C++ 拷贝构造函数 和 六大函数
1. C++什么时候会调用 拷贝构造函数?
a.一个对象作为函数参数,以值传递的方式传入函数体;
b.一个对象作为函数返回值,以值传递的方式从函数返回;(实际使用时,会被编译器优化掉)
c.一个对象用于给另外一个对象进行初始化(常称为赋值初始化)
如:
Animal a; Animal b(a); // 或者 Animal a; Animal b = a;
2. C++ 6大函数
1.构造函数
2.move构造函数
3.move赋值操作符
4.复制构造函数
5.赋值操作符
6.析构函数
关于move构造函数 和 move赋值操作符,可以提高性能:
// 测试 move
class Animal{
public:
Animal(){}
Animal(const char* name,int age){
_age = age;
_name = new char[strlen(name)];
strcpy(_name,name);
};
// 拷贝构造函数
Animal(const Animal& other){
if (_name) {
printf("[Animal 拷贝构造函数]看看会不会调用\n");
delete [] _name;
_name = nullptr;
}
cout << "[Animal Copy Constructor] called" << endl;
_name = new char[strlen(other._name)];
strcpy(_name,other._name);
_age = other._age;
}
// 赋值
Animal& operator=(const Animal& other){
if (this == &other) {
return *this;
}
if (_name) {
printf("[Animal 赋值]看看会不会调用\n");
delete [] _name;
_name = nullptr;
}
cout << "[Animal Assign Constructor] called" << endl;
_name = new char[strlen(other._name)];
strcpy(_name,other._name);
_age = other._age;
return *this;
}
// move copy constructor
Animal(Animal&& other){
cout << "move copy constructor called." << endl;
_name = other._name;
_age = other._age;
other._name = nullptr;
}
// move assign constructor
Animal& operator=(Animal&& other){
if (this == &other) {
return *this;
}
if (_name) {
delete [] _name;
_name = nullptr;
}
cout << "move assign constructor called." << endl;
_name = other._name;
_age = other._age;
other._name = nullptr;
return *this;
}
void show(){
cout << "name:" << _name << "; age :" << _age << endl;
}
~Animal(){
cout << "Animal Deconstructor" << endl;
if (_name) {
delete [] _name;
}
}
private:
;
char* _name = nullptr;
};
Animal genAnimal(){
);
}
测试:
int main(){
// 会调用 move copy constructor
vector<Animal> V;
V.push_back(Animal());
// 会调用 move assign constructor
// Animal a("zhangsan",1);
// a = genAnimal();
;
}
主要需要明白什么时候调用 copy constructor,什么时候调用 assign operator.
C++ 拷贝构造函数 和 六大函数的更多相关文章
- 关于C++中的拷贝构造函数和赋值函数
如果类定义的数据成员中存在指针或引用,那么最好重载这两个函数. 1. 定义 拷贝构造函数的定义格式:构造函数名(const 源类名& 引用对象形参名){} 赋值函数定义格式:源类名 & ...
- C++雾中风景6:拷贝构造函数与赋值函数
在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数.初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容.这篇文章我们会详细来梳理拷贝构造函数与赋值函数的区别. 1.调用了 ...
- C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转
对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存. ...
- CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数
类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...
- C++中构造函数,拷贝构造函数和赋值函数的区别和实现
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++中的构造函数,拷贝构造函数,赋值函数
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...
- C++ 拷贝构造函数与赋值函数的区别(很严谨和全面)
这里我们用类String 来介绍这两个函数: 拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式 ...
- 《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数
题中已给出CMyString的类定义,要求写赋值运算符函数. #include<iostream> #include<cstring> using namespace std; ...
- String类的构造函数,析构函数、拷贝构造函数和赋值函数
(1)构造函数 String::String(const char *str) { if(str==NULL) { m_data = new char[1]; *m_data = ‘\0’; } el ...
随机推荐
- centos 7 升级后yum install出现Exiting on user cancel
centos 7 升级后yum install出现Exiting on user cancel centos 7.x升级后用yum install进行安装时经常出现Exiting on user ca ...
- MST:Agri-Net(POJ 1258)
Agri-Net 题目大意:农夫有一片农场,现在他要把这些田地用管子连起来,田地之间有一定距离,铺设每一段管子的长度与这些田地与田地距离是一样的,问你最小的铺设方案. 这一题很裸,Kruskal算法 ...
- zookeeper集群搭建(windows环境下)
本次zk测试部署版本为3.4.6版本,下载地址http://mirrors.cnnic.cn/apache/zookeeper/ 限于服务器个数有限本次测试了两种情况 1.单节点方式:部署在一台服务器 ...
- [C#]Datatable和json互相转换操作
#region DataTable 转换为Json字符串实例方法 /// <summary> /// GetClassTypeJosn 的摘要说明 /// </summary> ...
- struts2响应AJAX
1发送ajax请求使用stream进行响应 Result的type属性的stream取值. 1.1定义Action public class UserAction { private String u ...
- java课后作业 弹出窗口求两个数的加减乘除
//计算2个数的加减乘除 谷伟华 2015/10/6package jisuan; import javax.swing.JOptionPane; public class Jiasuan { pub ...
- MFC 使用MFC EditBrowse Control控件选择文件或者文件夹
从工具箱中拖拽一个MFC EditBrowse Control到窗体中, 通过设置“Browse Mode”属性指定“文件浏览”还是“文件夹浏览” 可以通过添加对象的方式将其与一个CString se ...
- 聊聊SOA面向服务架构
什么是SOA SOA(Service-Oriented Architecture),即面向服务的架构.SOA是一种粗粒度.松耦合服务架构,服务之间通过简单.精确定义接口进行通讯,不涉及底层编程接口和通 ...
- Android Message Handling Mechanism
转自:http://solarex.github.io/blog/2015/09/22/android-message-handling-mechanism/ Android is a message ...
- Webstorm & PhpStorm的序列号和证书
WebStorm注册码 User Name: EMBRACE License Key: ===== LICENSE BEGIN ===== 24718-12042010 00001h6wzKLpfo3 ...