什么? 是常量对象? 为什么在程序中这个对象可以更改???
(2)例如函数原型: 前自增运算符 Date& operator++ ( );
后自增运算符 Date operator++ ( int );
谁能帮我解释一下,什么时候该返回对象的引用,什么时候该返回对象?
对象引用都返回 l-value ,谁能帮我具体解释一下 l-value?
感激不尽!
7 个解决方案
#1
1 表示返回常量引用
2 返回的变会做左值(l-vaule)时,返回引用。但有时必须返回对象(这个对象是临时的)
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.正常情况下都应该返回引用,因为至少的,引用的成本比对象小。当然,一切规则都有它的特例。
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怎么又能更改了?
…………
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++;
出乎意料吗,但事实就是如此。
将返回值设为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 返回的变会做左值(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.正常情况下都应该返回引用,因为至少的,引用的成本比对象小。当然,一切规则都有它的特例。
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怎么又能更改了?
…………
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++;
出乎意料吗,但事实就是如此。
将返回值设为const是防止你做这样的“蠢事”:"(d1+=10)++"或"(d1+=10)=d2"这显然是不合常理的,但如果你的返回值不是const这样的表达式是可以编译的,按你的类定义,
"(d1+=10)++"会被这样执行:
d1.operator+=(10);
d1++;
这是你要的结果吗?
如果返回的又不是引用的话,结果是这样。
Data tmpData(d1.operator+=(10));
tmpData++;
出乎意料吗,但事实就是如此。