zoukankan      html  css  js  c++  java
  • 关于类成员变量初始化顺序

           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

    b

    da

    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

    da

    b

    c

    db

    dc

           另外需要注意一点:析构函数是先子类再父类的,而且虚析构函数也是面试笔试经常考的问题。

  • 相关阅读:
    CSharp程序员学Android开发---1.初识AndriodIDE,掌握工具使用
    生产者-消费者问题(2)
    c++顺序容器
    打印二叉树某一层次的值(重点)
    二叉树层次遍历
    搜索算法比较
    动态定义数组
    RMQ(range minimum/maximum query)即查询区间最大最小值。
    string 空值
    vector 下标操作
  • 原文地址:https://www.cnblogs.com/sdqxcxh/p/2439510.html
Copyright © 2011-2022 走看看