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)