interview
c-new-features
C 中类定义中 delete 关键字和 default 关键字的作用

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

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

QA

Step 1

Q:: C++ 中 delete 关键字的作用是什么?

A:: 在 C++ 中,delete 关键字用于显式删除由 new 运算符动态分配的内存。它会释放指针指向的内存,避免内存泄漏的发生。在 C++11 之后,delete 还可用于删除类的默认函数(如构造函数、复制构造函数、复制赋值运算符等),以禁止这些函数的自动生成和使用。例如:class MyClass { MyClass(const MyClass&) = delete; } 禁止使用复制构造函数。

Step 2

Q:: C++ 中 default 关键字的作用是什么?

A:: 在 C++11 中,default 关键字用于显式声明某个函数为默认函数,告诉编译器生成该函数的默认实现。通常用于构造函数、析构函数、复制构造函数和赋值运算符。使用 default 可以提高代码的可读性和可维护性。例如:class MyClass { MyClass() = default; } 显式声明构造函数为默认的构造函数。

用途

delete 和 default 关键字在面向对象编程中非常重要,尤其是在管理资源和确保类的正确使用方面。在实际生产环境中,这些关键字用于避免不必要的拷贝和不正确的内存管理,从而提高程序的稳定性和性能。例如,在设计不可复制或不可移动的类时,使用 delete 关键字可以避免意外的资源泄露或错误的行为。而 default 关键字则能够帮助开发者简化代码,避免手动编写一些重复且容易出错的默认函数实现。了解这些关键字并能正确使用它们对于编写高效、安全的 C`++` 代码至关重要。\n

相关问题

🦆
C++ 中的 move 语义是什么?如何实现?

C++ 中的 move 语义允许资源的所有权在对象之间高效地传递,而不是进行昂贵的深拷贝。通过实现移动构造函数和移动赋值运算符,可以将资源从一个对象转移到另一个对象,从而避免不必要的资源分配。实现 move 语义时通常会结合 std::move 函数使用,它将对象转换为右值引用。

🦆
什么是 RAII?如何在 C++ 中使用?

RAII(Resource Acquisition Is Initialization)是一种管理资源的惯用方法,在对象的生命周期内自动管理资源。在 C++ 中,这通常通过在构造函数中获取资源(如内存、文件句柄),并在析构函数中释放资源来实现。RAII 确保资源在异常或退出作用域时不会泄漏,从而提高程序的可靠性。

🦆
C++ 中的智能指针是什么?有哪些类型?

智能指针是 C++ 中用于自动管理动态内存的类模板。主要有三种类型的智能指针:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。std::unique_ptr 实现独占所有权,std::shared_ptr 实现共享所有权,而 std::weak_ptr 则是对 shared_ptr 的一种弱引用。智能指针通过 RAII 来自动管理资源,减少内存泄漏和悬挂指针的风险。

🦆
为什么 C++ 中需要显式禁用默认函数?

在某些情况下,类不应该被复制或赋值,例如涉及到独占资源的类。如果类的默认复制构造函数或赋值运算符被隐式生成,可能导致资源的错误管理或双重释放。通过显式使用 delete 关键字禁用这些函数,可以防止潜在的错误和资源泄漏,确保类的正确使用。

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

QA

Step 1

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

A:: 在 C++ 中,delete 关键字可以用在类的成员函数声明中,以明确指定该成员函数被删除(即不允许调用)。通常用于删除拷贝构造函数、拷贝赋值运算符等,以防止对象的复制或不合适的赋值行为。示例:class MyClass { MyClass(const MyClass&) = delete; MyClass& operator=(const MyClass&) = delete; }; 这样做可以防止无意中复制对象,导致资源管理问题或逻辑错误。

Step 2

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

A:: 在 C++ 中,default 关键字用于显式指定编译器生成默认的函数实现。例如,当你希望使用默认的构造函数或析构函数,而不需要自定义时,可以使用 default。示例:class MyClass { MyClass() = default; ~MyClass() = default; }; 这样做可以提高代码的可读性,并且在需要默认实现时避免手动编写。

Step 3

Q:: 什么时候会用到 delete 和 default 关键字?

A:: delete 关键字通常用于禁止对象复制行为,特别是在类管理动态资源时,防止默认的浅拷贝导致资源管理问题。default 关键字用于显式请求编译器生成默认的函数行为,在需要依赖编译器生成的操作时很有用。这些关键字在设计类的接口时十分重要,可以明确代码意图,避免潜在的错误。

用途

面试这些内容是为了考察候选人对 C`++11` 及以后的新特性(如 `delete` 和 `default` 关键字)的掌握程度。这些特性对于设计健壮的类层次结构、避免常见的错误(如对象复制导致的问题)至关重要。在实际生产环境中,当需要严格控制对象的生命周期、资源管理和类接口时,这些关键字能够大大简化开发并提高代码的安全性和可维护性。\n

相关问题

🦆
C++11 还有哪些关键字或特性值得关注?

C++11 引入了许多新特性,包括 overridefinal 关键字,右值引用(rvalue references)和移动语义(move semantics),constexpr,lambda 表达式,智能指针(如 std::unique_ptrstd::shared_ptr),等等。这些特性显著提高了 C++ 的表达能力和性能。

🦆
什么是右值引用和移动语义?

右值引用(T&&)是 C++11 引入的新特性,允许你捕获和操作右值,从而实现移动语义。移动语义是指将资源从一个对象 '移动' 到另一个对象,而不是复制,这样可以避免不必要的资源分配和释放,显著提升性能。

🦆
C++ 中如何实现智能指针?

C++11 引入了 std::unique_ptrstd::shared_ptr 等智能指针,用于自动管理动态内存,以避免内存泄漏。std::unique_ptr 提供独占所有权,不能共享,而 std::shared_ptr 允许多个指针共享同一资源,并使用引用计数机制来管理资源的生命周期。

🦆
override 和 final 关键字的作用是什么?

override 关键字用于显式声明某个成员函数是重写基类中的虚函数,这有助于防止由于函数签名错误而导致的意外行为。final 关键字用于阻止派生类进一步重写某个虚函数或派生一个类,以保护类的行为。