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

原创 2005年02月27日 14:04:00

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型的最大值,因此也会出错。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[c++学习笔记]反汇编角度看变量名和引用作为函数参数

1:默认情况下即以变量名作为函数参数时进行值传递 从反汇编中可以看出以下几点: 1:默认情况下进行的是值传递(mov) 2: 函数调用中参数的传递是从右向左依次传递的 2:以引用传...

函数调用参数为引用的实现机制

本文阐述二个要点:        数组的引用,就是数组本身;即      char str[16];     有 str ==& str;&...

值传递-引用传递-指针传递-函数调用时指针参数的传递

在函数调用时,编译器如何处理形参变量和实参变量 当发生函数调用时,需要给形参分配内存,形参变量是实参变量的副本, 在函数调用过程中是形参变量参与整个过程的变化 1.    值传递 void sw...

PHP学习笔记——默认参数的函数;

/* 默认参数 * demo(string $name,$int $age,[string $sex,string $email]); * 小括号里是必须传参数的,中括号...
  • iheyu
  • iheyu
  • 2017-04-25 16:24
  • 77

[C#学习笔记之多线程1]使用ParameterizedThreadStart委托向线程函数传送参数

在不传递参数情况下,一般大家都使用ThreadStart代理来连接执行函数,ThreadStart委托接收的函数不能有参数,也不能有返回值。如果希望传递参数给执行函数,则可以使用带参数的Paramet...

C++中构造函数默认参数学习笔记

C++中函数在定义时可以预先声明默认的形参值,调用时如果给出的实参则用实参初始化形参;如果没有给出实参,则采用预先声明的默认形参值。 以下是一个简单的实例:

PHP学习笔记——可变个数参数的函数;

/* 可变参数 * number demo([number $...]) * 中括号里的...可以传多个参数 */
  • iheyu
  • iheyu
  • 2017-04-26 20:59
  • 77

java笔记-函数参数传值

java中存在引用,但是对于Java中的方法参数传递,无论传递的是原生数据类型还是引用类型,统一是传值(pass by value) 下面举个常见的程序小代码: public class Param...

python笔记5--函数的参数定义

函数相当于接口,当完成一个函数的定义时,函数的内部相当于已经封装起来了,调用者只需要知道如何正确的传递函数的参数,函数会返回什么样的值。 python中,函数的定义一律采用def开头,后面加函数名,函...

04-python学习笔记:函数-参数传递

04-python学习笔记:函数-参数传递
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)