前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >拷贝(复制)构造函数

拷贝(复制)构造函数

作者头像
用户7272142
发布2023-10-16 08:17:51
1630
发布2023-10-16 08:17:51
举报
文章被收录于专栏:Republic博客Republic博客

如果类的设计者不写复制构造函数,编译器就会自动生成复制构造函数。大多数情况下,其作用是实现从源对象到目标对象逐个字节的复制,即使得目标对象的每个成员变量都变得和源对象相等。编译器自动生成的复制构造函数称为“默认复制构造函数”。

代码语言:javascript
复制
#include<iostream >
class Complex
{
public:
    double real, imag;
    Complex(double r, double i) {
        real= r; imag = i;
    }//构造函数
};
int main(){
    Complex cl(1, 2);
    Complex c2 (cl);  //用默认复制构造函数初始化c2
    cout<<c2.real<<","<<c2.imag;  //输出 1,2
    return 0;
}

如果编写了复制构造函数,则默认复制构造函数就不存在了。下面是一个非默认复制构造函数的例子。

代码语言:javascript
复制
#include<iostream>
using namespace std;
class Complex{
public:
    double real, imag;
    Complex(double r,double i){
        real = r; imag = i;
    }
    Complex(const Complex & c){
        real = c.real; imag = c.imag;//复制构造函数
        cout<<"Copy Constructor called"<<endl ;
    }
};

int main(){
    Complex cl(1, 2);
    Complex c2 (cl);  //调用复制构造函数
    cout<<c2.real<<","<<c2.imag;
    return 0;
}

如果有复制的需要用系统默认的复制构造函数即可,我们自己定义的复制构造函数除了进行复制操作还可以进行其他操作(后话) 构造函数不能以本类的对象作为唯一参数,以免和复制构造函数相混淆。例如,不能写如下构造函数:

代码语言:javascript
复制
Complex (Complex c) {...}

复制构造函数被调用的三种情况

当用一个对象去初始化另一个对象时 Time p1 = p2; Time p1(p2); 这两条语句是等价的,其次要区分复制和赋值语句,复制是左边没有定义的,赋值是左边有定义的,也就是会不会调用赋值构造函数的区别

如果函数F的参数是类A的对象,那么当F被调用时,类A的复制构造函数将被调用,换句话讲,形参的初始化也是靠实参调用拷贝构造函数进行的

代码语言:javascript
复制
#include<iostream>
using namespace std;
class A{
public:
A(){};
A(A & a){
    cout<<"Copy constructor called"<<endl;
}
};

void Func(A a){ }

int main(){
A a;
Func(a);
return 0;
}

我们只是要初始化,如果再用复制构造函数初始化一个对象时间上有点划不来, 所以就像我们之前说的参数改为const Time&c既不会被改变又节省资源。

如果函数的返冋值是类 A 的对象,则函数返冋时,类 A 的复制构造函数被调用。换言之,作为函数返回值的对象是用复制构造函数初始化 的,而调用复制构造函数时的实参,就是 return 语句所返回的对象。例如下面的程序: `C++++  #include using namespace std; class A { public: int v; A(int n) { v = n; }; A(const A & a) {

代码语言:javascript
复制
 v = a.v;
 cout << "Copy constructor called" << endl;

} };

A Func() {

代码语言:javascript
复制
A a(4);
return a;

}

int main() {

代码语言:javascript
复制
cout << Func().v << endl;
return 0;

}

代码语言:javascript
复制
//以上内容大部分转自[C++拷贝构造函数(复制构造函数)详解 (biancheng.net)](http://c.biancheng.net/view/151.html)
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 复制构造函数被调用的三种情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档