gpt4 book ai didi

c++ - 使用 { * this } 初始化类

转载 作者:IT老高 更新时间:2023-10-28 21:56:10 26 4
gpt4 key购买 nike

团队成员建议使用这样的初始化程序:

return Demo{ *this };

优于:

return Demo(*this);

假设这样一个简单的类:

class Demo {
public:
int value1;
Demo(){}
Demo(Demo& demo) {
this->value1 = demo.value1;
}
Demo Clone() {
return Demo{ *this };
}
};

我承认以前没有见过 { *this } 语法,也找不到能很好地解释它的引用资料,以至于我理解这两个选项的不同之处。是否有性能优势、语法选择或更多?

最佳答案

您的同事缺少“统一初始化”的技巧,当类型名称已知时,就不需要它了。例如。创建返回值时。 克隆可以定义为:

Demo Clone() {
return {*this};
}

这将根据需要调用 Demo 复制构造函数。您认为这是否更好,取决于您。

GOTW 1 Sutter 指出:

Guideline: Prefer to use initialization with { }, such as vector v = { 1, 2, 3, 4 }; or auto v = vector{ 1, 2, 3, 4 };, because it’s more consistent, more correct, and avoids having to know about old-style pitfalls at all. In single-argument cases where you prefer to see only the = sign, such as int i = 42; and auto x = anything; omitting the braces is fine. …

特别是,使用大括号可以避免混淆:

Demo d();      //function declaration, but looks like it might construct a Demo
Demo d{}; //constructs a Demo, as you'd expect

大括号语法将使用一个构造函数,该构造函数首先接受一个初始化列表(如果存在)。否则它将使用普通的构造函数。它还可以防止上面列出的令人烦恼的解析。

使用复制初始化时也有不同的行为。用标准方式

Demo d = x;

如果需要,编译器可以选择将 x 转换为 Demo,然后将转换后的 r 值移动/复制到 w。类似于 Demo d(Demo(x)); 的意思是调用了多个构造函数。

Demo d = {x};

这等效于 Demo d{x} 并保证只会调用一个构造函数。上面的两个赋值都不能使用显式构造函数。

正如评论中提到的,存在一些陷阱。使用 initializer_list 的类(class)并且拥有“正常”的构造函数会导致困惑。

vector<int> v{5};       // vector containing one element of '5'
vector<int> v(5); // vector containing five elements.

关于c++ - 使用 { * this } 初始化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20713058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com