当我们不应该在构造函数中使用初始化列表时,请有人引用一个示例代码,以及如何通过赋值来克服这种情况?
我正在为下面的声明寻找一个例子
如果类有两个构造函数,需要以不同的顺序初始化
对象的数据成员,则可能会发生这种情况。或者,如果两个数据成员是自引用的,则可能发生这种情况。或者当数据成员需要引用该对象时,您希望避免编译器在开始构造函数体的{之前使用this关键字(当特定编译器碰巧发出该特定警告时)。或者当您需要对变量(参数、全局的等等)进行if/抛出测试时。在使用该变量初始化其中一个成员之前。
。
发布于 2012-04-25 22:32:00
下面是一些示例:
如果类有两个构造函数,需要以不同的顺序初始化该对象的数据成员,则可能会发生
。
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关键字(当特定编译器碰巧发出该特定警告时)。
class Example2 {
public:
Example2() : functor_() {
functor_ = std::bind(&Example2::Do, this);
}
private:
void Do();
std::function<void()> functor_;
};在这里,functor_需要在初始化/分配this时使用它。如果我们要在初始化列表中对functor_进行初始化,那么this指针将指向一个对象,该对象当时还没有完全初始化。根据具体情况,这可能是安全的,但万无一失的选择是推迟到构造函数体内设置functor_,在构造器主体中,this确实引用了一个完全初始化的对象。
,或者当您需要对变量(参数、全局等)进行if/抛出测试时。在使用该变量初始化其中一个成员之前。
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_;
};希望这是不言自明的。
我不知道这是什么意思
当两个数据成员为自引用时,则为
。
所以我恐怕不能给出一个例子。
发布于 2012-04-25 21:07:21
我认为,您的声明的作者所指的主要概念是,对初始化列表中变量的调用发生而不是按照您在初始化列表中看到它们的顺序发生,而是按照类定义中变量的顺序排列。
这意味着
)。
我建议看一下Scott的Effective C++,它涵盖了这一点(在许多其他有用和信息丰富的主题中)。
https://stackoverflow.com/questions/10323739
复制相似问题