c++ - int a = 5 和 int a(5) 在 C++ 中是否等价?

标签 c++

int a = 5int a(5) 在标准输出上显示时产生相同的输出。另外 int* b = new intint* b(new int) 似乎是一样的。这些只是初始化变量和声明指针的两种不同方法还是有更大的图景?坦率地说,我不知道您可以在没有赋值运算符的情况下初始化原始数据类型。

最佳答案

是的,它们是一样的。

另一方面,对于类类型,它们略有不同。

struct S {
    S(int);
    S(const S&);
};

S s(5);   // 1
S ss = 5; // 2

标记为 1 的行使用 S(int) 构造 s。标记为 2 的行有点复杂。形式上,它使用 S(int) 构造一个 S 类型的临时对象,然后使用 S(const S&) 将该临时对象复制到ss.

但是,允许编译器跳过复制,直接使用 S(int) 构造 ss,实际上,每个编译器都这样做。但是复制构造函数仍然必须存在并且可以访问;只有它的用途被省略了。因此,如果 S(const S&) 被标记为私有(private),则标记为 2 的行将是错误格式的。您可以通过编写一个复制构造函数来尝试这一点,该构造函数将某些内容写入 std::cout 以告诉您它何时被调用;允许编译器跳过该调用,即使它有明显的副作用。

关于c++ - int a = 5 和 int a(5) 在 C++ 中是否等价?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40317932/

相关文章:

c++ - 类内信号处理

c++ - 尝试 libssh 身份验证时的核心转储

c++ - 如果找到,则尝试输出所有索引值

c++ - C++ 中的显式类型转换

c++ - C++动态调度机制及正确调用函数的过程

c++ - 指针作为函数参数

c++ - Linux 上的 .NET Core - 编码(marshal)结构

c++ - 为什么不在带有迭代器参数的标准库函数中提供重载?

c++ - 三重与号 `&&&` 在 C++ 中代表什么?

c++ - WMV 媒体流在 Windows 7 上比在 XP 上看起来更像素化