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++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。方便使用,便于记忆。
重载函数的形参必须不同:个数不同或类型不同。

 

posted @ 2017-11-28 19:39  LeoSirius  阅读(165)  评论(0)    收藏  举报