在(函数代码少、频繁调用 )情况下适宜采用 inline 定义内联函数
内联函数在编译时,类似宏替换,使用函数体 替换调用处的函数名,因此适合代码较少调用较多的函数。
对象是指一块能够存储数据并具有某种类型的内存空间4
指针是对象而引用不是
有效的迭代器指向某个元素,或者容器尾元素的下一个位置;其余的都是无效。
如果容器为空,begin和end返回同一个迭代器,都是尾后迭代器
—> 箭头运算符 = 解引用+成员访问s
两个指针相减的结果 ptrdiff_t的标准库类型,和size_t一样,都是定义在cstddef头文件中的机器相关的类型,它是带符号类型
C++早期版本允许结果为负值的商向上/向下取整,C++11新标准规定商一律向0取整(切除小数)
m % -n = m%n -m % n = -(m%n)
移位:令左侧的对象的内容按照右侧运算对象的要求移动指定位数,然后将移动的(可能提升)左侧运算的拷贝作为求职结果,右侧不能为负,且严格小于结果位数,否则产生未定义行为。
左移直接补0
(右移)
右移操作符有以下两种方案:1.逻辑右移 左边补0,右边丢弃。
2.算数右移 左边移入的位由原先该值的符号位决定,符号位1则移入1,为0则移入0。
3.选择与联系
算术左移与逻辑左移是相同的,它们只有在右移时不相同,而且条件为操作数为负值。标准说明无符号值执行的所有移位操作都是逻辑移位,
但对于有符号值,采用哪种取决于编译器。
∴ 有符号数的右移操作符是不可移植的。
在 c++ 语言中,对函数参数默认值描述正确的是(在设定了参数的默认值后,该参数后面定义的所有参数都必须设定默认值)
对函数参数设定了默认参数后,为了防止参数匹配发生歧义,后边的参数也必须要设置成默认的。
关于函数的默认参数:
默认参数只能放在函数声明处或者定义处,能放在声明处就放在声明处 ;
如果某个参数是默认参数,那么它后面的参数必须都是默认参数,
因为调用函数传递参数的顺序是从左往右的,也即默认参数后的参数必须是默认参数;
不要重载一个带默认参数的函数,否则编译器会不清楚你要调用的是重载前还是重载后的函数。
下列静态数据成员的特性中,错误的是(静态数据成员不是所有对象所共有的)
- 静态数据在类内声明,类外定义,初始化
- 静态数据成员为该类所有对象所共享的
- 使用<类名> + 作用域解析符::进行访问, 使用static进行声明 ,只能访问类中的 静态数据成员
ASCLL 0-48 A-65 a-97
整型给浮点,如果正数所占空间超过了浮点数的容量,精度可能会损失
当赋给无符号类型一个超过他所标识的范围,结果是初始值堆无符号类型数值总数取模后的余数。
例如:-1给8比特大的unsigned char 结果 -1 mol 256 = 255
当赋给带符号类型一个超出它所表示的范围,结果未定义的。因此,程序可能继续工作、可能膨蝰,也可能生成垃圾数据
派生类一般都用公有派生
对基类成员的访问必须是无二义性的
赋值兼容规则是指派生类对象可以当作基类对象使用,只要存在继承关系,所以单继承/多继承都适用
char *szX=”abc”;
char *szY=”abc”;
//szX与szY指向同一个地址
c++有一种 copy on write(写时复制)机制,szX 和szY所指内容是一样的,没必要分配两个空间,浪费空间,但是当我们要修改其中一个时,系统才为我们复制一份,此时一个指针会指向新拷贝的那一份,这样对一个的修改就不会影响到另一个实体,
int a[]={
1,2,3,4};
int *b=a;
*b+=2;//即 *b = *b +2 b指向了a[0],a[0]=3
*(b+2)=2;//即 a[2]=2
b++; //b指向了a[1]
printf(“%d,%d\n”,*b,*(b+2));//a[1]=2; a[3]=4
struct A{
unsigned a : 19;
unsigned b : 11;
unsigned c : 4;
unsigned d : 29;
char index;
};
则sizeof(struct A)的值为(16)
//位域/位段 是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。
分为以下四行:
19+11 < 32
4 32-30<4,存不下4
29 存不下29
8
一共四行,每行4个字节,所以结构体的大小是4*4=16个字节(sizeof返回值以字节为单位)
//c++任何引用都必须指向一个实例
//内联函数不能是虚函数
//原因:虚表机制需要一个真正的函数地址,而内联函数展开以后,就不是一个函数,而是一段简单的代码(多数C++对象模型使用虚表实现多态,对此标准提供支持),可能有些内联函数会无法内联展开,而编译成为函数。
//定义在Class声明内的成员函数默认是inline函数
a. 成员函数被重载的特征:
( 1 )相同的范围(在同一个类中);
( 2 )函数名字相同;
( 3 )参数不同; 函数类型可以不同,参数类型或个数不同
( 4 ) virtual 关键字可有可无。
b. 覆盖是指派生类函数覆盖基类函数,特征是:
(重写即覆盖,子类的虚函数重写(覆盖)基类的虚函数 )
( 1 )不同的范围(分别位于派生类与基类);
( 2 )函数名字相同;
( 3 )参数相同;
( 4 )基类函数必须有 virtual 关键字。
c.“ 隐藏 ” 是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
( 1 )如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载混淆)。
( 2 )如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有 virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
字符串的结束标志是0和’\0’,注意’0’不是结束标志.
二维数组初始化必须指定第二个[],第一个[]是行号,也就是几个花括号
由多个源文件组成的C程序,经过编辑、预处理、编译、链接等阶段会生成最终的可执行程序。下面哪个阶
段可以发现被调用的函数未定义?
链接
List封装了链表,Vector封装了数组, 只有dqeue和vector是连续存储的
list和vector得最主要的区别在于: vector使用连续内存