1、C++ 和C最大/主要区别是什么?
答:**C++是在C语言的基础上开发的一种面向对象编程语言,**应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。 其编程领域众广,常用于系统开发,引擎开发等应用领域,是最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特性
区别:C语言是一种结构化语言,面向过程,基于算法和数据结构,所考虑的是如何通过一个过程或者函数从输入得到输出;
C++是面向对象,基于类、对象和继承,所考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题,通过获取对象的状态信息得到输出或实现过程控制。
2、const的作用。
(1)const 修饰类的成员变量,表示成员常量,不能被修改。
(2)const修饰函数承诺在本函数内部不会修改类里面的数据成员,不会调用其它非 const 成员函数。
(3)如果 const 构成函数重载,const 对象只能调用 const 函数,非 const 对象优先调用非 const 函数。
(4)const 函数只能调用 const 函数。非 const 函数可以调用 const 函数。
(5)类体外定义的 const 成员函数,在定义和声明处都需要 const 修饰符。
3、类的static变量在什么时候初始化?函数的static变量在什么时候初始化?
答:类的静态成员变量在类实例化之前就已经存在了,并且分配了内存。函数的static变量在执行此函数时进行初始化。
4、封装、继承
(1)封装:
封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。
封装的意义在于保护或者防止代码(数据)被我们无意中破坏。
(2)继承:
继承主要实现重用代码,节省开发时间。
子类可以继承父类的一些东西。
5、什么是内存泄漏? 面对内存泄漏和指针越界,你有哪些方法?你通常采用哪些方法来避免和减少这类错误?
答:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。
使用的时候要记得指针的长度。
malloc的时候得确定在那里free。
对指针赋值的时候应该注意被赋值指针需要不需要释放.
动态分配内存的指针最好不要再次赋值.
6、new和malloc的区别?
答:(1)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
(2)由于对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。而不能够把执行构造函数和析构函数的任务强加于C语言中的malloc/free。因此C++语言需要一个能完成动态内存分配和初始化(构造函数)工作的运算符new,以及一个能完成清理与释放内存(析构函数)工作的运算符delete。
(3)new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。
7、面向对象技术的基本概念是什么,三个基本特征是什么?
答:基本概念:类、对象、继承;基本特征:封装、继承、多态。
8、多态的概念:
多态是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态。
多态性(polymorphism)可以简单地概括为“一个接口,多种方法”,它是面向对象编程领域的核心概念。
多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。
编译时多态性(静态多态):通过重载函数实现:先期联编 early binding
运行时多态性(动态多态):通过虚函数实现 :滞后联编 late binding
C++运行时多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(Override),或者称为重写。主要通过继承和虚函数实现,父类指针或者引用能够指向子类对象,调用子类的虚函数,所有在编译时是无法确定调用哪个虚函数,每个子类都维护着一张虚函数表, 程序执行时查询虚函数表来确定调用哪个虚函数;
实例:https://blog.csdn.net/e295166319/article/details/75221669
9、虚函数、纯虚函数区别:
纯虚函数是为了实现一个接口,在基类中实现,起到一个规范的作用,规范继承这个类的派生类必须实现这个函数。
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”
例如: virtual void funtion1()=0
纯虚函数的引入出于两个目的:
1、为了安全,因为避免任何需要明确但是因为不小心而导致的未知的结果,提醒子类去做应做的实现。
2、为了效率,不是程序执行的效率,而是为了编码的效率。
虚函数只能借助于指针或者引用来达到多态的效果。虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。
虚函数 vs 纯虚函数,如何选用?
当基类中的某个成员方法,在大多数情形下都应该由子类提供个性化实现,但基类也可以提供缺省备选方案的时候,该方法应该设计为虚函数。
当基类中的某个成员方法,必须由子类提供个性化实现的时候,应该设计为纯虚函数。
构造函数和析构函数可以是虚函数吗?
答:构造函数不能是虚函数,析构函数可以是虚函数且推荐最好设置为虚函数。
实例:
https://blog.csdn.net/yusiguyuan/article/details/12676177
10、 C++函数中值的传递方式有哪几种?
答:三种传递方式为:值传递、指针传递和引用传递。
11、内联函数
(1)对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
c用宏定义,c++用inline
(2)内联函数概念:
C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。如果已定义的函数过于复杂,编译器会自动忽略 inline 限定符。
引入内联函数的目的是为了解决程序中函数调用的效率问题。程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留意:
a. 在内联函数内不允许使用循环语句和开关语句;
b.内联函数的定义必须出现在内联函数第一次调用之前;
c.类结构中所在的类说明内部定义的函数是内联函数。
12、在c++程序中调用被C编译器编译后的函数,为什么要加extern“C”
C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库中的名字与C语言的不同,
例:假设某个函数原型为:
void foo(int x, inty);
该函数被C编译器编译后在库中的名字为: _foo
而C++编译器则会产生像: _foo_int_int 之类的名字。
为了解决此类名字匹配的问题,C++提供了C链接交换指定符号 extern “C”。
13、基类的析构函数不是虚函数,会带来什么问题
派生类的析构函数用不上,会造成资源的泄漏。
14、重载和重写(覆盖)
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
重写:是指子类重新定义父类虚函数的方法。
15、拷贝构造函数
拷贝构造函数,又称复制构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其形参必须是引用,但并不限制为const,一般普遍的会加上const限制。此函数经常用在函数调用时用户定义类型的值传递及返回。拷贝构造函数要调用基类的拷贝构造函数和成员函数。
class Line
{
public:
int getLength( void );
Line( int len ); // 简单的构造函数
Line( const Line &obj); // 拷贝构造函数
~Line(); // 析构函数
private:
int *ptr;
};
16、友元函数概念:
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
例如,以下语句说明类B是类A的友元类:
class A
{
…
public:
friend class B;
…
};
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。(B可以访问A的成员)
使用友元类时注意: (1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
参考:https://blog.csdn.net/fanyun_01/article/details/79122916