当然,如果你想做一个“不动性赋值”特性的C++类(即赋值运算符只传递状态而不传递对象本身,类似VB6风格)
——这不属于通常意义上的赋值运算符的功能。。。就别用这个模型了,乖乖地写Big Three吧
——这不属于通常意义上的赋值运算符的功能。。。就别用这个模型了,乖乖地写Big Three吧
class MyClass
{
private:
// 两个模拟函数
void CopyFrom(MyClass& src);
void Dispose();
public:
// 需要自己写的函数
MyClass(); // 默认构造函数(清空内存并设置默认值)
MyClass(int a, int b, char *str); // 常规构造函数
public:
// C++定式模型:丢弃旧的,拷贝新的
~MyClass() { Dispose(); } // 析构函数(丢弃旧的)
MyClass(MyClass& src) { CopyFrom(src); } // 复制构造函数(拷贝新的)
MyClass& operator=(MyClass& src) { // 赋值运算符(丢弃旧的,拷贝新的)
Dispose();
CopyFrom(src);
return *this;
}
public:
int a;
int b;
char *str;
};
// 【CopyFrom函数】作用:复制内存和外部资源
void MyClass::CopyFrom(MyClass& src)
{
// 复制内存
memcpy(this, &src, sizeof(MyClass));
// 复制外部资源
// 先判断是否来了新资源,如果来了则复制
if (src.str != NULL) {
this->str = new char[strlen(src.str)+1];
strcpy(this->str, src.str);
}
}
// 【Dispose函数】作用:销毁旧资源
void MyClass::Dispose()
{
if (this->str != NULL) // 判断是否存在旧资源
{
delete[] this->str; // 删除旧资源
}
}
// 【默认构造函数】
// 任务:清空内存,设置默认值
MyClass::MyClass() {
memset(this, 0, sizeof(MyClass));
// TODO: 设置默认值
}
// 【常规构造函数】
// 任务:按照常规方法初始化数据
MyClass::MyClass(int a, int b, char *str)
{
this->a = a;
this->b = b;
if (str != NULL) {
this->str = new char[strlen(str)+1];
strcpy(this->str, str);
} else {
// 注意:常规构造函数需要初始化所有成员,防止产生垃圾数据
this->str = NULL;
}
}class MyClass
{
private:
// 两个模拟函数
void CopyFrom(MyClass& src);
void Dispose();
public:
// 需要自己写的函数
MyClass(); // 默认构造函数(清空内存并设置默认值)
MyClass(int a, int b, char *str); // 常规构造函数
public:
// C++定式模型:丢弃旧的,拷贝新的
~MyClass() { Dispose(); } // 析构函数(丢弃旧的)
MyClass(MyClass& src) { CopyFrom(src); } // 复制构造函数(拷贝新的)
MyClass& operator=(MyClass& src) { // 赋值运算符(丢弃旧的,拷贝新的)
if (&src != this) { // 【修正】:判断自赋值情况
Dispose();
CopyFrom(src);
}
return *this;
}
public:
int a;
int b;
char *str;
};