diff --git "a/\347\274\226\347\250\213\350\257\255\350\250\200C++.md" "b/\347\274\226\347\250\213\350\257\255\350\250\200C++.md" index 250e421..3febc22 100644 --- "a/\347\274\226\347\250\213\350\257\255\350\250\200C++.md" +++ "b/\347\274\226\347\250\213\350\257\255\350\250\200C++.md" @@ -245,9 +245,9 @@ C/C++的内容又多又杂,常常看到有人罗列相关书单,觉得毫无 3. 对象存储空间? - 非静态成员的数据类型大小之和。 -    - 编译器加入的额外成员变量(如指向虚函数表的指针)。 + - 编译器加入的额外成员变量(如指向虚函数表的指针)。 - - 为了边缘对齐优化加入的panding。 + - 为了边缘对齐优化加入的padding。 4. C++空类有哪些成员函数? - 首先,空类大小为1字节。 @@ -270,11 +270,15 @@ C/C++的内容又多又杂,常常看到有人罗列相关书单,觉得毫无 - 析构函数可以是纯虚函数,含有纯虚函数的类是抽象类,此时不能被实例化。但派生类中可以根据自身需求重新改写基类中的纯虚函数。 - 构造函数: - - 构造函数不能定义为虚函数,不仅如此,构造函数中还不能调用虚函数。因为那样实际执行的是父类对应的函数,因为自己还没有构造好(构造顺序先基类再派生类)。 + - 构造函数不能定义为虚函数。在构造函数中可以调用虚函数,不过此时调用的是正在构造的类中的虚函数,而不是子类的虚函数,因为此时子类尚未构造好。 6. 构造函数调用顺序,析构函数呢? + - 调用所有虚基类的构造函数,顺序为从左到右,从最深到最浅 + - 基类的构造函数:如果有多个基类,先调用纵向上最上层基类构造函数,如果横向继承了多个类,调用顺序为派生表从左到右顺序。 + - 如果该对象需要虚函数指针(vptr),则该指针会被设置从而指向对应的虚函数表(vtbl)。 + - 成员类对象的构造函数:如果类的变量中包含其他类(类的组合),需要在调用本类构造函数前先调用成员类对象的构造函数,调用顺序遵照在类中被声明的顺序。 - 派生类的构造函数。 @@ -362,7 +366,7 @@ C/C++的内容又多又杂,常常看到有人罗列相关书单,觉得毫无 - 全局范围中的对象:构造函数在所有函数调用之前执行,在主函数执行完调用析构函数。 - - 局部自动对象:建立对象时调用构造函数,函数结束时调用析构函数。 + - 局部自动对象:建立对象时调用构造函数,离开作用域时调用析构函数。 - 动态分配的对象:建立对象时调用构造函数,调用释放时调用析构函数。