携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第30天
前言: 接着c++学习——前进(一)来
二:复制构造函数
复制构造函数也是构造函数的一种,它的作用是使用一个已存在的对象去初始化另一个正在创建的对象。
复制构造函数的格式: 类名::类名(const 类名 &) 为了不改变原有的对象,通常用const 来限定。 或者 类名::类名(类名 &)
声明和实现复制构造函数的一般格式:
class 类名
{
public:
类名(形参表); //构造函数
类名(类名 & 对象名); //复制构造函数
…
};
类名::类名(类名 & 对象名) // 实现复制构造函数
{
函数体
}
需要注意的是,如果类中没有自行定义复制构造函数,那么编译器就会自动生成一个复制构造函数,通常是使得目标对象的每个成员变量都和源对象相等。自动生成的复制构造函数也叫做默认复制构造函数。默认构造函数不一定存在,但是复制构造函数一定存在。
1:调用默认的复制构造函数:
# include <iostream>
using namespace std;
class Complex
{
public:
double real,imag;
Complex(double r,double i)
{
real=r;
imag=i;
}
};
int main()
{
Complex c1(10,24);//声明Complex的对象c1并赋值
Complex c2(c1);//c1作为c2的参数,并调用默认复制构造函数对c2进行初始化
cout<<"c2:("<<c2.real<<","<<c2.imag<<")";
}
从输出结果可以看到没有自行定义一个复制构造函数时,编辑器就会调用默认的复制构造函数对c2初始化,此时c2就成为c1的复制品。
当定义了复制构造函数时,编辑器就不会再生成默认的复制构造函数了
2:调用自定义的复制构造函数:
# include <iostream>
using namespace std;
class Complex
{
public:
double real, imag;
Complex(double r,double i){
real = r; imag = i;
}
Complex(const Complex & c);//复制构造函数的声明
};
Complex::Complex(const Complex & c) //复制构造函数的实现
{
real = c.real+1;
imag = c.imag-1;
cout<<"自定义复制构造函数"<<endl ;
}
int main() {
Complex c1(3, 4);//调用默认的复制构造函数
cout<<"c1: ("<<c1.real<<","<<c1.imag<<")"<<endl;
Complex c2(c1);//调用复制构造函数初始化c2
cout<<"c2: ("<<c2.real<<","<<c2.imag<<")"<<endl;
return 0;
}
或者是在类体内完成复制构造函数的声明和实现:
class Complex
{
public:
double real, imag;
Complex(double r,double i)
{
real = r;
imag = i;
}
Complex(const Complex & c)
{
real = c.real+1;
imag = c.imag-1;
cout<<"Copy Constructor called"<<endl ;
}
};
自动调用复制构造函数的情况有: 1:当用一个对象去初始化本类的另一个对象时,就会调用复制构造函数: 类名 对象名2(对象名1); 类名 对象名2=对象名1; 2:如果函数F的参数是类A的对象,那么调用F的时候,就会调用类A的复制构造函数; 3:如果函数的返回值是类A的对象,那么当函数返回时,会调用类A的复制构造函数。