c – 使用{* this}初始化类 - 代码日志

c – 使用{* this}初始化类

一个团队成员建议使用这样的初学者:

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 copy构造函数。无论你认为这是更好还是否,都取决于你。

GOTW 1萨特州作为指导:

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并具有“正常”构造函数的类可能会导致混淆。

vector<int> v{5};       // vector containing one element of '5'
vector<int> v(5);       // vector containing five elements.
http://stackoverflow.com/questions/20713058/initializing-class-using-this

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c – 使用{* this}初始化类