跳至主要內容

C++ 变量声明与初始化

Kamimika...大约 3 分钟C++C++变量初始化笔记

在 C++ 中,变量的声明和初始化有多种不同的方式,体现了 C++ 的自由与灵活性,但也常常令人费解,本文将介绍 C++ 变量声明与初始化的基本知识。

六种变量初始化方式

1. 默认初始化(Default initialization)

int x;
MyType var;

调用默认构造函数进行初始化,但不会初始化变量,其值是不确定的。

2. 值初始化(Value initialization)

int x{};
MyType var{};

调用值构造函数进行初始化,并将变量或对象成员变量的值初始化为 0 或其他默认值。

推荐使用值初始化,因为这种方式更加安全,可避免未定义行为
除非有特殊需求,例如希望避免额外的初始化开销,同时已知对象有默认构造函数且变量的值会被初始化

3. 拷贝初始化(Copy initialization)

int x = 10;
MyType var = otherVar;

创建一个临时变量,再将临时变量的值拷贝或移动到目标变量。(通常编译器会自动进行优化)

4. 直接初始化(Direct initialization)

int x(10);
MyType var(otherVar);

调用与初始化列表匹配的构造函数进行初始化,类型不同时会尝试进行隐式类型转换

5. 直接列表初始化(Direct list initialization)

int x{10};
MyType var{otherVar};

调用与初始化列表匹配的构造函数进行初始化,类型不同时不会通过编译。

同时可以防止窄化(如double赋值给int不会通过编译)

6. 拷贝列表初始化(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

总结

最推荐的初始化方式:

上次编辑于:
贡献者: wzh
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.4.1