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
查看评论