浅析C++拷贝构造函数的应用场景

一、函数结构定义

        在理解拷贝构造函数前,还是有必要回顾下类的构造函数基本概念。类的构造函数是一种特殊的成员函数,它在创建类的对象时执行。构造函数的函数名和类名一致,它不会返回任何类型,同样返回类型也不是void,一般构造函数用来初始化类的成员变量。

class Object
{
   public:
      Object();  // 构造函数
   private:
      Object obj;
};
//构造函数结构定义
Object::Object(void)
{
    obj = 0;
    cout << "Object is init" << endl;
}

        拷贝构造函数,又叫做复制构造函数,从字面上看,是通过复制对象的方式创建一个新对象。因此,它通过编译器调用实现使用同一个类中之前创建的对象来完成新创建对象的初始化。其函数结构如下:

Object::Object(const Object& obj)
{
}

        拷贝构造函数的形参必须为引用,即参数前加上“&”。使用引用是因为如果使用传值的方式将实参传给形参,中间过程需要经历一次对象拷贝的过程,对象拷贝又需要调用拷贝构造函数,因此为了防止无限的构造,形成死循环递归,拷贝构造函数的形参必须为对象的引用。

        拷贝构造函数形参可以是const引用,也可以是非const引用。但是一般使用const,这样既能以常量对象(初始化后值不能改变的对象)作为参数去初始化别的对象,也能以非常量对象作为参数去初始化别的对象。


二、例程说明

        如果不在类中显式的声明一个拷贝构造函数,那么编译器会自动的为类生成一个拷贝构造函数,自动生成的拷贝构造函数功能简单,即为新对象复制源对象的所有成员。

#include<iostream >
using namespace std;
class Object
{
public:
   Object(int a, int b);  //构造函数
   void display();
private:
    int m_a;
    int m_b;
};
Object::Object(int a, int b)
{
    m_a = a;
    m_b = b;
}
void Object::display()
{
    cout<<m_a <<","<<m_b<<endl;
}

void main()
{
    Object obj1(1, 9);
    Object obj2(obj1);  //用默认拷贝构造函数初始化obj2 
    obj2.display();  
}

        运行结果为:

1,9

        可以看出默认的拷贝构造函数功能就是将之前创建的对象成员的值都拷贝给了新对象成员的值。

        一般可以显式的声明一个拷贝构造函数,如果编写了拷贝构造函数,那么默认的拷贝构造函数就不存在了,可以在自己编写的拷贝构造函数中增加自定义内容。

#include<iostream >
using namespace std;
class Object
{
public:
   Object(int a, int b);  //构造函数
   Object(const Object& obj); //拷贝构造函数
   void display();
private:
    int m_a;
    int m_b;
};
Object::Object(int a, int b)
{
    m_a = a;
    m_b = b;
    cout<<"copy function init"<<endl;
}
Object::Object(const Object& obj)
{
    m_a = obj.m_a;
    m_b = obj.m_b;
}
void Object::display()
{
    cout<<m_a <<","<<m_b<<endl;
}

void main()
{
    Object obj1(1, 9);
    Object obj2(obj1);  //用编写拷贝构造函数初始化obj2 
    obj2.display();  
}

        运行结果为:

copy function init
1,9

        可以看出自己编写的拷贝构造函数不仅将之前创建的对象成员的值都拷贝给了新对象成员的值,而且输出自定义的打印内容。


三、应用场景

        一般来说,拷贝函数被调用有这样几种基本场景:

(1)、通过使用同一个类中已有的对象来初始化新创建的对象。

Object obj2(obj1);   //用拷贝构造函数初始化obj2 
Object obj3 = obj1;  //用拷贝构造函数初始化obj3

(2)、复制对象把它作为参数传递给函数。

#include<iostream>
using namespace std;
class Object 
{
public:
   Object(int a);  //构造函数
   Object(const Object& obj); //拷贝构造函数
public:
    int m_a;
};
Object(int a) 
{ 
    m_a = a; 
};
Object(const Object& obj) 
{
    m_a = obj.m_a;
    cout<<"copy function init"<<endl;
}

void Fun(Object obj)
{ 
}
void main()
{
    Object obj1;
    Fun(obj1);
}

        运行结果为:

copy function init

        可以看出,Fun()函数的形参obj在初始化时调用了复制构造函数。即作为形参的对象,是用复制构造函数初始化的,而调用复制构造函数时的参数,就是调用Fun()函数时所传递的实参obj1。

(3)、复制对象并从函数返回这个对象。

#include<iostream>
using namespace std;
class Object 
{
public:
   Object(int a);  //构造函数
   Object(const Object& obj); //拷贝构造函数
public:
    int m_a;
};
Object(int a) 
{ 
    m_a = a; 
};
Object(const Object& obj) 
{
    m_a = obj.m_a;
    cout<<"copy function init"<<endl;
}

Object Fun() 
{
    Object obj1(1);
    return obj1;
}
void main() 
{
    cout <<Fun().m_a<< endl;
}

        运行结果为:

copy function init
1

        可以看出,调用的Fun()函数,它的返回值是一个对象,该对象就是用复制构造函数初始化的, 即调用复制构造函数时,复制构造函数时的实参,就是Fun()函数return语句所返回的对象。


↓↓↓更多技术内容和书籍资料获取,入群技术交流敬请关注“明解嵌入式”↓↓↓ 

猜你喜欢

转载自blog.csdn.net/helloqusheng/article/details/132128218