在 C++ 中,赋值运算符和复制构造函数都用于复制对象,但它们的应用场景和工作方式有所不同:
复制构造函数
复制构造函数用于创建一个新的对象作为已存在对象的副本。在以下情况下会调用复制构造函数:
- 当一个新对象被创建,并用已存在的同类型对象进行初始化时。
- 当一个对象被作为函数的参数按值传递时。
- 当一个对象从函数返回并按值返回时。
示例:
cppclass Example { public: int a; Example(int x) : a(x) {} // 普通构造函数 Example(const Example& other) { // 复制构造函数 a = other.a; } }; int main() { Example obj1(10); // 调用普通构造函数 Example obj2 = obj1; // 调用复制构造函数 return 0; }
在这个例子中,obj2
是通过复制构造函数创建的,它的初值取自 obj1
。
赋值运算符
赋值运算符用于将一个已存在的对象的状态复制到另一个已存在的对象。这通常发生在两个对象都已被创建后。
示例:
cppclass Example { public: int a; Example(int x) : a(x) {} // 普通构造函数 Example& operator=(const Example& other) { // 赋值运算符 if (this != &other) { // 避免自赋值 a = other.a; } return *this; } }; int main() { Example obj1(10); // 调用普通构造函数 Example obj2(20); // 调用普通构造函数 obj2 = obj1; // 调用赋值运算符 return 0; }
在这个例子中,obj1
和 obj2
都是独立创建的。之后,我们使用赋值运算符将 obj1
的状态复制到 obj2
。
总结
总的来说,复制构造函数在新对象创建时被调用,用于初始化新对象作为其他对象的副本;而赋值运算符则是在两个已存在的对象之间复制数据。赋值运算符需要处理自赋值的情况并通常返回对自身的引用。
2024年6月29日 12:07 回复