C++中的默认函数与default和delete用法
来源:互联网 发布:cf录视频软件 编辑:程序博客网 时间:2024/05/21 06:41
一、类中的默认函数
a.类中默认的成员函数
1.默认构造函数
2.默认析构函数
3.拷贝构造函数
4.拷贝赋值函数
5.移动构造函数
6.移动拷贝函数
b.类中自定义的操作符函数
1.operator
2.operator&
3.operator&&
4.operator*
5.operator->
6.operator->*
7.operator new
8.operator delete
同时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用法
- C++中的默认函数与default和delete用法
- C++中的默认函数与default和delete用法
- C++中的默认函数与default和delete用法
- C++中的默认函数与default和delete用法
- C++中的默认函数与default和delete用法
- C++中的默认函数与default和delete用法
- C++中的默认函数与default和delete用法
- C++ -- 默认函数与default和delete用法
- C中的malloc()函数和free()函数与C++中的new()函数和delete()函数详解
- 构造函数delete和default关键字分析
- C++构造函数的default和delete
- [C++]default constructor默认构造函数
- 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元
- C++ Primer中的陌生概念二:default默认构造函数
- 读书笔记-Thinking in C++-第7章 函数重载和默认参数Function Overloading &Default Arguments
- C++中的new和delete用法
- C++:new和delete的用法
- 当scrollview 遇到gridview,listview产生的坑
- 滚动和div标签位置和li标签的相对定位,并进行重叠
- selenium geckodriver firefox兼容性问题
- 初窥Linux 之最常用的20条命令
- IDEA创建maven项目-1
- C++中的默认函数与default和delete用法
- vim之快速查找功能
- js获取二位数组的最大下标
- C++笔记 构造函数属性初始化,new,delete,对象的大小
- CUDA小记(5)something before programming(二)
- win10下,apache启动失败 Cannot load php7apache2_4.dll into server
- Python-协程
- 关于tomcat服务器本机可以访问tomcat管理界面,其他机器返回403Access Denied
- Android在分线程展示Toast