首页 > 解决方案 > 复制(显式)初始化与直接(隐式)初始化 C++

问题描述

我在阅读变量初始化时遇到了三种不同的初始化变量的方法:复制、直接和统一。来源: http: //www.learncpp.com/cpp-tutorial/2-1-fundamental-variable-definition-initialization-and-assignment/comment-page-1/#comments

我的问题是对基本类型使用复制与直接初始化有什么区别?

该网站声明,“(高级用户注意:此处用于复制初始化的等号是初始化语法的一部分,不被视为使用在进行复制赋值时调用的赋值运算符)”

这意味着什么?是不是说用于初始化的'='运算符在复制赋值中使用时不一样?

此外,它指出,“对于某些数据类型,直接初始化可以比复制初始化执行得更好,并且一旦我们开始谈论类,它还会带来一些其他好处。它还有助于区分初始化和赋值。因此,我们建议使用直接初始化而不是复制初始化。”

有人可以帮我清理一下并解释更简单的术语吗?谢谢

标签: c++variablesinitialization

解决方案


对于原始类型,复制初始化与直接初始化完全相同。对于具有构造函数的更复杂类型,复制初始化与使用 之后的值调用复制构造函数相同=,除非该复制构造函数被标记为explicit

一个小示范:

#include <iostream>

struct bar
{
    int x;
    bar() : x(30) {}
};

struct foo
{
    int x;
    foo() : x(42) { std::cout << "Default constructor\n"; }
    foo(const foo &other) : x(other.x) { std::cout << "Copy constructor\n"; }
    foo(const int &y) : x(y) { std::cout << "Copy/conversion constructor with int\n"; }
    explicit foo(const bar &y) : x(y.x) { std::cout << "Copy/conversion constructor with bar\n"; }
    foo& operator=(const foo &other)
    {
        std::cout << "Copy assignment operator\n";
        x = other.x;
        return *this;
    }
};

int main() {
    foo a; //calls default constructor
    foo w; //calls default constructor
    w = a; //then the assignment operator
    foo b = a; //calls copy constructor, not copy assignment operator, different from previous
    foo c(a); //also calls copy constructor, same as previous
    foo d = 10; //same as foo d(10), constructor that takes an int can be used for conversions
    bar h;
    foo j(h); //calls copy/conversion constructor that takes a bar,
              //the contructor can also be used for explicit conversions
    //foo k = h; //error because of implicit conversion when constructor is marked explicit
    return 0;
}

如演示中所示,=in an 初始化与=in an assignment 不同。我不确定它们在关于性能的部分是什么意思,因为复制初始化通常与直接初始化相同并调用相同的构造函数。


推荐阅读