关于类成员变量初始化顺序
来源:互联网 发布:爱读掌阅软件 编辑:程序博客网 时间:2024/06/04 21:54
java和C#语言里类变量初始化的顺序是
1 类成员变量初始化先于类的构造函数
2 静态成员变量先于实例变量
3 父类成员变量先于子类成员变量 C#相反
4 父类构造函数先于子类构造函数
举一个java的例子:
class Base{public static Test a=new Test("a");public static Test b;public Test c=new Test("c");public Test d;static{b=new Test("b");}public Base(){d=new Test("d");}public static void main(String[] args) {new Derived();}}class Derived extends Base{public static Test da=new Test("da");public static Test db;public Test dc=new Test("dc");public Test dd;static{db=new Test("db");}public Derived(){dd=new Test("dd");}}class Test{public Test (String name) {System.out.println(name);}}
运行结果是:
a
bda
db
c
d
dc
dd
C++中没有成员变量定义时初始化的方式,所以有如下几条:
1 构造函数初始化列表的变量优先于构造函数(至少明显的写在前面)
2 静态成员变量先于实例变量
3 父类成员变量先于子类成员变量
4 父类构造函数先于子类构造函数
举一个例子:
#include <iostream>#include <string>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():db(new Test("db")){dc=new Test("dc");}~Derived(){if(da) delete da;//似乎是很欠妥的做法if(db) delete db;if(dc) delete dc;}};Test* Derived::da=new Test("da");void main(){Derived d;}
结果是:
a
dab
c
db
dc
另外需要注意一点:析构函数是先子类再父类的,而且虚析构函数也是面试笔试经常考的问题。
- 关于类成员变量初始化顺序
- 类成员变量初始化顺序:
- 成员变量初始化顺序
- 成员变量初始化顺序-
- Java类成员变量的初始化顺序
- java类成员变量的初始化顺序
- Java类成员变量的初始化顺序
- C++类成员变量初始化顺序问题
- C++类成员变量初始化顺序问题
- 关于c++的类中成员变量初始化问题+初始化列表中对应顺序问题!
- C++成员变量初始化顺序
- java成员变量初始化顺序
- 成员变量的初始化顺序
- C++成员变量初始化顺序
- Java成员变量初始化顺序
- 关于类成员的初始化顺序问题
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- 关于类继承/初始化成员变量/构造函数/析构函数 执行顺序
- 2012.4.9
- 深入浅出嵌入式底层软件开发(嵌入式学习书籍)
- 使用JLink间接烧写s3c6410 nand_flash的方法
- spring的scope="prototype"
- 从Phone源码中分析来电话流程(部分)
- 关于类成员变量初始化顺序
- 使用EFS加密数据的注意事项
- C语言字符串面试相关函数
- Pick-up Sticks
- 赵雅智_java继承
- Android下的多线程
- s3c6410 uboot代码分析《一》
- 让adbd监听指定端口
- 谨记这些计算机基础知识