C++_拷贝构造函数/赋值运算

一、拷贝构造函数/复制构造函数:

如果一个类中的只有普通成员变量,可以不定义拷贝构造函数,,
当一个类存在指针变量时,必须定义拷贝构造函数。

二、深拷贝/浅拷贝:

当类中存在指针变量时,如采用浅拷贝,两个指针会指向同一个地址,调用析构函数时,同一块内存析构两次。

浅拷贝指针指向同一块内存,并不重新开辟内存

//浅拷贝:并未对指针分配内存,同一块内存地址析构两次,会发生内存泄漏
class Student
{
private:
int num;
char* name;
public:
Student();
~Student();
};
Student::Student()
{
name = new char(20);
cout << "Student" << endl;
}
Student::~Student()
{
cout << "~Student" << int(name) << endl;
delete name;
name = nullptr;
}
int main()
{
Student s1;
Student s2(s1);
}

 


 

 
//深拷贝:对指针变量重新分配内存
class Student
{
private:
    int num;
    char* name;
public:
    Student();
    ~Student();
    Student(const Student& s);
};
Student::Student()
{
    name = new char(20);
    cout << "Student" << endl;
}
Student::~Student()
{
    cout << "~Student"  << endl;
    delete name;
    name = nullptr;
}
Student::Student(const Student& s)
{
    cout << "copy construct" << endl;
    name = new char(20);
    memcpy(name,s.name, strlen(s.name));
    
}
int main()
{
    Student s1;
    Student s2(s1);
}

三、拷贝构造函数调用三种情况

 

1.一个对象去初始化另外一个对象(该对象并并未初始化)。
2.函数的参数为类对象,值传递。
3.函数返回值一个对象,值传递。

 

include <iostream>
using namespace std;

class Example
{
public:
    int a;
public:
    Example(int b)
    {
        a = b;
        cout << "default constrcut" << endl;
    }
    Example(const Example& C)
    {
        a = C.a;
        cout << "copy construct" << endl;
    }
    
    ~Example()
    {
        cout << "destory" << endl;
        //cout <<"memory ad "<<this << endl;
    }
    void operator=(const Example &ex)
    {
        cout << "operator=" << endl;
    }
};
void test_a(Example c)
{
    Example a = c;
}
Example test()
{
    Example c(5);
    cout << c.a << endl;
    return c;
}

int main()
{
    Example A(100);
    //第一种情况,一个对象去初始化另一个对象  //调用拷贝构造函数
    Example B(A);
    Example C(5);
    //当一个对象已经初始化,并不会调用拷贝构造函数
    //赋值运算
    C = A;
    //第二种情况,函数的参数为类对象,并为值传递 //调用拷贝构造函数
    test_a(A);
    //第三种情况,函数返回值为类对象,并为值传递 //调用拷贝构造函数
    test();
}

 

 

四、拷贝构造函数和重载运算的调用区别:

1.一个对象构造一个未初始化的对象(拷贝构造)
2.一个对象构造另一个已初始化的对象(赋值运算)

posted on 2021-05-11 22:02  Animer  阅读(109)  评论(0编辑  收藏  举报