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 ...
随机推荐
- FFmpeg-20160415-snapshot-bin
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...
- Java for LeetCode 214 Shortest Palindrome
Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. ...
- SAP ALV OO 选择行打印
&---------------------------------------------------------------------* *& Report ZSDF001 * ...
- SaltStack之Master配置文件详解
salt-master的配置文件位于/etc/salt/master,可用选项如下: #######################主配置 interface默认值:0.0.0.0(所有的网络地址接口 ...
- Ubuntu jsp平台使用JDBC来连接MySQL数据库
Ubuntu 7.04 搭建Ubuntu jsp平台开发环境MySQL+tomcat+apache+j2sdk1.6在所有安装开始前先在Terminal中输入 rpm -q -a查看是否安装过rpm ...
- .NET后台如何获取前台HMTL控件的值
很多时候我们需要HTML控件,感觉比服务器控件更加简介,清爽,那么如何获取HMTL控件的值呢,请看下面例子: 前台页面代码: <input id="Text1" type=& ...
- October 12th 2016 Week 42nd Wednesday
Passion is momentary; love is enduring. 激情短暂,真爱长久. What is love? And what is real love? We are alway ...
- July 6th, Week 28th Wednesday, 2016
Diligence is the mother of good fortune. 勤勉是好运之母. The mother of good fortune can be diligence, conti ...
- 浅析 - Storyboard / Xib
大家都知道纯代码写应用的成本是很高的,特别是涉及到UI界面的实现,相当耗费时间.之前自己写应用时有了解过Storyboard,也简单使用过,但随着最近深入了解它之后,发现自己低估了它的作用和影响力,因 ...
- NYOJ题目816它合法吗?
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtIAAAJ0CAIAAACwTVMOAAAgAElEQVR4nO3du1LjzNo24O8kyDkQYh