2.2 变量
C++11 初始化方式
int units_sold = 0;
int units_sold = {0};
int units_sold{0};
int units_sold(0);
内置类型使用列表初始化且初始值存在丢失信息的风险,编译器将报错
long double ld = 3.1415926536;
int a(ld), b = {ld}; // 存在数据丢失风险,报错
int c(ld), d = ld; // 正确
函数体外的内置类型变量默认初始化为0,函数体内为初始化的内置类型变量值时
初始化内置类型变量
内置类型没有被显示初始化,其值由定义的位置决定。定义于任何函数体之外的变量被初始化为0,但函数体内部的内置类型变量将不被初始化,其值是未定义的。类的对象如果没有显示地初始化,则其值由类确定。
引用必须被初始化,且初始值必须是一个对象,类型也要一致。
2.3 指针
不能把 int 变量直接赋值给指针,即使int变量的值恰好等于0
void* 指针
- 指针比较
- 函数输入输出
- 赋值
指向指针的引用
int i= 42;
int *p;
int *&r = p;
r = &r;
*r = 0;
2.4 const 限定符
const对象必须初始化,默认状态下, const 对象仅在文件内有效,要在多个文件之间共享 const 对象,在定义之前添加 extern 关键字。
// file.c 定义并初始化一个常量,能被其他文件访问
extern const int bufsize = fcn();
// file.h
extern const int bufsize;
对 const 的引用可能引用一个并非 const 对象,常量引用对于引用的对象本身是不是常量未作限定。
int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0; // 可以修改
r2 = 0; // 不能修改
指针和const
指向常量的指针不能用于改变其所指对象的值,要想存放常量对象的地址,只能使用指向常量的指针。
指向常量的指针其所指的对象不一定是一个常量,只代表不能通过指针改变对象的值。
const double pi = 3.14;
double *ptr = π
const double *cptr = π
*cptr = 42;
const 指针
指针是对象而引用不是,const 指针必须初始化,值不能改变。不变的是指针本身的值,而不是指针指向的值。
int errnum = 0;
int *const curErr = &errnum; // 可以通过curErr修改errnum值
const double pi = 3.14;
const double *const pip = π // 不能通过pip修改pi的值
顶层const
常量指针、const常量(顶层const)和指向常量的指针(底层const)
拷贝操作(赋值等)时,要考虑底层const(指针指向的是否是常量)的限制。
int i = 0;
int *const p1 = &i; // 顶层
const int *p2 = &i; // 底层
const int *const p3 = &i;
2.5 处理类型
定义类型别名
- typedef
typedef double wages;
typedef wages base, *p; // p是double*同义词
wages hourly, weekly;
- using
using SI = sales_item;
SI item; // = sales_item item;
常量或复合类型的别名带来的歧义:
typedef char *pstring;
const pstring cstr = 0; // cstr: 指向char的常量指针
const pstring *ps; // ps: 指针,其值是一个指向char的常量指针
cstr类型是指针,对其 const 限定,便是const指针(常量指针),而不是替换类型别名之后的语句
const char * cstr = 0;
auto类型
auto 变量必须有初始值,同时声明多个变量时,所有变量初始数据类型必须一样.
auto i = 0, *p = &i; // correct
auto sz = 0, pi = 3.14; // wrong
auto忽略顶层const,保留底层const,希望保留const,要明确指出。
int i = 0;
const int ci = i;
auto a = ci; // a: int 而不是 const int
const auto b = ci; // b: const int
decltype 类型指示符
decltype 选择返回操作数的数据类型
const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x: const int
decltype(cj) y = x; // y: const int&, Y与x绑定
decltype(cj) z; // 错误,z是引用,必须初始化
decltype中如果变量加了括号,结果将是引用
decltype((i)) d; // 错误 d: int&,必须初始化
decltype(i) e; // 正确 e:int
2.6 自定义数据结构
预处理器,头文件保护符
#ifndef
#ifdef
#define
#endif
预处理变量无视C++中关于作用域的规则
本文详细介绍了C++中的变量初始化方式,包括C++11的四种初始化方法及注意事项,探讨了内置类型变量的默认初始化行为,以及引用、指针、const限定符的使用规则。同时,文章还讲解了如何处理类型,包括类型别名的定义和auto、decltype的使用,最后介绍了自定义数据结构的基本概念。

被折叠的 条评论
为什么被折叠?



