我正在挖掘其他人的代码,我注意到他以下列方式分配了一个班级的公共/私人成员:
myMemberVar(Value);
而不是
myMemberVal=Value;
我想知道这种分配方式是否正常,可以真正互换使用。
答案 0 :(得分:2)
您可能正在成员初始化列表中查看 initialisations 。
struct A
{
int x, y;
A()
: x(42) // <-- here
, y(12) // <-- and here
{}
{};
这些不是“作业”,不仅仅是以下作业:
void foo()
{
int x = 42;
int y = 42;
}
但请记住,C ++ 03初始化语法(与上述令人困惑,遗留,看起来像配置语法†相反)是:
void foo()
{
int x(42);
int y(42);
}
而且,进一步,从C ++ 11开始:
void foo()
{
int x{42};
int y{42};
}
这就是成员初始化列表中所需的语法。
请注意,这意味着它们不通常可以互换:仅在初始化时!通常当您编写=
时,您正在执行赋值,并且此初始化语法在那里无效。
†别担心,我仍然喜欢它!
答案 1 :(得分:0)
这是构造的语法,而不是赋值。
答案 2 :(得分:0)
第一段代码不分配任何内容;它试图像函数一样调用myMemberVar
。
也许真正的代码在构造函数的初始化列表中:
MyClass() : myMemberVar(Value) {}
而第二个是在构造函数体中:
MyClass() {
myMemberVar = Value;
}
这里的区别在于第一个执行直接初始化,而不是赋值;第二个执行默认初始化,然后执行赋值。
对于简单类型,两者具有相同的效果,可以视为可互换。对于类类型,它们可能会调用不同的用户定义函数:第一种情况下的转换/复制/移动构造函数,以及第二种情况下的赋值运算符后面的默认构造函数。根据这些功能的定义方式,这两个选项可能具有不同的效果或性能特征,如果无法访问所需的功能,则可能无法实现。