首页 > 编程语言 > 详细

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

时间:2021-05-12 00:29:57      阅读:23      评论:0      收藏:0      [点我收藏+]

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

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

二、深拷贝/浅拷贝:

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

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

//浅拷贝:并未对指针分配内存,同一块内存地址析构两次,会发生内存泄漏
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);
}

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

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.一个对象构造另一个已初始化的对象(赋值运算)

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

原文:https://www.cnblogs.com/zsymdbk/p/14757597.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!