C++ 通过将其他构造函数初始化的 class 成员分配给它们来初始化 class 成员是个坏主意吗?
C++ Is it a bad idea to initialise class members by assigning them other constructor initialised class members?
我发现了一种初始化 class 成员 q
的查询方法,方法是将其分配给通过构造函数 i
初始化的不同 class 成员:
class test{
public:
test(int c) : i(c) {
}
int i;
int q = i;
};
int main() {
std::cout << test(1).q << std::endl; //outputs 1
}
但是,如果我交换 i
和 q
的声明顺序:
int q = i;
int i;
打印出 i
输出 0。
以这种方式初始化 class 成员是个坏主意吗?很明显,在此示例中,将 : i(c), q(c)
添加到构造函数可能更容易。
但是对于 class 成员依赖 i
的情况,例如某些对象的构造函数采用 int
(i
) 并具有私有 =
运算符和复制构造函数,这种方法可能是初始化该对象的好方法吗?或者这是一个坏主意,应该始终避免?
是的,您已经概述了失败的条件。不难想象有人由于重新排序而无意中破坏了您的代码。
如果你想做这样的事情,最好在输入源的构造函数中分配两者。
test(int c) : q(c), i(c) {}
这减少了初始化顺序的混乱,并且两个变量不再相关。
我发现了一种初始化 class 成员 q
的查询方法,方法是将其分配给通过构造函数 i
初始化的不同 class 成员:
class test{
public:
test(int c) : i(c) {
}
int i;
int q = i;
};
int main() {
std::cout << test(1).q << std::endl; //outputs 1
}
但是,如果我交换 i
和 q
的声明顺序:
int q = i;
int i;
打印出 i
输出 0。
以这种方式初始化 class 成员是个坏主意吗?很明显,在此示例中,将 : i(c), q(c)
添加到构造函数可能更容易。
但是对于 class 成员依赖 i
的情况,例如某些对象的构造函数采用 int
(i
) 并具有私有 =
运算符和复制构造函数,这种方法可能是初始化该对象的好方法吗?或者这是一个坏主意,应该始终避免?
是的,您已经概述了失败的条件。不难想象有人由于重新排序而无意中破坏了您的代码。
如果你想做这样的事情,最好在输入源的构造函数中分配两者。
test(int c) : q(c), i(c) {}
这减少了初始化顺序的混乱,并且两个变量不再相关。