2016年8月31日
摘要: 运算符重载函数既可以声明为类的成员函数,也可以声明为所有类之外的全局函数。 运算符重载函数作为类的成员函数 将运算符重载函数声明为类的成员函数时,二元运算符的参数只有一个,一元运算符不需要参数。之所以少一个参数,是因为这个参数是隐含的。 例如,上节的 complex 类中重载了加法运算符: 当执行: 阅读全文
posted @ 2016-08-31 20:50 白宫飘红旗 阅读(1272) 评论(0) 推荐(0) 编辑
摘要: 所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同的功能。 实际上,我们已经在不知不觉中使用了运算符重载。例如,"+"号可以 阅读全文
posted @ 2016-08-31 17:12 白宫飘红旗 阅读(407) 评论(0) 推荐(0) 编辑
摘要: 在C++中,可以将成员函数声明为纯虚函数,语法格式为: 纯虚函数没有函数体,只有函数声明,在虚函数声明结尾加上=0,表明此函数为纯虚函数。 最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。 包含纯虚成员函数的类称为抽象类(Abstract Class)。之所以说它 阅读全文
posted @ 2016-08-31 15:59 白宫飘红旗 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数。因为在执行构造函数前对象尚未创建完成,虚函数表尚不存在,也没有指向虚函数表的指针,所以此时无法查询虚函数表,也就不知道要调用哪一个构造函数。下节会讲解虚函数表的概念。 析构函数则用于在销毁对象时完成相应的资源释放工作,可以被声明为 阅读全文
posted @ 2016-08-31 12:01 白宫飘红旗 阅读(274) 评论(0) 推荐(0) 编辑
  2016年8月30日
摘要: 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。上节的例子中,你可能还未发现虚函数的用途,不妨来看下面的代码。 这个例子中,由于派生类比较多,如果不使用多态,那么就需要定义多个变量,很容易造成混乱。有了多态,只需要一个变量 p,就可以调用所有派生类的虚函数。 从这个例子中也可以发现,对于具有复 阅读全文
posted @ 2016-08-30 21:11 白宫飘红旗 阅读(330) 评论(0) 推荐(0) 编辑
  2016年8月29日
摘要: 在《C++基类和派生类的赋值》一节中讲到,基类的指针也可以指向派生类对象。请看下面的例子: 运行结果:People: Xiao MingPeople: Li Lei 我们通常认为,如果指针指向了派生类对象,那么就应该使用派生类的成员变量和成员函数,这符合人们的思维习惯。但是本例的运行结果却告诉我们: 阅读全文
posted @ 2016-08-29 00:59 白宫飘红旗 阅读(1183) 评论(0) 推荐(0) 编辑
  2016年8月26日
摘要: 在C/C++中,经常会发生数据类型转换,例如整型数据可以赋值给浮点型变量,在赋值之前,先把整型数据转换为浮点型;反过来,浮点型数据也可以赋值给整型变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍。例如: 输出结果为 10,编译器会将小数部分直接丢掉(不是四舍五入)。再如: 输出结果为 10 阅读全文
posted @ 2016-08-26 11:12 白宫飘红旗 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 多继承时很容易产生命名冲突,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如非常经典的菱形继承层次。如下图所示: 类A派生出类B和类C,类D继承自类B和类C,这个时候类A中的成员变量和成员函数继承到类D中变成了两份,一份来自 A-->B-->D 这一路, 阅读全文
posted @ 2016-08-26 10:08 白宫飘红旗 阅读(4215) 评论(0) 推荐(1) 编辑
摘要: 在前面的例子中,派生类都只有一个基类,称为单继承。除此之外,C++也支持多继承,即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。想快速学习C++的读者可以不必细读。 多继承的语法也很简单, 阅读全文
posted @ 2016-08-26 08:36 白宫飘红旗 阅读(748) 评论(0) 推荐(0) 编辑
  2016年8月25日
摘要: 和构造函数类似,析构函数也是不能被继承的。 创建派生类对象时,构造函数的调用顺序和继承顺序相同,先执行基类构造函数,然后再执行派生类的构造函数。但是对于析构函数,调用顺序恰好相反,即先执行派生类的析构函数,然后再执行基类的析构函数。 请看下面的例子: 从运行结果可以很明显地看出来,构造函数和析构函数 阅读全文
posted @ 2016-08-25 12:57 白宫飘红旗 阅读(199) 评论(0) 推荐(0) 编辑