标题:详解C++ 拷贝构造函数和赋值运算符
什么是拷贝构造函数和赋值运算符
在C++中,每一个类都有一个默认的拷贝构造函数和赋值运算符。拷贝构造函数和赋值运算符的作用是对一个已经存在的对象进行复制。
拷贝构造函数用于创建一个新对象并将某个已经存在的对象的值赋给它。赋值运算符则在已有对象上操作。
拷贝构造函数
拷贝构造函数的定义格式如下:
ClassName(const ClassName &object);
其中,ClassName是类名,object是另一个与ClassName相同类型的对象。拷贝构造函数的作用是将参数对象的值复制到当前对象中。
假设有以下的代码:
#include <iostream>
using namespace std;
class Person {
public:
// 构造函数
Person(const char *s = "", int a = 0) : age(a) {
name = new char[strlen(s) + 1];
strcpy_s(name, strlen(s) + 1, s);
}
// 拷贝构造函数
Person(const Person &p) : age(p.age) {
name = new char[strlen(p.name) + 1];
strcpy_s(name, strlen(p.name) + 1, p.name);
}
// 析构函数
~Person() {
delete[] name;
}
void ShowInfo() {
cout << "Name: " << name << ", Age: " << age << endl;
}
private:
char *name;
int age;
};
int main() {
Person p1("Tom", 20);
Person p2 = p1; // 这是拷贝构造函数的调用
p1.ShowInfo();
p2.ShowInfo();
return 0;
}
运行结果:
Name: Tom, Age: 20
Name: Tom, Age: 20
可以看到,p2是通过p1的拷贝构造函数创建出来的,两个对象的属性值完全相同。
赋值运算符
赋值运算符的定义格式如下:
ClassName &operator=(const ClassName &object);
其中,ClassName是类名,object是另一个与ClassName相同类型的对象。赋值运算符的作用是将参数对象的值赋给当前对象。
假设有以下的代码:
#include <iostream>
using namespace std;
class Person {
public:
// 构造函数
Person(const char *s = "", int a = 0) : age(a) {
name = new char[strlen(s) + 1];
strcpy_s(name, strlen(s) + 1, s);
}
// 拷贝构造函数
Person(const Person &p) : age(p.age) {
name = new char[strlen(p.name) + 1];
strcpy_s(name, strlen(p.name) + 1, p.name);
}
// 赋值运算符
Person &operator=(const Person &p) {
if (this != &p) {
delete[] name;
name = new char[strlen(p.name) + 1];
strcpy_s(name, strlen(p.name) + 1, p.name);
age = p.age;
}
return *this;
}
// 析构函数
~Person() {
delete[] name;
}
void ShowInfo() {
cout << "Name: " << name << ", Age: " << age << endl;
}
private:
char *name;
int age;
};
int main() {
Person p1("Tom", 20);
Person p2;
p2 = p1; // 这是赋值运算符的调用
p1.ShowInfo();
p2.ShowInfo();
return 0;
}
运行结果:
Name: Tom, Age: 20
Name: Tom, Age: 20
可以看到,p2是通过p1的赋值运算符创建出来的,两个对象的属性值完全相同。
总结
拷贝构造函数和赋值运算符是C++编程中必须掌握的内容。拷贝构造函数用于创建新对象,并从已有对象中复制值;赋值运算符则在已有对象上操作。在使用拷贝构造函数和赋值运算符时,需要注意深拷贝和浅拷贝的区别,避免出现内存泄漏等问题。另外,C++也提供了默认的拷贝构造函数和赋值运算符,在使用时需要对其进行调整,以满足具体的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++ 拷贝构造函数和赋值运算符 - Python技术站