系统会自动生成一个默认的无参的构造函数,如果你声明了有参构的造函数,那么无参构造就会不主动创建。

当类为空时,编译器会为这个类合成默认的构造函数、析构函数、拷贝构造函数、赋值重载函数。 编译器合成的默认函数都是public的,不是private。因为如果类中构造函数是私有的,就不能在类的外部创建对象。

class Demo
{

};
void func()
{
    Demo d1,d2,d5;  //默认构造函数
    Demo d3(d1);    //默认拷贝构造函数
    Demo d4 = d2;   //默认拷贝构造函数
    d5 = d4;        //默认赋值重载

    //局部对象自动销毁,调用默认析构函数
}
int main()
{
    func();
    return 0;
}

# 触发

class A
{
public:
    A()
    {
        cout << "A";
    }
};
A a;            // A
A a2[2];        // A A
A *a3;          // 无
new A;          // A
A *a4 = new A;  // A

# 构造函数与继承

派生类的构造函数会隐含调用基类的构造函数.

如果基类中没有缺省构造函数,那么派生类必须定义构造函数.

在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数

在销毁派生类对象时,先调用子类的析构函数,再调用基类的析构函数

class A
{
public:
    A()
    {
        cout << "A::A" << endl;
    }
    ~A()
    {
        cout << "A::~A" << endl;
    }
};
class B : public A
{
public:
    B()
    {
        cout << "B::B" << endl;
    }
    ~B()
    {
        cout << "B::~B" << endl;
    }
};
B b; 
/**
A::A
B::B
B::~B
A::~A
*/
A* p = NULL;    // 没有
p = new B;      // A::A, B::B
delete p;       // A::~A

指针声明没有, 赋值才有;没有B的析构.

因为B的构造会先去调用A的构造, 然后B的对象被转化为A的类型(A*), 这就是为什么最后析构的是A对象.

# member initializer list

  • 初始化私有变量必须用这种格式
class MyClass {
public:
    MyClass(int a, int b): regVar(a), constVar(b){}

private:
    int regVar;
    const int constVar;
};
  • 继承
// 仅有继承的变量
Derived(int x,int y):Base(x,y){}

// 继承的变量+子类独有的
Derived(int x,int y,int z,int m):Base(x,y){c=z; d=m;}