c++11 默认函数的控制
1. 类与默认函数:
C++中声明自定义的类,编译器会默认生成未定义的成员函数:
构造函数
拷贝构造函数
拷贝赋值函数(operator=)
移动构造函数
移动拷贝函数
析构函数
编译器还会提供全局默认操作符函数:
operator,
operator &
operator &&
operator *
operator ->
operator ->*
operator new
operator delete
2. default delete
#include <type_traits>
#include <iostream>
using namespace std; class NoCopyCator {
public:
NoCopyCator() = default; NoCopyCator(const NoCopyCator&) = delete; //阻止使用拷贝构造函数
}; int main() {
NoCopyCator a;
NoCopyCator b(a); //无法通过编译 return ;
}
=default修饰的函数为显式缺省函数
=delete修饰的函数为删除函数
delete可以避免一些不必要的隐式数据类型转换。
class ConvType {
public:
ConvType(int i) {}
ConvType(char c) = delete;
};
void Func(ConvType ct) {}
int main() {
Func();
Func('a'); //无法通过编译
ConvType ci();
ConvType cc('a'); //无法通过编译
return ;
}
//delete 不局限于缺省版本的类成员函数或者全局函数,对于普通的函数也可以通过显式删除来禁止类型转换
void Func(int i) {}
void Func(char c) = delete;
int main() {
Func(3);
Func('c'); //无法通过编译
return 1;
}
显示删除可以删除自定义类型的operator new操作来避免在堆上分配该class对象。
#include <cstddef>
class NoHeapAlloc {
void* operator new(std::size_t) = delete;
};
int main() {
NoHeapAlloc nha;
NoHeapAlloc* pnha = new NoHeadAlloc; //编译失败
return ;
}
如果需要在指定内存位置进行内存分配,并且不需要析构函数来完成一些对象级别的清理。可以通过显示删除析构函数来限制自定义类型在栈上或者静态的构造。
#include <cstddef>
#include <new> extern void* p; class NoStackAlloc {
public:
~NoStackAlloc() = delete;
}; int main() {
NoStackAlloc nsa; //无法通过编译
new (p) NoStackAlloc(); // placement new, 假设p无需调用析构函数 return ;
}
c++11 默认函数的控制的更多相关文章
- c++11 类默认函数的控制:"=default" 和 "=delete"函数
c++11 类默认函数的控制:"=default" 和 "=delete"函数 #define _CRT_SECURE_NO_WARNINGS #include ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;
转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- C++11之使用或禁用对象的默认函数
[C++11之使用或禁用对象的默认函数] C++11 允许显式地表明采用或拒用编译器提供的内置函数.例如要求类型带有默认构造函数,可以用以下的语法: 另一方面,也可以禁止编译器自动产生某些函数.如下面 ...
- C++11 类的六个默认函数及其使用
六个默认函数: 构造函数(construct) 析构函数(destruct) 复制构造函数(copy construct) 赋值(assign) 移动构造函数(move construct) 移动赋值 ...
- C++类的默认函数
在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++ ...
- C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)
在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过: ...
- openssl之BIO系列之5---CallBack函数及其控制
CallBack函数及其控制 ---依据openssl doc/crypto/bio/bio_set_callback.pod翻译和自己的理解写成 (作者:DragonKin ...
- C++11多态函数对象包装器
[C++11多态函数对象包装器] 针对函数对象的多态包装器(又称多态函数对象包装器)在语义和语法上和函数指针相似,但不像函数指针那么狭隘.只要能被调用,且其参数能与包装器兼容的都能以多态函数对象包装器 ...
随机推荐
- kafka 生产者发送消息
KafkaProducer 创建一个 KafkaThread 来运行 Sender.run 方法. 1. 发送消息的入口在 KafkaProducer#doSend 中,但其实是把消息加入到 batc ...
- Delphi XE2 之 FireMonkey 入门(14) - 滤镜: 概览
相关单元: FMX.Filter FMX.FilterCatBlur FMX.FilterCatGeometry FMX.FilterCatTransition FMX_FilterCatColor ...
- IntelliJ IDEA的常用设置
1.设置IDEA主题样式 ①设置方法: ②效果:设置为Darcula之后整体的风格就是暗黑主题,如上图. 2.设置编辑区主题 ①设置方法: 注:由于IDEA自带的编辑区主题比较少,想要更多的编辑区主题 ...
- failed to open stream: HTTP request failed! HTTP/1.1 505 HTTP Version Not Supported
PHP模拟GET请求支付宝退款链接(未用sdk 自己拼接的请求链接与参数); 起初用file_get_contents();就报错 :failed to open stream: HTTP requ ...
- LeetCode——160 Intersection of Two Linked Lists
题目 Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 Output: ...
- IDEA常用快揵键
IDEA常用快揵键 工作中常用IDEA快捷键 参见博客:https://www.cnblogs.com/zhangpengshou/p/5366413.html Double shift --- ...
- 远程访问其他主机的Mysql(Ubuntu)
远程访问其他主机的Mysql 首先:被访问的电脑应该把防火墙关掉, sudo ufw disable 然后去etc/mysql sudo gedit my.cnf 将bind-address注解掉 由 ...
- 解决ajax跨域几种方式
发生跨域问题的原因: 浏览器的限制,出于安全考虑.前台可以正常访问后台,浏览器多管闲事报跨域问题,但其实前台已经访问到后台了. 跨域,协议.域名.端口任何一个不一样浏览器就认为是跨域. XHR(XML ...
- BZOJ4990 (LCS转LIS)
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4990 分析 首先可以看出一个简单的DP dp[i][j]表示序列a前i个与序列b前j个连线数 ...
- Codeforces 1159D The minimal unique substring(构造)
首先我们先观察三个串 10,1110,11101110,答案都是红色部分,我们可以下一个结论,形如 1,1101,111101,那么答案为红色部分.我们可以发现,通过我们末尾添加的1,导致之前红色部分 ...