interview
cpp-basics
C++基础

C++基础面试题, C++基础

C++基础面试题, C++基础

QA

Step 1

Q:: 请解释C++中的构造函数和析构函数的作用,并给出示例代码。

A:: 构造函数是类的特殊成员函数,当创建类的对象时,它会自动调用,用于初始化对象。析构函数也是特殊的成员函数,当对象的生命周期结束时,它会自动调用,用于清理对象(例如释放资源)。构造函数可以被重载,而析构函数不能。示例代码:

 
class Example {
public:
    Example() { 
        std::cout << "Constructor called" << std::endl;
    }
    ~Example() { 
        std::cout << "Destructor called" << std::endl;
    }
};
 
int main() {
    Example obj;
    return 0;
}
 

Step 2

Q:: 什么是C++中的虚函数?请解释其在多态中的作用。

A:: 虚函数是基类中的一个成员函数,可以在派生类中被重新定义。当通过基类指针或引用调用虚函数时,会根据对象的实际类型调用相应的函数版本。它是实现运行时多态的关键。示例代码:

 
class Base {
public:
    virtual void show() { 
        std::cout << "Base class" << std::endl;
    }
};
 
class Derived : public Base {
public:
    void show() override { 
        std::cout << "Derived class" << std::endl;
    }
};
 
int main() {
    Base* b = new Derived();
    b->show(); // 输出:Derived class
    delete b;
    return 0;
}
 

Step 3

Q:: 请解释C++中的内存管理,包括new/delete和malloc/free的区别。

A:: C++中的内存管理可以通过两种方式进行:使用new/delete操作符或使用malloc/free函数。new/delete是C++中的运算符,它们分别用于动态分配和释放对象的内存,并会自动调用构造函数和析构函数。malloc/free是C语言的标准库函数,只负责内存的分配和释放,不调用构造函数和析构函数。因此,在C++中推荐使用new/delete。示例代码:

 
int* arr = new int[10]; // 分配内存
...
delete[] arr; // 释放内存
 

Step 4

Q:: C++中的智能指针是什么?请解释它们的类型和使用场景。

A:: 智能指针是C++标准库中的一个类模板,用于自动管理动态分配的对象内存,防止内存泄漏。常用的智能指针有三种:std::unique_ptrstd::shared_ptrstd::weak_ptrunique_ptr实现独占式所有权,shared_ptr实现共享式所有权,weak_ptr是一种不控制对象生命周期的智能指针,用于解决循环引用问题。使用智能指针可以确保对象在超出作用域时自动释放内存。示例代码:

 
std::unique_ptr<int> p1 = std::make_unique<int>(10);
std::shared_ptr<int> p2 = std::make_shared<int>(20);
 

Step 5

Q:: C++中的虚继承是什么?在什么情况下需要使用虚继承?

A:: 虚继承是一种解决C++多重继承中“菱形继承”问题的技术。当一个类从两个或多个基类继承,而这些基类又继承自一个共同的基类时,会导致该共同基类的成员在派生类中被多次继承,产生冗余。虚继承通过确保最底层的共同基类成员只被继承一次来解决这个问题。示例代码:

 
class A {
public:
    int a;
};
 
class B : virtual public A {};
class C : virtual public A {};
 
class D : public B, public C {};
 

用途

面试这些内容的目的是评估候选人对C`++核心概念和高级特性的理解程度。在实际生产环境中,C++常用于高性能系统、嵌入式系统和游戏开发,这些领域对内存管理、对象生命周期、多态和继承有着严格的要求。因此,掌握这些概念对于编写高效、稳定的C++`程序至关重要。\n

相关问题

🦆
什么是C++中的RAIIResource Acquisition Is Initialization?

RAII是一种编程习惯,表示资源的获取和初始化是同时进行的。当一个对象在其生命周期内管理某个资源时,该对象的构造函数负责获取资源,析构函数负责释放资源。RAII确保资源被及时释放,避免资源泄漏。这种模式在C++的内存管理中被广泛使用,尤其是结合智能指针。

🦆
请解释C++中的模板以及模板元编程.

C++中的模板是用于创建泛型代码的强大工具,它允许函数和类操作任意类型,而无需指定确切的类型。模板元编程(Template Metaprogramming, TMP)是一种编程技术,利用C++模板机制在编译期间执行计算,从而生成高度优化的代码。模板元编程在编写高性能库和框架时非常有用。

🦆
C++11中引入了哪些新特性?请列举并解释其中的几个.

C++11是C++语言的一个重要更新,引入了许多新特性,如auto关键字(自动类型推导)、lambda表达式、右值引用和移动语义(提高性能)、nullptr(替代传统的NULL指针)等。这些新特性极大地提高了C++编程的简洁性和效率。

🦆
C++中的多态和继承有什么区别和联系?

继承是面向对象编程的一个关键特性,允许一个类从另一个类获取属性和方法,而多态则是基于继承的机制,允许在不改变接口的情况下使用不同类型的对象。多态通常通过虚函数和指针或引用实现,使得相同的接口可以有不同的实现。