English 中文(简体)
C++实例初始化语法
原标题:
  • 时间:2008-12-16 20:49:56
  •  标签:

给定这样一个类:

class Foo {
public:
    Foo(int);

    Foo(const Foo&);

    Foo& operator=(int);

private:
    // ...
};

这两行话完全等价吗,还是有微妙的不同之处?

Foo f(42);

Foo f = 42;

编辑:在原问题中我把Foo构造函数设为“显式”,这可能导致混淆。我已经删除了这一要求,但仍感谢大家的回答。

我也添加了一个复制构造函数的声明,以明确复制可能不是一个简单的操作。

我真正想知道的是,根据C++标准,“Foo f = 42”会直接调用Foo(int)构造函数,还是会调用复制构造函数?

看起来像是 fasih.ahmed 给出了我想要的答案(除非是错的)。

最佳回答
Foo f = 42;

这个语句将会为值42创建一个临时对象。

Foo f(42);

这个语句将直接赋值,减少了一个函数调用。

问题回答
class Foo {
public:
    Foo(explicit int);

    Foo& operator=(int);
};

这是无效的。语法有误。

class Foo {
public:
    explicit Foo(int);

    Foo& operator=(int);
};

不同之处在于,当您在其前面放置 explicit 时,转换构造函数 不能用于隐式转换:

Foo f(10); // works
Foo f = 10; // doesn t work

上面与您在那里声明的赋值运算符没有任何关系。它没有被使用,因为那是一个初始化(只有构造函数被使用)。以下将使用赋值运算符:

Foo f;
f = 10;

并且将使用Foo的默认构造函数(不带参数的构造函数)。


编辑:提问者更改了他的问题,以特定的方式询问是否。

Foo f = 1; // called "copy initialization" 
Foo f(1);  // called "direct initialization"

一样的。答案是它们等同于以下内容:

Foo f(Foo(1));
Foo f(1);

当且仅当使用int类型的转换构造函数未声明关键字explicit时,否则第一个为编译器错误(见上文)。如果所有语义限制仍然被满足,甚至包括具有副作用的复制构造函数,编译器允许省略(优化掉)在第一种情况下传递给Foo复制构造函数的临时对象。这特别包括可见的复制构造函数。





相关问题
热门标签