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_ptr
、std::shared_ptr
和std::weak_ptr
。unique_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 {};