C ++中显式和隐式赋值之间的区别是什么

时间:2010-06-16 23:18:10

标签: c++ explicit-constructor

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

编辑:我实际上刚刚发现这篇文章,它使整个事情变得更加清晰......并且它提出了另一个问题,如果你(一般)标记构造函数采用单个参数一个原始类型 - 数字/ bool /字符串 - 作为显式,并保留原样(当然要注意像(int, SomeType = SomeType())这样的构造函数等问题吗?

3 个答案:

答案 0 :(得分: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(),就把你的编译器抛弃并得到一个可以运行的编译器(哦,让我们知道它是什么编译器那么严重破坏了)!

答案 1 :(得分:7)

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

否则,没有区别。

答案 2 :(得分:-1)

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

编辑:实际上,我错了。也没有任务。