- C++ primer 第四版
- 1、 c++基本要素:内置类型、库类型、类类型、变量、表达式、语句和函数
- 2、 main函数的返回值必须是int
- 3、 endl操纵符,具有输出换行的效果,并刷新与设备相关联的缓冲区
- 4、 多行注释不允许嵌套
- 5、 Char类型一般只用于存储而不用于计算
- 6、 整数、字符、布尔值→整型
- 7、 只有内置类型存在字面值,可以定义如下:128U,128L,注意:没有short类型的字面值常量
- 8、 初始化:copy-initialization:int a=1024;
- Direct-initialization :int a(1024);
- 直接出示话语法更灵活且效率更高
- 9、 初始化不是赋值
- 10、 内置类型变量自动初始化:在函数体外自动初始化为0
- 11、 Extern int i;extern 即不是定义,也不分配存储空间;只有当extern声明位于函数外部时,才可以含有初始化
- 12、 C++语言中,变量只能定义一次,在使用变量之前必须定义或声明变量
- 13、 局部变量可以屏蔽全局变量,但通常不要同名
- 14、 下列一个语句:
- For(int index = 0;index!=512;++index){……:}
- 中512成为魔数,程序的维护性很差
- 15、 const对象;必须初始化
- 16、 非const变量默认为extern 要是const变量能够在其他文件中访问,必须显式的使定位extern
- 17、 引用别名:必须初始化,并且必须为对象
- 即以下是错误引用:int &a=34; int &b;
- 18、 规定:将普通的引用绑定到const对象是不合法的
- 19、 Const引用可以出师话未不同类型的对象或者初始化为右值int i=42;
- Const int & r=42;
- Const int &r2=r+i;
- 如果非const引用初始化是错误的
- Int i=42;
- Int &r =42;
- 20、 不同类型的引用
- Double dval=3.14; 编译器转换为 int temp = dval;
- Int &r=dval; Int &r=temp
- 对引用r修改不用改变dval的值,改变的知识编译器生成的temp中间变量
- 21、 非const以用只能绑定到该引用同类型的对象
- Const引用则可以绑定到不同但相关的类型对象对绑定到右值
- 22、 每句:enum points{point a=2,point b,point c=3,point d};
- 其中point a=2;point b=3;point c=3;point d=4;
- 23、 枚举类型的对象的初始化货赋值,只能通过其枚举成员或同一枚举类型的其他对象进行
- 24、 定义了类,也就定义了一种新的类型,类名就是该类型的名字
- 25、 类的初始化,不是在数据成员定义是初始化,而是通过构造函数
- 26、 用class和struct关键字定义类的唯一差别在于默认访问级别:默认情况下,struct成员为public,而class的成员为private
- 27、 头文件用于声明而不是用于定义,允许const变量的定义
- 28、 因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义
- 29、 #ifndef sal_h 如果sal_h未定义执行#ifndef和#endif之间的内容,如果定义跳过
- #define asl_h
- #endif
- 30、 string 对象的操纵中,不要把size()返回值赋给一个int变量可以用string::seze-type 接受string::size()值
- 31、 string 关系操作符
- a) 两个string 对象长度不同,且断的string对象与长的string对象的前面部分相匹配,则断的L长的
- b) 若不匹配,则比较第一个不匹配的字符
- 注:大小写敏感,字典排序策略
- 32、 当进行string对象和字符串字面值混合连接操作时,+操作符的左右操作数必须至少有一个是string类型的
- 33、 Vector不是数据类型而是一个类模板
- 34、 Vector复制初始化必须保存同一种元素类型
- 35、 Vector使用size-type时,必须指出该vector在哪里定义 它的类型总是包括vector的元素类型
- 36、 在c++中,对于程序员在鞋循环判断条件优先选用!=
- 37、 Vector<int> ivec;//empty vector
- Ivec[i]操作只能获取已存在的元素,不能向vector里田间元素
- 38、 仅能对确定已存在的元素进行下标操作 vector
- 39、 Vector<int>::const_iterator //an iterator that cannot write elements
- Const vector<int>::iterator //an itertor whose value cannot change
- 40、 任何改变vector长度的操作都会使已存在的迭代器失效
- 41、 Stirng对象和bitset对象之间是反向转化的:string 对象的最右边字符(即下标最大的那个字符)用来初始化bitset低阶位
- 42、 使用变量未定义数组维数是非法的
- 43、 Int a=0;和int *pi=a; 非法;把int型变量赋给指针,但可以把数值或const量赋值给指针式合法的
- 44、 Void *指针可以保存和人类型对象的地址
- 45、 Ptrdiff-t:标准库数据类型
- 46、 把一个const对象的地址赋给一个普通的,非const对象的指针也是非法的,不能用void*保存const指针,只能用void const
- 47、 const int* a1;a1可变,*a1不可变(指针可变,指向的不变)int *const a2;(反之)
- 48、 strlen返回的使字符串的长度,不包括结束符
- 49、 在程序中使用前自增操作,效率更高
- 50、 强制转换:cast-name<type>(expression)
- Cast-name:static-cast ,dynamic-cast const-case
- Reinterpret-cast
- 51、 在使用空语句的时候,要注释//null statement
- 52、 形参和实参个数要完全相同,类型必须要匹配
- 53、 参数传递时,对于赋值参数局限性:一下不能使用赋值参数
- a) 但需要在函数中修改实参的值时;
- b) 当传递的值是大型对象时;
- c) 当不能赋值对象时;
- 54、 应该将不需要修改的引用定义为const引用
- 55、 返回类型为void的函数通常不能使用第二种形式的return语句,但是,它可以返回一个void函数
- 56、 内联函数:函数返回类型加关键字inline,其定义应该在头文件中
- 57、 构造函数与类同名,而且没有返回类型
- 58、 函数不能仅仅基于不同的返回类型而实现重载
- 59、 局部申明函数不明智
- 60、 将一个容器复制给另一个容器时,类型必须匹配:容器类型和元素类型都必须相同
- 61、 接受容器大小做形参的构造函数只适用于顺序容器,而关联容器不支持这种初始化,如果元素类型没有默认构造函数,则必须显示指定气元素初始化式
- 62、 在定义容器的容器时必须加空格,例如:vector<vector<string> >lines;
- 63、 对容器内元素的增改删都会引起迭代器失效
- 64、 使用迭代器,添加元素会使之失效,insert返回值是一个更新的迭代器
- 65、 Vector<int> c;
- c.back() 返回容器c第一个元素的引用
- c.front() 返回容器c最后一个元素的引用
- c.begin() 指向容器c的第一个元素
- c.end() 指向容器c 最后一个元素下一个位置
- 66、 map接口中,value-type是pair类型,它的值成员可以修改,键成员不能修改
- 67、 即使两个类具有完全相同的成员列表,他们也是不同的类型
- 68、 构造函数不能声明为const
- 69、 按照与成员声明一直的次序编写构造函数初始化列表是个好主意。此外,尽可能避开使用成员初始化其成员
- 70、 重载逗号、取地址、逻辑与、逻辑或等操作不是好做法。这些操作符具有内置含义,如果定义自己的版本,就不能使用内置定义
- 71、 一般而言,输出操作符输出对象的内容,进行最小限度的格式化,我们不应该输出换行符
- 72、 基类一般把派生类需要重定义任意函数定义为虚函数
- 73、 反元关系不能继承
- 74、 构造函数只能初始化其直接基类的原因是每个类都定义了自己的接口,派生类构造函数不能初始化基类的成员且不应该对基类成员赋值
- 75、 只有析构函数应定义为虚函数,构造函数却不能
- 76、 设计派生类时,只要可能,最好避免与基类成员的名字冲突