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);
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM