列表初始化
int m = 0;
int m = {0}; // 列表初始化
int m{0}; // 列表初始化
int m(0); // 调用了int型的构造函数
对于内置类型变量,如果使用列表初始化且初始值存在丢失信息的危险,则编译器将报错:
long double ld = 3.1415926;
int a{ld}; // 错误,因为存在丢失信息的危险
int b = {ld}; // 错误,因为存在丢失信息的危险
int c(ld); // 正确
int c = ld; // 正确
默认初始化
定义在任何函数体外的内置类型变量将被初始化为0。
函数体内部的内置类型变量如果未被显式初始化,则值是未定义的。
类的对象未被显式初始化,则值由类的默认构造函数决定。
声明和定义
声明规定了变量的类型和名字,定义在此基础上还申请了存储空间。
如果想声明一个变量而非定义它,就在变量前添加关键字extern,而且不要显式初始化变量:
extern int i; // 声明i而非定义i
int j; // 声明并定义i
任何包含了显式初始化的声明即成为定义。extern语句如果包含初始值就不再是声明,而变成了定义:
extern double pi = 3.1415926; // 定义
在函数体内部,如果试图初始化一个extern标记的变量,将引发错误,因为对同一个变量定义了两次。
以下是一个使用extern关键字的例子:
// 变量i定义在头文件variable.hpp中
#ifndef VARIABLE_H
#define VARIABLE_H
extern int i = 0;
#endif
// 在另一个文件中使用变量i
#include <iostream>
#include "variable.hpp" // 引入包含变量i的头文件
using namespace std;
int main() {
extern int i; // 用extern关键字声明变量i,即i来自外部文件,此时初始化会报错
cout << i << endl; // 输出0
i = 10;
cout << i << endl; // 输出10
return 0;
}