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 允许显式地表明采用或拒用编译器提供的内置函数.例如要求类型带有默认构造函数,可以用以下的语法: 另一方面,也可以禁止编译器自动产生某些函数.如下面 ...
随机推荐
- ultraedit使用记录
ultraedit使用记录 10:57:33 在日常的工作中,我经常用keil进行程序的编写等工作,不过在编写过程中Keil对中文的支持不是很好,容易发生问题:同事推荐我用ultraedit进行程序的 ...
- 使用命令行启动spring boot项目
1.找到项目路径 cd target 2.敲命令--------java -jar xxxx.jar ------------------------------------------------- ...
- html03表单
<!DOCTYPE HTML> <html> <head> <title>用户登录的表单</title> </head> < ...
- LeetCode OJ:Permutations(排列)
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- Python基础学习(第8天)
先补充些iter函数的用法:iter()其实就是一个迭代器,参数可传个list.dict等等,然后可通过调用next函数获取下一个元素,默认并未指向对象的第一个元素,可理解为指向了第一个元素的前面的位 ...
- <input type="checkbox" name="" value=" ">
<input type="checkbox" name="" value=" ">
- macOS Ruby版本需要升级到2.2.2以上
在安装 Ruby on Rails 时遇到问题,提示依赖 ruby 2.2.2 或更高的版本. ERROR: Error installing rails: activesupport require ...
- 人生苦短之我用Python篇(基础)
Python简介 Python,是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, ...
- Navicat for MySQL导入.sql文件
首先,打开Navicat for MySQL,打开需要使用的连接,新建一个数据库名等按自己的需求填写. 打开创建的数据库,在空白处右键,选择运行SQL文件,然后找到.SQL文件所在地址即可. MySQ ...
- 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)
题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...