c++教程:c++ primer知识点总结
第一章
1.包含来自标准库的头文件用<>,不属于标准库用""。
2.默认情况,读cin会刷新cout;程序非正常终止时也会刷新cout。
3.默认情况,cerr不缓冲,cerr通常用于输出错误信息或其他不属于程序正常逻辑的输出内容。
4.默认情况,clog缓冲,clog通常用于报告程序的执行信息,存入一个日志文件中。
第二章
1.算术表达不要用char,char在一些机器上是有符号的,在一些机器上是无符号的;如要使用一个不大的整数,明确指定是signed char还是unsigned char。
2.当我们赋给无符号类型一个超过它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
比如8bit的unsigned char表示0到255,则unsigned char c=-1 //实际c=-1+256=255
3.当我们赋给带符号类型一个超过它表示范围的值时,结果是未定义的(undefined)。此时程序可能继续工作,可能崩溃,可能生成垃圾数据。
在某些情况或某些编译器下,含有无法预知行为的程序能正确执行,但我们无法保证同样一个程序在别的编译器下能正常工作,甚至已经编译过的代码再次执行也可能会出错。此外,不能认为这样的程序对一组输入有效,对另一组输入就一定有效。
4.当表达式里既有带符号类型又有无符号类型,带符号数会自动地转换成无符号数。
例如:int a=-1,unsigned b=1,a*b结果是4294967295
5.以0开始的数表示8进制,以0x或0X开头的数表示16进制。以下都表示数值20:
20 /*十进制*/ 024/*八进制*/ 0x14/*十六进制*/
6.默认情况下,十进制字面值是带符号数,八进制和十六进制字面值既可能是带符号也可能是无符号。
7.如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,它们实际上是一个整体。
std::cout<<"something is wrong with my head, "
"and i am try my best to solve it"<
8.泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1个,2个,3个八进制数字。\115和\x4d都表示自负M。
std::cout<<"hi \x4dO\115!"; //输出hi MOM!。
如果\后跟的八进制数超过3个,只有前3个数字与\构成转义序列,\1234表示两个字符。\x要用到后面的所有数字,\1234表示一个字符。
9.指定字面值的类型,如后缀中有U或u,字面值类型从unsigned int,unsigned long和unsigned long long 中选能匹配的空间最小的一个,如后缀中有L或l,字面值类型至少是long,如有LL或ll,字面值将是long long和unsigned long long中的一种。
L'a' //wchar_t类型a
u'a' //char16_t
U'a' //char32_t
u8'a' //char
42ULL(ull,Ull,uLL) //unsigned long long
42l(L) //long
1e-3f(F) //float
3.14l(L) //long double
10.以下初始化等价:
int a=0;
int a={0};
int a(0);
int a{0};
如果使用列表初始化且初始值存在丢失信息的风险,编译器将报错:
double b=3.14;
int a{b},c={b}; //wrong
int d(b),e=b; //right
11.默认初始化。内置类型未被显示初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0,定义在函数体之内的将不被初始化,访问将引发错误。
每个类各自决定其初始化对象的方式,是否允许不经显示初始化就定义对象也由类自己决定。
12.声明只规定变量的类型和名字,定义除此之外还申请存储空间,也可能为变量赋初值。想声明一个变量而非定义它,就在变量名前缀加关键字extern,而且不要显示地初始化变量:
extern int i; //声明i而非定义i
int j; //声明j并定义j
给由extern标记的变量赋初值就抵消了extern的作用:
extern int d=0; //定义
在函数内部,试图初始化一个extern标记的变量将引发错误。
在多个文件中使用同一个变量,只能在一个文件中定义,其他文件中都要且只能声明,不能重复定义。
13.标识符必须以字母或下划线开头,用户自定义的标识符中不能出现两个连续的下划线,也不能以下划线紧邻大写字母开头。定义在函数体外的标识符不能以下划线开头。
变量名一般小写,如index;自定义类名一般以大写字母开头,如Sales_item;多个单词组成中间用下划线,如student_loan,不要写成studentloan。
14.在函数体内使用::a表示全局作用域里的变量a。
15.“引用”指“左值引用”,引用必须被初始化,引用是一个已经存在的对象的另一个名字,与它的初始值绑定在一起。引用不是对象,不能定义引用的引用:
int ival=1024;
int &refval=ival; //refval指向ival,是ival的一个别名
refval=2; //把2赋值给refval指向的对象,即ival
int ii=refval; //与ii=ival执行结果一样
int &refval2=refval; //refval2绑定到了与refval绑定的对象上,这里是绑定到ival上
int &refval3=10; //错误,引用类型的初始值必须是一个对象
double dval=3.14;
int &refval=dval; //错误,类型必须为int
15.指针是对象,允许赋值和拷贝,无须定义时赋初值。因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。
对指针解引会得出所指的对象,因此如果给解引的结果赋值,实际上是给指针指向的对象赋值,解引用操作只适用于那些确实指向了某个对象的有效指针。
16.生成空指针:
int *p1=nullptr; //nullptr可以被转换成任意其他的指针类型(最好的方法)
int *p2=0;
int *p3=NULL; //NULL是预处理变量,在头文件cstdlib中定义,值为0。预处理变量不属于命名空间std,它由预处理器负责管理(尽量避免)
把int变量直接赋值给指针是错误的操作,即使int变量的值恰好等于0也不行
int zero=0;
int *pi=zero; //错误
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5525.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
