飞道的博客

【C++】5-1.9 拷贝构造函数

220人阅读  评论(0)

1、拷贝构造函数

拷贝构造:用一个对象初始化另一个同class类的对象;
拷贝构造函数是一种特殊的构造函数,它用于:根据已有的对象,创建另一个同class的对象;
拷贝构造函数可以简写为 copy ctor;

2、隐式声明拷贝构造函数

隐式声明的拷贝构造函数 Implicitly-declared Copy Constructor,不要翻译成默认拷贝构造函数!

一般情况下,如果程序员不编写拷贝构造函数,那么编译器会自动生成;
这个自动生成的拷贝构造函数叫做“隐式声明/定义的拷贝构造函数”(copy ctor);

隐式声明的拷贝构造函数的作用:
将被拷贝对象里面的每一个数据域,复制到新的对象中去!

如果拷贝构造函数里,除了数据域复制,还要做别的事情,就需要程序员显示的定义拷贝构造函数!

3、显示声明拷贝构造函数

假如Square是一个定义的class类;
下面两种方式声明拷贝构造函数:

// 方式1、
Square (Square&); //类的名字作为拷贝构造函数的名字;参数是同class类的对象的引用;

//方式2、
Square (const Square&);//同类(class类)型对象的引用,前面也增加const关键字。

注意:拷贝构造函数可以带有别的默认值参数,
即只要第一参数是类的对象的引用(同class类),后面其他参数带有默认值,也是拷贝构造函数!

4、调用拷贝构造函数

例如Square是一个定义的class类;

Square squ1(1.0); // 创建 squ1对象;

// c++03标准,直接将squ1作为初始化squ2对象的参数;
Square squ2(squ1);

// c++03标准,用等号对squ3定义阶段,进行初始化;
//squ3定义阶段不是赋值,而是调用拷贝构造函数!
Square squ3=squ1;

Square squ4{
   squ1};//c++11标准,列表初始化方式
Square squ5={
   squ1};//c++11标准,列表初始化方式

关于"=“什么时候是赋值,什么时候是拷贝构造?
只有”="在定义对象的时候,才是调用拷贝构造函数!否则是对象赋值。

5、示例

Square.h 头文件如下:

#pragma once
class Square
{
   
private:
	double side{
    1.0 };
	static int numberObjects;// 声明静态成员变量
public:
	Square():Square(1.0){
   }// 调用委托构造函数
	Square(double side) 
	{
   
		this->side = side;
		numberObjects++;//静态数据成员做自增;
		std::cout << ">>>[1]存在的对象数:" << numberObjects << std::endl;
	}

	// 创建拷贝构造函数,(带有默认值参数的拷贝构造函数)
	// const保证squ在拷贝构造函数中不可修改
	// 使用委托构造函数,减少程序代码
	Square(const Square& squ,int a=537):Square(1.0){
   }	

	// 析构函数
	~Square()
	{
   
		numberObjects--;
		std::cout << ">>>[2]存在的对象数:" << numberObjects << std::endl;
	}
	
	// 返回面积
	double getArea() {
   
		return side * side;
	}

	// 声明静态成员函数
	static int getNumberOfObject()
	{
   
		return numberObjects;
	}
};

copyCtor.cpp 源文件如下:

#include<iostream>
#include "Square.h"

// 静态数据成员定义
// 显示的初始化为0
int Square::numberObjects = 0;

int main()
{
   
	// 由编译器,在栈上创建对象;
	Square s1{
    10. };
	std::cout << "************************" << std::endl;

	// 拷贝构造函数的方式创建另外一个对象;
	Square s2{
    s1 };
	std::cout << "########################" << std::endl;
	
	// 在堆上创建一个对象;
	Square* s3 = new Square{
    s1 };//类名字,s1作为拷贝构造函数的参数;
	std::cout <<">>>[3]矩形的面积为:"<< s3->getArea() << std::endl;
	std::cout << "------------------------" << std::endl;
	
	// 将s3指向的内存归还给操作系统
	delete s3;
	s3 = nullptr;
	std::cout << "" << std::endl;
	std::cout <<">>>[4]存在的对象数:"<< Square::getNumberOfObject() << std::endl;
	return 0;
}

运行copyCtor.cpp 源文件,如下:


转载:https://blog.csdn.net/jn10010537/article/details/117048133
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场