类中自定义了拷贝函数,编译器自带的拷贝函数还存在吗
时间: 2023-12-09 12:06:28 浏览: 67
C++规定与类同名的函数就是拷贝构造函数
当我们在类中定义了自己的拷贝构造函数或拷贝赋值运算符函数时,编译器会默认生成一个默认的拷贝构造函数和拷贝赋值运算符函数,但它们并不像没有自定义的那么简单。
默认的拷贝构造函数和拷贝赋值运算符函数是按位拷贝的,也就是说,它们仅仅是将一个对象中的所有成员变量的值复制到另一个对象中。对于一些含有指针成员变量的类来说,这种简单的复制往往会导致内存泄漏、野指针等问题。
因此,当类中定义了自定义的拷贝构造函数和拷贝赋值运算符函数时,编译器不会产生默认的拷贝构造函数和拷贝赋值运算符函数。
需要注意的是,如果我们确实需要按位拷贝,可以显式地调用编译器生成的默认拷贝构造函数和拷贝赋值运算符函数,例如:
```cpp
class Person {
public:
int age;
char* name;
// 自定义拷贝构造函数
Person(const Person& p) {
age = p.age;
name = new char[strlen(p.name) + 1];
strcpy(name, p.name);
}
// 自定义拷贝赋值运算符函数
Person& operator=(const Person& p) {
if (this != &p) {
age = p.age;
delete[] name;
name = new char[strlen(p.name) + 1];
strcpy(name, p.name);
}
return *this;
}
};
int main() {
Person p1;
p1.age = 20;
p1.name = new char[6];
strcpy(p1.name, "Alice");
// 调用默认拷贝构造函数
Person p2 = p1;
// 调用默认拷贝赋值运算符函数
Person p3;
p3 = p1;
delete[] p1.name;
delete[] p2.name;
delete[] p3.name;
return 0;
}
```
阅读全文