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多态函数对象包装器] 针对函数对象的多态包装器(又称多态函数对象包装器)在语义和语法上和函数指针相似,但不像函数指针那么狭隘.只要能被调用,且其参数能与包装器兼容的都能以多态函数对象包装器 ...
随机推荐
- p5437 【XR-2】约定
分析 https://www.cnblogs.com/cjyyb/p/11111404.html 代码 #include<bits/stdc++.h> using namespace st ...
- tjuthesis 图标题左对齐修改办法
图标题格式默认是居中的. 将 format 文件里定义图表标题样式部分的 \centering 删去,可变为左对齐. 如下: %% 定制浮动图形和表格标题样式\makeatletter\long\de ...
- 协议:FTP
ylbtech-协议:FTP FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一.FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客 ...
- Java中使用MATLAB作图 .
最近做一个项目,需要很多进行很多信号处理——小魏就是学软件的,对信号处理简直是个小白,最简单的实现就是傻瓜似的调用MATLAB的各种工具箱,达到目的就行. 同时,MATLAB是种解释性语言,执行效率比 ...
- Delphi XE2 之 FireMonkey 入门(7) - TText 与 TFont
TText 也是从 TShape(TControl -> TShape)继承; 而与之类似的 TLabel 的继承序列是 TControl -> TStyledControl -> ...
- rpm安装软件时提示warning: *.rpm: Header V3 RSA/SHA256 Signature, keykey ID c105b9de
在RedHat下有时候用rpm安装软件是会出现下面则中错误 1.安装时提示:warning: *.rpm: Header V3 RSA/SHA256 Signature, keykey ID c105 ...
- [转载]Parsing X.509 Certificates with OpenSSL and C
Parsing X.509 Certificates with OpenSSL and C Zakir Durumeric | October 13, 2013 While OpenSSL has b ...
- python实现建立udp通信
实现代码如下: #udp协议通信import socket,timeclass UdpConnect: def get_udp(self,ip,port,message): #建立udp连接 myso ...
- gradle阿里云镜像配置
Maven镜像的配置参考: http://blog.java1234.com/blog/articles/252.html buildscript { repositories { mavenLoca ...
- [常用类]Math、Random、System、BigInteger、BigDecimal
Math类中的成员全是静态成员,构造方法是 私有的,以避免被创建对象 常用方法: int abs() double ceil() //向上取整 double floor() //向下取整 int ma ...