博客园  :: 首页  :: 新随笔  :: 管理

c++拷贝构造函数

Posted on 2020-02-08 23:22  wsg_blog  阅读(338)  评论(0编辑  收藏  举报

Index C++

c++拷贝构造函数

这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下。

什么时候会发生拷贝构造

  • 对象之间的初始化赋值
  • 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健壮性)
  • 函数中返回对象的值
class A
{...}

A a0;         //构造函数产生对象a0
A a1(a0);     //发生拷贝构造,直接走拷贝构造函数进行初始化
A a2=a0;      //和上一行完全一致,并且会发生拷贝构造,这里要注意的是在c++中 “=”和()做的工作是一致的就是赋值(拷贝构造函数进行复制);构造函数的初始化列表 也是会走拷贝构造的
A a3;        //构造函数 产生a3
a3=a0;       //仅赋值

拷贝构造函数的形式为 T::T(const T&); 如果没有在类中给出声明及定义,c++会默认给出;

代码解释下拷贝构造的形式:

首先说明下,拷贝构造也是构造,既然是构造在程序结束的时候就会调用析构函数来销毁构造出的对象,那我们就利用这种机制,使用静态全局变量来做一个标记变量 objectCount,我们将会看到拷贝构造函数的调用过程。

#include <iostream>
#include <string>
using namespace std;

static int objectCount = 0;

class HowMany
{
public:
        HowMany(){ objectCount++; print("HowMany()");}
        void print(const string& msg = "")
        {
                if(msg.size()!=0) cout << msg << ":";
                cout << "objectCount = " << objectCount << endl;
        }
        HowMany(const HowMany & h) { objectCount++; print("copy constructor HowMany");}   //这里我们将隐藏的默认拷贝构造函数显式的写出来,并加上objectCount++,string的赋值就是通过这种方式进行的
        ~HowMany()
        {
                objectCount--;
                print("~HowMany()");
        }
};

HowMany f(HowMany x) {             //这里调用拷贝构造 讲下边的对象h形参通过拷贝构造给x
        cout << "begin of f" << endl;
        x.print("x argument inside f()");
        cout << "end of f" << endl;
        return x;                 //这里反回值会付给h2 同时也会调用拷贝构造函数给h2赋值
}

int main()
{
        HowMany h;
        h.print("after construstion of h");
        HowMany h2 = f(h);
        h.print("after call to f()");
}