这种分配方式叫什么?myVar(值);
What is this way of assignment called? myVar(value);
我正在挖掘别人的代码,注意到他以以下方式分配类的公共/私有成员:
myMemberVar(Value);
而不是
myMemberVal=Value;
我想知道这种分配方式是否正常,是否真的可以互换使用。
您可能正在成员初始化列表中查看初始化。
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};
}
这就是成员初始化列表中所需的语法。
请注意,这意味着它们不通常是可互换的:仅在初始化时!通常,当您编写=
时,您正在执行赋值,并且这种初始化语法在那里是无效的。
&匕首别担心,我还是喜欢它
这是构造的语法,而不是赋值。
第一段代码没有分配任何内容;它试图像函数一样调用CCD_ 2。
也许真正的代码在构造函数的初始化程序列表中:
MyClass() : myMemberVar(Value) {}
而第二个是在构造函数主体中:
MyClass() {
myMemberVar = Value;
}
这里的区别在于,第一个执行直接初始化,而不是赋值;第二个执行默认初始化,然后进行赋值。
对于简单类型,两者具有相同的效果,并且可以被视为可交换的。对于类类型,它们可能会调用不同的用户定义函数:第一种情况下是转换/复制/移动构造函数,第二种情况下则是默认构造函数后跟赋值运算符。根据这些功能的定义方式,这两个选项可能具有不同的效果或性能特征,如果无法访问所需的功能,则可能无法使用。
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 这种分配方式叫什么?myVar(值);