文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>初始化列表执行顺序

初始化列表执行顺序

时间:2010-09-18  来源:zyd_cu

初始化列表中成员初始化执行的顺序与它们在类中声明的顺序相同,而与其出现在列表中的顺序无关,如如下例,SubArray能从一个数组的一部分构造对象,在其构造的过程中,size、lBound、hBound、data先后出现在初始化列表中,看似没什么问题,但实际上vector数组的长度是不确定的,因为编译器并不是先初始化size,再构造size长度的vector,而会根据vector先在类中声明而先构造vector对象,而此时的size值是不确定。

#include <iostream>
#include <vector>
using namespace std;

template<class T>
class SubArray {
public:
    SubArray(T *arr, int low, int high);
    unsigned int getSize() { return size; }
    unsigned int getVecSize() { return data.size(); }
private:
    vector<T> data;
    int lBound, hBound;
    unsigned int size;
};

template<class T>
SubArray<T>::SubArray(T *arr, int low, int high):
size(high-low+1), lBound(low), hBound(high), data(size)
{
}

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8};
    SubArray<int> thisArray(arr, 3, 7);
    cout << thisArray.getSize() << endl; //输出5

    cout << thisArray.getVecSize() << endl; //输出4,内容是不确定的

}


为什么需要做这样的规定呢,因为C++中规定了对象的被析构的顺序与其被构造的顺序相反,假设允许按照在初始化列表中的顺序初始化,如下例:

 

class TwoString {
public:
TwoString(const char *s): s1(s), s2(0) {}
TwoString(const TwoString& rhs): s2(rhs.s1), s1(0) {}
private:
string s1, s2;
};

TwoString w1 = "Hello world!";
TwoString w2 = w1;


根据我们的假设,创建w1时,s1先于s2被创建;创建w2时,s2先于s1被创建。为了保证对象的被析构的顺序与其被构造的顺序相反这一原则,编译器必须跟踪每个对象的成员初始化顺序。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载