类成员变量初始化
1 C++成员变量初始化方式
一般变量 int | 初始化列表、构造函数内 |
静态成员变量 static int | 类外初始化 |
常量 const int | 初始化列表 |
静态常量 static const int | 类定义时 |
成员对象 Class | 初始化器 |
成员对象指针 Class * | 初始化列表、构造函数内,和一般变量相同 |
Example:
[cpp]
include <iostream>
include <string>
using namespace std;
class Test
{
private:
int a;
static int b;
const int c;
static const int d=4;
public:
Test():c(3) //a(1)或者在初始化列表里初始化
{
a=1;
}
};
int Test::b=2;
void main()
{
Test t;
}
[/cpp]
2 C++类成员初始化顺序
- 初始化列表优先于构造函数(初始化列表的初始化顺序与声明顺序相同,与初始化列表顺序无关)
- 静态成员优先于实例变量
- 父类成员变量优先于子类成员变量
- 父类构造函数优先于成员对象构造函数优先于子类构造函数
Example:
[cpp]
using namespace std;
class Test
{
public:
Test(string n)
{
cout<<n<<endl;
}
};
class Base
{
public:
static Test* a;
Test* b;
Test* c;
Base():b(new Test("b"))
{
c=new Test("c");
}
virtual ~Base()
{
if(a) delete a;//似乎是很欠妥的做法
if(b) delete b;
if(c) delete c;
}
};
Test* Base::a=new Test("a");
class Derived:Base
{
public:
static Test* da;
Test* db;
Test dc;
Derived():dc("dc")
{
db=new Test("db");
}
~Derived()
{
if(da) delete da;//似乎是很欠妥的做法
if(db) delete db;
}
};
Test* Derived::da=new Test("da");
void main()
{
Derived d;
} ///:~
[/cpp]
结果:
分析:首先根据顺序初始化static成员:a,da,初始化Derived首先初始化基类b,c,然后初始化成员对象dc(初始化器),最后初始化一般的变量db。
3 Java中成员变量初始化顺序
类成员变量优先于类的构造函数
静态成员优先于实例变量
父类成员变量优先于子类成员变量
父类构造函数优先于子类构造函数。
Java不精,就不举例了。
Reference:http://blog.csdn.net/jhj735412/article/details/7520528