C++中的RAII机制指明”对象创建时通过构造函数进行初始化,析构时通过析构函数释放资源”,但实际中因类无构造函数时编译器将自动合成一个默认构造函数,该构造函数只服务于自身编译器构造需要而不负责对象成员构造,如这个实例中对象A成员val,next均未进行初始化,而对象B由于是类对象则调用其默认构造函数。但全局对象,静态对象编译器则自动进行将其初始化为0.

 #include <iostream>

 using namespace std;

 class X {
public:
virtual void out() {
cout << "class X" << endl;
}
}; class B :public X{
public:
int i;
~B()
{
cout << "~B()" << endl;
} virtual void out() {
cout << "class B" << endl;
}
}; class A :public X{
public:
int val;
A *next;
B b;
virtual void out() {
cout << "class A" << endl;
}
}; class C:public X {
X *px;
public:
C():px(new A()) {
px->out();
}
~C() {
delete px;
cout << "~C()" << endl;
}
}; A b;
static A c;
int main(int argc, char *argv[]) { A a; C d;
//d.C::C();
cout << a.val << ",next:" << a.next << ",i:" << a.b.i<< endl;
cout << b.val << ",next:" << b.next << ",i:" << b.b.i << endl;
cout << c.val << ",next:" << c.next << ",i:" << c.b.i << endl; d.~C();
d.~C();
cout << "finish." << endl;
return ;
}

运行结果如下:

 test_con
class A
,next:0x77be2850,i:
,next:,i:
,next:,i:
~C()
~C()
finish.
~C()
~B()
~B()
~B()

实际中继承中虚表的构造通过在构造函数中完成,编译器自动将构造过程添加至构造函数前面如类C中,添加的构造函数通过内联展开才能满足非局部对象初始化不为0:

 C():px(new A()) {
//构造虚表过程在此完成
px->out(); //此时已经实现虚表构造,调用多态化
}

C++中的初始化的更多相关文章

  1. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  2. 实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法

    实现Square类,让其继承自Rectangle类,并在Square类增添新属性和方法,在2的基础上,在Square类中重写Rectangle类中的初始化和打印方法 #import <Found ...

  3. C++中构造函数初始化成员列表总结

    1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中 ...

  4. angluarjs中页面初始化的时候会出现语法{{}}在页面中问题

    angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题.出现这个的原因是:由于页面或者组件需要渲染加载数据,浏览器和angluarjs渲染页面需要消耗一定的时间,虽然这 ...

  5. 6.翻译系列:EF 6 Code-First中数据库初始化策略(EF 6 Code-First系列)

    原文链接:http://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-firs ...

  6. oracle中有关初始化参数文件的几个视图对比

    涉及oracle中有关初始化参数文件的几个视图主要有:v$paraemter,v$parameter2,v$system_parameter,v$system_parameter2,v$spparam ...

  7. C++17尝鲜:在 if 和 switch 语句中进行初始化

    初始化语句 在C++17中,类似于 for 语句,在 if 和 switch 语句的判断条件之前也能加上初始化语句,语法形式如下: if (初始化语句; 条件) 语句 else 语句 switch ( ...

  8. [java] java中的初始化顺序

    先看程序: package init_cls; class A{ {System.out.println("i am in the class A!");} static { Sy ...

  9. Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)

    本文链接    http://blog.csdn.net/xiaodongrush/article/details/29170099 參考文章     http://my.oschina.net/le ...

  10. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

随机推荐

  1. 通过Mac远程调试iPhone/iPad上的网页(转)

    我们知道在 Mac/PC 上的浏览器都有 Web 检查器这类的工具(如最著名的 Firebug)对前端开发进行调试,而在 iPhone/iPad 由于限于屏幕的大小和触摸屏的使用习惯,直接对网页调试非 ...

  2. zabbix通过API创建交换机模板,ifAdminStatus;ifOperStatus;ifInUcastPkts;ifAlias

    最终效果: 目的:         通过zabbix的Latest data查看主机就可以看到其监控结果. 监控项:         # 管理状态          IF-MIB::ifAdminSt ...

  3. sql索引实例

    1.创建表并插入数据 在Sql Server2008中创建测试数据库Test,接着创建数据库表并插入数据,sql代码如下: USE Test IF EXISTS (SELECT * FROM INFO ...

  4. IOS开发之异步加载网络图片并缓存本地实现瀑布流(二)

    /* * @brief 图片加载通用函数 * @parma imageName 图片名 */ - (void)imageStartLoading:(NSString *)imageName{ NSUR ...

  5. FIFO页面置换算法

    本文以序列长度20的{ 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};以及页面4:为例: #include <stdio.h> #define Init ...

  6. springMVC简单示例

    1.新建web工程 2.引入springframework架包 3.配置文件 web.xml <?xml version="1.0" encoding="UTF-8 ...

  7. SQL Server 查询表的记录数(3种方法,推荐第一种)

    http://blog.csdn.net/smahorse/article/details/8156483 --SQL Server 查询表的记录数 --one: 使用系统表. SELECT obje ...

  8. javascript 分页组件

    自己写的一个简单的分页组件,主要功能还有实现都在JS中,html页面中只用增加一个放置生成分页的DIV,并给定容器的id. html结构如下: <ul class="paginatio ...

  9. [bzoj3155]Preprefix sum(树状数组)

    3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 1183  Solved: 546[Submit][Status] ...

  10. implicit operator

    class Digit { public Digit(double d) { val = d; } public double val; // ...other members // User-def ...