这里有些例子:
当您的类有两个需要以不同顺序初始化 this 对象的数据成员的构造函数时,可能会发生这种情况。
class Example1 {
public:
Example1(std::string decoded, std::string encoded)
: decoded_(decoded),
encoded_(encoded) {}
explicit Example1(std::string encoded)
: decoded_(), // Can't use "decoded_(Decode())" since "encoded_" isn't initialised
encoded_(encoded) {
decoded_ = Decode(); // Assign here instead of initialising
}
private:
std::string Decode(); // decodes class member "encoded_"
std::string decoded_, encoded_;
};
在此示例中,decoded_
将始终在之前初始化,encoded_
因为这是它们在类中声明的顺序,即使我们在初始化列表中交换它们的顺序。
或者当数据成员需要对 this 对象的引用,并且您希望避免在开始构造函数主体的 { 之前使用 this 关键字的编译器警告(当您的特定编译器恰好发出该特定警告时)。
class Example2 {
public:
Example2() : functor_() {
functor_ = std::bind(&Example2::Do, this);
}
private:
void Do();
std::function<void()> functor_;
};
在这里,functor_
需要在this
初始化/分配时使用。如果我们要functor_
在初始化列表中进行初始化,则this
指针将指向一个当时尚未完全初始化的对象。根据特定情况,这可能是安全的,但万无一失的选项是将设置推迟functor_
到构造函数主体内部,此时this
确实引用了完全初始化的对象。
或者当您需要在使用该变量初始化您的 this 成员之一之前对变量(参数、全局等)进行 if/throw 测试时。
class Example3 {
public:
Example3(int force, int acceleration)
: force_(force),
acceleration_(acceleration),
mass_(0) {
if (acceleration_ == 0)
throw std::exception("Can't divide by 0");
mass_ = force_ / acceleration_;
}
private:
int force_, acceleration_, mass_;
};
希望这是不言自明的。
我不确定是什么意思
当两个数据成员是自引用的
所以恐怕我不能举一个例子。