2010-06-16 27 views
14
int value = 5; // this type of assignment is called an explicit assignment 
int value(5); // this type of assignment is called an implicit assignment 

这些(如果有的话)和显式和隐式赋值在哪些情况下有什么不同?C++中的显式和隐式赋值有什么区别


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

编辑:我其实只是发现这篇文章,这让整个事情更加清晰......它带来了另一个问题,你应该标记构造(一般)服用一个原始类型的单个参数 - 数字/布尔型/字符串 - 显式地保留原样(当然要留意像构造函数那样的陷阱,比如(int, SomeType = SomeType())

+3

这闻起来像功课。如果是这样,请标记为。 – greyfade 2010-06-16 23:22:32

+0

不是作业,只是我很久以前从没有调查过的笔记。无论如何,标记作为家庭作业的东西是做什么的? – 2010-06-16 23:31:35

+1

这说明问题是作业。 =]通常,回答问题的人会更喜欢提供提示以提供完整的答案。 – strager 2010-06-16 23:36:10

回答

6

它们不同,如​​果一个类有一个构造符标记为'明确“,然后,其中一个就是 不行。

否则,没有区别。

-1

只有第一个是一个任务。他们都是初始化。

编辑:其实,我错了。都不是任务。

+2

这些都不是一个分配。赋值和初始化是互斥的。 – fredoverflow 2010-06-16 23:27:15

+0

heh ...就像我在编辑:P – 2010-06-16 23:29:28

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(),扔掉你的编译器并得到一个工程(哦,让我们知道它是什么编译器是如此严重破碎)!

+0

不一定*真。对于POD类型,是的,你的陈述是准确的。如果有问题的类型是用户定义的,那么很可能有一个用户定义的赋值运算符在没有类似的拷贝构造函数的情况下进行转换。奇怪,是的。但是,可能的。 – 2010-06-16 23:41:03

+0

另外,第一个是分配。只有第二个是初始化。第一个可以并且几乎肯定会被内联到等效的拷贝初始化并不会减少它作为一个赋值。复制初始化和复制分配相同的假设是有缺陷的,并不能保证。 – 2010-06-16 23:43:19

+5

@Nathan:这个答案是正确的。 §8.5/ 12将“复制初始化”定义为形式为'T x = a;'和'直接初始化'的任何初始化为'T x(a);'形式的任何初始化。两者都是初始化。 – GManNickG 2010-06-16 23:53:13

相关问题