摘要: 编译器生成的成员函数 编译器会自动生成一些公有的成员函数——特殊成员函数。 1、 默认构造函数 提供构造函数的动机之一是确保对象总能被正确地初始化。如果类包含指针成员,则必须初始化这些成员。最好提供一个显式默认构造函数,将所有的类数据成员都初始化为合理的值。 如果定义了某种构造函数,编译器将不会定义 阅读全文
posted @ 2019-02-23 12:49 Grooovvve 阅读(195) 评论(0) 推荐(0)
摘要: 如果基类使用动态内存分配,并重新定义赋值和复制构造函数,这将怎样影响派生类的实现?这个问题的答案取决于派生类的属性。如果派生类也使用动态内存分配,那就需要注意学习新的小技巧。 派生类不适用new //Base Class Using DMA class baseDMA { private: char 阅读全文
posted @ 2019-02-23 12:47 Grooovvve 阅读(502) 评论(0) 推荐(0)
摘要: abstract base class,ABC 抽象基类 有时候is-a规则并不像看上去那么简单,例如圆和椭圆的关系。圆是椭圆的特殊情况。椭圆可以派生出圆。但是椭圆的数据成员及方法对于圆来说是信息冗余。圆类继承椭圆类会显得很繁琐。 如果把圆和椭圆分开定义,这种方法效率不高,因为它忽略了圆类和椭圆类的 阅读全文
posted @ 2019-02-23 12:46 Grooovvve 阅读(636) 评论(0) 推荐(0)
摘要: public和private来控制对类成员的访问。 还存在另外一个访问类别,这种类别用关键字protected表示。protected和private相似,在类外只能用公有类成员来访问protected部分中的类成员。但是它们之间的区别体现在基类派生的类中。派生类的成员可以直接访问基类的保护成员,但 阅读全文
posted @ 2019-02-23 12:44 Grooovvve 阅读(178) 评论(0) 推荐(0)
摘要: 程序调用函数时,将使用哪个可执行代码块呢?编译器负责回答这个问题。 将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding)。 在C语言中,这非常简单,因为每个函数名对应一个不同的函数。 但是在C++中由于函数重载的缘故,这项任务非常复杂。编译器必须查看函数参数才能确定使用哪个函 阅读全文
posted @ 2019-02-23 12:43 Grooovvve 阅读(409) 评论(0) 推荐(0)
摘要: 有时候希望同一个方法在派生类和基类中的行为是不同的。换句话说,方法的行为取决于调用该方法的对象。这种较复杂的行为称为多态——具有多种形态。即同一种方法其行为随上下文而异。有两种重要的机制可用于实现多态公有继承: 在派生类中重新定义基类的方法。 使用虚方法。 如果要在派生类中重新定义基类的方法,通常应 阅读全文
posted @ 2019-02-23 12:38 Grooovvve 阅读(249) 评论(0) 推荐(0)
摘要: 面向对象编程的主要目的之一是:提供可重用的代码。尤其是项目很庞大的时候,重用测试过的代码比重新编码代码要好得多。 C++提供了更高层次的重用性。其中之一就是继承这个概念。 一些厂商提供了类库。类库由类声明和实现构成。类库通常是由源代码组成的,这意味着可以对其进行修改,以满足需求。但是也可以用类继承的 阅读全文
posted @ 2019-02-23 12:35 Grooovvve 阅读(397) 评论(0) 推荐(0)
摘要: 如果两种类只是数据类型不同,而其他代码是相同的,与其编写新的类声明,不如编写一种泛型(独立于类型的)栈。然后将具体的类型作为参数传递给这个类。这样就可以使用通用的代码生成存储不同类型值的栈。 可以使用typedef处理这样的需求,但是有两个问题,一、每次修改类型都必须重新编辑头文件;二、在每个程序中 阅读全文
posted @ 2019-02-23 12:27 Grooovvve 阅读(288) 评论(0) 推荐(0)
摘要: 继承使用时要注意,默认是私有派生。所以要公有派生时必须记得加关键字Public。 MI(Multi Inheritance)会带来哪些问题?以及如何解决它们? 两个主要问题: 从两个不同的基类继承同名方法; 从两个或更多相关基类那里继承同一个类的多个实例; 虚方法 Worker公有派生出Singer 阅读全文
posted @ 2019-02-23 12:24 Grooovvve 阅读(243) 评论(0) 推荐(0)
摘要: 使用包含:易于理解,类声明中包含表示被包含类的显式命名对象,代码可以通过名称引用这些对象; 使用继承:将使关系更抽象,且继承会引起很多问题,尤其是从多个基类继承时。 私有继承所提供的特性确实比包含多。 通常,应使用包含来建立has-a关系;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应 阅读全文
posted @ 2019-02-23 12:22 Grooovvve 阅读(207) 评论(0) 推荐(0)
摘要: 对于姓名可以使用字符数组来表示,但这将限制姓名的长度。当然,还可以使用char指针和动态内存分配,但这要求提供大量的支持代码。有一个好的方法就是使用一个他人开发好的类的对象来表示。如果C++库提供了合适的类,实现起来将更简单。C++库确实提供了一个这样的类,它就是valarray。 valarray 阅读全文
posted @ 2019-02-23 12:19 Grooovvve 阅读(350) 评论(0) 推荐(0)
摘要: C++的主要目的是促进代码重用。 公有继承是实现这一目标的机制之一; 本身是另一个类的成员,这种方法称为包含、组合、层次化。 另一种方法是使用私有、保护继承。 通常包含、私有继承和保护继承用于实现has-a关系,即新的类型包含另一个类的对象。 多重继承使得能够使用两个或更多的基类派生出新的类,将基类 阅读全文
posted @ 2019-02-23 12:17 Grooovvve 阅读(157) 评论(0) 推荐(0)
摘要: 友元和类的关系还可以更复杂。 举个例子,假设出现了交互式遥控器,交互式遥控器能够让您回答电视节目中的问题,如果回答错误,电视将在控制器上产生嗡嗡声。 这个例子的问题,可以使用新的友元关系来解决。我把它叫做相互的友情。 即一些Remote方法能够像前面那样访问Tv对象,而一些Tv方法也能影响Remot 阅读全文
posted @ 2019-02-23 11:23 Grooovvve 阅读(316) 评论(0) 推荐(0)
摘要: 接着上一篇《友元是什么》中,我们发现Remote友元类的大多数方法都是用Tv类的公有接口实现。这意味着这些方法并不是真正需要友元。 事实上唯一直接访问Tv成员的Remote方法是Remote::set_chan(),因此它是唯一需要作为友元的方法。 确实可以仅让特定的类成员成为另一类的友元。 这种做 阅读全文
posted @ 2019-02-23 11:07 Grooovvve 阅读(223) 评论(0) 推荐(0)