标签:c++
不适合复制实参的情况包括:
通常,数组以非引用类型传递,此时数组会转换为指向第一个元素的指针,形参中数组大小并没有意义。然而如果形参是数组的引用,则编译器不会将数组实参转化为指针,而是传递数组引用本身。此时数组大小会由编译器进行检查。
例:
void printValues(int (&arr)[10]){}
int main()
{
int i(0);
int j[2] = {0,1};
int k[10] = {1,2,3,4,5,6,7,8,9,0};
printValues(&i); //error
printValues(j); //error
printValues(k); //ok
return 0;
}
考虑如下四个函数和某次调用:
void f();
void f(int);
void f(int, int);
void f(double, double = 3.14);
f(5.6); //It calls f(double, double)
选择可行函数:
即从所有候选函数中,选择一个或多个能够用本次函数调用中的实参来调用的函数。其必须满足两个条件:
本例中的可行函数为:
void f(int);
void f(double, double = 3.14);
寻找最佳匹配(如果有)
即在可行函数中寻找对应形参与实参最匹配的一个。
如果有且仅有一个函数满足下列条件,则匹配成功:
f(5.6);
中,若调用void f(int);
意味着有一个实参需要隐式类型转换
如调用
void f(double, double = 3.14);
则每一个实参的匹配都不需要隐式类型转换。
故该函数:
故最佳匹配为
void f(double, double = 3.14);
*注:若调用函数f(42,1.2);
其可行函数为:
void f(int, int); //(1)
void f(double, double = 3.14); //(2)
对于(1),其第二个实参的匹配劣于(2),对于(2),其第一个实参的匹配劣于(1)。故具有二义性,调用错误。
再*注:类型提升优于标准转换
考虑
void func(int);
void func(short);
func(‘a‘);
char->int //类型提升
char->short//类型转换
故实际调用为void func(int);
调用一个引用形参的函数时,传递一个右值或传递一个需要转换类型的对象是不允许的。例如:
int incr(int &val)
{
return ++val;
}
int main()
{
short v1 = 0;
const int v2 = 42;
int v3 = incr(v1); // error: v1 is not an int
v3 = incr(v2); // error: v2 is const
v3 = incr(0); // error: literals are not lvalues
v3 = incr(v1 + v2); // error: addition doesn‘t yield an lvalue
int v4 = incr(v3); // ok: v3 is a non const object type int
}
令人吃(dan)惊(teng)的是,尽管函数的形参是const,但是编译器却将func的定义视为其形参被声明为普通的int型:
void func(const int i)
{
cout << i << endl;
}
void func(int i)
{
cout << i << endl;
}
error C2084: 函数“void func(const int)”已有主体
这种用法是为了支持对C语言的兼容,因为在C语言中,具有const形参或非const形参的函数并无区别。
int *&v1;
这个应该从右至左理解,V1是一个引用,和一个int*的类型绑定。
只能为一个形参指定默认实参一次。
每一个版本的重载函数应该声明在同一个作用域。
函数指针只能通过同类型的函数或函数指针或0值常量进行初始化或赋值。
直接引用函数名等效于在函数名上应用取地址操作符。
指向重载函数的指针必须与重载函数的一个版本精确匹配。
printValues(int (*matrix)[10], int rowSize);
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:c++
原文地址:http://blog.csdn.net/skillness2/article/details/48010079