C++ 中一些零碎的知识点

来源:互联网 发布:js 判断event 编辑:程序博客网 时间:2024/05/29 03:29

1.初始化列表

对于内置类型,如int, float等,使用初始化类表和在构造函数体内初始化差别不是很大,但是对于类类型来说,最好使用初始化列表
在初始化列表中的对象直接调用拷贝构造函数,不用调用初始化构造函数,所以效率高。
在构造函数体中的对象会先调用自身的构造函数,再调用拷贝构造函数进行赋值。
对于const成员变量而言,必须在初始化列表中进行初始化。

2.函数返回值

不要返回局部变量的指针或引用

3.使用++i而不是i++,因为前者不需要返回临时对象,效率更高。

4.关于typedef

(1)定义类型的别名,而不是简单的宏替换
char *a,b;//a为char型指针,b为char型typedef char * PCHAR;PCHAR a,b;//a和b都是char型指针
(2)在旧的C代码中,用来简化struct的定义
(3)定义与平台无关的类型
typedef unsign short UINT_16;

5.typedef和define的区别

(1)执行时间不同
typedef在编译期间执行,会进行类型检查
define在预处理期间进行简单的字符替换,不会进行类型检查
(2)功能不同
typedef用来定义类型的别名,简化类型定义,与struct结合使用
define可以用来替换类型,常量,变量等各种东西
(3)作用域不同
define没有特定的作用域
tydedef有作用域
(4)与指针结合时效果不同

6.指针常量与常量指针

char * const p;指针常量const char * p;常量指针char const *p;常量指针

7.指针数组与数组指针

int (*a)[4];数组指针,又叫行数组,a++将跨越4个int步长int *a[4];//指针数组,数组a中存储四个int型的指针int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

8.new 操作符

int *p1 = new int[10]; //分配随机值int *p2 = new int[10]();//会被初始化

未初始化的全部变量会被初始化为0,局部变量是随机值。

9.关于变量析构顺序

C c;void main(){    A*pa=new A();    B b;    static D d;    delete pa;}
先析构程序显式析构的,再析构局部变量。然后是全局变量。。同等级的,谁先被构造,谁后被析构。
全局变量作用域大于静态局部变量

10.虚函数的动态绑定仅在 基类指针或引用绑定派生类对象时发生

void fun(B0 ptr)//普通函数,这里使用的不是按地址传递,就会转化为基类对象{    ptr.display();}