C++的参数默认值和哑元

一. 函数的参数支持哑元

哑元是一种没有参数名的参数,主要是为了函数间的区别以及向前兼容

二. 函数的参数可以指定默认值,当调用时没有传参,就以默认值进行函数调用。

三. 有默认值的形参必须靠右,声明和定义分开时,默认值必需在声明中指定,定义中不再指定。

//默认参数 与 哑元

#include <iostream>
using namespace std;

/*   1

void print(int *a,int n){
    for (int i = 0; i<n; i++) {
        cout << a[i];
    }
    cout << endl;
}

 */

// 2.用空格分开输出的每一个数
/*
void print(int *a,int n){
    for (int i = 0; i<n; i++) {
        cout << a[i] << ' ';
    }
    cout << endl;
}
 */

// 3.想用星号分隔开呢?
/*
void print(int *a,int n){
    for (int i = 0; i<n; i++) {
        cout << a[i] << '*';
    }
    cout << endl;
}
*/

// 4.随意用各种分隔符分开每个数  封装函数就是找出不同之处作为参数
/*
 *
void print(int *a,int n,char ch){
    for (int i = 0; i<n; i++) {
        cout << a[i] << ch;
    }
    cout << endl;
}
 *
 */

// 5.用中括号括起来输出的内容

/*
void print(int *a,int n,char ch){
    cout << '[';
    for (int i = 0; i<n; i++) {
        cout << a[i] << ch;
    }
    cout << ']';
    cout << endl;
}
*/

// 6.有时候想要中括号  有时候不想要呢?
/*
 *
void print(int *a,int n,char ch,bool flag){
    if (flag) {
        cout << '[';
    }

    for (int i = 0; i<n; i++) {
        cout << a[i] << ch;
    }

    if (flag) {
        cout << ']';
    }
    cout << endl;
}

 *
 */

#pragma 如果想要打印10000次,但是只有9999次的分隔符是空格 和需要中括号,只有一次的分隔符是星号*和不带中括号 ,如果只为了这一次特殊的,就要写9999次不特殊的  怎么办?   只需要给定默认参数即可

// 7. C++中参数可以给默认值
void print(int *a,int n,char ch,bool flag = true){
    if (flag) {
        cout << '[';
    }

    for (int i = 0; i<n; i++) {
        cout << a[i] << ch;
    }

    if (flag) {
        cout << ']';
    }
    cout << endl;
}

//8. 默认情况下  我想用空格作为分隔符
void print2(int *a,int n,char ch = ' ',bool flag = true){
    if (flag) {
        cout << '[';
    }

    for (int i = 0; i<n; i++) {
        cout << a[i] << ch;
    }

    if (flag) {
        cout << ']';
    }
    cout << endl;
}

#pragma 注意哦  C++的默认值只能从右向左给
//这个函数我没有给定最后一个参数的默认值   你会发现报错  这就说明了默认值只能从右向左给定
//如果第四个没有给定默认值而给第三个参数默认值,那么当我传进来3个参数的时候,编译器不知道把我传的第3个给谁。。。。也就是右边的没有默认值的话 不能给左边的默认值
/*
void print3(int *a, int n, char ch = ' ', bool flag){
   //省略一下
}
 */

// 9 .     我能不能什么分隔符都不用   第8个函数能不能满足???
//不满足

//方法重载
/*
void print2(int *a,int n){
    for (int i = 0; i<n; i++) {
        cout << a[i];
    }
    cout << endl;
}
*/

#pragma 哑元参数   哑元参数没有实际意义,解决方法冲突  解决版本兼容(例如本来的版本里面有个函数有2个参数的  到现在这个版本这个函数只需要1个参数。如果把这个函数改成1个参数,那么就不兼容原来的了)
//10 . 哑元参数  随便给一个类型  不用变量名

void print2(int *a,int n,float){
    for (int i = 0; i<n; i++) {
        cout << a[i];
    }
    cout << endl;
}

//主函数
int main(){
    //声明数组
    int a[] = {12,15,16,18,23,89,73,29,88,97};

    //调用函数输出遍历数组
    print(a, 10, '*', false);
    print(a, 10, '/', true);

    cout << "===== 默认值 ====" << endl;

    //7
    //可以不用给定是否需要输出中括号 因为已经给定默认值了
    print(a,10,' ');
    //另外一次特殊的可以给定  传进参数的话
    print(a, 10, '*',false);

    //8
    //没有输入最后一个参数  会默认使用给定的默认值
    print2(a, 10,'^');
    //在我输入的时候 不输入分隔符  就会自动用默认值了
//    print2(a, 10);

    //9.
    //print2(a, 10,'');
   // print2(a, 10);//这样会报错,因为第8个函数也可以只是传2个参数  所以这里就不知道用第8个还是第9个的了  那该怎么办?除了改方法名     用哑元参数

    cout << "==== 哑元参数 ====" << endl;
    //10
    print2(a, 10);//只传2个参数 那就是使用第8个默认值的函数
    //如果想要挨个打印   那就传一个哑元参数
    print2(a,10,3.14f);

    return 0;
}

