interview
cpp-basics
C++中类定义中delete关键字和default关键字的作用?

C++基础面试题, C++ 中类定义中 delete 关键字和 default 关键字的作用?

C++基础面试题, C++ 中类定义中 delete 关键字和 default 关键字的作用?

QA

Step 1

Q:: C++ 中类定义中 delete 关键字的作用?

A:: 在 C++ 中,delete 关键字用于显式地删除默认的类成员函数或构造函数。通常用于阻止类对象被复制或移动。比如,将复制构造函数或赋值运算符标记为 delete,可以防止对象被复制或赋值,从而避免意外的深拷贝操作。

示例:

 
class MyClass {
public:
    MyClass(const MyClass&) = delete;  // 禁止复制构造函数
    MyClass& operator=(const MyClass&) = delete;  // 禁止赋值运算符
};
 

在上述例子中,试图复制 MyClass 的对象会导致编译错误。

Step 2

Q:: C++ 中类定义中 default 关键字的作用?

A:: 在 C++ 中,default 关键字用于显式地请求编译器生成默认的类成员函数或构造函数。这种情况下,尽管编译器通常会自动生成默认构造函数、复制构造函数、析构函数等,但在某些情况下,需要显式地指定 default 来恢复这些默认行为。例如,在用户定义了某些构造函数的情况下,编译器将不会自动生成默认构造函数,此时可以使用 default 来显式要求生成。

示例:

 
class MyClass {
public:
    MyClass() = default;  // 明确要求生成默认构造函数
    MyClass(const MyClass&) = default;  // 明确要求生成默认复制构造函数
};
 

在上述例子中,即使用户定义了其他构造函数,MyClass 仍然拥有默认构造函数。

用途

这些关键字在 C`++` 的类设计中非常重要,尤其是在涉及对象生命周期管理、资源管理以及避免不必要的对象复制和移动时。在实际生产环境中,`delete` 关键字可以用来避免对象被意外复制或移动,防止潜在的性能问题或逻辑错误。而 `default` 关键字可以确保类的默认行为得以保留,尤其是在用户定义了其他构造函数的情况下,可以显式要求编译器生成所需的默认函数。\n

相关问题

🦆
C++ 中构造函数和析构函数的区别是什么?

构造函数用于初始化对象,当对象创建时自动调用。析构函数用于清理对象,当对象被销毁时自动调用。构造函数可以有参数,用于对象初始化,而析构函数没有参数,用于释放资源。

🦆
什么是C++中的拷贝构造函数和赋值运算符?

拷贝构造函数用于创建新对象时对已有对象进行拷贝。赋值运算符用于将一个对象的值赋给另一个已经存在的对象。拷贝构造函数创建一个新的对象实例,而赋值运算符则是覆盖已有的对象。

🦆
在C++中,何时需要定义拷贝构造函数和赋值运算符?

当类中包含动态分配内存或其他资源时,需要显式定义拷贝构造函数和赋值运算符,以确保深拷贝操作,防止多个对象共享相同的内存地址,从而避免潜在的资源管理问题。

🦆
C++11 中的移动语义是什么?如何使用?

C++11 引入了移动语义,通过移动构造函数和移动赋值运算符,可以将资源从一个对象移动到另一个对象,而不是进行昂贵的拷贝操作。std::move 可用于将对象转换为右值引用,从而触发移动语义。

🦆
RAII资源获取即初始化是什么?在C++中如何实现?

RAII 是一种管理资源(如内存、文件句柄)的技术,通过将资源的获取与对象的生命周期绑定,确保资源在对象生命周期结束时自动释放。在 C++ 中,RAII 通常通过构造函数分配资源,析构函数释放资源来实现。