首页  »   C语言

返回值有关问题

网友分享于:2013-02-11  浏览:6次
返回值问题
int       &Array::operator[]       (       int       subscript       )      
{      
    assert(       0       <=       subscript       &&       subscript       <       size       );      
    return       ptr[       subscript       ];          
}      
       
const       int       &Array::operator[](       int       subscript       )       const      
{      
    assert(       0       <=       subscript       &&       subscript       <       size       );      
    return       ptr[       subscript       ];      
}      
为什么这两个成员函数一个返回左值一个返回右值?

------解决方案--------------------
返回的如果是非const的引用的话,它就是一个对象的别名,是个左值,可以取地址和修改它的内容。但是如果是const 的引用的话,它就是一个不开改动的值,可以参考我所写的一个验证性的程序:
//本程序研究怎样进行对函数返回值操作而不影响实参,以及怎样让对函数返回值的操作影响到实参的值
//以及怎么禁止对函数返回值进行操作的几种方法。

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

inline int &max1(int a,int b)
{
return a <b? b:a;
}

inline int &max2(int &a ,int &b)
{
return a <b? b:a;
}


inline int &max3(const int &a,const int &b)
{
return a <b? b:a;
}


inline int * max4(int *a ,int *b)
{
return *a <*b? b:a;
}

inline const int * max5(int *a , int *b)
{
return *a <*b? b:a;
}


inline const int &max6(int &a ,int &b)
{
return a <b? b:a;
}


void main()
{
int a=1,b=2,c=3,d=4;
int *p1=&a,*p2=&b,*p3=&c,*p4=&d;

cout < < "a,b调用函数++max1前a= " < <a < < "\tb= " < <b < <endl;
cout < < "++max1(a,b)本身的值为 " < <++max1(a,b) < <endl;
cout < < "a,b调用函数++max1后a= " < <a < < "\tb= " < <b < <endl;
//对次函数max1的调用结果说明当参数传递为传值时,即使返回的是指针和引用,对返回值的操作也不会影响到
//原来的参数
cout < < "a,b调用函数++max2前a= " < <a < < "\tb= " < <b < <endl;
cout < < "++max2(a,b)本身的值为 " < <++max2(a,b) < <endl;
cout < < "a,b调用函数++max2后a= " < <a < < "\tb= " < <b < <endl;
//对此函数max2的调用结果说明当参数和返回值都是引用的时候,对返回值的操作将改变实参的值
cout < < "c,d调用函数++max3前c= " < <c < < "\td= " < <d < <endl;
cout < < "++max3(c,d)本身的值为 " < <++max3(c,d) < <endl;
cout < < "c,d调用函数++max3后c= " < <c < < "\td= " < <d < <endl;
//原来以为将max3的两个形参声明为const的引用,即使返回的是引用,对返回值的操作就不能改变实参
//但是结果确实改变了实参d的值,猜测原因就是对实参是引用的限制只在实参的那个作用域里面有效,也就是
//说只在函数体和那个实参列表中是const的引用,当函数返回以后对返回值操作不受const的限制了。因为对
//引用的说明就是在参数里声明的。
cout < < "p1,p2调用函数++(*max4(p1,p2))前a= " < <*p1 < < "\tb= " < <*p2 < <endl;
上一页1/2下一页

相关解决方案

最新解决方案