函数参数

  • 类似于局部变量,函数的形参为函数提供了已命名的局部存储空间
  • 函数不能返回另一个函数或者内置数组类型,但可以返回指向函数的指针,或指向数组元素的指针的指针
  • 每次调用函数时,都会重新创建该函数所有的形参,此时所传递的实参将会初始化对应的形参。
    形参的初始化与变量的初始化一样:如果形参具有非引用类型,则复制实参的值,如果形参为引用类型(第 2.5 节),则它只是实参的别名
  • 在 C 语言中,具有 const 形参或非 const 形参的函数并无区别
  • 利用 const 引用避免复制
  • 不需要在函数内改变实参的值时,不应将形参定义为引用,否则可能错误修改实参的值
  • 应该将不修改相应实参的形参定义为 const 引用。如果将这样的形参定义为非 const 引用,则毫无必要地限制了该函数的使用
    1 string func(const string &s)
    2 {
    3     return s;
    4 }
    5 int main()
    6 {
    7     cout << func("ddd");
    8     return 0;
    9 }

    如果将func形参定义为非const,则字符串常量不能作为实参传入

  • 传递指向指针的引用

    1 int *&v1
    2 //v1 是一个引用,与指向 int 型对象的指针相关联
  • 通常,函数不应该有 vector 或其他标准库容器类型的形参。调用含有普通的非引用 vector 形参的函数将会复制 vector 的每一个元素 。从避免复制 vector 的角度出发,应考虑将形参声明为引用类型。然而,看过第十一章后我们会知道,事实上,C++ 程序员倾向于通过传递指向容器中需要处理的元素的迭代器来传递容器
     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 void print_(vector<int>::iterator it1, vector<int>::iterator it2)
     5 {
     6     for(vector<int>::iterator it = it1; it != it2; ++it)
     7     {
     8         cout << *it << ' ';
     9     }
    10     cout << endl;
    11 }
    12 int main()
    13 {
    14     vector<int> v(10);
    15     print_(v.begin(), v.end());
    16     return 0;
    17 }

  • 数组形参

    1 // three equivalent definitions of printValues
    2 void printValues(int*) { /* ... */ }
    3 void printValues(int[]) { /* ... */ }
    4 void printValues(int[10]) { /* ... */ } //编译器忽略为任何数组形参指定的长度。
    当编译器检查数组形参关联的实参时,(非引用传参情况下)它只会检查实参是不是指针、指针的类型和数组元素的类型时是否匹配,而不会检查数组的长度
  • 不需要修改数组形参的元素时,函数应该将形参定义为指向 const 对象的指针
  • 通过引用传递数组
    如果形参是数组的引用,编译器不会将数组实参转化为指针,而是传递数组的引用本身。在这种情况下,数组大小成为形参和实参类型的一部分。 编译器检查数组的实参的大小与形参的大小是否匹配
  • 只严格地接受含有 10 个 int 型数值的数组
     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 void print_(int (&a)[10]) //&arr 两边的圆括号是必需的,因为下标操作符具有更高的优先 
     5 {
     6     for(int i = 0; i<10; ++i)
     7         cout << a[i] << ' ';
     8     cout << endl;
     9 }
    10 int main()
    11 {
    12     int a[10]{0};
    13     print_(a);
    14     print_(a);
    15     return 0;
    16 }
    //把a大小改为11时,不能通过编译
  • 多维数组的传递
     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 void print_(int (*a)[10])// void print_(int a[][10]), 
     5 {
     6     for(int i = 0; i<2; ++i)
     7         for(int j = 0; j<10; ++j)
     8             cout << a[i][j] <<endl;
     9 }
    10 int main()
    11 {
    12     int a[10][10]={};
    13     a[0][7] = 32;
    14     print_(a);
    15     return 0;
    16 }

  • 可以通过传递指向数组第一个和最后一个元素的下一个位置的指针来传参

  •  1 // const int ia[] is equivalent to const int* ia
     2 // size is passed explicitly and used to control access to elements of ia
     3 #include <iostream>
     4 using namespace std;
     5 void printValues(const int ia[], size_t size)
     6 {
     7    for (size_t i = 0; i != size; ++i) {
     8      cout << ia[i] << endl;
     9    }
    10 }
    11 int main()
    12 {
    13      int j[] = { 0, 1 }; // int array of size 2
    14      printValues(j, sizeof(j)/sizeof(*j));
    15      return 0;
    16 }
  • 当函数需要处理数组且函数体不依赖于数组的长度时应使用指针形参,其他情况下应使用引用形参
  • main函数参
     1 // const int ia[] is equivalent to const int* ia
     2 // size is passed explicitly and used to control access to elements of ia
     3 #include <iostream>
     4 using namespace std;
     5 int main(int argc, char *argv[])
     6 {
     7     for(int i=0; i<argc; ++i)//argc表示字符串个数
     8         cout << argv[i] << endl;
     9     return 0;
    10 }
  • 1 #include <iostream>
    2 #include <cstdlib>
    3 using namespace std;
    4 int main(int argc, char *argv[])
    5 {
    6        cout << atoi(argv[1]) + atoi(argv[2]) <<endl;
    7     return 0;
    8 }



  • 含可变参数的函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值