IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ 构造函数拷贝构造函数析构函数与赋值操作符 -> 正文阅读

[C++知识库]c++ 构造函数拷贝构造函数析构函数与赋值操作符

1、注意

1、Rectangle赋值构造函数,构造顺序:先父类,后子类

2、正确区分拷贝构造函数和赋值操作符:

*拷贝构造函数是构造函数,也就是创建新对象时,所以一个对象存在,一个对象尚未存在

*赋值操作符使用时,两个对象必然都是存在的,所以需要讨论的问题是是否自我赋值等等

3、面对此类问题方法

*拷贝构造就是一边有,一边没有;赋值操作符就是两边都有
·结合指针是否为空,可以分析出上述的注意事项

4、类Rectangle展现了一个在所有c++环境下都会产生的bug:

*当Rectangle的拷贝创建时,没有拷贝其基类Shape部分。

*当然,这个Rectangle对象的Shape部分还是创建了,但它是用Shape的缺省构造函数创建的,成员no被初始化为0(缺省构造函数的缺省参数值)

*为避免这个问题,Rectangle的拷贝构造函数必须保证调用的是Shape的拷贝构造函数而不是Shape的缺省构造函数。

*这很容易做,只要在Rectangle的拷贝构造函数的[成员初始化列表]里对Shape指定一个初始化值即可

5、子类拷贝构造函数不会自动调用父类的拷贝构造函数,而是调用父类默认构造函数

2、代码实例

#include <iostream>
using namespace std;

class Shape
{
public:
	Shape(){};
	Shape(int n) :no(n){}
	Shape(const Shape& other):no(other.no){}
	int no;
};

class Point
{
public:
	Point(int x, int y) :x(x), y(y){}
	int x;
	int y;
};

class Rectangle :public Shape
{
	int width;
	int height;
	Point* leftUp;

public:
	Rectangle(int w, int h, int x, int y);//构造函数
	Rectangle(const Rectangle& other); //拷贝构造
	Rectangle& operator=(const Rectangle& other);//赋值运算符
	~Rectangle();//有指针考虑重写析构
};

//实现构造函数
Rectangle::Rectangle(int w, int h, int x, int y) :width(w), height(h), Shape(w)
{   //默认调用了Shape()构造函数,参数值是默认值
	//如果不显示继承Shape, 则默认调用构造Shape()
	//构造函数需要在堆内生成一个新的point对象,并用leftUp指向该对象
	leftUp = new Point(x, y);
}

//实现拷贝构造函数
Rectangle::Rectangle(const Rectangle& other):Shape(other)
{   //默认调用了Shape构造函数Shape()
	//如果没有默认无参Shape()会报错
	//Shape(other.no)把它放在初始化列表也能实现同样效果
	//最好继承父类拷贝构造函数(放在初始化列表中)
	
	width = other.width;
	height = other.height;
	
	//拷贝构造是一个构造的过程,other有, 而this的值没有就是系统随机值,也有可能是null
	if (this->leftUp != NULL) //如果是随机值
	{

		//delete this->leftUp; //如果是随机值能delete吗?不能

		this->leftUp = NULL;
	}
	//当other的leftUp是空指针时, 不能把它赋给this.leftUp
	if (other.leftUp != NULL)
	{
		this->leftUp = new Point(*other.leftUp);
	}
}
//实现赋值运算符,注意函数写法
Rectangle& Rectangle::operator= (const Rectangle& other)
{
	
	if (this == &other)  // 自赋值情况
		return *this;
	//赋值运算符不会调用默认构造函数,因为它不是创建对象的过程
	调用父类的赋值操作符
	Shape::operator=(other);
	

	this->width = other.width;
	this->height = other.height;

	//赋值操作other,this都是有值的对象
	if (this->leftUp != NULL)
	{

		delete this->leftUp;

		this->leftUp = NULL;

	}
	//一个细节:刚刚释放的地址,new Point又重新给他分配上了
	this->leftUp = new Point(*other.leftUp); //this,other的leftUp有不同的堆地址
	return *this;
}

//实现析构函
Rectangle::~Rectangle()
{
	delete this->leftUp;
	this->leftUp = NULL;
}
int main()
{
	//1、调用构造函数
	Rectangle rect(20, 10, 3, 5);
	/* no:20, width:20,heigh:10,left:0xf48(3,5) */

	//2、调用拷贝构造
	Rectangle rectCopy(rect);
	/* 未继承父类拷贝构造:rectCopy: no:0, width:20,heigh:10,left:0xf90(3,5)*/
	/* 继承父类拷贝构造:rectCopy: no:20, width:20,heigh:10,left:0xf90(3,5)*/

	//3、调用赋值运算符
	Rectangle rectAssign(10, 5, 1, 2); //调用构造函数
	/* no:10, width:10,heigh:5,left:0xfd8(1,2) */
	rectAssign = rect;
	/* 未继承父类赋值运算 rectAssign: no:10, width:10,heigh:5,left:0xfd8(1,2)*/
	/* 继承父类赋值运算   rectAssign: no:20, width:10,heigh:5,left:0xfd8(1,2)*/

	//4、可以看到未继承时:rect的no值没有拷贝进去rectCopy的no中,rect的no没有赋值到rectAssign的no中
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 09:47:23  更:2022-05-14 09:48:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 17:20:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码