16
int value = 5; // this type of assignment is called an explicit assignment
int value(5); // this type of assignment is called an implicit assignment

这些之间有什么区别(如果有的话),在什么情况下显式和隐式赋值不同以及如何?


http://weblogs.asp.net/kennykerr/archive/2004/08/31/Explicit-Constructors.aspx

编辑:我实际上刚刚发现这篇文章,它使整个事情变得更加清晰......它提出了另一个问题,如果你(通常)标记构造函数采用原始类型的单个参数 - 数字/布尔/字符串 -尽可能明确并保留其余部分(当然要注意诸如构造函数之类的陷阱(int, SomeType = SomeType())

4

3 回答 3

21

这些都不是任何类型的分配——它们都是初始化。第一个使用复制初始化,第二个直接初始化。(FWIW,我很确定我以前从未听说过“显式赋值”或“隐式赋值”这些术语)。

编辑:(主要是为了回应内森的评论):

这是您评论中代码的更正版本:

#include <iostream>

struct Foo { 
    Foo() { 
        std::cout << "Foo::ctor()" << std::endl; 
    } 
    Foo(Foo const& copy) { 
        std::cout << "Foo::cctor()" << std::endl; 
    } 
    Foo& operator=(Foo const& copy) { 
        std::cout << "foo::assign()" << std::endl; 
        return *this; 
    } 
};

int main(int, const char**) { 
    Foo f; 
    Foo b(f); 
    Foo x = b;
    return 0; 
}

运行它的结果应该是:

Foo::ctor()
Foo::cctor()
Foo::cctor()

如果你运行它并得到一个foo::assign().,把你的编译器扔掉,得到一个可以工作的(哦,让我们知道它是什么编译器,它被严重破坏了)!

于 2010-06-16T23:30:30.907 回答
7

如果一个类有一个标记为“显式”的构造函数,它们会有所不同。然后,其中之一不起作用。

否则,没有区别。

于 2010-06-16T23:22:11.067 回答
-1

只有第一个是作业。它们都是初始化。

编辑:实际上,我错了。也不是赋值。

于 2010-06-16T23:24:29.860 回答