【C++11】=default与=delete关键字使用详解

12 篇文章 1 订阅

系列文章目录

C++11新特性使用详解-持续更新
https://blog.csdn.net/xiaofeizai1116/category_12498334.html



一、=default关键字

=default关键字是C++11标准中引入的一个新特性,它用于告诉编译器生成默认的函数实现。

1. 为什么要引入=default关键字

在C++11之前,我们通常需要手动实现所有的函数,包括构造函数、拷贝构造函数、拷贝赋值运算符等等。但是有时候我们并不想为每个函数都编写实现,这时候就可以使用=default关键字来生成默认的实现。

2. 注意事项

  • 只能对具有合成版本的成员函数使用=default(即默认构造函数或拷贝控制成员)
  • 如果我们已经为某个函数提供了实现,那么就不能再使用=default关键字了。这样做会导致编译错误。
  • 类内用=default修饰成员的声明时,合成的函数将隐式地声明为内联,如果不希望隐式内联,应该只对成员的类外定义使用=default
  • 当构造函数需要申请内存资源时,我们通常需要手动编写构造函数的定义,并在其中使用适当的内存分配函数(如new)来申请内存。这样可以确保在对象创建时分配所需的内存,并在析构函数中释放这些内存。

3. 使用=default关键字有什么好处

它可以帮助我们减少代码量,提高代码的可读性和可维护性。
但是需要注意的是,只有在必要的情况下才应该使用=default关键字,否则可能会影响程序的性能和可读性。

4.实例代码

class MyClass
{
public:
	MyClass() = default;   //默认构造函数
	MyClass(const MyClass&) = default;    //默认构拷贝造函数
	MyClass& operator = (const MyClass&) = default;   //默认拷贝赋值运算符
	 MyClass(int i) { a = i; }; 

private:
	int a;
	std::string s;
	char* p;
};

int main()
{
    
	//default
	MyClass a1;
	MyClass a2 = a1;

	MyClass a3;
	a3 = a1;

    std::cout << "Hello World!\n";
}

二、=delete关键字

1. 为什么要引入=delete关键字

虽然大多数类应该定义拷贝构造函数和拷贝赋值运算符,无论是隐式的还是显式的。但某些类这些操作没有意义,这种情况下必须采用某种机制阻止拷贝或赋值。
=delete是C++11引入的一个新的关键字,它用于显式地删除一个已经定义的函数或操作符来阻止拷贝。

这个关键字告诉编译器,我们不希望这个函数或操作符被调用,即使在代码中出现了这样的调用也会导致编译错误。

比如iostream类阻止了拷贝,以避免多个对象写入或读取相同的IO缓存。
还有unique_ptrye阻止了拷贝,防止多个指针指向同一对象(破坏独占性)。

2. 注意事项

不能删除析构函数,如果析构函数被删除,就无法销毁此类型的临时对象。

某一个成员的析构函数是删除的,则该成员无法销毁,因而整个对象也无法被销毁

3. 使用场景

3.1删除默认构造函数

默认构造函数是没有参数的构造函数,它会在没有提供其他构造函数的情况下自动生成。但是,如果我们不希望这个默认构造函数被调用,可以使用=delete关键字来删除它。

class MyClass {
public:
	MyClass() = delete; // 删除默认构造函数
};
3.2 删除拷贝构造函数和拷贝赋值运算符

拷贝构造函数和拷贝赋值运算符用于创建一个新对象,并将其初始化为另一个同类型对象的副本。但是,如果我们不想让对象被复制,可以使用=delete关键字来删除这两个操作符。

class MyClass {
public:
	MyClass(const MyClass&) = delete; // 删除拷贝构造函数
	MyClass& operator=(const MyClass&) = delete; // 删除拷贝赋值运算符
};
3.3 删除重载操作符

我们可以在自定义类型上重载操作符,以便使用它们时就像使用内置类型一样。但是,如果我们不想让某个操作符被重载,可以使用=delete关键字来删除它。

class MyClass {
public:
	void operator()(int x) = delete // 删除重载了括号运算符  
};
3.4 为什么不直接删除函数用

直接删除函数和用=delete关键字删除函数的效果是一样的,都是从代码中移除了函数定义。但是,使用=delete关键字相比直接删除函数,能更清晰、更明确地表达我们的意图,提高代码的可读性和可维护性。

  • 明确地告诉了编译器和其他的开发者,这个函数是不应该被调用的。这样,如果在代码中出现了对这个函数的调用,编译器就会报错,避免了潜在的错误和bug。

  • 帮助开发者更好地理解和阅读代码。通过查看函数前面的=delete关键字,我们可以快速地判断出这个函数是否应该被调用,而不必去深入阅读函数的实现细节。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的delete功能是用来释放通过new关键字动态分配的内存空间的。当我们使用new关键字分配内存后,需要在不再使用这块内存时使用delete来释放它,以避免内存泄漏。delete操作符会调用对象的析构函数,并释放内存空间,使其可供其他程序使用。\[1\]\[2\]在C++中,delete操作符可以用于释放单个对象的内存,也可以用于释放数组对象的内存。对于通过new关键字分配的单个对象内存,我们使用delete操作符来释放它,而对于通过new关键字分配的数组对象内存,我们使用delete\[\]操作符来释放它。\[1\]需要注意的是,使用delete操作符释放内存后,我们不能再访问该内存空间,否则会导致未定义的行为。此外,delete操作符只能释放通过new关键字分配的内存,不能用于释放通过malloc函数分配的内存。\[3\] #### 引用[.reference_title] - *1* [C++delete函数](https://blog.csdn.net/jiayizhenzhenyijia/article/details/97935941)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [c++ new和delete详解](https://blog.csdn.net/weixin_49638349/article/details/126064455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++new与delete使用](https://blog.csdn.net/weixin_56935264/article/details/124858025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值