C++11 类的六个默认函数及其使用
六个默认函数:
- 构造函数(construct)
- 析构函数(destruct)
- 复制构造函数(copy construct)
- 赋值(assign)
- 移动构造函数(move construct)
- 移动赋值(move)
测试代码:
#include <iostream>
using namespace std;
int g_constructCount = 0;
int g_copyConstructCount = 0;
int g_destructCount = 0;
int g_moveConstructCount = 0;
int g_assignCount = 0;
int g_moveCount = 0;
struct A
{
A()
{
cout << "construct:" << ++g_constructCount << endl;
}
A(const A& a)
{
cout << "copy construct:" << ++g_copyConstructCount << endl;
}
A(A&& a)
{
cout << "move construct:" << ++g_moveConstructCount << endl;
}
~A()
{
cout << "destruct:" << ++g_destructCount << endl;
}
A& operator=(const A& other)
{
cout << "assign:" << ++g_assignCount << endl;
return *this;
}
A& operator=(A&& a)
{
cout << "move:" << ++g_moveCount << endl;
return *this;
}
};
测试:
情形一:A a等价于A a=A();
情形二:
{
A a ;
a = A();//A()为右值,所以move
}
结果:
construct:1
construct:2
move:1
destruct:1
destruct:2
情形三: A a,b; a=b;//b为左值,所以assign
情形四:
{
A a;
A c(a);
}
结果:
construct:1
copy construct:1
destruct:1
destruct:2
函数参数传递:
void fun(A a)
{
cout << "funA" << endl;
}
情形一:
{
A a;
fun(a);
}
结果:
construct:1
copy construct:1
funA
destruct:1
destruct:2
情形二:
{
A a;
fun(move(a));
}
结果:
construct:1
move construct:1
funA
destruct:1
destruct:2
情形三:
{
fun(A());
}
结果:
construct:1
funA
destruct:1
版权声明:本文为博主原创文章,未经博主允许不得转载。
C++11 类的六个默认函数及其使用的更多相关文章
- C++类中隐藏的六个默认函数
Test类中隐藏的六个默认的函数 class Test { public: //默认的构造函数 Test(): //析构函数 ~Test(): //拷贝构造函数 Test(const Test &am ...
- C++类的默认函数
在C++中,一个类有八个默认函数: 默认构造函数: 默认拷贝构造函数: 默认析构函数: 默认重载赋值运算符函数: 默认重载取址运算符函数: 默认重载取址运算符const函数: 默认移动构造函数(C++ ...
- C++:类中两个易被忽略的默认函数
C++的自定义类中有六个默认的函数,即如果用户没有显式定义这些函数时,C++编译器会类中生成这些函数的默认形式.除了大家所熟知的构造函数.拷贝构造函数.赋值函数和析构函数外,C++为自定义类 还提供了 ...
- C++基础知识梳理--C++的6个默认函数
C++有六个默认函数:分别是 1.default构造函数; 2.默认拷贝构造函数; 3.默认析构函数; 4.赋值运算符; 5.取值运算符; 6.取值运算符const; // 这两个类的效果相同 cla ...
- 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++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数
C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...
- C++11之使用或禁用对象的默认函数
[C++11之使用或禁用对象的默认函数] C++11 允许显式地表明采用或拒用编译器提供的内置函数.例如要求类型带有默认构造函数,可以用以下的语法: 另一方面,也可以禁止编译器自动产生某些函数.如下面 ...
随机推荐
- N!含有多少个 2/5质因子
编程之美127页,N!中含有质因数2的个数 = [N/2] + [N/4] + [N/8] + [N/16] + ..... 要理解上式,先看 编程之美126页,N!中含有质因数5的个数Z 举例:N ...
- HDU 3037 组合数、lucas,逆元
题目链接 题目大意,N颗树上取不超过M个果子,求总方案个数模P的值,P是质数且不超过10w,N,M不超过1e9: 在这里树是被认为不同的,也就是将k(0<=k<=M)个小球放入N个不同的盒 ...
- 开源分布式版本控制工具 —— Git 之旅
Git 主张的分布式代码库与文件快照的设计思想,相对于传统 CVS.SVN 等集中式.文件差异式版本控制工具是一种挑战与颠覆.Git 带来了离线提交.轻量级分支等诸多便利.不过,也有人质疑 Git 的 ...
- 【51nod-1046】最大子矩阵和
一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:3*3的矩阵: -1 3 -1 2 -1 3 -3 1 2 和最大的子矩阵是: 3 ...
- SqlServer表死锁的解决方法
SqlServer表死锁的解决方法 前些天写一个存储过程,存储过程中使用了事务,后来我把一些代码注释掉来进行调试找错,突然发现一张表被锁住了,原来是创建事务的代码忘记注释掉.本文表锁住了的解决方法 ...
- 一个css3 旋转效果 -- 待续
<div class="container"> <div> <figure></figure> <figure>< ...
- Android 之Navicat for SQLite 数据库介绍
Navicat for SQLite 是一套专为SQLite 设计的强大数据库管理及开发工具 Navicat for SQLite 是一套专为SQLite 设计的强大数据库管理及开发工具.它可以 ...
- tf随笔-6
import tensorflow as tfx=tf.constant([-0.2,0.5,43.98,-23.1,26.58])y=tf.clip_by_value(x,1e-10,1.0)ses ...
- 软件测试 Record
fxcopnunit软件质量 EDW 数据仓库ETL KPI 敏捷 测试计划 单元测试 集成测试 系统测试 对测试结果 阶段性 分析 总结 测试结果报告 环境问题:软硬件用户有问题,我们这边没有有效问 ...
- rebar自定义template
在开发过程中rebar自带模板建立项目,或多或少不能满足自己的开发需求.本人又是那种懒人,所以就要想办法偷懒.查看了priv模板 打造适合自己的项目模板.下面我简单的介绍整个模板的打造过程. 准备过程 ...