C++中const Someclass&相关构造、赋值运算符及代码结果疑问
问题解答
核心疑问拆解
1. Someclass(const Someclass& a){x=a.x;x++;} 是什么?
这是拷贝构造函数,属于类构造函数的一种,专门负责从一个已存在的类对象,复制生成一个全新的类对象。
- 参数
const Someclass& a:指代要被复制的源对象,const用来保证不会意外修改源对象,引用&是为了避免不必要的对象拷贝(如果传值会触发递归调用拷贝构造函数,导致程序异常)。 - 实现逻辑:先把源对象
a的x值赋值给新对象的x,再将新对象的x自增1。
2. void operator=(const Someclass& a){x=a.x;x--;} 是什么?
这是赋值运算符重载,用来处理两个已存在对象之间的赋值操作(和拷贝构造的核心区别:拷贝构造是创建新对象,赋值是给已存在的对象更新值)。
- 参数
const Someclass& a:指代提供赋值数据的源对象,const和引用的作用和拷贝构造一致。 - 实现逻辑:先把源对象
a的x值赋值给当前对象的x,再将当前对象的x自减1。
为什么b.x的值是5?
看main函数里的关键代码:
Someclass a(4); Someclass b=a;
这里Someclass b=a;是创建新对象b的操作,触发的是拷贝构造函数,而非赋值运算符!
- 拷贝构造函数执行时,先把
a.x(值为4)赋给b.x,接着b.x自增1,最终b.x的值就是5。 - 如果是
b = a;这种场景(b已经提前创建完成,再执行赋值),才会触发赋值运算符重载,此时b.x会变成4-1=3。
补充验证示例
如果修改main代码为:
Someclass a(4); Someclass b(0); // 先创建b,此时b.x为0 b = a; // 触发赋值运算符重载 cout << "b:" << b.x << endl; // 输出结果为3
就能直观看到赋值运算符的执行效果。
内容的提问来源于stack exchange,提问作者sojaBean
相关产品推荐
相关产品推荐

