1. 构造函数与析构函数的机制
构造函数,在对象被创建时调用;析构函数在对象被释放的时候调用。在创建类时,如果用户没有显示的定义构造函数/析构函数,编译器将会创建默认构造函数/析构函数。
2. 如何只创建静态变量(例如: A a),以及如何只创建动态变量(例如: A *a = new A)
如果用户定义静态变量(A a), 编译器将自动调用构造函数创建对象在栈上,编译器负责其的生命周期的管理,在变量离开作用域时,编译器自动调用析构函数释放内存。
如果只允许用户创建静态变量(A a), 只需将操作符new与delete定义为private成员即可,如下:
class A
{
private:
void* operator new(size_t size);
void operator delete(void* ptr);
如果用户定义动态变量(例如: A *a = new A),操作符new会在堆上申请内存空间,并调用构造函数对变量进行初始化,用户自行维护变量的生命周期,显式调用delete操作符释放内存。
如果只允许用户创建动态变量(例如: A *a = new A), 只需设置析构函数为private 即可,由于创建静态对象时,编译器要检查类中非静态函数(包括析构函数),如果析构函数是private,编译器将不能创建变量,编译器将会报错, 定义如下:
class A
{
private:
~A();
const 成员变量需要在构造函数的初始化列表中定义。