class A
{
public:
A() : val_(0) // initializer list, initializes val_
{}
A(const int v) : val_(v) // initializes val_
{}
A(const A& rhs) : val_(rhs.val_) // still initialization of val_
{}
private:
int val_;
};
// all initialization:
A a;
A a2(4);
A a3(a2);
a = a3; // assignment
6条答案
按热度按时间lymnna711#
哦,天哪。任务和任务。那肯定是混淆了!
initialize是准备使用。当我们谈论一个变量时,这意味着 * 给变量一个第一个有用的值 *。其中一种方法是使用赋值。
所以这是相当微妙的:赋值是进行初始化的一种方法。
赋值对于初始化很有效,例如:一个
int
,但是它不能很好地初始化,例如。astd::string
.因为std::string
对象至少包含一个指向动态分配内存的指针,因此
std::string
对象的赋值操作符显然必须以两种不同的方式运行,这取决于对象是否已经初始化!当然,它不会以两种不同的方式表现。相反,对于
std::string
对象,初始化由构造函数负责。你可以说构造函数的工作是获取内存中表示对象的区域,并将其中的任意位更改为适合对象类型的内容,即表示有效对象状态的内容。从 * 原始内存 * 初始化理想情况下应该为每个对象做一次,在对象上的任何其他操作之前。
而C规则有效地保证了这一点。至少只要你不使用非常低水平的设施。有人可能会称之为**C构造保证**。
所以,这意味着当你这样做的时候,
那么你就是在从原始内存中进行简单的构造,但当你这样做时,
然后你首先构造
s
(用一个对象状态表示一个空字符串),然后赋值给这个已经初始化的s
。最后,我可以回答你的问题。从语言独立编程的Angular 来看,第一个有用的值大概是被赋值的值,因此在这种观点中,人们认为赋值是初始化。然而,在C++技术层面上,初始化已经通过调用
std::string
的默认构造函数完成了,所以在这个层面上,人们认为声明是初始化,赋值只是后来对值的更改。因此,特别是术语“初始化”取决于上下文!
简单地运用一些常识来整理别人可能意味着什么。
干杯,
pgpifvop2#
简单来说:
对于内置的类型,它相对简单。对于用户定义的类型,它可以变得更复杂。查看this article.
例如:
hmae6n7t3#
示例正在创建一个示例(类型),该示例具有一定的值。
赋值是对已经创建的示例(类型)进行给予。
回答您编辑的问题:
***在构造函数中初始化和赋值有什么区别?&
有什么好处呢?***
使用初始化器列表初始化成员和在构造函数体内为其赋值之间存在差异。
当你通过初始化器列表初始化字段时,构造函数将被调用一次。
如果你使用赋值,那么字段将首先用默认构造函数初始化,然后用实际值重新赋值(通过赋值运算符)。
正如你所看到的,在后者中有一个额外的创建和赋值开销,这对于用户定义的类来说可能是相当大的。
对于整数数据类型或POD类成员,没有实际的开销。
代码示例:
在上面的例子中:
这个构造在C++中称为成员初始化列表。
它将成员
param_
**转换为值param
。HAVE TO
何时使用成员初始化器列表?***如果出现以下情况,您将不得不(被迫)使用成员初始化程序列表:
您的类有一个引用成员
你的类有一个const成员或者
您的类没有默认构造函数
wixjitnu4#
初始化:给一个对象一个初始值:
赋值:为一个对象赋值:
um6iljoc5#
在C中,初始化的一般语法是
{}
:用于
S
的初始化器被称为“指定初始化器”,并且仅从C99开始可用。0
。double r = { 1.0 };
0
,即{ 0 }
。这种
{}
语法不能直接用于赋值,但在C99中,您可以使用复合文字,如所以首先在RHS上创建一个临时对象,并将其分配给您的对象。
dpiehjr46#
有一件事还没有人提到,那就是构造函数中类字段的初始化和赋值之间的区别。
让我们来看看这个类:
我们这里有一个构造函数,它将
Thing::num
初始化为值5,并将'a'赋给Thing::c
。在这种情况下,差异很小,但是正如前面所说的,如果你要在这个例子中用int
和char
来替换一些任意的类,我们将讨论调用参数化构造函数与调用默认构造函数后跟operator=
函数之间的区别。