我有这个类X
,使用委托构造函数我想只将值i
和j
更改为0.是否可以这样做?
class X{
public:
X() = default;
X(int ival, int jval) : i{ ival }, j{ jval } {}
X(int new_i) : i{ new_i }, X(i, 0) {} //error here
private:
int i;
int j;
};
int main()
{
X x{ 345, 54 };
x = X{ 34 }; //annoymous copy changes only the i:member
return 0;
}
编辑:我知道X(int new_int) : X{new_int, 0}
会起作用但我想知道如果在列表中再初始化一个变量会出现什么错误。
可能是我有另一个z
,我希望将其与i
和j
一起初始化。
即。 X(int new_i) :z{ new_i }, X(new_i, 0) {}
答案 0 :(得分:2)
只需使用
X(int new_i) : X(new_i, 0) {}
来自C ++ Draft Standard N3337(强调我的):
12.6.2初始化基础和成员
6
mem-initializer-list
可以使用表示构造函数类本身的任何class-or-decltype
委托给构造函数类的另一个构造函数。 如果mem-initializer-id
指定构造函数的类, 它应该是唯一的mem-initializer
;
答案 1 :(得分:1)
你为什么不这样做?
X(int new_i) :X(new_i, 0){...}
通过这种方式,您可以将j
- th值设置为0,并且只有x
变量。
答案 2 :(得分:1)
初始化列表中不能有委托构造函数和另一个成员初始化程序。这是不允许的,因为初始化的顺序不可能是成员声明的顺序,而是一些变量将被初始化两次,这可能是不明确的。
如果您的示例被允许,那么相关构造函数将首先初始化i
< - new_i
,然后i
< - i
,然后{{ 1}}&LT - j
。对于非0
const
,这可能是可行的,但不适用于更一般的类型。
只需通过委托初始化对象:
int
虽然在这种情况下,使用默认参数会更好:
class X
{
public:
X() = default;
X(int ival, int jval) : i{ival}, j{jval} {}
X(int ival) : X(ival, 0) {}
private:
int i;
int j;
};
您还应该考虑对单参数构造函数使用class X
{
public:
X() = default;
X(int ival, int jval=0) : i{ival}, j{jval} {}
private:
int i;
int j;
};
关键字来避免令人不快的意外......如
explicit