首页 > 编程语言 >[C++ Daily] 确保类复制了所有应该复制的成员

[C++ Daily] 确保类复制了所有应该复制的成员

时间:2024-09-09 09:48:12浏览次数:10  
标签:rhs Derived C++ Base Daily 复制 date 拷贝 赋值

确保类复制了所有应该复制的成员

image-20240909093304369

image-20240909093331287

image-20240909093344474

结果:

image-20240909093409415

源代码:

#include <iostream>
#include <string>
#include <vector>
/**
 * copy操作应该包含对象内的所有成员变量及所有父类的成员变量,
 * 此种可以通过调用对应的拷贝构造与拷贝赋值操作完成
 */

/// @brief simple terminal print
/// @param msg 
void log_w(const char* msg) {
    std::cout << msg << std::endl;
}
/// @brief 用户自定义类,包含拷贝构造与拷贝复制操作,操作对象成员为int基本内置类型
class Date {
    public:
    Date() = default;
    ~Date() = default;

    Date(const Date& rhs):day_(rhs.day_) {
        log_w("Date copy construct");
    }

    Date& operator=(const Date& rhs) {
        log_w("Date copy assignment function");
        this->day_ = rhs.day_;
        return *this;
    }

    private:
    int day_;
};

/// @brief 基类,包含拷贝构造与拷贝赋值函数,操作对象成员为std::string stl型str_与用户自定义型Date date_;
class Base {
    public:

    Base() = default;
    ~Base() = default;

    Base(const Base& rhs):str_(rhs.str_),date_(rhs.date_) {
        log_w("Base copy construct");
    }

    Base& operator=(const Base& rhs) {
        log_w("Base copy assignment function");
        str_ = rhs.str_;
        date_ = rhs.date_;
        return *this;
    }

    private:
    std::string str_;
    Date date_;
};

/// @brief 派生类(:Base),包含stl型std::vector及继承Base的private成员;
class Derived : public Base {
    public:
    Derived() = default;
    ~Derived() = default;
    //此处初始化组调用父类的拷贝构造函数进行构造
    Derived(const Derived& derived):vec_(derived.vec_),Base(derived) {
        log_w("Derived copy construct");
    }
    //此处赋值调用父类的拷贝赋值函数进行赋值
    Derived& operator= (const Derived& rhs) {
        log_w("Derived copy assignment function");
        Base::operator=(rhs);
        vec_ = rhs.vec_;
        return *this;
    }

    private:
    std::vector<int> vec_;
};

int main() {
    Date date_1;    //构造
    Date date_2(date_1);    //拷贝构造
    date_2 = date_1;    //拷贝赋值

    Base base_1;    //构造
    Base base_2(base_1);    //拷贝构造
    base_2 = base_1;    //拷贝赋值

    Derived d_1;    //构造
    Derived d_2(d_1);   //拷贝构造
    d_2 = d_1;  //拷贝赋值

    return 0;
}

标签:rhs,Derived,C++,Base,Daily,复制,date,拷贝,赋值
From: https://www.cnblogs.com/NekoBlog/p/18403960

相关文章

  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • 【C++学习笔记】数组与指针(三)
    目录一、数组1.1数组声明与赋值1.2数组的特点特点1:任意类型均可创建数组特点2:固定大小特点3:内存连续且有序特点4:C++无数组下标越界错误特点5:数组变量不记录数据1.3遍历数组普通for循环foreach增强循环1.4字符数组1.5多维数组二维数组三维数组遍历二维数......
  • 【C++学习笔记】逻辑判断语句与循环语句(二)
    目录一、逻辑判断语句1.1ifelse语句1.2 switch语句1.3枚举类型二、循环语句2.1while循环2.2dowhile循环2.3for循环2.4break与continue关键字2.5goto语句一、逻辑判断语句1.1ifelse语句#include"iostream"usingnamespacestd;intmain(){......
  • 【C++】list(下)
    个人主页~list(上)~list四、模拟实现1、list.h(1)关于整个list的搭建①节点②迭代器③接口(2)自定义类型实例化2、test.cpp(1)test1(2)test2五、额外小知识四、模拟实现1、list.h#pragmaonce#include<iostream>namespacelittle_monster{ template<classT> ......
  • c++的初始化列表与const成员
    初始化列表与const成员const成员使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。在定义const成员时......
  • c++的构造函数与析构函数
    构造函数与析构函数构造函数1、什么构造函数类、结构、联合中的特殊成员函数,与类名、结构名、联合名同的成员函数,没有返回值。class类名{public:  类名(参数列表) {     }};2、何时调用构造函数当创建类对象时(实例化对象)会自动调用构造函......
  • [C++#33][异常] 错误码 | 抛出与捕获 | 异常安全 | 异常体系
    目录C语言与C++错误处理方式的对比及应用一、C语言传统的错误处理方式1.终止程序:assert2.返回错误码缺点:二、C++中的异常处理机制1.基本概念2.异常的抛出与捕获3.异常的重新抛出三、C++中的异常安全1.构造函数与析构函数的异常2.RAII(资源获取即初始化)3.使......
  • C++17: 用折叠表达式实现一个IsAllTrue函数
    前言让我们实现一个IsAllTrue函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true。本文记录了逐步实现与优化该函数的思维链,用到了以下现代C++新特性知识,适合对C++进阶知识有一定了解的人。这样一种从实际问题来学习和运用知识的过程还是挺有趣的,特此整理分......
  • C++笔记19•数据结构:红黑树(RBTree)•
    红黑树1.简介:    红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。当搜索二叉树退化为单支树时,搜......
  • C++:类与对象
    一、面向对象编程(一)面向过程vs面向对象   面向过程(Procedural-Oriented-Programming, POP)和面向对象(Object-Oriented-Programming,OOP),是两种典型的编程范式,通常是作为划分编程语言的一大依据,在许多现代编程语言中都会有面向对象的编程范式,这是因为其与现实世界的良好......