您的位置:首页 > 编程语言 > C语言/C++

C++primer第4版第七章函数

2016-12-03 21:57 281 查看
Talk is cheap, show me the code.

求最大公约数gcd(the greatest common divisor)的最佳方法

int gcd(int v1, int v2)

{

while (v2)

{

int temp = v2;

v2 = v1 % v2;

v1 = temp;

}

return v1;

}


函数使用引用形参通常有两个目的:

只是为了避免创建形参浪费存储空间:这种情况无需改变原有实参,所以应当采用const引用,比如 const string &s;

为了对原有实参产生影响:定义为string &s,这样可以传入的实参值产生影响。这种作用有一个很好应用:当函数需要返回多个值时,可以避免去创建包含多个元素的结构体,而是直接用形参引用的形式来传值。

函数形参中使用string引用有一个有意思的地方需要注意:不能用字符串字面值作为函数实参,不是引用却可以。

void show(string &s)   //不能使用show("hello")

{

cout << s << endl;

}


当将vector等容器作为函数形参时,太浪费空间,通常的做法是将容器的迭代器作为函数形参传入,或者使用引用。

当将数组作为函数形参时,编译器会对一维数组忽略数组长度,如果需要传入数组长度,需要额外指定数组长度,或者使用数组引用:

void fun(int (&a)[10]){}   //可以传入数组长度10


千万不要返回函数内定义的局部变量的引用或者指针,因为函数执行结束后会释放函数内变量使用的内存空间。

函数声明一般放在头文件中,而且函数声明一般会忽略形参变量名,所以可以不写形参变量名,函数声明时不用写花括号。

带默认形参的函数必须将有默认参数的形参放在参数列表后面,函数声明时也需要写出形参变量名和值。

仅当形参时引用或指针时,形参是否为const对重载函数区分才有影响。而且如果是指向变量的const指针和一般指针,也不能作为重载函数的区分。

void fun(const int &a);

void fun(int &a); //可以区分重载函数

void fun1(const int*a);

void fun1(int *a); //可以区分重载函数

void fun2(int *const a);

void fun2(int *a);  //不能区分重载函数

void fun3(const int a);

void fun3(int a);  //不能区分重载函数


函数指针可以隐式解引用和取地址:

typedef bool (*fun)(const string &);

bool fun1(const string &a);

fun = fun1;  //等价于fun = &fun1

const string a = "a";

fun(a); //等价于(*fun)(a)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++primer