• C++:复制构造函数在什么时候被调用?


    1、对象在创建时使用其他的对象初始化
    
    Person p(q); //此时复制构造函数被用来创建实例p
    
    Person p = q; //此时复制构造函数被用来在定义实例p时初始化p
    
    2、对象作为函数的参数进行值传递时
    
    f(p); //此时p作为函数的参数进行值传递,p入栈时会调用复制构造函数创建一个局部对象,与函数内的局部变量具有相同的作用域
    
    需要注意的是,赋值并不会调用复制构造函数,赋值只是赋值运算符(重载)在起作用
    
    p = q; //此时没有复制构造函数的调用!
    
    简单来记的话就是,如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在,然后将另一个已存在的对象赋给它,调用的就是赋值运算符(重载)
    
    默认的复制构造函数和赋值运算符进行的都是"shallow copy",只是简单地复制字段,因此如果对象中含有动态分配的内存,就需要我们自己重写复制构造函数或者重载赋值运算符来实现"deep copy",确保数据的完整性和安全性。

    eg:

    string.h

    #include<iostream>
    #include<cstring>
    #ifndef STRING_H_
    #define STRING_H_
    class string
    {
    private:
        char *data;
    public:
        string();
        string(const char *value);
        string(const string & s);
        ~string();
        operator=(const string & s);
    };
    #endif

    string_h.cpp

    #include"string.h"
    using std::cout;
    using std::endl;
    
    string::string()
    {
        data=new char[4];
        data="c++";
       cout<<"構造函數無參:"<<data<<endl;
    }
    string::string(const char *value) { if(value) { data=new char[strlen(value)+1]; strcpy(data,value); } else { data=new char[1]; *data='\0'; } cout<<"構造函數有參:"<<data<<endl; } string::string(const string & s) { data=new char[strlen(s.data)+1]; strcpy(data,s.data); cout<<"複製構造函數:"<<data<<endl; } string::~string() { delete [] data; } string::operator =(const string & s) { data=new char[strlen(s.data)+1]; strcpy(data,s.data); cout<<"重載操作符=:"<<data<<endl; }

    string.cpp

    #include<iostream>
    #include"string.h"
    
    int main()
    {
        string a("hello"); // 定義並構造 a ,有參構造
        string b(a); // 定義並構造b,顯式調用複製構造函數
        string c;//無參構造 
        c=a;//調用操作符重載
        string d=c;//隱式調用複製構造函數,而不是操作符重載
        return 0;
    }

    vinson
  • 相关阅读:
    Loadrunder场景设计篇——IP欺骗
    Loadrunner场景设计篇——负载生成器
    Loadrunder场景设计篇——定时器(schedule)
    2-SAT 及 一点习题
    如何A掉未来程序改
    NOI2015 寿司晚宴
    好玩的东西——一个代码片段
    后缀自动机
    Codeforces Round #313 (Div. 2)
    Codeforces Round #312 (Div. 2)
  • 原文地址:https://www.cnblogs.com/vinsonLu/p/2706723.html
Copyright © 2020-2023  润新知