gpt4 book ai didi

C++ 复制构造函数和重载 = 运算符的案例

转载 作者:行者123 更新时间:2023-11-30 05:46:28 25 4
gpt4 key购买 nike

在下面的代码中,d = a; 没有调用复制构造函数。

a 是如何复制到 d 的?或者在什么情况下我们必须重载 = 运算符?

#include<iostream>
using namespace std;

class code{
int id;

public:
code(){}//default constructor

code(int a){
id=a;
}

code(code & x){//copy constructor
id=x.id;
}

void display(){
cout<<id;
}
};

int main(){


code a(100);
code b(a);//copy constructor is called
code c=a;//copy constructor is called again
code d;
c=a;//copy constructor is not called this time

std::cout << "\n id of A: ";
a.display();
cout << "\n id of B: ";
b.display();
cout << "\n id of C: ";
c.display();
cout << "\n id of D: ";
d.display();
return 0;
}

我怎样才能有效地实现复制构造函数?

最佳答案

根据C++标准(12.8复制和移动类对象)

18 如果类定义没有显式声明复制赋值运算符,则隐式声明一个。如果类定义声明了移动构造函数或移动赋值运算符,则隐式声明的复制赋值运算符被定义为已删除;否则,它被定义为默认 (8.4)。如果类具有用户声明的复制构造函数或用户声明的析构函数,则不推荐使用后一种情况。类 X 的隐式声明的复制赋值运算符将具有以下形式

28 非 union 类 X 的隐式定义复制/移动赋值运算符对其子对象执行成员复制/移动赋值

在这个声明中

c=a;

使用编译器复制赋值运算符隐式定义,因为类没有显式定义它,它执行对象数据成员的成员复制(对于此类定义,它是数据成员 int id;)

当对象的子对象的成员方式复制不满足类要求时,您需要显式定义复制赋值运算符。

关于C++ 复制构造函数和重载 = 运算符的案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28900758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com