int a = 0 and int a(0) differences
int a = 0 and int a(0) differences
可能的重复项:
副本初始化和直接初始化在C++上是否有区别?
我刚开始学习C++。
要用值初始化变量,我遇到了
int a = 0;
和
int a(0);
这让我很困惑。我可以知道哪种方式是最好的吗?
int a = 0;
和int a(0);
对机器生成的代码没有区别。它们是一样的。
以下是在Visual Studio中生成的汇编代码
int a = 10; // mov dword ptr [a],0Ah
int b(10); // mov dword ptr [b],0Ah
它们都是一样的,所以真的没有一种"最好的方法"。
我个人使用
int a = 0;
因为我发现它更清晰,在实践中应用更广泛。
这适用于您的代码,其中类型为 int
。对于类类型,第一个是复制初始化,而另一个是直接初始化,所以在这种情况下它会有所不同。
没有"最佳"方法。对于标量类型(如示例中的int
),两种形式具有完全相同的效果。
引入了非类类型的int a(0)
语法,以支持类和非类类型的统一直接初始化语法,这在与类型无关的(模板)代码中非常有用。
在非模板代码中,不需要int a(0)
。无论您是要使用int a(0)
语法,还是更喜欢使用更传统的int a = 0
语法,这完全取决于您。两者都做同样的事情。在我看来,后者更具可读性。
从实际的角度来看:我只会使用int a = 0;
.
int a(0)
可能是允许的,但在实践中永远不会使用。
我认为这不应该打扰你的水平,但让我们走得更远。
假设a
是一个类,而不是一个整数。
class Demo{
public:
Demo(){};
Demo(int){};
};
Demo a;
Demo b(a);
Demo c = a; // clearly expressing copy-init
在这个例子中,b(a)
和c=a
都做同样的事情,我不鼓励你使用拳头解决方案。我的理由是,这看起来类似于c(2)
这是从论点构造的。
此括号式初始化只有两种有效用途:
- 初始化列表(如果 Demo 有 int 数据成员
data
,则Demo(int i):data(i){}
), - 新品:
Demo *p=new Demo(a); // copy constructing a pointer
这么简单。(嗯,几乎 - 有一些事情你不能命名你的变量,我们将在下一节中讨论)
您还可以在声明时为变量赋值。当我们使用赋值运算符(等号)为变量赋值时,它被称为显式赋值:
int a= 5; // explicit assignment
您还可以使用隐式赋值为变量赋值:
int a(5); // implicit assignment
尽管隐式赋值看起来很像函数调用,但编译器会跟踪哪些名称是变量,哪些是函数,以便可以正确解析它们。
在教科书和文献中,一种是直接初始化,另一种是复制初始化。但是,就机器代码而言,没有区别。
不同之处在于,()
初始化是当您明确希望它只接受一个参数时,例如:
您可以:int a = 44 + 2;
但你不能:
int a(44) + 2;
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 如何计算数据类型的范围,例如int
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- int a = 0 and int a(0) differences