C++ C++;在=运算符中复制构造函数和重载情况

C++ C++;在=运算符中复制构造函数和重载情况,c++,g++,C++,G++,在下面的代码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 cons

在下面的代码
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;
}
#包括
使用名称空间std;
类代码{
int-id;
公众:
代码(){}//默认构造函数
代码(INTA){
id=a;
}
代码(代码和x){//复制构造函数
id=x.id;
}
无效显示(){

cout未调用复制构造函数,因为调用了隐式定义的复制赋值运算符。其形式如下:

T& T::operator=(const T&)

初始化期间可以调用复制构造函数:

code d = a;
在代码中:

code d;
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;
}
当您需要递归复制每个子对象的默认行为以外的其他行为时。在您的情况下,默认行为只是复制
id
值。这也是复制构造函数的默认行为,因此您也不需要提供


是一个很好的指南,当你需要提供这些运算符时,你通常需要在你的类管理另一个资源的生命周期时,它在它的析构函数中释放。你需要非标准的复制语义,这样你就不会有两个对象试图释放相同的资源。

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

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

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

在这份声明中

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


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

修复缩进样式plzany Rational编译器将看到,在第一个c=a之后,第二个c=a没有效果。您如何注意到是否调用了复制cstr?好吧,我可能错了我的最后一句话,但我仍然想知道你怎么知道它是否被调用