c++ - 复制(显式)初始化与直接(隐式)初始化 C++
问题描述
我在阅读变量初始化时遇到了三种不同的初始化变量的方法:复制、直接和统一。来源: http: //www.learncpp.com/cpp-tutorial/2-1-fundamental-variable-definition-initialization-and-assignment/comment-page-1/#comments
我的问题是对基本类型使用复制与直接初始化有什么区别?
该网站声明,“(高级用户注意:此处用于复制初始化的等号是初始化语法的一部分,不被视为使用在进行复制赋值时调用的赋值运算符)”
这意味着什么?是不是说用于初始化的'='运算符在复制赋值中使用时不一样?
此外,它指出,“对于某些数据类型,直接初始化可以比复制初始化执行得更好,并且一旦我们开始谈论类,它还会带来一些其他好处。它还有助于区分初始化和赋值。因此,我们建议使用直接初始化而不是复制初始化。”
有人可以帮我清理一下并解释更简单的术语吗?谢谢
解决方案
对于原始类型,复制初始化与直接初始化完全相同。对于具有构造函数的更复杂类型,复制初始化与使用 之后的值调用复制构造函数相同=
,除非该复制构造函数被标记为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 不同。我不确定它们在关于性能的部分是什么意思,因为复制初始化通常与直接初始化相同并调用相同的构造函数。
推荐阅读
- google-chrome - Chrome 扩展名可以包含谷歌产品名称吗?
- stripe-payments - 如何将订阅和单次付款结合起来一次收费[Stripe API]?
- html - 如何淡入模态内容而不是背景?
- react-native - Victory Native:图表未显示 Y 轴的第一个标签
- powershell - 仅从返回的 Get-ADUser 数组中获取字符串值
- reactjs - 反应中的嵌套地图返回一个空页面
- python - 清除 Tkinter GUI 中每个选项卡的画布
- asp.net-core - 使用 DevExtreme 在 ASP.NET 中发布时如何获取自动完成文本框值
- java - java 8流groupingBy进入自定义对象的集合
- android - JobIntentServices 是否限制线程数?具有多个 JobIntentServices 的应用程序只为所有服务提供两个线程