- (P32)double和float的选择:执行浮点数运算选用double。这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。
- (P33)类型转换,非bool型赋值给bool型:初始值为0 的结果为false,否则结果为true。非0即1
- (P35)字面值常量
- (P39)初始化:创建变量时赋予其一个初始值。赋值:把对象当前值擦除,而以一个新值替代
- (P40)如果定义变量时没有指定初值,则变量被默认初始化。定义于任何函数之外的变量将被初始化为0。定义在函数体内部的内置变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或以其他形式访问此类值将发生错误。建议初始化每一个内置类型的变量,简单可靠。
- (P41)声明(declaration)使得名字为程序所知。定义(definition)负责创建于名字相关的实体。
extern int i;//声明i而未定义i
int j;//声明并定义j
extern double pi = 3.1416;//声明并定义pi。任何包含显示初始化的声明即成为定义
变量能且只能被定义一次,但是可以被多次声明。
如果要在多个文件中使用同一个变量,就必须将声明与定义分离,即:定义只出现在一个文件中,其他用到该变量的文件必须对其声明,却决不能重复定义。一个int i, 其他都是extern int i - (P42)C++标识符(identifier)由字母数字下划线组成,不以数字开头,长度没有限制,但是对大小字母写敏感。(如:int Int =0; int _ = 0; 都是正确的)
- (P)全局作用域,块作用域。建议:当你第一次使用变量时再定义它。第一,很容易找到变量的定义;第二,会赋予比较合理的初始值。
- (P)复合类型:基于其他类型定义的类型,如引用和指针。
- (P)引用reference(左值引用lvalue reference)
- 引用的定义,引用必须初始化,引用的初始值必须是一个对象
int ival = 1024;
int &refVal = ival;
int &refVal2;//报错:引用必须初始化
int &refVal2 = 10;//报错:引用的初始值必须是一个对象 - 引用并非对象,它只是一个已存在对象的别名,是将引用和源对象帮到在一起。
refval = 2;//执行完此句后,ival=2 - 以引用作为初始值
int &refVal3 = refVal;//等价于int &refVal3 = ival; - 因为引用本身不是一个对象,所以不能定义引用的引用
int &&refVal4 = ival;//报错:不能定义引用的引用 - 允许在一条语句中定义多个引用,其中每个引用都必须以符号&开头
int &refVal5 = ival, &refVal6 = ival;//定义了两个引用
int &refVal5 = ival, refVal6 = ival;//定义了1个引用1个int型对象
- 引用的定义,引用必须初始化,引用的初始值必须是一个对象
- (P)指针(pointer)
- 指针存放某个对象的地址,需要用取地址符(操作符&)获取该地址
int ival = 42;
int *p = &ival;//p存放ival的地址,p是指向ival的指针
int *p2;//正确!在定义时无需赋初值。但建议初始化所以指针,若不知道指向何处,初始化为0 - 指针本身就是一个对象,允许对指针的赋值和拷贝
int *p3 = p;//正确! - 指针指向了一个对象,使用解引用符(操作符*)来访问该对象
int ival = 42;
int *p = &ival;
cout << *p;//用操作符得到指针p所指的对象
*p=0;//操作结果:ival=0。对解引用的结果赋值,实际上就是对指针所指的对象赋值 - 空指针(null pointer)不指向任何对象。生成空指针的方法:
int *p3 = 0;
int *p3 = NULL;//需#include< cstdlib>,和上一句等价。Tips: NULL为预处理变量,它在头文件cstdlib中定义,她的值就是0
- 指针存放某个对象的地址,需要用取地址符(操作符&)获取该地址
- (P)指针引用高级
- 指向指针的指针
int ival = 1024;
int *pi = &ival;
int **ppi = & pi;//指向指针的指针,ppi指向对象pi,即存pi的地址
cout << *ppi << **ppi;//一次解引用为pi的值(ival的地址),两次解引用为ival的值 - 指向指针的引用
int i = 42;
int *p;
int *&r = p;//r是一个对指针p的引用,r是p的同名变量
r = &i;//r指向i,即p指向i
*r = 0;//解引用r得到i,即i的值变为0
- 指向指针的指针
- (P)const限定符
const int bufSize = 512;
bunfSize = 512;//错误!bufSize为常量,任何试图为bufSize赋值的行为都将引发错误。
const int k;//错误!因为const对象一旦创建就不能改变,所以必须初始化
const对象被设置为仅在文件内有效。当多个文件同时用同一const变量时,有两种策略:
- 每个文件都用const int bufSize = 0; 等同于在多个不同文件中定义多个独立的变量。
- 第一个文件用extern const int bufSize = 0; 其他文件用extern const int bufSize; 所有文件共享同一变量
- (P)类型别名
typedef double wages;//wage 是double的同义词
typedef wages base, * p;//base是double的同义词, p是double*的同义词 - (P)自定义数据结构
C++11新标准可以为数据成员定义类内初始值。之前的不可以,数据成员只能默认初始化 - (P)预处理#include<*.h>代替头文件内容
头文件保护符(可确保头文件多次包含仍能安全工作)#define指令把一个名字设置为预处理变量,#ifdef指令当且仅当定义时为真,#ifndef指令当且仅当未定义时为真,一旦结果为真,则执行后续代码直至遇到#endif指令为止
#ifndef SALES_DATA_H//SALES_DATA_H为预处理变量,一般全部大写
#define SALES_DATA_H
#include< string>
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
}
#endif
《C++Primer》读书笔记——第2章 变量和基本类型
最新推荐文章于 2023-09-22 16:22:54 发布