📜  在C++中复制构造函数与赋值运算符(1)

📅  最后修改于: 2023-12-03 15:23:22.673000             🧑  作者: Mango

在C++中复制构造函数与赋值运算符

C++中的复制构造函数和赋值运算符是用于创建和复制对象的两个关键特性。在面向对象编程中,这两个特性常常被用于创建和复制类的实例。以下是对两个特性的详细讲解。

复制构造函数

复制构造函数是一个特殊的构造函数,用于创建一个对象的副本。它将一个已有的对象作为函数参数,并且会创建一个新的与该对象完全相同的对象。复制构造函数是使用以下语法定义的:

<类名> (const <类名> &obj) { //复制构造函数代码 }

其中,参数obj是要复制的对象。复制构造函数在以下情况下被调用:

  • 当使用对象初始化另一个对象时,如:

    MyClass obj2(obj1); //obj1是一个已有的MyClass对象,obj2是其副本
    
  • 当对象作为函数参数时,如:

    void myFunction(MyClass obj) {...} //obj是一个MyClass的副本
    
  • 当对象作为函数返回值时,如:

    MyClass myFunction() {... return obj; } //返回一个MyClass对象的副本
    

以下是一个示例程序,演示如何创建和使用复制构造函数:

#include <iostream>
using namespace std;

class MyClass
{
    public:
        int x, y;

        MyClass() { //默认构造函数
            x = 0;
            y = 0;
        }

        MyClass(int a, int b) { //自定义构造函数
            x = a;
            y = b;
        }

        MyClass(const MyClass& obj) { //复制构造函数
            x = obj.x;
            y = obj.y;
            cout << "Object copied." << endl;
        }
};

int main()
{
    MyClass obj1(1, 2);
    MyClass obj2 = obj1;
    MyClass obj3(obj1);

    cout << "obj1: " << obj1.x << " " << obj1.y << endl;
    cout << "obj2: " << obj2.x << " " << obj2.y << endl;
    cout << "obj3: " << obj3.x << " " << obj3.y << endl;

    return 0;
}

上述代码将输出以下内容:

Object copied.
obj1: 1 2
obj2: 1 2
Object copied.
obj3: 1 2

复制构造函数可用于提高程序性能,特别是在传递对象作为参数时。例如,在以下情况下,复制构造函数可用于提高性能:

void myFunction(MyClass obj) {...} //obj对象是按值传递的副本

如果没有复制构造函数,将使用默认的拷贝构造函数进行拷贝。这将导致多次调用构造函数,浪费资源。通过编写自己的复制构造函数,可以避免这种情况。

赋值运算符

C++中的赋值运算符(=)是一个二元运算符,用于将一个对象的值赋给另一个对象。赋值运算符可用于使用一个已有的对象初始化另一个对象,也可用于将一个对象值赋给另一个对象。以下是赋值运算符的语法:

<类名> &operator = (const <类名> &obj) { //赋值运算符代码 }

其中,参数obj是要复制的对象。赋值运算符在以下情况下被调用:

  • 当用一个对象初始化另一个对象时,如:

    MyClass obj2;
    obj2 = obj1; //obj1是已有的MyClass对象
    
  • 当使用对象作为函数返回值时,如:

    MyClass myFunction() { ... return obj; } //返回一个MyClass对象
    ...
    MyClass obj = myFunction();
    

以下是一个示例程序,演示如何创建和使用赋值运算符:

#include <iostream>
using namespace std;

class MyClass
{
    public:
        int x, y;

        MyClass() { //默认构造函数
            x = 0;
            y = 0;
        }

        MyClass(int a, int b) { //自定义构造函数
            x = a;
            y = b;
        }

        MyClass(const MyClass& obj) { //复制构造函数
            x = obj.x;
            y = obj.y;
            cout << "Object copied." << endl;
        }

        MyClass& operator=(const MyClass& obj) { //赋值运算符
            x = obj.x;
            y = obj.y;
            cout << "Object assigned." << endl;
            return *this;
        }
};

int main()
{
    MyClass obj1(1, 2);
    MyClass obj2 = obj1;
    MyClass obj3;

    obj3 = obj1;

    cout << "obj1: " << obj1.x << " " << obj1.y << endl;
    cout << "obj2: " << obj2.x << " " << obj2.y << endl;
    cout << "obj3: " << obj3.x << " " << obj3.y << endl;

    return 0;
}

上述代码将输出以下内容:

Object copied.
Object assigned.
obj1: 1 2
obj2: 1 2
Object assigned.
obj3: 1 2

赋值运算符还可以返回对象的引用,以实现链式赋值。以下是一个示例:

MyClass obj1, obj2, obj3;
...
obj1 = obj2 = obj3;

在此示例中,将先将obj3的值赋给obj2,然后将obj2的值赋给obj1。

总结

在C++中,复制构造函数和赋值运算符是用于创建和复制对象的重要特性。使用这些特性可以提高程序性能并避免资源浪费。熟练掌握这些特性是每位C++程序员的必备技能。