您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记之C/C++的区别

2019-03-27 00:42 44 查看

C++学习的基本概要:
1、C和C++的去别
(1)带默认值的参数的函数;
(2)inline内联函数;
(3)函数重载;
(4)引用;
(5)const&指针&引用;
(6)new/delete
(7)命名空间;
2、C++面向对象
3、C++模板编程
4、C++运算符重载
5、C++继承和多态
6、C++的I/O流的异常处理
7、C++设计模式
8、C++STL和Boost库

C和C++的区别

带默认参数的函数:
1、函数形参默认值,必须从右往左
2、调用参数带默认值的函数,有实参,取实参的值,没实参,取默认值
3、 形参默认值,函数声明,或者函数定义都定义给
4、默认参数只能给一次
5、实参是从左向右给形参赋值,和设置默认值的顺序相反,相辅相成,共同给形参赋值。入栈是从右向左
6、带默认参数的函数在调用的时候没有mov指令,将变量的值装入寄存器,只是有一个push压栈的过程。所以带默认值参数的函数比没有默认参数的函数调用更快。

inline内联函数
1、inline函数和普通函数有什么区别:
inline函数在编译过程中,会把代码在函数调用点进行展开,生成指令,省去了函数的调用过程中的栈帧的开辟和回退的消耗。
2、inline函数只是对编译器的一个建议,希望编译器把这个函数设置为inline函数在调用点进行替换,具体由编译器决定,但不能设置为递归函数,因为inline函数只是在调用点展开,并不知道真正递归的次数和结束条件。
3、inline函数的作用域和static修饰的函数一样只对本文件可见,优点是可以提高程序的执行效率,在大量调用函数的时候可以节省大量的普通函数调用的栈帧的开辟和回退。
4、inline和宏的区别:
宏是在预编译期间对代码的简单替换,并没有类型的检查,而inline函数是在编译期,在函数调用的时候,用函数体进行替换,同时用实参代替形参。

函数的重载
1、在编译阶段每一个函数都会生成一个符号,在C语言中函数符号就是函数名,而在C++中,函数生成的符号是函数名+参数列表(这就是为什么C语言没有函数重载的原因,就算参数列表不一样但是生成的函数符号是一样的,在链接时候的符号重定位会出现符号重定义的错误)
2、函数重载的要求:
a、函数名相同,但是参数列表不同,不能简单通过返回值的不同而区分是否是重载
b、一组函数重载,必须处在同一的作用域里。

C和C++中的const的区别:
C语言中:
1、const修饰的量不能作为左值
2、const修饰的量可以不初始化
3、const修饰的量是常变量,不能当做常量使用
4、编译过程和普通变量没有区别
在C++中:
1、C++编译const的过程的是遇到常量的名字的地方替换成常量的初始值
2、常量是可以退化为常变量,当用一个已初始化的变量来赋值给const修饰的量的时候,这时这个量为常变量。

const和指针的结合:
const int *==>int * error
const int ** <==int ** error
int ** ==>const int ** error
1)当const右边有*号的时候,const才参与类型当中
2)const表达式出现错误的原因:
a、const常量作为左值
b、把常量的地址或者引用泄露出去(把常量的地址赋值给非常量的指针)

static 在C和C++中的区别:
1、在C中static修饰的变量表示数据存储在静态区,作用域为本文件,在程序加载的时候就已经初始化。当static修饰全局变量时,改变了全局变量的作用域,使全局变量变为本文件可见,如果static修饰局部变量时,改变了它的生存期(存储方式变为静态),只被初始化一次,下一次依据上一次的值。默认值为0;
2、在C++中,static修饰的变量也存储在静态区
1)在程序执行到定义的代码的时候进行初始化,其余具有在C里面的所有性质
2)类的静态成员函数属于整个类而非类的对象,所以他没有this指针,所以他仅能访问类的静态数据和静态成员函数
3)不能将静态成员函数定义为虚函数
4)由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
(5)static并没有增加程序的时空开销,相反她还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。
(6)静态数据成员是静态存储的,所以必须对它进行初始化。 (程序员手动初始化,否则编译时一般不会报错,但是在Link时会报错误)
(7)静态成员初始化与一般数据成员初始化不同:
初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
初始化时不加该成员的访问权限控制符private,public等;
初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>
(9)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。

指针和引用有什么区别:
1、从汇编的角度来讲,指针和引用没有什么区别,引用的底层是由指针实现的
2、引用在定义时,就需要进行初始化,因为引用和指针一样是对地址的操作,但有野指针,却没有野引用。
3、指针可以定义多级指针,而引用却不能;
4、引用一旦指向一块地址,就不能改变了,这也是引用必须在初始化的另一个重要的原因

new 和malloc的区别:
1、new在C++里是一个关键字,而malloc在C里面是一个函数,两个都是在堆里开辟空间,new的底层是由malloc实现的
2、两个方式的检错方式不一样,new是抛出一个异常,来提示出错;而malloc是返回一个空指针
3、new 开辟空间是以元素的个数为单位,因为new的表达式中已经把数据的类型告诉了编译器,它的意思是让编译器开辟这种类型的数据n个;而malloc是以字节单位开辟的
4、new在开辟空间的时候可以进行初始化,而malloc 不能

C和C++中的struct的区别:
1、在vs中C是不能定义一个空结构体,而在GCC中可以,大小为0;而C++中的空结构体的大小为1;这是因为在C++中struct是类,在定义一个对象的时候,会先开辟空间,在调用构造函数,而构造函数是类的成员方法,参数列表中会自动带一个this指针,但又因为该结构体为空,为了表示有这个this指针,就用一个1字节的占位符。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: