c++类的初始化过程及对象成员初始化详解
(2012-08-01 10:51:02)
标签:
类构造函数初始化列表对象成员类初始化过程it |
分类: c/cpp |
本文主要研究c++类中对象成员的初始化,及多个对象成员间初始化的依赖性,涉及构造函数初始化列表
例子:
#include <iostream>
#include <string>
class b{
public:
std::string name;
b(std::string
name="b"){std::cout<<"class b
name:"<<name<<
"construct!"<<std::endl;}
~b(){std::cout<<"class type b
deconstruct!"<<std::endl;}
void displayname(){std::cout<<"class
b:
name:"<<name<<std::endl;}
void setname(std::string
name){this->name=name;}
};
class a {
public:
int i;
b b0;
b b1;
std::string name;
a(int j, std::string name, const b& b00, const
b& b11):b0("b0"),b1("b1"),b3("b3") {
};
class test
{
public:
b b0_ptr;
b b1_ptr;
//b* b0_ptr;
//b* b1_ptr;
a
std::string name;
//test(std::string name):a0(100, "a0", *b0_ptr, *b1_ptr),
name(name)
test(std::string name):a0(100, "a0", b0_ptr, b1_ptr), name(name),
b0_ptr("b0_ptr"),b1_ptr("b1_ptr"),b2_ptr("b2_ptr")
{
std::cout<<this->name<<"construct
begin!"<<std::endl;
};
b b2_ptr;
};
int main(){
test* test0=new test("test0");
return 0;
}
output:
sha-dcbu-lnx93:409> g++ test.cpp
sha-dcbu-lnx93:410> ./a.out
class b name:b0_ptrconstruct!
class b name:b1_ptrconstruct!
class b name:b0construct!
class b name:b1construct!
class b name:b3construct!
class:a0initial begin
class:a0initial i as:100
class b: name:a_b0
class b: name:a_b1
class:a0initial end
class b name:b2_ptrconstruct!
test0construct begin!
test0construct end!
可见先初始化b0_ptr, b1_ptr,然后初始化a0(先初始化b0,
b1,b3,然后调用a0.a()),然后初始化b2_ptr,最后调用test的构造函数体。
如果使用上边程序的注释部分替换相应部分,那么由于b0_ptr, b1_ptr都是指针,他们在未被new前就被test的构造函数解除引用,将导致程序崩溃。
sha-dcbu-lnx93:413> g++ test.cpp
sha-dcbu-lnx93:414> ./a.out
class b name:b0construct!
class b name:b1construct!
class b name:b3construct!
class:a0initial begin
Segmentation fault (core dumped)
可以看到利用*b0_ptr, *b1_ptr去掉用a0的构造函数时,b0, b1,
b3被初始化,调用a0的构造函数体后第一句被执行,但是到