C++中的初始化

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

 1 #include <iostream>
 2
 3 using namespace std;
 4
 5 class X {
 6 public:
 7     virtual void out() {
 8         cout << "class X" << endl;
 9     }
10 };
11
12 class B :public X{
13 public:
14     int i;
15     ~B()
16     {
17         cout << "~B()" << endl;
18     }
19
20     virtual void out() {
21         cout << "class B" << endl;
22     }
23 };
24
25 class A :public X{
26 public:
27     int val;
28     A *next;
29     B b;
30     virtual void out() {
31         cout << "class A" << endl;
32     }
33 };
34
35 class C:public X {
36     X *px;
37 public:
38     C():px(new A()) {
39         px->out();
40     }
41     ~C() {
42         delete px;
43         cout << "~C()" << endl;
44     }
45 };
46
47 A b;
48 static A c;
49 int main(int argc, char *argv[]) {
50
51     A a;
52
53     C d;
54     //d.C::C();
55     cout << a.val << ",next:" << a.next << ",i:" << a.b.i<< endl;
56     cout << b.val << ",next:" << b.next << ",i:" << b.b.i << endl;
57     cout << c.val << ",next:" << c.next << ",i:" << c.b.i << endl;
58
59     d.~C();
60     d.~C();
61     cout << "finish." << endl;
62     return 0;
63 }

运行结果如下:

 1 test_con
 2 class A
 3 2009095316,next:0x77be2850,i:2009091625
 4 0,next:0,i:0
 5 0,next:0,i:0
 6 ~C()
 7 ~C()
 8 finish.
 9 ~C()
10 ~B()
11 ~B()
12 ~B()

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

1 C():px(new A()) {
2         //构造虚表过程在此完成
3         px->out(); //此时已经实现虚表构造,调用多态化
4 }
时间: 2024-10-12 04:46:09

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

Java 类中成员初始化顺序

Java 中的类成员 基本分为 静态成员, 实例变量  方法中特别的是静态方法和构造方法. 1.定义一个类 public class ClassLoaderTest { public int a ; public String b; private static int c; public  ClassLoaderTest(){ System.out.println("执行前:"+ a + "  "+ b); a = 10; b = "lisi"

C++中数组初始化

#include<iostream>using std::cout;using std::endl;int arr1[5];int arr2[5] = {1,3,5};int main(){int arr3[5];int arr4[5] = {2,4,6};int *pi1 = new int[5];int *pi2 = new int[5]();for(int i = 0; i != 5; i++)   cout << arr1[i] << " "

什么时候需要在类的构造函数中使用初始化列表

1,如果基类没有default构造函数,则意味着其不能自己初始化.如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数.下例中Base 2,如果类成员没有默认构造函数.下例中Elem4 2,如果类的成员变量中含有const成员变量,如果不使用列表,在构造函数中是不能对其赋值的,会导致编译失败.下例中b 3,如果类的成员变量中含有引用,引用必须被初始化.下例中c 4,需要提高效率的时候,如果不使用初始化列表,而放在构造函数体内赋值的方法,则变量先被默认构造函数初始化,然后又

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

angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题.出现这个的原因是:由于页面或者组件需要渲染加载数据,浏览器和angluarjs渲染页面需要消耗一定的时间,虽然这个时间很多,可能肉眼看不出来,但有的时候加载时间比较长的时候,特别是网络等原因.这样就看到了在渲染前的带有语法的页面.解决的办法如下: 1.ng-cloak ng-cloak指令是angular的内置指令,它的作用是隐藏所有被它包含的元素: <div ng-cloak> <h1>Hel

Java中的初始化过程(转)

原文:http://www.cnblogs.com/mmbo/archive/2009/10/05/1578156.html 1.类成员自动初始化,基本类型总是最先初始化为0(boolean为false,(char)0),对象的引用初始化为null:2.类成员指定初始化,可以在类成员定义或构造器(包括其他方法)中给基本类型和非基本类型对象初始化,但这并不能阻止自动初始化首先进行:3.按类成员定义的顺序决定初始化的顺序:4.静态成员只有在第一次被访问时(class对象首次加载)才会被初始化,此后不

从配置文件中取得初始化参数

一般来说,对于一些程序,需要指定其中一些时常会动态变化的参数而不影响程序本身的运行.所以这些时候往往会将这些问题放到配置文件中.从而进行读取和修改就方便很多了.下面是分别配置到servlet中和context中的两种方式: 1.从servlet配置中设置初始化参数,如下: 1)设置参数(servlet的配置): <servlet> <servlet-name>SearchItemServlet</servlet-name> <servlet-class>co

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

1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行初始化 d.类成员变量中有自定义类型的变量最好在初始化列表中进行初始化 2.初始化列表的顺序? 初始化列表的初始化顺序是依据类成员变量定义的顺序来决定的. 3.关于static const是否应该在初始化成员列表中初始化? static const为全局静态常量,全局的意思是该变量属于整个类而非某个类实例,所以 不能再初始化列表中进行初始化.

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

本文链接    http://blog.csdn.net/xiaodongrush/article/details/29170099 参考文章     http://my.oschina.net/leoson/blog/103251 1. 一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 2. 两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量

[java] java中的初始化顺序

先看程序: 1 package init_cls; 2 3 class A{ 4 5 {System.out.println("i am in the class A!");} 6 static { System.out.println("static is the class A");} 7 } 8 public class init_cls { 9 {System.out.println("i am in the init_cls");} 1

C++学习笔记18,C++11中的初始化列表构造函数(二)

C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list<T>作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值).例如: #include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: ve