C++ 容易犯的错误和容易忘记的知识点(一)

  1. 在使用printf输出时,关于字符串输出格式
    对于 %-a.bs:
    • 表示左对齐
      a 表示输出占的宽度,如果这个宽度不够,则自动扩展到足够宽度
      b 表示输出字符串中多少个字符,如果原字符串长于这个宽度,则截断,多余的不输出

2.关于指针数组和数组指针,比方说:
<1> int p1[10]; 和 <2> int (p2)[10];
分清楚的关键是依靠运算符优先级,[ ]优先级大于,所以p是一个数组,int 修饰的是数组的元素,所以<1>是在一个指针数组,每一个元素是一个指针
同理<2>是一个数组指针,是一个指向一个有十个元素的数组的指针。

3.关于内联函数
<1>内联函数中的代码应该只是很简单、执行很快的几条语句。如果一个函数较为复杂,它执行的时间可能上万倍于函数调用的额外开销,那么将其作为内联函数处理的结果是付出让代码体积增加不少的代价,却只使速度提高了万分之一,这显然是不划算的。

<2>有时函数看上去很简单,例如只有一个包含一两条语句的循环,但该循环的执行次数可能很多,要消耗大量时间,那么这种情况也不适合将其实现为内联函数。

<3>需要注意的是,调用内联函数的语句前必须已经出现内联函数的定义(即整个函数体),而不能只出现内联函数的声明。

4.关于静态成员变量
<1> 静态成员为所有类对象所共享,不属于某个具体的实例
<2>静态成员变量必须在类外定义,定义时不添加static关键字
<3>类静态成员即可用类名::静态成员或者对象.静态成员来访问
<4>静态成员函数没有隐藏的this指针,不能访问任何非静态成员
<5>静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值
<6>子类可以访问父类的静态成员
<7>静态成员无多态特性

5.关于函数声明
函数声明中,参数名称可以忽略不写
eg:int Find( int , char );

6.C风格字符串相关
eg:、
char a="abcde";
char
b="abcde";
//此时a和b地址是相同的,都指向字符常量区的abcde
char c[]="abcde";
//此时c地址和a,b不同,因为c是一个数组,数组数据是存在栈区
char d[]={‘a’,'b','c','d','e'};
//d和c虽然定义时看起来内容一样,但是大小不同,使用“ ”初始化的数组会多出一个‘\0’元素

7.关于结构体大小的计算
普通计算:
由于内存对齐的问题,各个数据类型放的位置不同就会导致结构体的大小不一样。

偏移量:结构体中的偏移量就是结构体成员和结构体变量的地址之差,比如说第一个结构体成员的偏移量就是0,第二个结构成员的偏移量就是第一个结构体成员的大小,假如第一个成员的是int b;那么第二个结构体成员变量的偏移量就是4。

计算结构体大小的规则:

  1. 每一个成员的偏移量都必须是该成员的倍数。
  2. 结构体的大小必须是该结构体字节数最大成员的倍数。

有位段计算:
在32位cpu上选择缺省对齐的情况下,每行支持4个字节即32bit
最后结构体大小为 (行数*32)/8 字节

8.纯虚函数
使用场景:
什么情况下使用纯虚函数(pure vitrual function)?
1.当想在基类中抽象出一个方法,且该基类只做能被继承,而不能被实例化;
2.这个方法必须在派生类(derived class)中被实现;

猜你喜欢

转载自blog.51cto.com/14232799/2450114