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

原创 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。哪些是合法的?哪些调用将导致编译器引进临时变量?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

解答程序如下。在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:以引用传...

VS2010 C++ 学习笔记(一) 引用 函数参数默认值 函数重载 内联inline

慕课网的C++ 视频,讲的蛮不错,搭配 《Visual C++2008入门经典(中文高清版)》,有2010版的。  学习ing,做个笔记。  视频链接 链接...

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

本文阐述二个要点:        数组的引用,就是数组本身;即      char str[16];     有 str ==& str;  成立        引用在汇编层级的实现即为取参数地址...

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

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

Java核心技术笔记—方法参数(值调用和引用调用)

最近重读Java核心技术,不得不说的是这本书确实不错。虽然本人不太喜欢做笔记,但还是觉得某些重要的地方必须要记一下。 关于方法参数调用一般有两种:值调用(call by value)和引用调用(cal...
  • whucyl
  • whucyl
  • 2013年10月12日 16:43
  • 4297

C++学习笔记12——函数的参数传递

1,可行与不可行的参数传递情况: 2,举例: 假如有如下定义的函数 void fun_val(int i, const int ci); void fun_pointer(int *...

C#调用CDLL带指针参数的函数

  • 2009年04月16日 16:04
  • 36KB
  • 下载

python学习笔记-(13)python中的函数参数传递

在之前的python学习笔记系列博客中,我已经描述过关于python中最简单的函数参数传递,根据参数位置传递。这里就不再赘述了,若想了解位置传递,请链接http://blog.csdn.net/u01...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[笔记]对有引用参数的函数的调用
举报原因:
原因补充:

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