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);
}
![](https://img2020.cnblogs.com/blog/2035031/202105/2035031-20210511220149366-1451356559.png)
//深拷贝:对指针变量重新分配内存
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.一个对象构造另一个已初始化的对象(赋值运算)