const成员-拷贝构造函数(copy constructor)-浅拷贝、深拷贝

const成员

  • const成员:被const修饰的成员变量、非静态成员函数
  • 必须类里面初始化
class Car {
public:
    const int m_price = 0;    //const常量设置
    Car() :m_price(0) {}    //也可以在构造函数中初始化
    void run() const {    //const一般写最后
        cout << "run()" << endl;

        m_price = 10;
    }
};

const成员函数

  • 两个同名函数构成了重载
void run() const {}
void run() {}

引用类型成员变量必须初始化

int age;
int & m_price = age;
car(int &price) :m_price(price) {}

拷贝构造函数(copy constructor)

  • 拷贝构造函数是构造函数的一种
  • 当利用已存在的对象创建一个新对象时(类似于拷贝),就会调用新对象的拷贝构造函数进行初始化
  • 拷贝构造函数的格式是固定的,接收一个const引用作为参数
//拷贝构造函数
Car(const Car &car) {
    cout << "Car(const Car &car)" << endl;
}
Car car4(car3);

浅拷贝

浅拷贝:指针类型的变量只会拷贝地址值

  • 编译器默认的提供的拷贝是浅拷贝(shallow copy)

  • 堆空间指向栈空间都很危险
    栈空间随机都可能回收,堆空间可以自己控制

  • 在堆空间再申请一个空间用于拷贝

深拷贝

public:
    Car(int price = 0, char *name = NULL) :m_price(price){
        if (name == NULL ) return;

        // 申请新的堆空间
        m_name = new char[strlen(name) + 1] {};
        // 拷贝字符串数据到新的堆空间
        strcpy(m_name, name);
    }

    ~Car(){
        if (m_name == NULL) return;
        delete[] m_name;
        m_name = NULL;
    }

  • 浅拷贝(shallow copy):指针类型的变量只会拷贝地址值
  • 深拷贝(deep copy):将指针指向的内容拷贝到新的存储空间
    Car(const Car &car) :m_price(car.m_price) {
        if (car.name == NULL ) return;

        // 申请新的堆空间
        m_name = new char[strlen(name) + 1] {};
        // 拷贝字符串数据到新的堆空间
        strcpy(m_name, name);
    }
原文地址:https://www.cnblogs.com/sec875/p/12328947.html