怎么都搞不清楚?

时间:2020-11-26 16:22:32
(1)例如函数原型这样定义: const object& deal(……); 这里返回的 const 表示
什么? 是常量对象? 为什么在程序中这个对象可以更改???

(2)例如函数原型: 前自增运算符 Date& operator++ ( );  
                   后自增运算符   Date operator++ ( int );
谁能帮我解释一下,什么时候该返回对象的引用,什么时候该返回对象?  
对象引用都返回 l-value ,谁能帮我具体解释一下 l-value?         
   
     感激不尽!     

7 个解决方案

#1


1 表示返回常量引用
2 返回的变会做左值(l-vaule)时,返回引用。但有时必须返回对象(这个对象是临时的)

#2


2 返回的变量会做左值(l-vaule)时,返回引用。但有时必须返回对象(这个对象是临时的) 
左值就是可以被赋值,相反右值不行
 

#3


1.我猜你的意思可能是这样:
const object& deal(......);
object o=deal;
modify o;
这种情况下在o=deal()时,事实上将常引用的对象内容拷贝给了o,修改的是o
const object& o=deal();
这种情况下就不能修改o

2.正常情况下都应该返回引用,因为至少的,引用的成本比对象小。当然,一切规则都有它的特例。

#4


看这个: const Date& Date::operator+=( int d ){
for( int i=0; i<d; i++ )
helpIncrement();
return *this;
}

Date Date::operator ++ ( int ){
Date temp=*this;
helpIncrement();
return temp;
}

Date d1;  
d1+=10;   //d1不是返回一个const对象么?
d1++;     //d1怎么又能更改了? 
…………

#5


d1并不是返回的常量引用。d1+=10; == d1.operator+=(10); 并没有引用名"维系"在operator+=(10);的返回上

#6


d1.operator++(10)  不是返回 d1的常量引用么??     哪是返回什么?

#7


实际上"d1+=10"是一个const Data&类型,而d1的类型没有也不可能会改变。
将返回值设为const是防止你做这样的“蠢事”:"(d1+=10)++"或"(d1+=10)=d2"这显然是不合常理的,但如果你的返回值不是const这样的表达式是可以编译的,按你的类定义,
"(d1+=10)++"会被这样执行:
    d1.operator+=(10);
    d1++;
这是你要的结果吗?
如果返回的又不是引用的话,结果是这样。
    Data tmpData(d1.operator+=(10));
    tmpData++;
出乎意料吗,但事实就是如此。

#1


1 表示返回常量引用
2 返回的变会做左值(l-vaule)时,返回引用。但有时必须返回对象(这个对象是临时的)

#2


2 返回的变量会做左值(l-vaule)时,返回引用。但有时必须返回对象(这个对象是临时的) 
左值就是可以被赋值,相反右值不行
 

#3


1.我猜你的意思可能是这样:
const object& deal(......);
object o=deal;
modify o;
这种情况下在o=deal()时,事实上将常引用的对象内容拷贝给了o,修改的是o
const object& o=deal();
这种情况下就不能修改o

2.正常情况下都应该返回引用,因为至少的,引用的成本比对象小。当然,一切规则都有它的特例。

#4


看这个: const Date& Date::operator+=( int d ){
for( int i=0; i<d; i++ )
helpIncrement();
return *this;
}

Date Date::operator ++ ( int ){
Date temp=*this;
helpIncrement();
return temp;
}

Date d1;  
d1+=10;   //d1不是返回一个const对象么?
d1++;     //d1怎么又能更改了? 
…………

#5


d1并不是返回的常量引用。d1+=10; == d1.operator+=(10); 并没有引用名"维系"在operator+=(10);的返回上

#6


d1.operator++(10)  不是返回 d1的常量引用么??     哪是返回什么?

#7


实际上"d1+=10"是一个const Data&类型,而d1的类型没有也不可能会改变。
将返回值设为const是防止你做这样的“蠢事”:"(d1+=10)++"或"(d1+=10)=d2"这显然是不合常理的,但如果你的返回值不是const这样的表达式是可以编译的,按你的类定义,
"(d1+=10)++"会被这样执行:
    d1.operator+=(10);
    d1++;
这是你要的结果吗?
如果返回的又不是引用的话,结果是这样。
    Data tmpData(d1.operator+=(10));
    tmpData++;
出乎意料吗,但事实就是如此。