C++ Primer-第二章 变量和基本类型

时间:2021-09-10 20:43:05

2.1 基本内置类型
1. 建议如何选择类型
执行浮点数运算选用double,这是因为float通常精度不够,而且float和double的计算代价相差不大。
2. 避免依赖于实现环境的行为
程序应该尽量避免依赖于实现环境的行为。例如,如果我们把int的尺寸看成是一个确定不变的已知值,那么这样的程序移植到别的机器后就可能发生错误。
3.切勿混用带符号类型和无符号类型
如果表达式里面既有无符号类型又有带符号类型,则带符号数会自动转换成无符号数。
例如 int a=-1; Unsinged b=1; int c; 则c=a*b;是错误的
2.2 变量
1. C++ 11新标准—列表初始化
int a {0};这种初始化形式称之为列表初始化。当用于内置类型的变量时,这种初始化形式有一个重要特点:初始值存在丢失信息的风险时,编译器会报错。
2. 建议初始化每一个内置类型的变量
3. 注意区分变量声明和变量定义
4. 变量可以声明多次,但只能定义一次。
2.3 复合类型
2.3.1 引用
1. 引用为对象起了另外一个名字,引用必须在定义时初始化。
2. 引用并非对象,他只是为已经存在的对象起的另外一个名字。
2.3.2 指针
1. 指针本身就是一个对象,可以先后指向不同的对象。
2. C++ 11 中用字面值nullptr来表示空指针,它可以转换成任意其它类型的指针。
3. 现有的C++程序最好使用nullptr,尽量避免使用NULL.
4. 建议初始化所有的指针,并在可能的情况下,尽量先定义了对象,再定义指向它的指针。
2.4 const 限定符
1. const 对象一旦创建后它的值就不能再改变,所以const 对象必须初始化。
2. 如果利用一个对象去初始化另外一个对象,则他们是不是const 都无关紧要,例如:
int a=2; const int b=a; int c=b; 都是正确的。
3. 如果想在多个文件之间共享const对象,必须在声明和定义之间加extern 关键字做限定。例如:在file.h 文件中声明 extern const int bufSize; 在file.cpp 文件中定义 extern const int bufSize = 5;
2.4.1 const 的引用
1. 可以把引用绑定到const 对象上,但是对const 对象的引用不能用于修改他所绑定的对象。
2.const 引用 仅对引用可参与的操作做出了限定,对于被引用的对象本身未做限定。例如:
int i=4;
int & r1=i; //正确;
const int &r2=i; //正确;
r1=0; //正确;
r2=0; //不正确r2是常量引用;
2.4.2 指针和const
1. 指向常量的指针类似于常量的引用,指向常量的指针仅仅要求不能通过该指针改变对象的值,也没有规定其所指的对象必须是常量。可以理解为:所谓指向常量的指针或者对常量的引用,不过是指针或引用的自以为是,他们觉得自己指向了常量,或是常量的引用,所以自觉的不去改变所指向或引用的对象的值。
例如:
const double a=3.14;
double b=3.14;
const double *c=&a//正确;
const double *d=&b//正确;
double *c=&a;//错误;
2. 常量指针(指针本身是一个常量)
如何弄清楚声明的含义?
int a = 0;
int *const cur = &a;
从右向左依次阅读,离cur 最近的是const, 意味着cur 是一个常量对象;对象的类型由声明符的其他部分决定。声明符的下一个符号是*,意思是 cur 是一个常量指针;最后该声明语句的基本数据类型部分确定了常量指针指向了一个int 对象。
const int b = 0;
const int *const cur = &b;
从右向左依次阅读,离cur 最近的是const, 意味着cur 是一个常量对象;对象的类型由声明符的其他部分决定。声明符的下一个符号是*,意思是 cur 是一个常量指针;最后该声明语句的基本数据类型部分确定了常量指针指向了一个int 类型的常量。
2.4.3 顶层const
用名词顶层const表示指针本身是个常量,用名词底层const表示指针所指向的对象是个常量。
2.5 处理类型
2.5.1 类型别名
方法1,typedef double wages; //wages 是double的同义词;
方法2,using SI = Sales_item; // SI 是Sales_item的同义词;
2.5.2 auto类型说明符
编程时常常需要把表达式的值赋值给变量,这就要求在变量声明时知道表达式的类型。C++11引入auto类型说明符来解决这个问题,auto让编译器通过初始值来推算变量的类型。显然auto定义的变量必须有初始值。
auto item = val1+val2;
2.5.3 decltype类型说明符
有时需要从表达式的类型推断出要定义的变量的类型,但是不想用该表达式初始化变量。为了解决这一问题C++11引入decltype类型说明符,他的作用是分析表达式并得到他的类型,却不实际计算表达式的值。
decltype (f()) sum = x; //sum的类型就是函数f的返回值的类型;