当前位置: 首页 > ds >正文

C++ 初始化大全

C++ 变量初始化方式详解

1. 基本数据类型(如 intfloatdoublechar 等)

1.1 直接初始化

通过赋值符号初始化:

int a = 10;       // 使用赋值符号初始化
float b = 3.14f;  // 使用赋值符号初始化
double c = 2.718; // 使用赋值符号初始化
char d = 'A';     // 使用赋值符号初始化

1.2 圆括号初始化

通过构造函数风格的圆括号初始化:

int a(10);       // 使用圆括号初始化
float b(3.14f);  // 使用圆括号初始化
double c(2.718); // 使用圆括号初始化
char d('A');     // 使用圆括号初始化

1.3 花括号初始化(C++11 及以上)

统一初始化语法,更安全:

int a{10};       // 使用花括号初始化
float b{3.14f};  // 使用花括号初始化
double c{2.718}; // 使用花括号初始化
char d{'A'};     // 使用花括号初始化

1.4 默认初始化

未显式初始化时的行为:

  • 全局变量/静态变量:初始化为 0
  • 局部变量:未定义(垃圾值)。
int global_var;      // 全局变量,默认初始化为 0
static int static_var; // 静态变量,默认初始化为 0void func() {int local_var;    // 局部变量,未初始化,值是未定义的
}

2. 复合数据类型(如 std::stringstd::vector 等)

2.1 直接初始化

std::string str = "Hello";        // 使用赋值符号初始化
std::vector<int> vec = {1, 2, 3}; // 使用赋值符号和列表初始化

2.2 圆括号初始化

std::string str("Hello");        // 使用圆括号初始化
std::vector<int> vec(3, 10);     // 创建包含 3 个 10 的向量

2.3 花括号初始化

std::string str{"Hello"};        // 使用花括号初始化
std::vector<int> vec{1, 2, 3};   // 使用花括号初始化

2.4 默认初始化

调用默认构造函数:

std::string str;    // 默认初始化为空字符串
std::vector<int> vec; // 默认初始化为空向量

3. 自定义数据类型(类和结构体)

3.1 直接初始化

class MyClass {
public:int x;MyClass(int val) : x(val) {} // 构造函数
};
MyClass obj = MyClass(10);      // 使用赋值符号和构造函数初始化

3.2 圆括号初始化

MyClass obj(10); // 使用圆括号和构造函数初始化

3.3 花括号初始化

MyClass obj{10}; // 使用花括号和构造函数初始化

3.4 默认初始化

调用默认构造函数:

class MyClass {
public:int x;MyClass() : x(0) {} // 默认构造函数
};
MyClass obj; // 默认初始化,调用默认构造函数

4. 数组

4.1 直接初始化

int arr[] = {1, 2, 3, 4}; // 使用赋值符号和列表初始化

4.2 花括号初始化

int arr[]{1, 2, 3, 4};    // 使用花括号初始化

4.3 默认初始化

  • 全局/静态数组:所有元素初始化为 0
  • 局部数组:未初始化(垃圾值)。
int global_arr[5];      // 全局数组,默认初始化为 0
static int static_arr[5]; // 静态数组,默认初始化为 0void func() {int local_arr[5];   // 局部数组,未初始化
}

5. 指针

5.1 直接初始化

int* ptr = nullptr;     // 初始化为 nullptr
int* ptr = &a;          // 初始化为变量地址

5.2 圆括号初始化

int* ptr(nullptr);      // 使用圆括号初始化
int* ptr(&a);           // 使用圆括号初始化

5.3 花括号初始化

int* ptr{nullptr};      // 使用花括号初始化
int* ptr{&a};           // 使用花括号初始化

5.4 默认初始化

未显式初始化时为未定义值:

int* ptr; // 未初始化,值是未定义的

6. 枚举类型

6.1 直接初始化

enum Color { RED, GREEN, BLUE };
Color color = RED; // 使用赋值符号初始化

6.2 圆括号初始化

Color color(RED); // 使用圆括号初始化

6.3 花括号初始化

Color color{RED}; // 使用花括号初始化

6.4 默认初始化

未显式初始化时为未定义值:

Color color; // 未初始化,值是未定义的

7. 联合体(Union)

7.1 直接初始化

union Data {int i;float f;char str[20];
} data = {10}; // 初始化第一个成员

7.2 花括号初始化

union Data {int i;float f;char str[20];
} data{10}; // 初始化第一个成员

