c和cpp比较(1)--读书笔记3

来源:互联网 发布:无法开启网络发现 编辑:程序博客网 时间:2024/06/01 09:46

一、函数调用约定:(1)_cdecl(默认)   (2)_stdcall  (3)_fastcall

      调用约定决定了函数的三个方面:参数入栈、平衡堆栈(程序调用前后使得堆栈保持不变的过程)

二、call指令(1)先把下一行指令的地址入栈(2) 转到调用的子程序

三、带有默认值的函数:给默认值只能从右向左给,定义处或声明处都可以给。默认值只能给一次。

                     编译器在编译左边的参数的默认值时,一定要让编译器知道右边参数已经有默认值了。

                     int sum(int a,int b=10);(yes)

                     int sum(int a=5,int b);    (no)

四、内联(inline)函数:只在release版本起作用

1.inline:(1)在编译过程,在函数的调用点,把函数的代码全部展开;

              (2)inline函数不产生符号,所有内联函数只在本文件可见。

                inline只是对编译器的一个建议,最终由编译器决定

2.宏:在预处理阶段,字符串替换

3.inline函数是一种更安全(类型检查)的宏

4.内联函数和普通函数的区别:(1)内联函数没有标准的函数栈帧的开辟和回退;(只在release版本起作用,在debug版本中,inline函数的调用也需要栈帧的开辟和回退。)

                                                       (2)inline函数只有当前文件可见。

5. 内联函数和static函数的区别:(1)static函数有栈帧的开辟和回退,inline函数没有。

                                                        (2)static函数产生符号(local),inline函数不产生符号

                                                          链接器只处理global符号(符号解析---->符号分配内存虚拟地址---->符号的重定位),不看local符号

6. 普通函数和static函数的区别:普通函数产生的符号的属性为global                              ,

                                                          static函数产生的符号的属性为local

五、函数的重载

1. ①函数名相同、参数列表不同;②且在同一作用域,可以构成重载;③对实参的值是否有影响 const 或 volatile所修饰的 指针或者引用 可以作为函数重载的前提条件。 

2.不能仅通过返回值不同进行重载

3.静多态:函数的重载和模板

动多态:继承里面的多态(虚函数)

4.编译器的类型转换



5.C和C++之间的互相调用

(1)  C++程序  调用  C语言代码:   extern “C”     按C语言规则生成符号

      (c++编译器解析c)       

      (声明时用extern C              

(2) C程序  调用  C++代码:     extern “C”            按C语言规则生成符号

   (把C++源代码全部扩在extern C                     

6.静态链接和动态链接的区别:

  静态链接:链接的是*.lib (*.a)   编译时,生成可执行文件之前链接

      动态库:                *.dll(*.so)  生成可执行文件之后运行起来时链接的(动态链接减少可执行文件的大小,但比静态链接慢)

六、const   变成不能被修改的量

1、C语言的const:  (1)const修饰的变量不是必须初始化的,但之后再也无法给其合法的值。

                                  (2)const修饰的量叫常变量,不是常量。

                                  (3)const修饰的常变量和普通变量唯一区别是,常变量定义以后,不能作为左值存在。

                      (4)常变量和普通变量的编译方式一模一样。

2、C++的const:  (1)const修饰的量必须初始化。

                             (2)const修饰的量为常量

                             (3)const的编译规则:所有使用常量名字的地方(使用常量值的地方)全部替换成常量的初始值。???

                             (4)当const常量引用一个编译阶段不明确的值的时候,const常量会退化成常变量。???        (3)和(4)矛盾??

                             (5)const修饰的值的符号属性是local的,只有当前文件可见。???

                               在const常量定义处加extern,符号属性就改为了global,即外部文件就可访问该常量了。???

七、引用

  (int)&a:把a的地址强制转换为十进制整型

  (int &)a:把a的引用强制转为整型。

1、定义一个引用变量是否开辟内存?   (开辟四个字节存储地址,但是访问不到系统给引用开辟的那四个字节的内存,只能访问到引用变量所引用的内存。系统会自动解引用)

2、定义一个引用变量,引用数组名   

int (*q)[10]=&array    <=======>     int (&q)[10]= array

【注意】

1.引用变量必须初始化 

2.初始化的值必须能取地址

3.引用一经定义不能改变,不能再引用别的变量

4.访问引用变量,永远访问的是它所引用的内存,不能访问存储地址的那四个字节的内存。

 



原创粉丝点击