运行结果如下:

12*15*16*18*23*89*73*29*88*97*
[12/15/16/18/23/89/73/29/88/97/]
===== 默认值 ====
[12 15 16 18 23 89 73 29 88 97 ]
12*15*16*18*23*89*73*29*88*97*
[12^15^16^18^23^89^73^29^88^97^]
==== 哑元参数 ====
[12 15 16 18 23 89 73 29 88 97 ]
12151618238973298897
Program ended with exit code: 0
时间: 2024-07-31 12:46:40

C++的参数默认值和哑元的相关文章

38 py改变函数参数的值关键字参数和参数默认值函数中可变参数将序列中的元素值作为函数对应的参数值传

第五课:改变函数参数的值 一个python函数可以有任意多个参数,在一个函数的外部来定义变量,然后把变量作为参数传入到函数内,并且在函数的内部来修改函数的参数值,函数结束之后,这些变量的值在如何变化呢? 给函数传递值有2种:1种是值传递,1种是引用传递 # 改变函数参数的值 # 值传递(数值.字符串.布尔 这些都是值传递) 在函数的内部修改变量值,不改变原参数定义的参数值,解释为: 这个在函数中不会改变原来定义(函数外部)的值 这是因为函数里面会有一个占的概念,外边的变量的值会复制给 占 里面,

SQL 自定义函数(Function)——参数默认值

sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值. 内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图.它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体. 多声明表值函数:它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END 语句括起来的函数体,返回值

C# 函数参数默认值

namespace 函数参数默认值 { class Program { public static void Test(int i =100) { Console.WriteLine("{0}",i); } static void Main(string[] args) { Test(); Test(222); Console.Read(); } } } 输出:100 222

java函数参数默认值

java通过函数的重载来实现函数参数默认值 public class ParameterDefault { /** * @param args */ public String getName(String givenName,String familyName){ return givenName+"."+familyName; } public String getName(String givenName){ return getName(givenName,"Xie&

ES6笔记之参数默认值(译)

原文链接:http://dmitrysoshnikov.com/ 原文作者:Dmitry Soshnikov 译者做了少量补充.这样的的文字是译者加的,可以选择忽略. 在这个简短的笔记中我们聊一聊ES6的又一特性:带默认值的函数参数.正如我们即将看到的,有些较为微妙的CASE. ES5及以下手动处理默认值 在ES6默认值特性出现前,手动处理默认值有几种方式: function log(message, level) { level = level || 'warning'; console.lo

ES6: 参数默认值及中间域

下午看了一章 ECMA-262 by Dmitry Soshnikov, 现在稍稍来小结下ES6中的参数默认值以及由此产生的参数中间作用域. 原文地址: http://dmitrysoshnikov.com/ecmascript/es6-notes-default-values-of-parameters/#conditional-intermediate-scope-for-parameters ES6中的参数默认值用法和其他语言都差不多,直接在参数后赋值: 1 function log(me

c++使用参数默认值实现默认构造函数

通常情况下的默认构造函数是不带任何的参数: class X{ private: int i; public: X() {} X( int ii):i(ii) {} }; 这其实等效于如下使用参数默认值的形式: class X{ private: int i; public: X( int ii=0):i(ii) {} //default constructor }; 若是将构造函数的实现不在类的声明中实现,可单独列出实现,但声明的时候是必须指定参数默认值: class X{ private: i

研究下JavaScript中的Rest参数和参数默认值

研究下JavaScript中的Rest参数和参数默认值 本文将讨论使 JavaScript 函数更有表现力的两个特性:Rest 参数和参数默认值. Rest 参数 通常,我们需要创建一个可变参数的函数,可变参数是指函数可以接受任意数量的参数.例如,String.prototype.concat 可以接受任何数量的字符串作为参数.使用 Rest 参数,ES6 为我们提供一种新的方式来创建可变参数的函数. 我们来实现一个示例函数 containsAll,用于检查一个字符串中是否包含某些子字符串.例如

ES6 随记(3.4.1)-- 函数的拓展(参数默认值,扩展运算符)

上一章请见: 1. ES6 随记(1)-- let 与 const 2. ES6 随记(2)-- 解构赋值 3. ES6 随记(3.1)-- 字符串的拓展 4. ES6 随记(3.2)-- 正则的拓展 & 数值的拓展 5. ES6 随记(3.3)-- 数组的拓展 4. 拓展 e. 函数的拓展 · 参数默认值.此节与结构赋值关系甚大,可去往前文再看一次 再来烧脑的重新打开这个蛋疼的案例, function fn1({x = 0, y = 0} = {}) { console.log(x, y);