C++函数bool类型函数返回值与返回值不匹配怎么办

c++ 函数返回值、引用
我的图书馆
c++ 函数返回值、引用
一,c++函数的返回分为以下几种情况
1)主函数main的返回值:这里提及一点,返回0表示程序运行成功。
2)返回非引用类型:函数的返回值用于初始化在跳用函数出创建的临时对象。用函数返回值初始化临时对象与用实参初始化形参的方法是一样
的。如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。且其返回值既可以是局部对象,也可以是求解表达式的结果。
3)返回引用:当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。
二,函数返回引用
1,当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。先看两示例,示例1如下:
const string &shorterString(const string &s1,const string &s2) {
return s1.size & s2.size ? s1:s2; }
<span style="COLOR: # ostream &operator&&(ostream &output, const AAA &aaa)<span style="COLOR: # {<span style="COLOR: #
output && aaa.x && ' ' && aaa.y && ' ' && aaa.z &&<span style="COLOR: #
return<span style="COLOR: # }
&&&& 形参和返回类型都是指向const string对象的引用,调用函数和返回结果时,都没有复制这些string对象。
2,返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。比如:
int& abc(int a, int b, int c, int& result){ 2
result = a + b + 4
这种形式也可改写为: 8
int& abc(int a, int b, int c, int *result){<span style="COLOR: #
*result = a + b +<span style="COLOR: #
return *<span style="COLOR: #
&&&& 但是,如下的形式是不可以的:
<span style="COLOR: #
int& abc(int a, int b, int c){<span style="COLOR: #
return a + b +<span style="COLOR: #
3,千万不要返回局部对象的引用。当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。如:
&&const string &manip(const string &s)
&&&string ret =s;
&&&& //wrong:returning reference to a local object
4,引用返回左值。返回引用的函数返回一个左值。因此这样的函数可用于任何要求使用左值的地方。示例见:c++ primer p215
5,由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!如下代码,将无法编译通过,这就是因为返回值立即进行了++操作(相当于对变量z进行了++操作),而这对于该函数而言,是不允许的。如果去掉const,再行编译,则可以获得通过,并且打印形成z
= 7的结果。
&include &iostream&&include &cstdlib&&const int&
abc(int a, int b, int c, int& result){&&& result = a + b +&
&int main() {&& int a = 1; int b = 2; int c=3;&&&
&abc(a, b, c, z)++;& //wrong: returning a const reference& &cout &&
"z= " && z &&&& SYSTEM("PAUSE");& &return 0;&}
三,思考:&&&
1,什么时候返回引用是正确的?而什么时候返回const引用是正确的?
&&& 返回指向函数调用前就已经存在的对象的引用是正确的。当不希望返回的对象被修改时,返回const引用是正确的。
本文来自CSDN博客,转载请标明出处:源代码如下 # & include & &stdio.h& int & testA & (void) {
int & b & = & 1 & ;
return & b & ; } char & * & testB &
char & str[] & = & "abc " & ;
return & str & ; }
& int & main() {
printf( & " & the & value & of & testA & is &
%d & \n ", & testA() & ) & ;
printf( & " & the & value & of & testB & is
& %c & ", & *( & testB() & ) & ) & ; } 问题1 & :
根据《高质量c编程》里所说,testB函数返回了一个临时指针,因为函数结束时,该指针会被销毁,因此这里的返回语句是错误的,我用vc6编译时的确也收到了警告,但是为什么build还是能通过呢?而且为什么运行时也没有任何问题,正确返回
'a & '这个值。我的理解是运行时return还是返回了一个指向栈的指针,并且这段内存暂时还没有被其他的数据所覆盖,因此能够正确返回 'a
'这个值,但是如果程序中又多次调用其他函数并占据了该内存,那么就会得到其他的数据而不是 'a '了,是不是这样理解呢? 问题2 & :
同样testB里也是返回一个临时值b,但是为什么这样是完全可行的呢?因为不是一个地址?不知道return的返回机制是怎么样的,请各位帮我解释一下,谢谢answer:C里面的return &
val都是传回一个值,你不可能得到val这个变量,所有修改作用于接收val的那个对象;C++里面返回引用就不一样了,返回的就是原来的对象,所有修改都作用于val 。而指针和引用非常相似,通过指针可以操纵原来的对象,所以返回一个不存在的对象的指针时不正确的。但是作为逻辑上讲,返回一个指针的值并没有错误,无论这个指针指向的是什么位置。对于返回值的情况: & & & & testA与main函数同在栈区,testA结束时C++创建临时变量,然后将返回值复制给该临时 变量。
& & & & printf( & " & the & value & of & testA & is & %d & \n ", & testA() &
) & 时输出的是该临时变量的值,testA中的b已经不存在。 对于返回指针的情况: & & & &
这是最复杂的部分。首先,对于上面的情形:返回一个数组的首地址,由于是返回char & * 类型,所以C++会首先创建一个char &
*类型的临时变量,再把该数组的首地址赋给临时变量;
函数结束后该数组也就被销毁,这就意味着临时变量指向了一个“未声明的地址”,幸运的情况下,这段内存暂时还没有被其他的数据所覆盖,因此还能输出正确的内容。
& & & & 在testB里面,如果换成char* & str= "abc ";return & & 由于这时str指向的是全局数据区 的一段内存地址,所以函数结束后临时变量也指向该地址,所以编译器不会提出警告。但这样 的方法是不推荐的。 返回引用: &
& & & 这中情况的效率最高,它直接返回一个对象,不产生返回值的副本。但同时也要注意避免 返回局部引用的情况。
TA的最新馆藏[转]&[转]&[转]&[转]&C++中函数返回值类型的技巧
本回答由提问者推荐
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;探讨:C++中函数返回引用的注意事项
字体:[ ] 类型:转载 时间:
本篇文章是对C++中函数返回引用的注意事项进行了详细的分析介绍,需要的朋友参考下
函数 返回值 和 返回引用 是不同的函数返回值时会产生一个临时变量作为函数返回值的副本,而返回引用时不会产生值的副本,既然是引用,那引用谁呢?这个问题必须清楚,否则将无法理解返回引用到底是个什么概念。以下是几种引用情况:1,引用函数的参数,当然该参数也是一个引用 代码如下:const string &shorterString(const string &s1,const string &s2)&&&&& {&&&&&&&&&&&& return s1.size()&s2.size()?s1:s2;&&&&& }以上函数的返回值是引用类型。无论返回s1或是s2,调用函数和返回结果时,都没有复制这些string对象。简单的说,返回的引用是函数的参数s1或s2,同样s1和s2也是引用,而不是在函数体内产生的。函数体内局部对象是不能被因哟个的,因为函数调用完局部对象会被释放。2,千万不要返回局部对象的引用 代码如下:const string &mainip(const string &s)&&&&& {&&&&&&&&&&&& string ret=s;&&&&&&&&&&&&&&&&& }当函数执行完毕,程序将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。3,不能返回函数内部定义的对象。在类的成员函数中,返回引用的类对象,当然不能是函数内定义的类对象(会释放掉),一般为this指向的对象,典型的例子是string类的赋值函数。 代码如下:&SPAN style="COLOR: #000066; FONT-SIZE: 16px"&String& String::operator =(const String &str)& //注意与“+”比较,函数为什么要用引用呢?a=b=c,可以做为左值{&if (this == &str)&{&&return *& &}&delete [] m_&int len = strlen(str.m_string);&m_string = new char[len+1];&strcpy(m_string,str.m_string);&return *}&/SPAN&这与sting类中的“+”运算符重载不一样。“+”运算符的重载不能返回引用,因为它返回的是在函数内定义的类对象,附上代码。 代码如下:&SPAN style="COLOR: #000066; FONT-SIZE: 16px"&String String::operator +(const String &str)&&& {&S&if (!str.m_string)&{&&newstring = *&}&else if (!m_string)&{&&newstring =&}&else&{&&int len = strlen(m_string)+strlen(str.m_string);&&newstring.m_string = new char[len+1];&&strcpy(newstring.m_string,m_string);&&strcat(newstring.m_string,str.m_string);&}&}&/SPAN&4,引用返回左值(上例的=赋值也是如此,即a=b=c是可以的) 代码如下:&char &get_val(string &str,string::size_type ix)&&&&& {&&&&&&&&&&&& return str[ix];&&&&& }&&&&& 使用语句调用:&&&&&& string s("123456");&&&&&& cout&&s&&&&&&&& get_val(s,0)='a';&&&&&& cout&&s&&最后转上一段code作为总结。 代码如下:&span style="font-size:16color:#000066;"&#include&iostream&string make_plural(size_t,const string&,const string&);const string &shorterString(const string &,const string &);const string &mainip(const string&);char &get_val(string &,string::size_type);int main(void){&&& cout&&make_plural(1,"dog","s")&&&&& cout&&make_plural(2,"dog","s")&&&&& string string1="1234";&&& string string2="abc";&&& cout&&shorterString(string1,string2)&&&&& cout&&mainip("jiajia")&&&&& &&& string s("123456");&&& cout&&s&&&&& get_val(s,0)='a';&&& cout&&s&&&&& getchar();&&& return 0;}//返回非引用 string make_plural(size_t i,const string &word,const string &ending){&&& return (i==1)?word:word+}//返回引用 const string &shorterString(const string &s1,const string &s2){&&& return s1.size()&s2.size()?s1:s2;}//禁止返回局部对象的引用(我的dev c++ 没有报错,比较可怕) const string &mainip(const string &s){&&& string ret=s;&&&}//引用返回左值char &get_val(string &str,string::size_type ix){&&& return str[ix];}&/span&
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具2013年12月 C/C++大版内专家分月排行榜第二2013年12月 Linux/Unix社区大版内专家分月排行榜第二2013年11月 C/C++大版内专家分月排行榜第二2013年10月 C/C++大版内专家分月排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 bool类型函数返回值 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信