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