C++在构造函数初始化列表中获取类成员地址

问题描述:

我遇到内存违规错误,我不知道它来自哪里。 我的问题是:我允许在构造函数初始化列表中获取类成员的地址,以便我可以将它传递给需要对其进行引用的对象?C++在构造函数初始化列表中获取类成员地址

例如:

class A 
{ 
}; 

class ReferencesA 
{ 
    A * const pA; 

    ReferencesA(A * ptrA) : pA(ptrA) { } 
}; 

class B 
{ 
    A a; 

    ReferencesA referencesA; 

    B() : referencesA(& a) { } 
}; 

是安全地& a构造函数初始化列表里面?在我看来,这将是,但事情并不总是像我们预期的那样工作。

谢谢。

+0

对我来说没关系。这可能是“引用A”对引起崩溃的内存中的ptrA做了什么,特别是如果“a”尚未构建。 – rakeshdn

class B中基础构件的初始化顺序是a,然后是referencesA。这是因为它们在类声明中以的顺序出现。 (它们出现,如果有的话,在你的构造函数初始化列表中的顺序是不相关的。)

因此,使用&a初始化referencesA安全的,如果有点脆。在你的情况下,&a是默认构建的成员a的地址。

我建议不要这样编码,以防有人更改班上成员的顺序。

+1

谢谢。问题是,如果我想要const指针(或引用)来指示指针将在对象的整个生命周期中是相同的和有效的,那么我需要初始化初始化器列表中的东西,否则我可以'使用const。 – Virus721

+4

值得注意的是,保存指向未初始化对象的指针是安全的,所以类中的顺序并不重要。如果你想通过指针来读或写,'a'只需要在班级列表中首先出现。 –