-
default construction
- 4种情况下编译器会构造出nontrivial(有用)的构造函数
- 带有default construction的member class object
我们有两个class:
class Foo { public: Foo(), Foo(int) … };
class Bar { public: Foo foo; char *str;};
- 则编译器会在Bar中合成一个默认的构造函数(看起来像这样):
Bar() { foo.Foo::Foo(); }
- 当我们自己定义了Bar一个或以上的构造函数时,编译器会为我们扩张
每一个构造函数。比如我们自己定义:
Bar() { str = 0;}
则编译器就为我们扩张成:
Bar() { foo.Foo::Foo(); str = 0; }
- 当有多个需要初始化的成员时,编译器会按照成员的声明次序来初始化成员
- 带有default construction的base class
- 声明或继承一个virtual function的class
- 一个virtual function table 会被编译器产生出来,内放class的virtual function 地址。
- 在每个class object中,一个额外的pointer member(vptr)会被编译器合成出来,内含
相关的class vtbl的地址。
- 带有一个virtual base class的class
对于virtual base class中的成员变量,derived class通过存放一个指针,指针中存放
着对应的基类,用这样的方式来访问virtual base class中的成员变量。
所以为了初始化这些指针,编译器会默认构造出或扩张nontrivial构造函数做这些初
始化的工作。
- c++新手常见的两个误解
- 任何class如果没有定义default constructor,就会被合成出来。
- 编译器合成出来的default constructor会明确设定class内每个
datamember的默认值。
这两个没有一个是真的
-
相关阅读:
Spring格式化注解
Mysql 慢查询和慢查询日志分析
jQuery中的end()方法
webService学习笔记
让Hibernate和触发器协同工作
JavaScript中的setInterval用法
jQuery中事情的动态绑定
mongoDB如何处理多对多关系
新生儿信息管理系统在线帮助
MySQL数据库安装与配置详解
-
原文地址:https://www.cnblogs.com/boydfd/p/4983106.html
Copyright © 2020-2023
润新知