C++ :default、delete关键字在构造函数后面的使用具有特定的含义
1. default 和 delete 的特殊意义
在C++中,default、delete关键字在构造函数后面的使用具有特定的含义,主要用于控制构造函数的生成和重载。
default:
当你在构造函数后面写上default,你实际上是告诉编译器自动为你生成一个该构造函数,除非你已经在类外部定义了同名的构造函数。如果你既没有写default也没有在类外部定义该构造函数,那么编译器不会自动生成这个构造函数。
例如:
class MyClass {
public: MyClass() = default; // 编译器自动生成这个默认构造函数
};
delete:
当你在构造函数后面写上delete,你实际上是禁止该构造函数的生成。这意味着你不能使用该构造函数来创建对象。这主要用于某些场景,如你有一个派生类并且你不希望该派生类的对象能通过基类的这个构造函数来创建。
例如:
class BaseClass {
public: BaseClass(int) = delete; // 禁止使用该构造函数来创建对象
};
两者的比较:
使用default和delete都可以达到控制构造函数生成的目的,但它们的行为是不同的:
- default:允许你在类外部定义一个同名的构造函数来覆盖默认行为。
- delete:禁止你在类外部定义一个同名的构造函数。
总的来说,default和delete关键字在构造函数后面的使用,提供了一种更细粒度的控制,使得你可以精确地定义哪些构造函数应该由编译器自动生成,哪些应该被禁止。
是的,除了default和delete,C++的构造函数后面还有其他一些指示关键字,这些关键字用于控制构造函数的链接性和可见性。
2. 除了default和delete,构造函数后面还有其他的指示关键字吗?
extern:
当你在构造函数后面写上extern,你实际上是告诉编译器这个构造函数是外部链接的,这意味着该函数可以在其他编译单元中被引用。
例如:
class MyClass {
public: MyClass() extern; // 构造函数是外部链接的
};
inline:
当你在构造函数后面写上inline,你实际上是告诉编译器这个构造函数应该被内联。内联函数是在编译时期展开的,这有助于减少函数调用的开销,但可能会增加编译后的代码大小。