[笔记]对有引用参数的函数的调用

来源:互联网 发布:淘宝到美国运费怎么算 编辑:程序博客网 时间:2024/05/16 06:10

The C++ Program Laguage(special edition)一书第5章第6个习题,题目如下:定义了函数 f (char), g (char&), h (const char&)之后,用参数'a',49,3300, c, uc, sc作为参数调用他们,其中c是char,uc是unsigned char,sc是signed char。哪些是合法的?哪些调用将导致编译器引进临时变量?

 

解答程序如下。在vc++.net 2003上编译过,并在错误语句后给出了编译出错提示信息。

void f (char ch)

{   cout << "f (char) : " << ch << endl; }

 

void g (char& ch)

{   cout << "g (char&) : " << ch << endl; }

 

void h (const char& ch)

{   cout << "h (const char&) : " << ch << endl; }

 

int main()

{

    char c = 'b';

    unsigned char uc = 'c';

    signed char sc = 'd';

    f ('a');

    g ('a');//error: 不是对“const”的引用不能绑定到非 lvalue

    h ('a');

 

    f (49);

    g (49);//error: 不是对“const”的引用不能绑定到非 lvalue

    h (49);

 

    f (3300);//warning: “参数” : 截断常数值

    g (3300);//error: 不是对“const”的引用不能绑定到非 lvalue

    h (3300);//warning: “参数” : 截断常数值

 

    f (c);

    g (c);

    h (c);

 

    f (uc);

    g (uc);//error: 不是对“const”的引用不能绑定到非 lvalue

    h (uc);

 

    f (sc);

    g (sc);//error: 不是对“const”的引用不能绑定到非 lvalue

    h (sc);

 

    return 0;

}

 

出错原因分析:

函数的参数是一个引用型。因此在调用函数时实参值将作为形参值的初始化值。这里实参就是'a',49,3300, c, uc, sc。

下面的内容是从书上摘抄的。为确保一个引用绑定到一个对象上,必须初始化它。一个左值(lvalue)就是一个可以得到它的地址的对象。(1)普通的引用,形如T&,必须用T类型的一个左值去初始化它。(2)对常量类型的引用,形如const T&,其初始化值不一定是一个左值,甚至可以不是T类型的。若初始化值不是T类型的,会有如下工作:首先在必要时作一个隐式转换到T类型;然后把转换结果存放到一个T类型的临时变量中;最后这个临时变量就用来对这个引用作初始化。

g (‘a’); g (49); g (3300); 出错的原因,违反了第(1)条。'a',49,3300等都不是一个左值。

g (uc); g (sc); 出错的原因在于,初始化值的类型不对。也是违反了第(1)条。

h (const T&)中,以'a',49,c,uc,sc调用函数都会产生临时变量。3300已经超出了char型的最大值,因此也会出错。

原创粉丝点击