C++继承问题:无指针场景下直接将子类对象赋值给父类的疑问
两种写法的核心差异
1. A ac = *b:值拷贝 + 对象切片
这行代码会触发A类的拷贝构造函数,创建一个全新的独立A类对象。拷贝过程只会复制*b(B类实例)中属于父类A的成员(也就是示例中的int i),如果子类B有自定义的新增成员,这些内容都会被截断丢弃,也就是C++中的「对象切片」现象。
此时ac和原b指向的B类对象是完全独立的两块内存,修改ac的任何属性都不会影响原b对象,和指针赋值的地址传递逻辑完全不同。
2. A &ac = *b:引用绑定,无对象拷贝
这行代码不会创建新对象,这里的ac是原*b对象中父类A部分的别名,二者共享同一块内存。你对ac的所有操作都会直接作用到原b指向的B类对象上,逻辑和父类指针指向子类对象一致,不会发生对象切片。
声明语句中&的作用
C++中&在不同语法位置的作用完全不同:
- 当
&跟在类型标识符之后时,作用是声明引用:例如int& ref = a、A& ac = *b,引用本质是变量的别名,和被绑定的变量共享同一块内存,不会产生拷贝开销。你提到的「按引用传递」就是引用的典型应用场景:函数参数声明为引用类型时,形参是实参的别名,既可以避免参数拷贝,也可以通过形参直接修改实参的值。 - 当
&放在变量/对象之前时,作用是取地址运算符:例如A* a = &ac,作用是获取目标对象的内存地址,赋值给对应类型的指针。
内容的提问来源于stack exchange,提问作者Corentin Salomon
相关产品推荐
相关产品推荐

