1、C语言跟C++的关系:
(1)C语言跟C++的本质区别:
1)、c更倾向于面向过程,c++是面向过程+面向对象+泛型编程
2)、c解决问题的思路如何通过一个过程来实现我们想要的功能,更注重的是算法;c++是 先构造一个对象模型,然后通过调用成员函数来实现相应的功能
3)、C和C++动态管理内存的方法不一样,C是使用malloc/free,而C++除此之外还有 new/delete关键字。
4)、C++支持函数重载,C不支持函数重载
5)、C++中有引用,C中不存在引用的概念
(2)C语言跟C++的结构体区别:
1)、c的结构体不能定义函数,但c++的可以
2)、c的空结构体大小为0,c++的为1
(3) g++如何调用c库函数:
1)、在c库的.h文件中对于函数的声明前要加extern "C",告诉g++不要对以下的函数名重命名
2)、如何区分此时用的是g++还是gcc?(1、g++中有__cplusplus这个宏,gcc没有;
2、sizeof(‘字符常量’)g++结果是1,gcc是4)
2、malloc和free、new和delete的问题
(1)malloc和free、new和delete的区别:
- malloc和free是标准c库的函数,new和delete是c++的运算符
- Malloc需要强制类型转换,而new不需要
- Malloc需要计算开辟空间的大小,而new不需要
(2)为什么有了malloc和free,还要有new和delete?
因为malloc和free是c库函数,不会自动调用构造和析构,而new和delete会.。这样就会产生内存泄漏。
3、引用和指针的区别:
(1)本质区别:
引用是变量的别名,是直接访问变量,指针存放的是变量的地址,需要单独开辟空间,访问变量是间接访问
(2)形式上的不同:
(1)引用不开辟空间,指针开辟空间
(2)引用必须初始化,指针可以不用初始化
(3)引用自加是变量自加,指针自加表示指针向地址增大的方向移动了一个数据
(4)指针可以赋值为NULL,但引用没有
(5)有void *类型的指针,但是没有void类型的引用
(6)指针有二级指针,但引用没有
(7)指针有函数指针、数组指针,但引用没有
(8)指针只能指向字符串常量,但常引用可以是任何类型常量的别名
4、Static的作用:
在C语言:
1、修饰局部变量延长了生命周期 2、修饰全局变量限制了作用域;修饰函数限制了作用域
在c++:
(1)修饰成员变量:
1、类内声明类外定义,因为static修饰的成员变量在编译阶段就开辟了空间,而类的定义不开辟空间,声明不开辟空间。2、属于整个类,所有对象共享;先于对象而存在 。3、如果是私有的,可以通过留static的成员函数作为公有的接口,在类外直接通过类名访问。 4、如果是公有的,可以直接在类外通过类名::被访问。
(2)修饰成员函数:
- 可以直接通过类名加作用域访问
- 没有this指针,不能访问非静态成员
- 非静态的成员函数可以访问静态成员
5、const的作用:
1、在C++中:
(1)const修饰成员函数:
- const修饰的成员函数中不能修改任何成员变量的值
- Const看似在修饰成员函数,实则是在修饰这个成员函数的第一个形参this
- 常成员函数只能调用常成员函数
(2)const修饰的对象:
- 不能作为左值
- 只能调用const修饰的成员函数
- 不能修改成员变量的值
2、在C语言中:
1、对变量声明只读特性,保护变量值以防被修改。
2、节省空间,避免不必要的内存分配。const修饰的变量在程序运行过程中只有一份拷贝。
6、重载、覆盖、重写的区别:
(1)重载:功能类似,函数名相同,参数不同(个数和类型),与返回值无关
特征:相同范围(同一个类中)、函数名字相同、参数不同、virtual关键字可有可无
(2)覆盖:子类覆盖父类的虚函数,实现接口的重用
特征:不同范围(基类和派生类)、函数名字相同、参数相同、基类中必须有virtual关键字(必须是虚函数)
(3)重写:子类定义了与父类一模一样的虚函数
特征:不同范围(父类和子类)、函数名字相同、参数不同或者参数相同且无virtual关键字
7、虚函数是怎么实现的
每一个含有虚函数的类都至少有有一个与之对应的虚函数表,其中存放着该类所有虚函数对应的函数指针(地址),
类的示例对象不包含虚函数表,只有虚指针;
派生类会生成一个兼容基类的虚函数表。
8、什么情况下会调用拷贝构造函数(三种情况)
1)用类的一个对象去初始化另一个对象的时候
2)当函数的参数是类的对象时,就是值传递的时候,如果是引用传递则不会调用
3)当函数的返回值是类的对象或者引用的时候
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)