C++中常见的初始化类型

59 篇文章 0 订阅
52 篇文章 1 订阅

目录

摘要

1. 默认初始化(Default Initialization)

2. 值初始化(Value Initialization)

3. 直接初始化(Direct Initialization)

4. 拷贝初始化(Copy Initialization)

5. 列表初始化(List Initialization)

6. 聚合初始化(Aggregate Initialization)

7. 引用初始化(Reference Initialization)

8. 成员初始化列表(Member Initialization List)

9. 显式初始化(Explicit Initialization)

10. 延迟初始化(Lazy Initialization)

11. 常量初始化(Constant Initialization)

12. 静态初始化(Static Initialization)

引用


摘要

在C++中,初始化变量的方法非常多,涵盖了多种类型的初始化方式。以下是C++中的常见初始化类型:

1. 默认初始化:未定义值或调用默认构造函数。
2. 值初始化:将变量初始化为零或调用默认构造函数。
3. 直接初始化:通过括号传递参数进行初始化。
4. 拷贝初始化:使用赋值运算符进行初始化。
5. 列表初始化:使用大括号进行初始化,避免窄化转换。
6. 聚合初始化:用于数组和 `struct` 等聚合类型的初始化。
7. 引用初始化:引用变量必须在声明时进行初始化。
8. 成员初始化列表:在类的构造函数中初始化成员变量。
9. 显式初始化:使用显式构造函数进行初始化。
10. 延迟初始化:在需要时才进行初始化。
11. 常量初始化:常量变量在编译时完成初始化。
12. 静态初始化:静态变量的初始化在程序启动时完成。

1. 默认初始化(Default Initialization)

默认初始化是指在声明变量时不提供初始值。对于内置类型变量,其值是未定义的;对于类类型变量,会调用其默认构造函数。

#include <iostream>

class MyClass {
public:
    int x;
    MyClass() : x(0) {
        std::cout << "MyClass default constructor called\n";
    }
};

int main() {
    int a;        // 未定义值
    MyClass obj;  // 调用 MyClass 的默认构造函数
    std::cout << "obj.x: " << obj.x << std::endl;  // 输出 0

    return 0;
}

2. 值初始化(Value Initialization)

值初始化会将变量初始化为零值。对于类类型,会调用其默认构造函数。

#include <iostream>

class MyClass {
public:
    int x;
    MyClass() : x(0) {
        std::cout << "MyClass default constructor called\n";
    }
};

int main() {
    int a = int();  // 初始化为 0
    MyClass obj = MyClass();  // 调用 MyClass 的默认构造函数

    std::cout << "a: " << a << std::endl;
    std::cout << "obj.x: " << obj.x << std::endl;

    return 0;
}

3. 直接初始化(Direct Initialization)

直接初始化通过括号传递参数进行初始化。

#include <iostream>

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {
        std::cout << "MyClass(int) constructor called\n";
    }
};

int main() {
    MyClass obj(10);  // 调用 MyClass(int) 构造函数

    std::cout << "obj.x: " << obj.x << std::endl;

    return 0;
}

4. 拷贝初始化(Copy Initialization)

拷贝初始化通过赋值运算符将初始值赋给变量,会调用拷贝构造函数或移动构造函数。

#include <iostream>

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {
        std::cout << "MyClass(int) constructor called\n";
    }
    MyClass(const MyClass& other) : x(other.x) {
        std::cout << "MyClass copy constructor called\n";
    }
};

int main() {
    MyClass obj1(10);  // 调用 MyClass(int) 构造函数
    MyClass obj2 = obj1;  // 调用拷贝构造函数

    std::cout << "obj1.x: " << obj1.x << std::endl;
    std::cout << "obj2.x: " << obj2.x << std::endl;

    return 0;
}

5. 列表初始化(List Initialization)

C++11引入了列表初始化,使用大括号 `{}` 进行初始化,可以避免窄化转换,并支持统一的初始化方式。

#include <iostream>

class MyClass {
public:
    int x;
    MyClass(int val) : x(val) {
        std::cout << "MyClass(int) constructor called\n";
    }
};

int main() {
    MyClass obj1{10};  // 调用 MyClass(int) 构造函数
    int a{5};          // 初始化为 5

    std::cout << "obj1.x: " << obj1.x << std::endl;
    std::cout << "a: " << a << std::endl;

    return 0;
}

6. 聚合初始化(Aggregate Initialization)

用于聚合类型(如数组和 `struct`),直接使用大括号 `{}` 为成员变量赋值。

#include <iostream>

struct MyStruct {
    int a;
    float b;
};

int main() {
    MyStruct s1 = {1, 2.5f};  // 聚合初始化
    int arr[3] = {1, 2, 3};   // 数组的聚合初始化

    std::cout << "s1.a: " << s1.a << ", s1.b: " << s1.b << std::endl;
    std::cout << "arr: " << arr[0] << ", " << arr[1] << ", " << arr[2] << std::endl;

    return 0;
}

7. 引用初始化(Reference Initialization)

引用变量必须在声明时进行初始化,且引用类型的初始化方式与其引用对象一致。

#include <iostream>

int main() {
    int x = 10;
    int& ref = x;  // 引用初始化

    std::cout << "ref: " << ref << std::endl;

    ref = 20;
    std::cout << "x: " << x << std::endl;  // x 也会改变

    return 0;
}

8. 成员初始化列表(Member Initialization List)

用于在类的构造函数中初始化成员变量。

#include <iostream>

class MyClass {
public:
    int x;
    int y;
    MyClass(int a, int b) : x(a), y(b) {
        std::cout << "MyClass(int, int) constructor called\n";
    }
};

int main() {
    MyClass obj(10, 20);  // 使用成员初始化列表

    std::cout << "obj.x: " << obj.x << ", obj.y: " << obj.y << std::endl;

    return 0;
}

9. 显式初始化(Explicit Initialization)

使用显式构造函数进行初始化。防止隐式转换。

#include <iostream>

class MyClass {
public:
    int x;
    explicit MyClass(int val) : x(val) {
        std::cout << "MyClass(int) constructor called\n";
    }
};

int main() {
    MyClass obj1(10);  // 直接初始化
    // MyClass obj2 = 10;  // 错误:不能进行隐式转换

    std::cout << "obj1.x: " << obj1.x << std::endl;

    return 0;
}

10. 延迟初始化(Lazy Initialization)

延迟初始化是指在需要时才进行初始化,常用于优化性能,减少资源占用。

#include <iostream>
#include <memory>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass constructor called\n";
    }
    void doSomething() {
        std::cout << "Doing something\n";
    }
};

int main() {
    std::unique_ptr<MyClass> ptr;  // 声明但不初始化
    // ...
    if (!ptr) {
        ptr = std::make_unique<MyClass>();  // 在需要时初始化
    }
    ptr->doSomething();

    return 0;
}

11. 常量初始化(Constant Initialization)

常量初始化用于初始化 `const` 变量,在编译时完成。

#include <iostream>

const int a = 10;  // 常量初始化

int main() {
    std::cout << "a: " << a << std::endl;

    return 0;
}

12. 静态初始化(Static Initialization)

静态变量的初始化,分为零初始化和常量初始化,在程序启动时完成。

#include <iostream>

class MyClass {
public:
    static int count;
    static const int constant;
};

int MyClass::count = 0;  // 静态初始化
const int MyClass::constant = 42;  // 常量初始化

int main() {
    std::cout << "MyClass::count: " << MyClass::count << std::endl;
    std::cout << "MyClass::constant: " << MyClass::constant << std::endl;

    return 0;
}

引用

Initialization - cppreference.com

  • 36
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉夢志昂丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值