首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >浅拷贝调用成员对象的构造函数吗?

浅拷贝调用成员对象的构造函数吗?
EN

Stack Overflow用户
提问于 2021-01-27 00:15:44
回答 2查看 50关注 0票数 0

假设我有以下代码:

代码语言:javascript
运行
复制
class A {
public:
    int x;
    A(){}
    A(const A& a){} //copy constructor
    operator= (const A &a){...}
};
class B {
public:
    A a;
    B(){}
};
int main() {
    B b;
    B c = b; //shallow copy
    B d;
    d = b; //shallow assignment
}

浅拷贝\赋值是否会调用成员A a的拷贝构造函数\赋值运算符重载?或者简单地说,浅拷贝执行成员对象的用户定制的拷贝构造函数和赋值操作符,或者也执行浅拷贝?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-27 00:19:09

那么答案是肯定的,复制构造函数将被调用,但赋值操作符不会被调用。

将调用复制构造函数,因为调用了默认的复制构造函数,但未调用赋值运算符。默认的赋值运算符将调用默认的复制构造函数,默认的复制构造函数将调用基类的复制构造函数,但不调用默认的赋值运算符。

原因很简单:没有调用默认的赋值操作符,因为默认的赋值操作符被声明为"A& operator=(const A& a)“。

以上是使用调用约定( "= default“是成员函数调用约定)的情况。

票数 -2
EN

Stack Overflow用户

发布于 2021-01-27 00:21:33

术语“浅复制”用于描述在“浅复制”之后,两个对象以某种方式在内部引用同一对象的复制。因此,操作一个对象可能在概念上操作通过另一个对象可见的值。

除非存储在A中的int的值是对某个对象的引用,否则AB中的任何内容都不会引用对象。因此,这种对象的隐式定义副本不是“浅”的(或“深的”)。这种限定并不适用于没有引用其他对象的对象。

隐式定义的复制构造函数/赋值将执行每个子对象的成员级复制。只要这些子对象有复制构造函数/赋值运算符,它们就会被隐式定义的版本调用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65905010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档