c++学习——前进(二)

69 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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<<")";
}

图片.png

从输出结果可以看到没有自行定义一个复制构造函数时,编辑器就会调用默认的复制构造函数对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 ;
    }
};

图片.png

自动调用复制构造函数的情况有: 1:当用一个对象去初始化本类的另一个对象时,就会调用复制构造函数: 类名 对象名2(对象名1); 类名 对象名2=对象名1; 2:如果函数F的参数是类A的对象,那么调用F的时候,就会调用类A的复制构造函数; 3:如果函数的返回值是类A的对象,那么当函数返回时,会调用类A的复制构造函数。