当前位置:  开发笔记 > 编程语言 > 正文

C++实例初始化语法

如何解决《C++实例初始化语法》经验,为你挑选了2个好方法。

鉴于这样的类:

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有我正在寻找的答案(除非它是错的).



1> Johannes Sch..:
class Foo {
public:
    Foo(explicit int);

    Foo& operator=(int);
};

那是无效的.语法是

class Foo {
public:
    explicit Foo(int);

    Foo& operator=(int);
};

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

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的复制构造函数的临时(优化).这尤其包括可见的复制构造函数.



2> fasih.rana..:
Foo f = 42;

该语句将为值'42'创建一个临时对象.

Foo f(42);

此语句将直接分配值,以便减少一个函数调用.

推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有