Note for C++ Primer Plus
第三章 处理数据
19.2.24
- sizeof()返回每种类型的字节(byte)数,对类型用sizeof,括号是必须的,但对变量名用sizeof,括号是可选的
- climits头文件包含了各种类型数据大小的信息。CHAR_BIT为字节位数(8) INT_MAX, INT_MIN. 再climits中有#define INT_MAX 32767这样的语句,#define和#include一样都是一个预处理编译指令,该指令告诉预处理器在程序中查找INT_MAX,并替换为32767,修改后的程序再被编译。#define可以用来定义自己的符号常量,但是可以被const代替,只有在设计成C/C++都可用的头文件时,必须使用#define
- short至少16位;int至少与short一样长;long至少32位,且至少与int一样长;longlong至少64位且至少与long一样长;从16位计算机移植到32位计算机,int加倍,short不变
- 整型字面值;以0开头,八进制;以0x/0X开头,十六进制
- 不论什么进制表示数字,在计算机内都以二进制存储。Cout可以控制输出进制:hex;oct,是在名称空间std中声明
19.2.25 - C++如何确定常量类型:除非有需要存储为别的类型,否则都存储为int类型。常量加后缀可以特殊指明为什么类型数据。u/U表示unsigned int,l/L表示long,ul unsigned long
- char八位一字节,宽字符类型w_har_t可以存储更多的值,如Unicode
- char在默认情况下既不是有符号也不是无符号,是否有符号由C++实现决定。可以显示定义为signed 或 unsigned 范围分别为0-255与-128-127,如果用来存储ASCII,则用char即可
- wcha_t 占用两字节内存 有配对的wcin与wcout,在赋值时可加前缀L声明为宽字符变量
- 字面值true,false都可以通过提升转换为int类型;任何数字值或指针值都可以被隐式转换为bool值
- float精度6位,double精度15位。。。
- 默认浮点数常量为double类型,可以加后缀f或l
- 结合性:当两个优先级相同的运算符被用于同一个操作数时,根据结合性决定从左向右运算还是从右向左运算。对于x=205+64,先计算哪个乘法,决定权留给了实现
- 类型转换:发生在1. 赋值;2. 表达式中;3. 参数传递. 初始化和赋值时的转换:值将被转换为接收变量的类型。从较大浮点数转为较小浮点数,精度会降低,结果将不确定;从浮点转为整数类型,小数部分丢失,原来值可能超过整数类型表示范围,结果不确定。较大整形转为较小整型,通常只赋值右边的字节。
第四章 复合类型
数组
- 数组初始化方式:初始化列表{}
- 如果将值赋给一个超出数组范围的数组个体,编译器并不会指出错误
- 如果没有初始化数组,数组的元素将是不确定的,是以前驻留在该内存单元中的值
- sizeof 用于数组名,返回整个数组的大小
- C++允许只对数组部分值进行初始化,则编译器将其他元素设置为0. 因此将数组初始化为0很简单,只需要显示初始化第一个元素为零即可
- 如果初始化数组时放括号内为空,则C++编译器将计算元素个数,后续个数可以用sizeof得出
- C++11的数组新特性:列表初始化可省略等于号(适用于所有初始化),大括号内可以不包含任何东西,则所有元素都将设置为0;列表初始化禁止缩窄转换,就是指所赋值不能超出数组定义类型宽度所能表示的范围大小
字符串 - 字符串是存储在内存的连续字节中的一系列字符. C++有两种处理字符串的方式,C-风格字符串以及基于string类的方法
- 连续意味着可以将字符串存储在char数组中,C-风格字符串要求以空字符‘\0’结尾。空字符对C-风格字符串而言至关重要,C++有很多处理字符串的函数,它们都逐个地处理字符串中的字符,直到到达空字符为止。如果char数值没有以空字符结尾,例如使用cout显示该数组,则cout在打印完数组值后会继续将内存中随后的各个字节解释为要打印的字符,知道遇到空字符(ASCII码为0)为止。可以在字符数组中插入空字符达到截断字符数组的目的
- 字符串数组初始化,可以 char fish[]=”blue fish”,这样赋值,被双引号括起的字符串称为字符串常量,隐式地包括结尾的空字符。交给编译器确认数组大小会更安全一些。
- 字符串常量允许拼接,任何两个空白分割的字符串常量都将自动拼接成一个,第二个字符串的第一个字符将取代第一个字符串的空字符
- strlen()函数返回一个char数组的字符串长度,且只包括可见字符,不包括空字符
- 字符串输入,cin使用空白(空格,制表符,换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。另一个问题是输入的单词比字符数组要长。
- 面向行输入:getline(),get()
- cin.getline(),有两个参数,数组名,输入的字符个数;字符个数包括空字符,getline()会读取整行输入,并把行结尾的换行符替代成空字符
9.get()函数与getline函数参数相同,但是它会将换行符留在输入队列中,可以用cin.get()没有任何参数的形式,读取下一个字符; - get与getline都可以连续使用cin.getline().getline()因为两者都会返回一个cin对象
11.混合输入时,要注意输入数字后的换行符,用get()读取丢弃掉 (cin>>year).get()/(cin>>year).get(ch)
string类
- 包含头文件string,string类可以互相赋值,char数组不可以;string类可以+号连接,或+=
- 转义序列\反斜杠开头,在C-风格字符串中输入双引号单引号等等字符
- 包含cstring文件,用于处理char数组的函数:strcpy()复制;strcat()追加末尾,但是有超出原数组大小的风险,会覆盖相邻内存,可能导致程序终止
- 确认字符个数的方法:str.size();strlen(char1) 对应两种字符串表示方式
- 声明string类,没有赋值的话会自动赋给空字符;string类读取整行,getline(cin, str);
结构 - 结构的初始化方式:typename variable={xx,xx,xx};
指针 - 不同类型的指针本身的长度是相同的,char的地址和double的地址一样,长度取决于系统
- new 与 delete 配套使用,不可以delete释放声明变量所获得的内存
- 不可以释放一块内存两次,这样做的结果是不确定的,可以释放空指针
- delete 动态数组:delete [] name;
- int *p=new int[10];p是指向数组第一个元素的指针,程序跟踪了分配的内存量以便以后delete运算符正确释放这些内存,但是这种信息不是公用的,例如不能使用sizeof运算符来确定动态分配的数组包含的字节数
- 上述 p 指针,p+=1 之后,p[0] 将指向第二个元素,p-=1之后才能正确释放内存
- 在C++中数组和指针基本等价
Int array[10];
Int p=array; int p=&array[0];//两者都是将数组第一个元素的地址传递给指针,数组名就是//第一个元素的地址
array[i]等价于(array+i),对p也是如此,(p+i)等价于p[i],[]数组符号相当于解引用了
两种表示的区别是,对指针可以修改它的值,p+=1,p跨越指向数据类型的宽度;而数组名不可修改;其次对数组名应用sizeof可以知道数组整体大小,而对指针应用sizeof只能得到指针变量的大小,这种情况C++不会将数组名解释为地址 - 数组的地址。Cout<<array;将显示array第一个元素的地址;cout<<&array;将显示整个数组的地址,两者数值上是一样的,但从概念上说,&array0是一个四字节内存块的地址,而&array是一个410内存块的地址。因此,array+1将地址值加4,而&array+1将地址值加40. Array是一个int指针,而&array是一个int()[10]这样类型的指针,可以这样声明一个指向这样类型的指针:int(array_p)[10]=&array;而且此时array_p可以表示array,所以(*array_p)[0]可以表示array的第一个元素
指针与字符串
- 在C++中,char数组名,char指针,引号括起的字符串常量都被解释为字符串第一个字符的地址
- const char*p=”animal”字符串常量,要用常指针指向
- char*p;cin>>p;这样不行,因为只声明了p指针,而没有分配地址
- 如果给cout提供一个指针,它将输出指针所指地址值,但如果指针类型为char*,则cout将打印指向的字符串;要显示地址的方法是强制类型转换为别的类型指针 cout<<(int*)p;
- 要获得一个字符数组存储的字符串的副本,要char*p=new char[strlen(array)+1]; strncpy(p,array,strlen(array))];p[strlen(array)]=’\0’;这样更保险,最后一个空字符是防止没有复制完原字符串而导致没有空字符。strlen应该是以空字符作为结尾标记来确定字符串长度的,而不是字符数组的长度
第五章 循环和关系表达式
- C++中,每个表达式都有值,有的明显,有的不明显 x=20:表达式的值为20,C++将赋值表达式的值定义为左侧成员,可以编写:x=(y=4)+3 这样
- x=y=z=0;赋值表达式右结合
- 逗号运算符,用作声明语句的分隔符,用作表达式语句的连接符
- 逗号运算符确保先运算第一个表达式,然后计算第二个表达式,C++规定,逗号表达式的值是第二个部分的值cat=17,240;cat将赋予17,因为逗号运算符级别最低,而cat=(17,240);则将赋予240,因为逗号表达式的值是第二部分
- strcmp()比较C-风格字符串,相同返回0,不同返回1;string类型直接用关系运算符比较