7.3 默认初始化

未显式初始化时,第一个成员的值是未定义的:

union Data data; // 未初始化,第一个成员的值是未定义的

8. 结构体(Struct)

8.1 直接初始化

struct Point {int x, y;
} p = {10, 20}; // 使用赋值符号和列表初始化

8.2 花括号初始化

struct Point {int x, y;
} p{10, 20}; // 使用花括号初始化

8.3 默认初始化

调用默认构造函数:

struct Point {int x, y;Point() : x(0), y(0) {} // 默认构造函数
};
Point p; // 默认初始化,调用默认构造函数

9. 初始化列表(C++11 及以上)

使用花括号 {} 初始化对象:

int arr[]{1, 2, 3, 4};                  // 数组
std::vector<int> vec{1, 2, 3, 4};        // 标准库容器
std::pair<int, double> p{10, 3.14};      // 标准库 pair
std::map<int, std::string> m{{1, "one"}, {2, "two"}}; // 标准库 map

10. 统一初始化(C++11 及以上)

使用 {} 初始化所有类型:

int a{10};                   // 基本数据类型
std::string str{"Hello"};    // 标准库类型
std::vector<int> vec{1,2,3}; // 容器
MyClass obj{10};             // 自定义类

优点

  • 类型安全(禁止隐式窄化转换)。
  • 语法一致性。
  • 简洁性。

注意事项

  • 类有显式构造函数时不能使用。
  • 空列表会调用默认构造函数。

11. 值初始化

显式初始化为默认值:

int a{};        // 初始化为 0
float b{};      // 初始化为 0.0f
std::string str{}; // 调用默认构造函数

12. 零初始化

显式初始化为 0

int global_var = 0;    // 全局变量显式初始化为 0
static int static_var = 0; // 静态变量显式初始化为 0

13. 聚合初始化(C++11 及以上)

初始化聚合类型(无构造函数、公有成员):

struct Point {int x, y;
};
Point p{10, 20}; // 聚合初始化

14. 委托构造函数(C++11 及以上)

构造函数调用其他构造函数:

class MyClass {
public:MyClass(int val) : x(val) {} // 主构造函数MyClass() : MyClass(0) {}    // 委托构造函数
private:int x;
};

总结

初始化方式语法示例适用场景
直接初始化int a = 10;简单类型显式赋值
圆括号初始化int a(10);显式调用构造函数
花括号初始化int a{10};类型安全、统一语法
默认初始化int a;全局/静态变量(初始化为 0)
值初始化int a{};显式初始化为默认值
聚合初始化Point p{10, 20};无构造函数的聚合类型
委托构造函数MyClass() : MyClass(0){}简化构造函数逻辑
http://www.xdnf.cn/news/9443.html

相关文章:

  • JavaScript变量宣言三剑客:var、let、const的奇幻冒险
  • 覆盖索引详解:原理、优势与面试要点
  • 循环神经网络(RNN):原理、架构与实战
  • 第1章 计算机系统知识
  • 32. 自动化测试开发之建立mysql和oracle数据库连接池
  • 训练自己的yolo模型,并部署到rk3588上
  • 微元法求解弧长与侧面积
  • 哪些情况索引会失效?
  • ubuntu 24 下使用pip 时碰到Externally Managed Environment Error的解决办法
  • Oracle迁移到瀚高之后,空值问题处理(APP)
  • 数据库相关问题
  • 什么是车间 6S 管理,如何实现人、事、物有序可控
  • [yolov11改进系列]基于yolov11引入全维度动态卷积ODConv的python源码+训练源码
  • QML常用窗口和菜单
  • 深入理解Modbus通信中的延迟机制
  • “相关分析”
  • UE5 蓝图,隐藏一个Actor,同时隐藏它的所有子物体
  • Rust 开发的一些GUI库
  • 如何在 Windows 和 Mac 上擦拭和清洁希捷外置硬盘
  • cf1703G
  • VR 技术与病毒分离鉴定:一场奇妙的邂逅​
  • vue3 getcurrentinstance 用法
  • 聊聊5G RedCap与eRedCap
  • 网络安全方向在校生有哪些证书适合考取?
  • 关于Java内存溢出文件OOM工具JProfiler的使用(示例)
  • 详解srs流媒体服务器的集群
  • 第五期书生大模型实战营——L0G1
  • Python打卡训练营打卡记录day38
  • CentOS 7.0重置root密码
  • Oracle OCP认证考试考点详解083系列16