📜  C ++ |类和对象|问题4(1)

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

C++ | 类和对象 | 问题4

概述

本篇介绍C++中类和对象的问题4。问题主要涉及到如何在C++中实现拷贝构造函数和拷贝赋值运算符。

拷贝构造函数

拷贝构造函数是一个特殊的构造函数,用于在创建一个新对象时,以另一个同类型的对象作为参数,从而将这个新的对象初始化为参数对象的一个副本。

拷贝构造函数的一般形式如下:

class MyClass {
public:
    MyClass(const MyClass& other) {
        // 实现拷贝构造函数
    }
};

其中,参数为const MyClass& other,表示要拷贝的对象是一个同类型的常引用。在函数体中,可以使用参数对象的数据成员来初始化新对象的对应成员。

需要注意的是,如果一个类没有自定义的拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数,其实现方式是按成员逐一拷贝。但是,如果类中包含指针或其他资源,这种方式可能会产生问题。

拷贝赋值运算符

基本上和拷贝构造函数相似,赋值运算符也需要为对象提供一份与另一个同类对象相同的副本。

拷贝赋值运算符的一般形式如下:

class MyClass {
public:
    MyClass& operator=(const MyClass& other) {
        // 实现拷贝赋值运算符
        return *this;
    }
};

其中,返回类型为MyClass&,表示赋值后的对象本身,以支持链式赋值。还需要注意的是,在函数体中,要避免发生自我赋值,即对象自身等于自身。

示例

下面是一个示例,演示了在C++中如何实现拷贝构造函数和拷贝赋值运算符。

#include <iostream>

class MyClass {
public:
    MyClass(int value = 0) : m_value(new int(value)) {
        std::cout << "Constructor" << std::endl;
    }

    ~MyClass() {
        delete m_value;
        std::cout << "Destructor" << std::endl;
    }

    // 拷贝构造函数
    MyClass(const MyClass& other) : m_value(new int(*other.m_value)) {
        std::cout << "Copy constructor" << std::endl;
    }

    // 拷贝赋值运算符
    MyClass& operator=(const MyClass& other) {
        std::cout << "Copy assignment operator" << std::endl;
        if(this != &other) {
            delete m_value;
            m_value = new int(*other.m_value);
        }
        return *this;
    }

private:
    int* m_value;
};

int main() {
    MyClass a(100);
    MyClass b(a);
    MyClass c;
    c = b;
    return 0;
}

输出结果:

Constructor
Copy constructor
Constructor
Copy assignment operator
Destructor
Destructor
Destructor

可以看到,程序首先创建一个MyClass对象a,然后通过拷贝构造函数创建了bc,最后又通过拷贝赋值运算符将b赋值给了c。在程序结束前,三个对象都被销毁,并输出了相应的提示信息。

总结

本篇介绍了C++中类和对象的问题4,主要介绍了如何在C++中实现拷贝构造函数和拷贝赋值运算符。拷贝构造函数用于在创建一个新对象时,以另一个同类型的对象作为参数,从而将这个新的对象初始化为参数对象的一个副本;拷贝赋值运算符则用于为对象提供一份与另一个同类对象相同的副本。需要注意的是,在实现这两个函数时,要避免发生自我赋值以及正确处理类中的指针和其他资源。