C++构造函数的default和delete
转自:https://blog.csdn.net/u010591680/article/details/71101737
C++11中,当类中含有不能默认初始化的成员变量时,可以禁止默认构造函数的生成,
myClass()=delete;//表示删除默认构造函数
myClass()=default;//表示默认存在构造函数
当类中含有不能默认拷贝成员变量时,可以禁止默认构造函数的生成,
myClass(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝
myClass & operatir=(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝
——————————————————————————————————————————————————————
转自:https://blog.csdn.net/u012333003/article/details/25299939
同时C++规定,一旦程序员实现了这些函数的自定义版本,则编译器不会再自动生产默认版本。注意只是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比如:
class MyClass
{public:MyClass()=default; //同时提供默认版本和带参版本,类型是POD的MyClass(int i):data(i){}private:int data;
};
有些时候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private的并不提供实现,这样当拷贝构造对象时编译不能通过,C++11则使用delete关键字显式指示编译器不生成函数的默认版本。比如:
class MyClass
{public:MyClass()=default;MyClass(const MyClass& )=delete;......
}
当然,一旦函数被delete过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。
二、default和delete的其他用途
上面我们已经看到在类中我们可用default和delete修饰成员函数,使之成为缺省函数或者删除函数,在类的外面,也可以在类定义之外修饰成员函数,比如:
class MyClass
{public:MyClass()=default;MyClass() &operator=(const MyClass& );
);
//在类的定义外用default来指明缺省函数版本
inline MyClass& MyClass::operator=(const MyClass& )=default;
而关于delete的显式删除,并非局限于成员函数,由此我们也知default是只局限作用于类的部分成员函数的。于是我们还可用delete来避免不必要的隐式数据类型转换。比如:
class MyClass
{public:MyClass(int i){};MyClsss(char c)=delete; //删除char版本的构造函数
};
void Fun(MyClass m){}
int main()
{Func(3);Func('a'); //编译不能通过MyClass m1(3);MyClass m2('a'); //编译不能通过
}
这是因为char版本的构造函数被删除后,试图从char构造MyClass对象的方式是不允许的了。但去掉这句的函数删除后,编译器会隐式的将a转换为整型使得编译通过,调用的是整型构造函数,这可能并不是你所想要的。但是如果这样:
class MyClass
{public:MyClass(int i){};explicit MyClsss(char c)=delete; //删除explicit的char版本的构造函数
};
void Fun(MyClass m){}
int main()
{Func(3);Func('a'); //编译可通过MyClass m1(3);MyClass m2('a'); //编译不能通过
}
将构造函数explicit后,构造函数一样的还是不能发生char的构造,因为char构造版本被删除了,但在Func的调用用,编译器会尝试将c转换为int,即Func(\\a')会调用一次MyClass(int )构造,顺利通过编译。于是我们不提倡explicit和delete混用。
对与普通函数delete也有类型的效果。比如:
void Func(int i){};
void Func(char c)=delete; //显式删除char版本
int main()
{Func(3);Func('c); //无法编译通过return 0;
}
这里因为Func的char版本已经被删除,故Func('c')会编译失败。
delete的有趣的用法还有删除operator new操作符,编码在堆上分配该类的对象如:
void* operator new(std::size_t)=delete;
另外析构函数也是可以delete的
这样做的目的是我们在指定内存位置进行内存分配时并不需要析构函数来完成对象级别的清理,这时我们可显示删除析构函数来限制自定义类型在栈上或者静态的构造。
C++构造函数的default和delete相关推荐
- 默认构造函数,=default,=delete
//默认构造函数: (1)定义:不带参数的构造函数就是默认构造函数 例如:class A {public:A();}; A::A()//默认构造函数 {}A a;//可以如果我们没有写默认构造函数,那 ...
- 关于new handler与default、delete关键字
在https://blog.csdn.net/qq_42604176/article/details/111638568的operate_new源代码长啥样中谈到过new handler. 当oper ...
- C++11学习 新特性之 “=default” 、“=delete”
文章目录 1. =default 和=delete 概述 2. 类与默认函数 3. 使用"=delete"来限制函数生成 4. "=default"使用范围 1 ...
- C++笔记-C++11中default及delete的使用
今天在研究某开源事例代码时发现有人用default和delete关键字,在此学习了下,写了个小例子. default和delete只能作用于构造函数和析构函数. default关键字写了后会自动生成某 ...
- C++新特性探究(三):=default、=delete
一. =default C++的类有四类特殊成员函数,它们分别是:默认构造函数.析构函数.拷贝构造函数以及拷贝赋值运算符. 这些类的特殊成员函数负责创建.初始化.销毁.或者拷贝类的对象. ...
- C++ =default 和 = delete 以及 trival 和 nontrival
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- C++11新标准 default 和 delete的使用
写这个知识点的初衷也是在面试的时候被问到过的,由于对C++11新标准不是很了解,所以你懂得...,好了不多说了 首先我们要了解一下C++类中的四类特殊成员函数:分别是默认构造函数.析构函数.拷贝构造函 ...
- c++内存管理3: new handler、=default、=delete函数
1.new_handler new_handler位于头文件< new >中 当new无法成功申请内存,在抛出异常之前,new会调用一个系统默认或用户指定的错误处理函数,也就是这里的ne ...
- Effective C++学习笔记之copy构造函数和default函数和copy赋值函数(operator=)
1 .C++一个空的类里面一般默认的函数 比如我们写 class A {}; 一般里面系统会给你哪些默认函数呢? class A { public:A(){} //default函数~A(){} // ...
- 【C/C++面经_其他问题】
1.C++的多态如何实现 2.为什么析构函数一般写成虚函数 3.构造函数能否声明为虚函数或者纯虚函数,析构函数呢? 4.基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间 5.模板函数和模 ...
最新文章
- Linux 关机命令介绍shutdown
- 常见的几种异常类型 Exception
- C++中的转换构造函数和类型转换函数
- 常用Python代码
- HDU 4059 The Boss on Mars (容斥)(2011 Asia Dalian Regional Contest)
- 高并发高可用系统的常见应对策略
- spidev 驱动 probe 获取 dts 节点参数
- opencv3编程入门毛星云(第五章节5.2)
- InTouch 如何备份驱动的通信配置
- 目标群体是什么意思_什么是目标客户群体?求解
- linux计算与检查md5值
- Nacos源码系列之服务发现(二)
- 2015年动漫电影观影指南值得收藏
- 嵌入式SQLite数据库架构和设计
- Android Studio首次连接不上网易mumu模拟器解决办法
- JavaScript对输入的用户名密码等进行判断
- 3dmax软件导入图片为背景的方法与步骤
- 【解决】ocam录制失败。 导致: WASRecord: pAudioClient- Initialize failed. (hr=0x80070005
- 1004_Median
- SpringCloud-07-新一代路由网关Spring Cloud Gateway