当你声明自己的拷贝函数时,也就意味着你告诉了编译器你并不喜欢缺省实现中的某些行为,比如浅拷贝。编译器仿佛被冒犯了一样,会以一种奇怪的方式回敬你:当你的代码几乎百分之百出错时,却保持沉默,甚至连一个小小的警告也没有,即使是开了最高级别的编译器警告。
比如下面这个例子,输出的结果与期望大相径庭!!!
//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