初始值:
当对象创建时获得了一个特定的值,则这个对象被初始化。
下列4条语句都是初始化:
int a1=0;
int a2={0};
int a3(0);
int a4{0};
用花括号来初始化变量成为列表初始化,且使用列表初始化且当初始值存在丢失信息的风险时。编译器会报错
#include <iostream>
using namespace std;
int main()
{
double c = 3.141592;
int a{c};
cout<<a<<endl;
int a2(c);
cout<<a2<<endl;
}
例如上面的 int a{c}因为存在丢失信息的风险,转换便不能进行,编译报错
但int a2(c)就会执行转换,但也会因此丢失部分值
默认初始化:
如果定义变量时没有指定初始值,则变量被默认初始化。默认值由变量类型和定义变量的位置决定
#include <iostream>
#include <string>
using namespace std;
string g;
int a;
int main()
{
cout<<"g,a :"<<endl<<g<<endl<<a<<endl;
int l1;
string l2;
cout<<"l1,l2 :"<<endl<<l1<<endl<<l2<<endl;
}
如果是内置类型的变量未被显示初始化,则值由定义的位置决定。
定义于函数体外的变量被初始化为0
定义于函数体内部的内置类型将不被初始化,一个未被初始化的内置类型变量是未知的!
变量的声明和定义:
extern int i;//声明i而非定义i
extern double pi = 3.1416 定义i
嵌套的作用域:
#include <iostream>
int reuse = 42;
int main()
{
int reuse = 0;
std::cout<<reuse<<endl;
//使用局部变量reuse
std::cout<<::reuse<<endl;
//显示地访问全局变量reuse
return 0;
}