派生类的复制构造函数与赋值运算符

本文探讨C++中派生类的复制构造函数和赋值运算符的问题。当不手动指定基类的拷贝函数时,可能导致意外行为。通过实例分析了默认构造、复制构造、赋值操作符和析构函数的行为,强调在派生类中明确调用基类的相应函数以避免问题。最后,提醒未声明的拷贝构造和赋值运算符将导致浅拷贝,实现深拷贝需要手动定义并正确调用基类函数。
摘要由CSDN通过智能技术生成

当你声明自己的拷贝函数时,也就意味着你告诉了编译器你并不喜欢缺省实现中的某些行为,比如浅拷贝。编译器仿佛被冒犯了一样,会以一种奇怪的方式回敬你:当你的代码几乎百分之百出错时,却保持沉默,甚至连一个小小的警告也没有,即使是开了最高级别的编译器警告。

比如下面这个例子,输出的结果与期望大相径庭!!!

//class.h
#ifndef CLASS_HEAD_FILE
#define CLASS_HEAD_FILE

class base {
public:
	base();
	base(const base&);
	base& operator=(base& bObj);
	int getBaseNum(void) { return b_iNum; }
	void setBaseNum(int Num) { b_iNum = Num; }
	virtual ~base();
private:
	int b_iNum;
};

class derived : public base {
public:
	derived();
	derived(const derived&);
	derived& operator=(derived&);
	int getDerivedNum(void) { return d_iNum; }
	~derived();
private:
	int d_iNum;
};

#endif // CLASS_HEAD_FILE

//class.cpp
#include "class.h"
#include <iostream>

base::base() : b_iNum(10){std::cout << "base() is called! " << std::endl;}
base::~base() {std::cout << "~base() is called! " << std::endl;}


base::base(const base& bObj) {
	std::cout << "base CopyFunction is called! " << std::endl;
	b_iNum = bObj.b_iNum;
}

base& base::operator=(base& bObj) {
	std::cout << "base::opera
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值