使用列表初始化
初始化内置类型时,若存在丢失信息的风险,编译器将会报错:
long double ld = 3.1415926536;
int b = { ld };
默认初始化
变量的默认值与变量类型和变量所处的位置有关,
- 定义于任何函数之外的变量被初始化为0;
- 定义在函数体内部的内置类型变量将不被初始化;
变量的声明和定义
变量的声明:
extern int i;
变量的声明则是:在变量名前面添加关键字extern
并且不能显示地初始化变量;并且在函数体内部,不能初始化由extern
关键字标记的变量
当为变量赋初始值时:
extern double pi = 3.1416; //将会抵消extern的作用,从而转变为定义
int j; //声明并定义
名字的作用域
int reused = 42;
int main()
{
int reused = 1;
std::cout << reused << std::endl;
std::cout << ::reused << std::endl; // 全局作用域本身没有名字,当操作符的左侧为空时,将会向全局作用域请求获取变量的值
}
复合类型
引用(左值引用)
引用并非对象。
在初始化变量时,初始值会被拷贝到新建的对象中;定义引用时,程序把引用和它的初始值绑定,而非拷贝。一旦初始化完成,将会和它的初始值对象一直绑定在一起。因此无法令引用重新绑定到另外一个对象,因此引用必须初始化。
int &ai = 10; //错误
const int &ab = 10; //正确
指针
指针本身就是一个对象。
设置为空指针:
int *p1 = nullptr;
int *p2 = 0;
// 需要首先包含#include cstdlib
int *p3 = NULL; // NULL为预处理变量
void*
指针:可存放任意对象的地址
指向指针的引用:
int i = 42;
int *p;
int *&r = p;
要理解r的类型到底是什么,简单的方法时从右向左阅读r的定义:距离变量名最近的符号对变量的类型具有最直接的影响,因此r是一个引用,声明符的其余部分确定r引用的类型。
自定义数据结构
struct Sales_data {/*......*/} accm, trans, *salesptr; //最后的分号不要忘记
C++11新标准规定,可以为数据成员提供一个类内初始值,创建对象时,类内初始值用于初始化数据成员。
预处理功能(头文件保护符)
#ifndef XXX
#define XXX
......
#endif