设为首页 加入收藏

TOP

C++类设计者的核查表
2014-11-24 11:27:59 来源: 作者: 【 】 浏览:0
Tags:设计者 核查

1. 类需要构造函数么?


2. 数据是否需要保持私有的?


方案一 public: int length;


方案二 public: const int& length;//在构造函数中length = true_length;这样由于是const变量,只能读,不能修改。 private: int true_length;


方案三 public: int length() const;//


3. 是否需要一个无参的构造函数?


如果没有无参的构造函数,那么 Point p; Point pa[100]; 这样的定义都是错误的。


4. 是不是每个构造函数初始化所有的数据成员?


构造函数的用途就是用一种明确定义的状态来设置对象,而这个对象是由对象的数据成员反映的。因此每个构造函数都要负责为所有数据成员设置明确定义的值。(特殊的例外)


5. 是否需要析构函数?如果有内存是在类中new出来,但一直也没有释放的,需要在析构函数中释放掉。


6. 是否需要虚析构函数?


如果一个基类B被派生了一个子类D,无论B是否有虚函数 B* d = new D(); delete d; //B都需要虚析构函数,否则这里会调用错误的析构函数


7. 是否需要复制构造函数?


因为data的内存是另外动态分配的。所以应该需要析构函数来释放data空间 class String{ public: String(); String(const char* s); private char* data } 因为data的内存是另外动态分配的。所以应该需要析构函数来释放data的空间。同样也需要复制构造函数,因为如果没有的话,如果复制对象 String b = a 就是仅复制data的地址,b.data和a.data指象同一个内存,在两个对象销毁时,这个内存会被释放两次。如果不希望用户能够复制类的对象,就声明复制构造函数(可能还有赋值操作符)为私有的 class Thing{ private Thing(const Thing&); Thing& operator=(const Thing&); }


8. 需要一个赋值操作符么?


是否需要的理由和复制构造函数是一样的。 Thing& operator=(const Thing&); 由return *this;结束以保证与内建的复制操作符一致。写这个函数的时候还要注意赋值给自身的情况 String& String::operator=(const String& s) { delete[] data; //如果是赋值给自身的情况,s.data也给delete了,所有后面都是错了 data = new char[strlen(s.data)+1]; strcpy(data,s.data); return *this; } 所以最好: String& String::operator=(const String& s) { if( &s != this){ delete[] data; data = new char[strlen(s.data)+1]; strcpy(data,s.data); return *this; } } 或: String& String::operator=(const String& s) { char* newdata = new char[strlen(s.data)+1]; strcpy(newdata,s.data); delete[] data; data = newdata; return *this; }


9. 需要定义关系操作符么?


如果类逻辑上支持相等操作,那么提供operate==,operate!=,就可能有好处如果类的值有某种排序关系,那就考虑其他 < > 等操作符


10. 删除数据用delete[]了么?


删除数组是用delete[]是个好习惯。这种用法是为了与C兼容,实现时会有个地方记录数组的长度


11. 记得在复制构造函数和赋值操作符的参数类型中加const了么?


X::X(const X&) X::operator=(const X&)


12. 如果函数有引用参数,它们应该是const引用么?


Complex operator+(const Complex& x,const Complex& y);


13. 记得适当地声明成员函数为const了么?


如果一个成员函数不会修改其对象(一般get方法),可以声明它为const,这样它才可以应用于const对象。例如:


int padded_length(const Vector& v,int n) { int k = v.length(); //由于v是const的,所以length()函数也需要定义成const,否则编译不通过。 return k>n k:n; }


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Java Swing 垂直流布局管理器实现 下一篇最轻量级的C协程库:Protothreads

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C 内存管理 | 菜鸟教 (2025-12-26 20:20:37)
·如何在 C 语言函数中 (2025-12-26 20:20:34)
·国际音标 [ç] (2025-12-26 20:20:31)
·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)