c++ - C++中显式赋值和隐式赋值有什么区别

标签 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

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

最佳答案

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

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

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

#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(),扔掉你的编译器并得到一个可以工作的(哦,让我们知道它是什么编译器,它被严重破坏了)!

关于c++ - C++中显式赋值和隐式赋值有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3057859/

相关文章:

c++ - 为什么 std::generate() 和 std::generate_n() 需要不同的迭代器?

c++ - 为什么 SFINAE 需要 'Enable' 类模板参数?

c++ - 为什么这个显式析构函数会导致共享 ptr 中的内存损坏?

c++ - 使用 "X x(42)"和 "X x = 42"的对象构造有何不同?

C++ 弃用从字符串常量到 'char*' 的转换

c++ - 可变参数模板 : how can I check if a specific class is part of the pack, 并在该类存在时执行该类的特定方法

使用模板的 C++ 11 异步编程

c++ - 纯右值与 C++17 中的临时值相同吗

c++ - 避免在人为模糊的重载函数调用中拼写出类型

C++ 使用 cppcheck 建议的显式