C++ 是一种功能强大的通用编程工具,由贝尔实验室的 Bjarne Stroustrup 开发。这种语言是 C 的扩展,是迄今为止最快的面向对象编程语言之一。C++ 因其高速和兼容性而非常流行。
它广泛用于游戏和服务器的开发,而 C++ 的一些实际应用如下
- 操作系统
- 基于 GUI 的应用程序
- 分布式系统
- 数据库软件
- 银行应用
- 高级计算和图形
- 嵌入式系统
所以,今天,从基础、中级和高级水平,很好地理解面试中提出的不同 C++ 问题。
应届生C++面试题和答案合集
1. C++ 中有哪些不同的数据类型?
C++中的4种数据类型如下:
- 原始数据类型(基本数据类型)。示例 - char、short、int、float、long、double、bool 等。
- 派生数据类型。示例 - 数组、指针等。
- 枚举。示例 - 枚举
- 用户定义的数据类型。示例 - 结构、类等。
2. C++常见面试题有哪些:C 和 C++ 有什么区别?
C++面试题解析:下表提供了 C 和 C++ 之间的主要区别:
C | C++ |
---|---|
C 是一种面向过程的编程语言。 | C++是一种面向对象的编程语言。 |
C 不支持数据隐藏。 | 数据通过封装隐藏,以确保按预期使用数据结构和运算符。 |
C是C++的子集 | C++是C的超集。 |
C 不支持函数和运算符重载 | C++ 支持函数和运算符重载 |
C 中不存在命名空间功能 | 命名空间由 C++ 使用,可避免名称冲突。 |
不能在结构内部定义函数。 | 函数可以在结构内部定义。 |
calloc() 和 malloc() 函数用于内存分配,free() 函数用于内存释放。 | new 操作符用于内存分配,delete 操作符用于内存释放。 |
3. C++中的类和对象是什么?
类是用户定义的数据类型,具有数据成员和成员函数。数据成员是数据变量,成员函数是用于对这些变量执行操作的函数。
对象是类的实例。由于类是用户定义的数据类型,因此对象也可以称为该数据类型的变量。
一个类被定义为-
class A{
private:
int data;
public:
void fun(){
}
};
例如,下面是一个类 car,它可以具有名称、颜色等属性,并且可以具有诸如 speed() 之类的方法。
4、struct和class有什么区别?
在 C++ 中,结构与类相同,除了安全性等一些差异。struct 和 class 的区别如下:
struct | class |
---|---|
默认情况下,结构的成员是公共的。 | 类的成员默认是私有的。 |
从类/结构派生结构时,基类/结构的默认访问说明符是公共的。 | 派生类时,默认访问说明符是私有的。 |
5. 什么是运算符重载?
运算符重载是对用户定义的数据类型执行操作的一个非常重要的元素。通过运算符重载,我们可以修改运算符的默认含义,如 +、-、*、/、<= 等。
例如 -
以下代码用于使用运算符重载将两个复数相加 -
class complex{
private:
float r, i;
public:
complex(float r, float i){
this->r=r;
this->i=i;
}
complex(){}
void displaydata(){
cout<<”real part = “<<r<<endl;
cout<<”imaginary part = “<<i<<endl;
}
complex operator+(complex c){
return complex(r+c.r, i+c.i);
}
};
int main(){
complex a(2,3);
complex b(3,4);
complex c=a+b;
c.displaydata();
return 0;
}
6. C++ 中的多态是什么?
简单的多态性意味着具有多种形式。它的行为在不同的情况下是不同的。当我们有多个通过继承相互关联的类时,就会发生这种情况。
例如,考虑一个名为 car 的基类,它有一个名为 carbrand() 的方法。派生类的汽车可以是梅赛德斯、宝马、奥迪 - 他们也有自己的汽车实现
C++中的两种多态是:
- 编译时多态
- 运行时多态
7.解释C++中的构造函数
C++面试题解析:构造函数是一个成员函数,在创建对象时自动执行。构造函数与它们所属的类具有相同的名称,以便编译器知道成员函数是构造函数。并且没有返回类型用于构造函数。
例子:
class A{
private:
int val;
public:
A(int x){ //one argument constructor
val=x;
}
A(){ //zero argument constructor
}
}
int main(){
A a(3);
return 0;
}
8. 说说虚函数
虚函数是你在派生类中重新定义的基类中的成员函数。使用 virtual 关键字声明虚函数。当函数变为虚函数时,C++ 会根据基类指针指向的对象类型确定在运行时调用哪个函数。
9. C++面试题和答案合集:比较编译时多态和运行时多态
编译时和运行时多态的主要区别如下:
编译时多态 | 运行时多态 |
---|---|
在这个方法中,我们会在编译时知道将调用哪个方法。并且调用由编译器解析。 | 在这个方法中,我们在运行时知道将调用哪个方法。编译器不解析调用。 |
它提供了快速执行,因为它在编译时是已知的。 | 与编译时多态性相比,它提供了缓慢的执行,因为它在运行时是已知的。 |
它是通过函数重载和运算符重载来实现的。 | 可以通过虚函数和指针来实现。 |
例子 -int add(int a, int b){ return a+b; } int add(int a, int b, int c){ return a+b+c; } int main(){ cout<<add(2,3)<<endl; cout<<add(2,3,4)<<endl; return 0; } | 例子 -class base{ public: void fun(){ cout<<”base “; } }; class derived: public base{ public: void fun(){ cout<<”derived ”; } }; int main(){ A *a=new B; a->fun(); return 0; } |
10.你对友元类和友元函数了解多少?
友元类可以访问其被声明为友元的其他类的私有、受保护和公共成员。
与友元类一样,友元函数也可以访问私有、受保护和公共成员。但是,Friend 函数不是成员函数。
例如 -
class A{
private:
int data_a;
public:
A(int x){
data_a=x;
}
friend int fun(A, B);
}
class B{
private:
int data_b;
public:
A(int x){
data_b=x;
}
friend int fun(A, B);
}
int fun(A a, B b){
return a.data_a+b.data_b;
}
int main(){
A a(10);
B b(20);
cout<<fun(a,b)<<endl;
return 0;
}
这里我们可以访问A类和B类的私有数据。
11. C++常见面试题有哪些:什么是 C++ 访问说明符?
在 C++ 中有以下访问说明符:
public:所有数据成员和成员函数都可以在类外访问。
protected:所有数据成员和成员函数都可以在类内部和派生类中访问。
private:所有数据成员和成员函数都不能在类外访问。
12.定义内联函数
如果函数是内联的,编译器会在编译时调用该函数的每个点放置该函数代码的副本。使用内联函数的重要优点之一是它消除了传统函数的函数调用开销。
13. C++中的引用是什么?
引用就像一个指针。它是已经存在的变量的另一个名称。一旦使用变量初始化引用名称,就可以通过变量名称或引用名称访问该变量。
例如-
int x=10;
int &ref=x; //reference variable
如果我们更改 ref 的值,它将反映在 x 中。一旦引用变量被初始化,它就不能引用任何其他变量。我们可以声明一个指针数组,但不能声明一个引用数组。
14. C++中的抽象是什么意思?
抽象是向用户显示基本细节并隐藏我们不想向用户显示的细节或隐藏与特定用户无关的细节的过程。
15. 析构函数是否可以重载?如果是,那么解释,如果不是,那么为什么?
没有析构函数重载是不可能的。析构函数不接受任何参数,因此只有一种方法可以销毁对象。这就是析构函数重载是不可能的原因。
16、按值调用和按引用调用是什么意思?
在按值调用方法中,我们将参数的副本传递给函数。对于这些复制的值,会分配一个新的内存,对这些值所做的更改不会反映主函数中的变量。
在按引用调用方法中,我们传递变量的地址,该地址用于访问函数调用中使用的实际参数。因此在参数中所做的更改会改变传递的参数。
17.什么是抽象类,什么时候使用?
类称为抽象类,其对象永远无法创建。这样的类作为派生类的父类存在。我们可以通过在类中放置一个纯虚函数来使类抽象。
18. C++ 中的析构函数是什么?
C++面试题解析:第一次创建对象时会自动调用构造函数。类似地,当一个对象被销毁时,一个名为 destructor 的函数会自动被调用。析构函数与构造函数同名(与类名相同),但前面有波浪号。
例子:
class A{
private:
int val;
public:
A(int x){
val=x;
}
A(){
}
~A(){ //destructor
}
}
int main(){
A a(3);
return 0;
}
19、什么是静态成员和静态成员函数?
当类中的变量声明为静态时,会在程序的整个生命周期内为其分配空间。无论该类创建了多少个对象,静态成员都只有一个副本。因此,该类的所有对象都可以访问相同的静态成员。
即使不存在类的对象并且仅使用类名和作用域解析运算符访问静态函数,也可以调用静态成员函数 ::
20.解释继承
继承是从现有类创建新类(称为派生类)的过程。这些现有的类称为基类。派生类继承了基类的所有功能,但可以添加自己的新功能和改进。
例子-
Class Bus、Class Car 和 Class Truck 继承了 Class Vehicle 的属性。
继承最重要的一点是它允许代码重用。
高级C++面试题和答案合集
21. 什么是复制构造函数?
复制构造函数是一个成员函数,它使用同一类的另一个对象来初始化一个对象。
例子-
class A{
int x,y;
A(int x, int y){
this->x=x;
this->y=y;
}
};
int main(){
A a1(2,3);
A a2=a1; //default copy constructor is called
return 0;
}
我们可以定义我们的复制构造函数。如果我们不定义复制构造函数,则调用默认的复制构造函数。
22.C++常见面试题有哪些:浅拷贝和深拷贝的区别是什么?
浅拷贝和深拷贝的区别如下:
浅拷贝 | 深拷贝 |
---|---|
浅拷贝存储对象对原始内存地址的引用。 | 深拷贝使用其唯一的内存地址为整个对象创建一个新的单独副本。 |
浅拷贝更快。 | 深拷贝相对较慢。 |
浅拷贝反映对原始对象中的新/复制对象所做的更改。 | 深层复制不反映对原始对象中的新/复制对象所做的更改 |
23.虚函数和纯虚函数有什么区别?
虚函数是你在派生类中重新定义的基类中的成员函数。它是使用 virtual 关键字声明的。
例子-
class base{
public:
virtual void fun(){
}
};
纯虚函数是一个没有实现的函数,通过赋值 0 来声明。它没有函数体。
例子-
class base{
public:
virtual void fun()=0;
};
这里,= 符号与赋值无关,值 0 没有赋值给任何东西。它用于简单地告诉编译器一个函数将是纯函数并且它不会有任何人。
24. 如果类 D 派生自基类 B。当创建类型 D 的对象时,这些类的构造函数将按什么顺序被调用?
派生类有两部分,基部分和派生部分。当 C++ 构造派生对象时,它是分阶段进行的。首先,构造最基类(在继承树的顶部)。然后依次构造每个子类,直到最后构造最子类。
所以B类的第一个构造函数将被调用,然后D类的构造函数将被调用。
在销毁过程中,遵循完全相反的顺序。那就是析构函数从派生最多的类开始,然后一直工作到基类。
因此,将调用 D 类的第一个析构函数,然后调用 B 类的析构函数。
25. 我们可以从构造函数中调用虚函数吗?
是的,我们可以从构造函数调用虚函数。但在这种情况下,行为略有不同。当调用虚拟函数时,虚拟调用在运行时被解析。始终是当前类的成员函数被调用。那是虚拟机在构造函数中不起作用。
例如-
class base{
private:
int value;
public:
base(int x){
value=x;
}
virtual void fun(){
}
}
class derived{
private:
int a;
public:
derived(int x, int y):base(x){
base *b;
b=this;
b->fun(); //calls derived::fun()
}
void fun(){
cout<<”fun inside derived class”<<endl;
}
}
26. 什么是空指针?
C++面试题解析:空指针是一个没有关联数据类型的指针。它可以保存任何类型的地址。
例如-
void *ptr;
char *str;
p=str; // no error
str=p; // error because of type mismatch
我们可以将任何类型的指针分配给 void 指针,但反之则不然,除非你将其类型转换为
str=(char*) ptr;
27. C++常见面试题有哪些:C++中的this指针是什么?
每个对象的成员函数都有一个名为 this 的指针,它指向对象本身。this 的值设置为调用它的对象的地址。它可以用来访问它指向的对象中的数据。
例子
class A{
private:
int value;
public:
void setvalue(int x){
this->value=x;
}
};
int main(){
A a;
a.setvalue(5);
return 0;
}
28. C++面试题和答案合集:C++中如何分配和释放内存?
在 C++ 中,new 运算符用于内存分配,delete 运算符用于内存释放。
例如-
int value=new int; //allocates memory for storing 1 integer
delete value; // deallocates memory taken by value
int *arr=new int[10]; //allocates memory for storing 10 int
delete []arr; // deallocates memory occupied by arr