首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请问一个关于引用和const的基本概念

2013-12-22 
请教一个关于引用和const的基本概念对于下面的这段代码void f(char c){}void g(char&){}void h(const char

请教一个关于引用和const的基本概念
对于下面的这段代码


void f(char c)
{
}
void g(char&)
{
}
void h(const char&)
{
}
void main()
{unsigned char uc=255;
f(uc);
g(uc);//wrong
h(uc);
}


在编译的时候,g(uc);就报错。而另外两个函数的调用都可以通过。
求教各位详细解释里面的基本概念!谢谢!!
[解决办法]

void g(unsigned char& c)
{
//非const引用只能绑定到与该引用同类型的对象
//const引用则可以绑定到不同但相关的类型的对象或绑定到右值
}

[解决办法]
引用:
对于下面的这段代码

void f(char c)
{
}
void g(char&)
{
}
void h(const char&)
{
}
void main()
{unsigned char uc=255;
f(uc);
g(uc);//wrong
h(uc);
}


在编译的时候,g(uc);就报错。而另外两个函数的调用都可以通过。
求教各位详细解释里面的基本概念!谢谢!!

上面几位都没说清楚。。
参数类型不匹配的直接传递是不允许的。所以能编译通过的,靠的都是隐式转换。
f(char)这个函数,char和uc的类型不匹配,但是因为是值传递,所以是先从uc构造一个char类型的临时变量作为f的参数,所以编译通过;
g(char &)这个函数,char和uc的类型不匹配,虽然允许从unsigned char到char的隐式转换,但是因为转换的结果是一个右值,右值不允许绑定到非const的引用上,所以结果是不转换不匹配,转换了又不接受,所以编译失败。注意隐式转换到不同类型(如果没有继承关系)一定只能是值转换而不是引用转换;
h(const char&)这个函数,char和uc的类型不匹配,所以先从uc构造一个char类型的临时变量,而因为右值允许绑定到const左值引用,所以编译也通过。但是若调试的话,可以发现h()函数体内参数的地址并不是传入h时的uc的地址。

热点排行