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