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++ 拷贝构造函数 和 六大函数的更多相关文章

  1. 关于C++中的拷贝构造函数和赋值函数

    如果类定义的数据成员中存在指针或引用,那么最好重载这两个函数. 1.     定义 拷贝构造函数的定义格式:构造函数名(const 源类名& 引用对象形参名){} 赋值函数定义格式:源类名 & ...

  2. C++雾中风景6:拷贝构造函数与赋值函数

    在进行C++类编写的过程之中,通常会涉及到类的拷贝构造函数与类的赋值函数.初涉类编写的代码,对于两类函数的用法一直是挺让人困惑的内容.这篇文章我们会详细来梳理拷贝构造函数与赋值函数的区别. 1.调用了 ...

  3. C++中:默认构造函数、析构函数、拷贝构造函数和赋值函数——转

    对于一个空类,编译器默认产生4个成员函数:默认构造函数.析构函数.拷贝构造函数和赋值函数.1.构造函数:构造函数是一种特殊的类成员,是当创建一个类的时候,它被调用来对类的数据成员进行初始化和分配内存. ...

  4. CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

    类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...

  5. C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  6. C++中的构造函数,拷贝构造函数,赋值函数

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法.下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象 ...

  7. C++ 拷贝构造函数与赋值函数的区别(很严谨和全面)

    这里我们用类String 来介绍这两个函数: 拷贝构造函数是一种特殊构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用.当定义一个新对象并用一个同类型的对象对它进行初始化时,将显式 ...

  8. 《剑指offer》面试题1:为类CMyString添加赋值运算符函数——C++拷贝构造函数与赋值函数

    题中已给出CMyString的类定义,要求写赋值运算符函数. #include<iostream> #include<cstring> using namespace std; ...

  9. String类的构造函数,析构函数、拷贝构造函数和赋值函数

    (1)构造函数 String::String(const char *str) { if(str==NULL) { m_data = new char[1]; *m_data = ‘\0’; } el ...

随机推荐

  1. Light OJ 1032

    数位dp,许多数位dp需要统计某种模式(子串)出现的数量,这种题通常需要在递归参数中加入高位已经出现过的模式的数量. #include <cstdio> #include <cstr ...

  2. delphi 快捷键

    1. 编辑器     按键时候请注意输入法: 英文状态 Code Folding (Fold ---Methods)   [Ctrl + Shift] + K + M      

  3. FFmpeg-20160415-snapshot-bin

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...

  4. webpack学习笔记一

    主要参考: https://blog.madewithlove.be/post/webpack-your-bags/ 起因: 作为运维狗, 对前端一窍不通但心向往之, 最近做一个Dashboard, ...

  5. 【干货】ECS服务器OPENVPN搭建,方便管理所有内网服务器

    [干货]ECS服务器OPENVPN搭建,方便管理所有内网服务器 使用场景 一台有外网的ECS服务器+N台无外网的ECS服务器,使用OPENVPN管理全部的ECS服务器(包括无外网的ECS服务器). 鉴 ...

  6. Ditto - Windows剪贴板增强小工具,方便复制粘贴多条记录

    在平时的工作中,好多地方需要重复的复制粘帖一些重复性的代码,频繁的Ctrl+C.Ctrl+V导致效率很低,而且时间长了会很烦,Windows自带的剪切板功能一次只能进行一条记录操作,单一的不行,与提高 ...

  7. 【python】list,dict赋值不要用等号,要用extend,update

    如果有一个list,我们用连等号的方式赋值 c = d = [1], 则当c改变时,d同样会改变.字典同理 正确做法应该是: d = [1] c = [1] 或者 d = [1] c.extend(d ...

  8. vs win32 & MFC 指针默认位置

    一开始win32指针所在的位置是与debug文件夹同级的.即打开打开改程序的第一个文件夹这一级. MFC指针是在第二个debug下头,就是打开第二个project名词的文件夹下头,e.g., &quo ...

  9. chrome shortcutkey

    按下Shift并点击链接 – 在新窗口打开链接. Ctrl+ – 切换到最后一个标签. Ctrl+Shift+V – 将剪切板中的内容无格式粘贴(举个例子,将你从网页中复制的HTML格式内容粘贴为纯文 ...

  10. Linq学习笔记---Linq to Xml操作

    LINQ to XML的成员, 属性列表: 属性 说明 Document 获取此 XObject 的 XDocument  EmptySequence  获取空的元素集合  FirstAttribut ...