nihbf 2024-04-22 00:36 采纳率: 8.3%
浏览 3

C++教材课后习题第三章(1)

请你用c++语言完成任务:设计一个具有拷贝构造、复制赋值、移动 构造和移动赋值功能的CSamplePart类,再设计一个含类型为CSamplePart的数据成员的 类,让编译器为你合成拷贝构造、移动构造、复制赋值和移动赋值。编写测试程序,测试·合成的拷贝控制函数的效果。

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-22 00:36
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个需求,我们首先创建一个名为CSamplePart的类,包含拷贝构造函数、复制赋值运算符、移动构造函数和移动赋值运算符。然后,我们将创建另一个类CContainer,它有一个CSamplePart类型的成员变量,并且利用编译器自动合成的拷贝控制函数。接下来是详细的步骤和代码示例。

    首先,定义CSamplePart类:

    #include <iostream>
    
    class CSamplePart {
    public:
        // 默认构造函数
        CSamplePart() : m_data(0) {}
    
        // 拷贝构造函数
        CSamplePart(const CSamplePart& other) : m_data(other.m_data) {
            std::cout << "Copy constructor called.\n";
        }
    
        // 复制赋值运算符
        CSamplePart& operator=(const CSamplePart& other) {
            if (this != &other) {
                m_data = other.m_data;
                std::cout << "Copy assignment operator called.\n";
            }
            return *this;
        }
    
        // 移动构造函数
        CSamplePart(CSamplePart&& other) noexcept : m_data(std::exchange(other.m_data, 0)) {
            std::cout << "Move constructor called.\n";
        }
    
        // 移动赋值运算符
        CSamplePart& operator=(CSamplePart&& other) noexcept {
            if (this != &other) {
                m_data = std::exchange(other.m_data, 0);
                std::cout << "Move assignment operator called.\n";
            }
            return *this;
        }
    
        int GetData() const { return m_data; }
    private:
        int m_data;
    };
    

    接下来,定义CContainer类,它包含一个CSamplePart类型的成员变量:

    class CContainer {
    public:
        CContainer() : m_part(0) {}
        ~CContainer() {}
    
        // 使用编译器自动生成的拷贝构造函数、移动构造函数、复制赋值运算符和移动赋值运算符
    
        CSamplePart GetPart() const { return m_part; }
        void SetPart(const CSamplePart& part) { m_part = part; }
        void SetPart(CSamplePart&& part) { m_part = std::move(part); }
    
    private:
        CSamplePart m_part;
    };
    

    最后,编写测试程序:

    int main() {
        // 创建CContainer对象并初始化
        CContainer container1;
        container1.SetPart(CSamplePart{42});
    
        // 测试拷贝构造函数
        CContainer container2(container1);
        std::cout << "container2's part: " << container2.GetPart().GetData() << "\n";
    
        // 测试复制赋值运算符
        CContainer container3;
        container3 = container2;
        std::cout << "container3's part: " << container3.GetPart().GetData() << "\n";
    
        // 测试移动构造函数
        CContainer container4(std::move(container3));
        std::cout << "container4's part: " << container4.GetPart().GetData() << "\n";
    
        // 测试移动赋值运算符
        container1 = std::move(container4);
        std::cout << "container1's part after move: " << container1.GetPart().GetData() << "\n";
    
        return 0;
    }
    

    这段代码会输出创建和操作CContainer对象时调用的各种拷贝和移动操作的相关信息。注意,由于移动构造函数和移动赋值运算符涉及到资源的转移,它们通常不会保留原对象的状态,因此在移动之后,原来的对象可能不再是初始状态。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月22日