C++:初始化和赋值有什么区别?

6
我正在阅读 Stroustrup 的 C++ 第 4 版第 153 页,对初始化和赋值有疑问。我理解的是,初始化发生在构造函数中,而赋值发生在重载的 operator= 函数中。这个理解正确吗?
此外,我不记得在他 1998 年的第三版书中看到过括号,即 int count {1}。我应该像使用 int count = 1 那样使用括号来定义计数器这样的变量吗?如果使用括号,似乎与 C 有些不同。
感谢您的指导。
void f() {
   int count {1}; // initialize count to 1
   const char∗ name {"Bjarne"}; // name is a    variable that points to a constant (§7.5) 
   count = 2; // assign 2 to count
   name = "Marian";
}

5
自1998年以来,C++发生了很多变化。如果你想要学习现代C ++,或者只是重新学习一下,那么有很多新的语法、规则和行为需要适应。 - NathanOliver
4
那时候还没有这种表示法,这种表示法是在2011年的C++11中才加入语言的。两种语法都可以使用。花括号用于表示许多不同类型的初始化方式。我建议您学习更近期的资料,特别是C++11之后的资料,因为这种语言和思考方式已经发生了巨大的变化。 - François Andrieux
1
初始化发生在变量构造时。赋值发生在构造之后 - 对已经初始化的变量进行赋值。 - Jesper Juhl
请参考此链接,了解T t{val};T t = val;之间的区别。 - NathanOliver
这回答您的问题了吗?初始化和赋值 - GutZuFusss
现代 C++ 中的初始化选项有点复杂,所以这里有一些方便的阅读资料一个视频可以帮助您理解它。 - user4581301
2个回答

8

花括号是 C++11 标准中引入的 统一初始化 的一部分。

使用:

int value {1};

等同于

int value = 1;

在变量初始化时,使用花括号和“赋值”语法存在一些差异,但在这个简单的情况下它们是相等的。


在上述情况下,复制构造函数是否被调用? - notaorb
@notaorb 这取决于变量的类型、初始化器的类型以及变量类型可能可用的构造函数重载。对于这种特定情况,由于 int 是一个基本类型,因此它根本没有任何构造函数。 - Some programmer dude

1

初始化意味着你第一次编写变量并赋予其初始值,例如 int x=5; 但是赋值意味着你已经有了一个变量并改变了它的值,例如当你回来时设置 x=10; 现在你在变量 x 上分配了数字 10


1
不完全正确。你的想法是对的,但措辞有误导性。在函数作用域中,int x; 是未初始化的,这使得 x = 1; 在第一次写入时没有被初始化。 - user4581301

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接