一、不寫構造函數(shù)帶來的問題
- 屬性值未被初始化,是內(nèi)存上的臟數(shù)據(jù)
- 創(chuàng)建對象語句,于編譯期報錯:Using uninitialized memory
- 不同于java,屬性有默認值,C++屬性的初始值需要程序員手動指定
#include<iostream>
class Entity {
public:
int x, y;
void print() {
//-858993460 , -858993460
std::cout << x << " , " << y << std::endl;
}
};
int main() {
//1. 內(nèi)部方法調(diào)用時,會顯示未初始化的內(nèi)存數(shù)據(jù)
Entity e;
e.print();
//2. 外部直接訪問未初始化屬性的對象時,編譯報錯
//如果沒有構造函數(shù):編譯報錯:Using uninitialized memory 'e'.
// 如果有空構造函數(shù):-858993460 , -858993460
std::cout << e.x << " , " << e.y << std::endl;
}
二、隱藏構造函數(shù)的2種方式
- private
- delete
#include<iostream>
class Log {
private:
//1. 隱藏默認構造函數(shù)方式一
Log() {}
public:
//2. 隱藏默認構造函數(shù)方式二
//Log() = delete;
static void write(const char* message) {
std::cout << message << std::endl;
}
};
int main() {
Log::write("Hello");
Log log;
log.write("World");
}
三、析構函數(shù)
在當前棧區(qū)釋放時,該棧中的對象會背釋放,此時調(diào)用析構函數(shù)
#include<iostream>
class Entity {
public:
Entity() {
x = 0;
y = 0;
std::cout << "Create Entity!" << std::endl;
};
~Entity() {
std::cout << "Destroy Entity!" << std::endl;
};
int x, y;
void print() {
//-858993460 , -858993460
std::cout << x << " , " << y << std::endl;
}
};
//需要挪到main函數(shù)之外,能看到析構函數(shù)的調(diào)用
void testDestructor() {
Entity e;
e.print();
}
int main() {
//對象在棧上創(chuàng)建,當作用域(當前方法)結束時會被自動銷毀
//最后一行代碼:std::cin.get(); 執(zhí)行完成后, 當前棧被銷毀,e,被銷毀,執(zhí)行e的析構函數(shù)。但黑窗口已經(jīng)不見了
//所以將此調(diào)用移到main函數(shù)之外
//Entity e;
//如果沒有構造函數(shù):編譯報錯:Using uninitialized memory 'e'.
// 如果有空構造函數(shù):-858993460 , -858993460
//std::cout << e.x << " , " << e.y << std::endl;
//e.print();
testDestructor();
std::cin.get();
}