C++类和数据抽象
文章平均质量分 77
此专栏是2014年已出版著作《编码的法则:C++程序员不可不知的101条实用经验》第二篇连载,第二篇类型和数据抽象 :包括9、10两章。内容涵盖C++的类和数据抽象封装。这些是C++区分面向过程语言最基本的特征。
@一鸣惊人
这个作者很懒,什么都没留下…
展开
-
实用经验 75 有些运算符重载应该成对实现
重载运算符,不仅== 和 !=、> 和 <、>= 和 <=要成对重载,+和+=,-和-=,*和*=,/和/=,%和%=也要成对重载原创 2021-08-22 21:18:52 · 112 阅读 · 0 评论 -
实用经验 74 重载操作符,类成员函数还是友元函数
重载操作符重载,使得程序表达更加直观,符合自然语言。对于双目运算符,建议采用friend函数。对于单目运算符,建议采用成员函数。双目运算符=只能重载为成员函数;单目运算符()、[]、->只能重载为成员函数。<<第一个操作数只能为ostream类型,所以<<运算符也只能为友员。原创 2021-08-21 08:25:04 · 498 阅读 · 0 评论 -
实用经验 73 重载operator=的陷阱
我们可通过重载内置的赋值运算符,实现用户自定义的数据类型也可具备内置数据类型的赋值运算能力,但是重载operator=需要考虑:自赋值问题,勿忘记复制所有成员。还有应为深拷贝还是浅拷贝。原创 2021-08-20 22:13:40 · 280 阅读 · 0 评论 -
实用经验 72 重载operator[]的陷阱
使用[]下标操作符,我们可像数组下标访问形式一样访问对象。这种操作方式简单而且形象,又方便理解。但是需注意operator[]下标操作符只能作为类的成员函数。同时在定义类的下标操作符时请定义两个版本。以适应const对象和非const对象。同时需要小心operator[]的陷阱。在重载时必须把这部分陷阱考虑进去,以防为此付出惨痛的代价。原创 2021-08-17 20:09:02 · 308 阅读 · 0 评论 -
实用经验 71 区别++/--操作符前置和后置差异
无论是++操作符还是—操作符,都有前置和后置之分。(++)自增和(–)自减是C++中最为特此的两个重载运算符,后置(++)自增和(–)自减均以前置(++)自增和(–)自减为基础实现。实现(++)自增和(–)自减,关键是掌握两种返回类型和返回类型的差异。原创 2021-08-15 14:51:31 · 1143 阅读 · 0 评论 -
实用经验 70 由重载&&、||和,操作符想到的
C++提供了比C语言更加强大的操作符功能。虽然操作符支持重载,但也不能成为重载的理由。重载操作符的目的是简化程序,而不引人新的问题,像||、&&和,还是不要重载的好。因为重载后的行为可能和你期望的行为不一样。原创 2021-08-15 00:41:32 · 100 阅读 · 0 评论 -
第10章 重载操作符
C和C++都定义了很多内置类型间的操作符,然而与C语言不同的是:C++语言支持重定义操作符作用于类类型对象的含义。有了操作符的重载,你可以像操作内置类型一样,操作你定义的类类型,从而避免复杂冗长的代码。这也需会让你喜出望外。但是类类型重载的操作符和内置操作符还是有差别的。本章将详细讲述重载操作符,希望通过本章的学习,读者能走出困扰,像专家一样将“操作符重载”玩弄于掌骨之间。原创 2021-08-15 00:08:59 · 86 阅读 · 0 评论 -
实用经验 69 理解常量成员函数
声明带有 const 关键字的成员函数指定,函数是 “只读”函数,在它被调用的时候不会修改对象。 一个常数成员函数不能修改任何非静态数据成员或调用不是常数的任何成员函数。声明常数成员函数,需在参数列表的右括号后放置const关键字。 声明和定义中均需要const 关键字。原创 2021-08-13 18:47:36 · 186 阅读 · 0 评论 -
实用经验 68 首选初始化列表实现类成员初始化
请选择初始化列表实现类成员的初始化,因为这种实现可提高程序的执行效率。如果类中包含引用或const成员。初始化类别是唯一可以为这些成员初始化的方法。因为在构造函数中无法对这类成员进行初始化工作。需要特殊说明的是:成员初始化,总是按照声明的顺序初始化,而不是按照初始化列表顺序初始化。原创 2021-08-12 22:41:06 · 188 阅读 · 0 评论 -
实用经验 67 关于对象复制的思考
对象复制,有拷贝构造,赋值操作等等。他们的目的都是一样的将数据从一个对象拷贝到另外一个对象。对象复制时,请记得复制对象的所有成员,及基类的所有成员。对于POD对象,您可以直接通过memset或memcpy实现对象的拷贝复制。原创 2021-08-11 22:42:12 · 135 阅读 · 0 评论 -
实用经验 66 class对象大小与什么有关系?
在C++中,对象大小牵涉着对象内存的使用。类对象的大小并不仅仅是对象中非静态数据成员的总和。其他因素包括内存对齐,虚函数,虚继承都影响类对象的大小。而类对象的大小影响因素不包括静态数据成员,因为类中的静态数据成员分布于全局存储区域。不占用类对象的空间。原创 2021-08-09 22:44:56 · 487 阅读 · 0 评论 -
实用经验 65 将成员变量声明为private
C++数据包括三种访问权限:public访问权限、private访问权限、protected访问权限。将数据成员声明为private,可带来访问数据的一致性,访问控制,并可为以后提供足够的弹性。 将数据声明为protected并不比public更具有封装性。原创 2021-08-09 22:02:13 · 1024 阅读 · 0 评论 -
实用经验 64 struct和class到底什么关系?
在C++中,虽然struct和class差别很小,可等同看待。但笔者扔建议struct还是当做数据结构使用,而不当做class对象使用。如果你想把struct作对象使用,笔者建议用class替代。 从struct到class的最大区别是编程思想变化的体现。原创 2021-08-08 22:57:24 · 223 阅读 · 0 评论 -
实用经验 63 不使用编译器自动生成的函数,就明确拒绝之
不使用编译器自动生成的函数,就明确拒绝之。为禁止编译器自动提供的机制,可将相应的成员函数声明为private并不予以实现。将类的构造函数声明为private,通过一个static的函数接口实现类的使用。这样可以保证类对象实例的单一性原创 2021-08-07 22:49:08 · 131 阅读 · 0 评论 -
实用经验 62 避免在构造/析构函数中调用虚函数
在基类的构造过程中,虚函数调用从不会被传递到派生类中。取而代之的是,派生类对象表现出来的行为好象其本身就是基类型。同样的我们还可以这样认为:在基类的构造过程中,虚函数并没有被“构造”。因此在构造函数/析构函数里请不要调用虚函数,因为这是一件极其危险的事情。原创 2021-08-06 08:33:23 · 300 阅读 · 0 评论 -
实用经验 61 绝不让构造函数为虚函数
每个类都可能会定义几个特殊的成员函数,这些函数用于完成class的初始化工作。这种特殊的成员函数被称之为构造函数。构造函数不能声明为虚函数,因为虚函数的调用需要class构造完成之后方可调用。原创 2021-08-05 08:58:56 · 173 阅读 · 0 评论 -
第9章 类
Class 是C++面向对象设计的核心。Class奠定了c++以数据为中心的设计理念的基础,这也是C++区别于以流程为中心C的最根本特征。类的实现涉及到类的构造,析构,数据(成员函数)访问权限,类的继承等。这些都是C++语言最基础的东西。同时也是C++开发人员出问题最多的地方。本章将详细讲述C++中类的实现陷阱、优秀实践。原创 2021-08-04 21:55:06 · 62 阅读 · 0 评论