gpt4 book ai didi

c++ - 成员初始值设定项列表中的赋值操作

转载 作者:行者123 更新时间:2023-12-01 18:57:58 30 4
gpt4 key购买 nike

我有以下 Stack 类。

class Stack{
public:
int size;
int* x;
Stack() : size(10), x(new int[10]) {}
Stack(const Stack& s) : x(new int[size=s.size]) {}

};

注意复制构造函数中的赋值。该代码可以正常工作,可以正常编译,并且即使使用 -Wall -Wextra 标志,编译器 (gcc) 也不会提示。编译器会自动将编译器重写为这个吗?

Stack(const Stack& s) : size(s.size), x(new int[size]) {}

或者还有其他魔法吗?我注意到当我更改定义顺序时,编译器会提示初始化不按顺序。所以我认为这就是我提到的情况。我在文档中找不到任何内容,ASM 输出也对我没有帮助。

最佳答案

Does the compiler automatically rewrite the compiler to this?

Stack(const Stack& s) : size(s.size), x(new int[size]) {}

没有。

Stack(const Stack& s) : x(new int[size=s.size]) {}

可以被认为是

Stack(const Stack& s) : size(), x(new int[size=s.size]) {}

但事实并非如此,因为实际编写 size() 会对它进行值初始化,这意味着它是零初始化的,但由于它是编译器综合初始化,所以默认初始化 [1]发生 意味着它尚未初始化。然后在x的初始化中为其分配一个值。这是“安全的”,意味着它在这种情况下有效,但我不会推荐它。

Stack(const Stack& s) : size(s.size), x(new int[s.size]) {}

初始化两个成员,如果您更改了它们在类中的顺序,您仍然会有正确的行为。

关于c++ - 成员初始值设定项列表中的赋值操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55044984/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com