Part3 函数 3.4函数的参数传递 3.5引用类型 3.6含有可变参数的函数 3.7内联函数 3.8constexpre函数 3.9带默认参数值的函数 3.10函数重载
3.4函数的参数传递
函数在被调用时才分配形参的存储单元
实参可以是常量、变量或表达式
实参类型必须与形参相符
值传递:是传递参数值,即单向传递
引用传递:可以实现双向传递。希望传引用但又保障实参数据的安全可以用常引用。
引用是标识符的别名。
定义一个引用时,必须同时对它进行初始化,使它指向一个已存在的对象
一旦一个引用被初始化后,就不能改为指向其他对象
例如:
int i,j;
int &ri = i; //定义int引用ri,并初始化为变量i的引用
j = 10;
ri = j; //相当于i = j
//3-11输入两个整数交换后输出(值传递) #include<iostream> using namespace std; void swap(int a, int b){ int t = a; a = b; b = t; } int main(){ int x = 5, y = 10; cout << "x = " << x << " y = " << y << endl; swap(x,y); cout << "x = " << x << " y = " << y << endl; return 0; }
//3-12输入两个整数交换后输出(引用传递) #include<iostream> using namespace std; void swap(int& a, int& b){ int t = a; a = b; b = t; } int main(){ int x = 5, y = 10; cout << "x = " << x << " y = " << y << endl; swap(x,y); cout << "x = " << x << " y = " << y << endl; return 0; }
3.6含有可变参数的函数
c++中提供了两种主要方法:
1 如果实参类型相同,可以传递一个名为initializer_list的标准库类型
2 如果实参的类型不同,我们可以编写可变参数的模板
initializer_list是一种标准库类型,用于表示某种特定类型的值得数组。该类型定义在同名的头文件中。
initializer_list是一个类模板。使用模板时,需要在模板后面跟一对尖括号,括号内给出类型参数。
initializer_list比较特殊的一点是,其对象中的元素永远是常量值。
含有initializer_list形参的函数也可以同时拥有其他形参。
3.7内联函数
使用关键字inline,建议编译器用函数体内的语句替换调用的地方。
注意:
1 内联函数体内不能有循环语句和switch语句
2 内联函数的定义必须出现在内联函数第一次被调用之前
3 对内联函数不能进行异常接口声明
inline只是对编译器的建议,一些编译器会自行判断。
//3-14内联函数应用举例,计算圆的面积 #include<iostream> using namespace std; const double PI = 3.141592653; inline double calArea(double radius){ return PI * radius * radius; } int main(){ double r = 3.0; double area = calArea(r); cout << area << endl; return 0; }
3.8constexpre函数
constexpr函数语法规定:
1 constexpr修饰的函数在其所有参数都是constexpr时,一定返回constexpr;
2 函数体中必须有且仅有一条return语句。
在编译期间可计算出来结果。
constexpr函数举例:
constexpr int get_size() { return 20; }
constexpr int foo = get_size(); //正确:foo是一个常量表达式
3.9带默认参数值的函数
可以预先设置默认的参数值,调用时如给出实参,则采用实参值,否则采用预先设置的默认参数值
int add(int x = 5,int y = 6) { return x + y; } int main() { add(10,20); //10+20 add(10); //10+6 add(); //5+6 }
默认参数值的说明次序:
有默认参数的形参必须列在形参列表的最右
如果一个函数有原型声明,且原型声明在定义之前,则默认参数值应在函数原型声明中给出;
如果只有函数的定义,则默认参数值可以函数定义中给出。
int add(int x = 5, int y = 6); int main(){ add(); } int add(int x, int y){//原型声明中已经指定,此处不能再制定 return x + y; }
//3-15计算长方体的体积 #include<iostream> #include<iomanip> using namespace std; int getVolume(int length, int width = 2, int height = 3); int main(){ const int X = 10, Y = 12, Z = 15; cout << "Some box data is "; cout << getVolume(X,Y,Z) << endl; cout << "Some box data is "; cout << getVolume(X,Y) << endl; cout << "Some box data is "; cout << getVolume(X) << endl; return 0; } int getVolume(int length, int width, int height){ cout << setw(5) << length << setw(5) << width << setw(5) << height << '\t'; return length * width * height; }
3.10函数重载
C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。
重载函数的形参必须不同:个数不同或类型不同。
浙公网安备 33010602011771号