C++ 变量声明与初始化
...大约 3 分钟
在 C++ 中,变量的声明和初始化有多种不同的方式,体现了 C++ 的自由与灵活性,但也常常令人费解,本文将介绍 C++ 变量声明与初始化的基本知识。
六种变量初始化方式
默认初始化(Default initialization)
int x;
MyType var;
调用默认构造函数进行初始化,但不会初始化变量,其值是不确定的。
值初始化(Value initialization)
int x{};
MyType var{};
调用值构造函数进行初始化,并将变量或对象成员变量的值初始化为 0 或其他默认值。
推荐使用值初始化,因为这种方式更加安全,可避免未定义行为
除非有特殊需求,例如希望避免额外的初始化开销,同时已知对象有默认构造函数且变量的值会被初始化
拷贝初始化(Copy initialization)
int x = 10;
MyType var = otherVar;
创建一个临时变量,再将临时变量的值拷贝或移动到目标变量。(通常编译器会自动进行优化)
直接初始化(Direct initialization)
int x(10);
MyType var(otherVar);
调用与初始化列表匹配的构造函数进行初始化,类型不同时会尝试进行隐式类型转换。
直接列表初始化(Direct list initialization)
int x{10};
MyType var{otherVar};
调用与初始化列表匹配的构造函数进行初始化,类型不同时不会通过编译。
同时可以防止窄化(如double
赋值给int
不会通过编译)
拷贝列表初始化(Copy list initialization)
int x = {10};
MyType var = {otherVar};
创建一个临时对象,再将临时变量的值拷贝或移动到目标变量。(通常编译器会自动进行优化)
同时可以防止窄化(如double
赋值给int
不会通过编译)
实验
#include <iostream>
class MyClass {
public:
MyClass(int value) : value(value) {
std::cout << "Constructor called with value: " << value << std::endl;
}
MyClass(const MyClass& other) : value(other.value) {
std::cout << "Copy constructor called with value: " << value << std::endl;
}
MyClass(MyClass&& other) noexcept : value(other.value) {
std::cout << "Move constructor called with value: " << value << std::endl;
}
int value;
};
int main() {
MyClass obj1 = 42; // 拷贝初始化
MyClass obj2(42); // 直接初始化
MyClass obj3 = MyClass(42); // 拷贝初始化,但实际上是直接初始化
MyClass obj4 = obj1; // 拷贝初始化
MyClass obj5(obj1); // 直接初始化
return 0;
}
输出
Constructor called with value: 42
Constructor called with value: 42
Constructor called with value: 42
Copy constructor called with value: 42
Copy constructor called with value: 42
总结
最推荐的初始化方式:
Powered by Waline v3.4.1