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())
这样的构造函数等问题吗?
答案 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)
只有第一个是作业。它们都是初始化。
编辑:实际上,我错了。也没有任务。