当然,如果你想做一个“不动性赋值”特性的C++类(即赋值运算符只传递状态而不传递对象本身,类似VB6风格)
——这不属于通常意义上的赋值运算符的功能。。。就别用这个模型了,乖乖地写Big Three吧
——这不属于通常意义上的赋值运算符的功能。。。就别用这个模型了,乖乖地写Big Three吧
<code class="lang-cpp">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; } }</code>
[修改于 9年8个月前 - 2015/04/28 01:21:05]
<code class="lang-cpp">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; };</code>
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。