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

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){}简化构造函数逻辑

相关文章:

  • 阿里云云网络论文:Nezha,计算网络解耦下的vSwitch池化架构
  • 三品PLM产品全生命周期管理功能清单 三品PLM系统赋能企业产品全生命周期管理
  • 开疆智能Profinet转Profibus网关连接施耐德ATV610变频器案例
  • Web3怎么本地测试连接以太坊?
  • 车载网关策略 --- 车载网关通信故障处理机制深度解析
  • 26考研 | 王道 | 第五章 传输层
  • Linux 下 C 语言实现工厂模式
  • K8S Pod调度方法实例
  • go build -gcflags 参数学习
  • Oracle 12c新增的数字转换验证VALIDATE_CONVERSION函数
  • 多模态大语言模型arxiv论文略读(九十四)
  • 【linux篇】动静态库和自动化构建的“神之一手”:make、Makefile
  • 【C++】小知识点
  • 《计算机组成原理》第 9 章 - 控制单元的功能
  • 电脑主板VGA长亮白灯
  • 自动化Web页面性能测试介绍
  • word中表格拉不动以及插入图片有间距
  • 使用 ssld 提取CMS 签名并重签名
  • Python学习(1) ----- Python的文件读取和写入
  • el-table设置自定义css
  • 电子网站怎么做/理发培训专业学校
  • 作文网站网址/网店运营工资一般多少
  • 京东联盟网站推广位怎么做/网站收录免费咨询
  • 网站更换空间教程/网络优化大师
  • 做兼职打字员的网站/百度搜索推广
  • 网站培训制度/wordpress网站建设