类设计者的核查表
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<t></t>& v,int n)
{
int k = v.length(); //由于v是const的,所以length()函数也需要定义成const,否则编译不通过。
return k>n?k:n;
}
分享到:
相关推荐
《C++沉思录》--十年编程生涯的真知灼见
2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-...
【资源说明】2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip2024届求职C++后端-学习笔记-操作...
《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...
C++非常实用-学习-总结-笔记-.pdf
C++ - C++语法 - C++程序设计
c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--...
随着面向对象程序设计思 想的日益普及,很多支持面向 对象程序设计方法语言也相继 出现了,C++就是这样一种语 言。C++是Bjarne Stroustrup 于1980年在AT&T的贝尔实验 室开发的一种语言。
c++课程设计--个人收支管理系统 仅供学习交流! 后续会持续分享相关资源,记得关注哦! c++课设 c++课程设计--个人收支管理系统 仅供学习交流! 后续会持续分享相关资源,记得关注哦! c++课设 c++课程设计--个人...
Visual C++实践与提高-COM和COM+篇(高清pdf + 随书源代码).part2,很好的COM技术学习资料
【标题】"我的笔记-qt-c++-c#-后面持续更新.7z" 提供了几个关键领域:Qt、C++和C#,这些都是计算机编程语言和技术框架。这个压缩包显然包含了作者在这些主题上的学习笔记,可能是教程、代码示例、问题解决方案或者...
Microsoft Visual C++ 2010 x86 Runtime - 10.0.40219 Microsoft Visual c + + 2010年可再发行组件包安装 Visual c + + 库运行在没有安装 Visual c + + 2010年的计算机上与 Visual c + + 开发的应用程序所需的运行时...
《C++课程设计--学生通讯录管理系统》是一个实践项目,旨在巩固和应用C++编程语言的知识,特别是面向对象编程的概念。这个系统不仅限于学生通讯录的管理,还包括了教师信息管理和图书馆管理的功能,全面展示了C++在...
### C++ 学习笔记精华版 #### 一、C++ 语言概述 **1、历史背景** - **C++ 的江湖地位** - Java、C、C++、Python、C# 是当前主流的编程语言之一,而 C++ 在这些语言中以其高效性和灵活性著称。 - **C++ 之父 ...
在本项目"C++课程设计--学生考勤管理"中,我们关注的是利用C++编程语言来构建一个学生考勤管理系统。这个系统的核心功能是管理学生考勤数据,提供查询、修改以及统计分析等功能,这对于教育机构或教师来说非常实用。...
《大话设计模式》C++实现-design-patterns-cpp
不错的c++语言课程设计项目--个人收支管理系统 不错的c++语言课程设计项目--个人收支管理系统 不错的c++语言课程设计项目--个人收支管理系统 不错的c++语言课程设计项目--个人收支管理系统 不错的c++语言课程设计...
2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改...
warning: gcc-c++-4.4.7-3.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: gcc = 4.4.7-3.el6 is needed by gcc-c++-4.4.7-3.el6.x86_64 libstdc++ = 4.4.7-...