摘要:在前面已经探讨过了虚继承对类的大小的影响,这次来加上虚函数和虚继承对类的大小的影响。 先来回顾一下之前例子的代码: 编译运行: 而数据模型为: 关于对虚继承的详细分析可以参考博文:http://www.cnblogs.com/webor2006/p/5621825.html 下面在这个例子上加上虚函
        
阅读全文
 
    
        
        
摘要:还记得之前写过一个代码么?如下: 上面代码是用来根据指定的形状名称来创建相印的形状实例,这里面有很多if...else...语句,如果有新的形状要创建,则里面的代码得不断的进行修改,所以这种设计不是很灵活,所以对象动态创建技术就可以很好的解决此问题。 什么是对象动态创建呢?简单的说它是指可以通过一个
        
阅读全文
 
    
        
        
摘要:虚函数是实现多态性的前提①、需要在基类中定义共同的接口②、接口要定义为虚函数 如果基类的接口没办法实现怎么办?如形状类Shape 解决方法将这些接口定义为纯虚函数 在基类中不能给出有意义的虚函数定义,这时可以把它说明成纯虚函数,把它的定义留给派生类来做。 定义纯虚函数: class 类名{ virt
        
阅读全文
 
    
        
        
摘要:多态性是面向对象程序设计的重要特征之一。 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。 多态的实现:①、函数重载②、运算符重载③、模板以上三种为静态绑定④、虚函数【这节的重点】这个为动态绑定 绑定过程出现在编译阶段,在编译期就已确定要调用的函数。 绑定过程工作在程序运行时
        
阅读全文
 
    
        
        
摘要:在研究之前,先来回忆一下类/对象大小的计算: 类大小计算遵循前面学过的结构体对齐原则。 类的大小与数据成员有关与成员函数无关。 类的大小与静态数据成员无关。 虚继承对类的大小的影响 虚函数对类的大小的影响 前面三点在之前已经介绍过了,这节主要是研究第四点,而第五点会在未来进行探讨,在探讨虚继承对内存
        
阅读全文
 
    
        
        
摘要:单重继承——一个派生类最多只能有一个基类。 多重继承——一个派生类可以有多个基类 ①、class 类名: 继承方式 基类1,继承方式 基类2,….{….}; ②、派生类同时继承多个基类的成员,更好的软件重用。 ③、可能会有大量的二义性,多个基类中可能包含同名变量或函数。 多重继承中解决访问歧义的方
        
阅读全文
 
    
        
        
摘要:派生类对象也是基类对象。这意味着在使用基类的地方可以用派生类来替换。 当派生类以public方式继承基类时,编译器可自动执行的转换(向上转型 upcasting 安全转换)①、派生类对象指针自动转化为基类对象指针。 下面用代码进行说明: #include <iostream> #include <s
        
阅读全文
 
    
        
        
摘要:构造函数 析构函数 =运算符【由于它的功能跟构造函数类似,所以也不能被继承】 构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化(调用基类构造函数完成)。 派生类的构造函数需要给基类的构造函数传递参数。 声
        
阅读全文
 
    
        
        
摘要:C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。 关于“继承”是什么,只要是有过面向对象的编程基础的应该都很容易理解,接下来会详细对其进行介绍,而上面提到了一个“组合”,那
        
阅读全文
 
    
        
        
摘要:使用map得包含map类所在的头文件#include <map> 定义一个map对象:map<string, int> mapTest;//用string作为索引,存储int对象 【四种方法】 mapTest["aaa"] = 100; mapTest.insert(map<string, int>
        
阅读全文
 
    
        
        
摘要:上篇中遗留了一个小作业,就是用string中的find_first_not_of和find_last_not_of函数来实现字符串左右空格的去除,先来完成它,实现的思路是先来编写去除左空格,然后再编写去除右空格,最后去除左右空格则去调用前面两个方法既可,先来编写一个去除空格的工具类: StringU
        
阅读全文
 
    
        
        
摘要:上几篇中已经实现了一个简单版的String字符串类,但是实际开发中不用我们自己实现了,学习Java的也知道有一个系统现成的用,当然强大的C++也不例外,下面就来学习一下系统定义的string是怎么用的。 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有
        
阅读全文
 
    
        
        
摘要:必须是成员函数,不能是友元函数。 没有参数(操作数是什么?)。 不能指定返回类型(其实已经指定了)。 函数原型:operator 类型名(); 下面用代码来说明,先新建工程,将上次实现的Integer类添加至项目中来: Integer.h: Integer.cpp: 测试代码: 上面的输出的写法及输
        
阅读全文
 
    
        
        
摘要:基于上次String类的实现,这次继续学习其它相关运算符的重载来进一步完善String类,先将目前String类的实现贴出来,以下的实验都是基于它: String.h: String.cpp: 先编写测试代码: 当然目前还编不过: 下面来重载该运算符: 编译运行: 说明代码是有BUG的,经过查找,是
        
阅读全文
 
    
        
        
摘要:运算符重载允许把标准运算符(如+、—、*、/、<、>等)应用于自定义数据类型的对象。 直观自然,可以提高程序的可读性。 体现了C++的可扩充性。 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式。 运算符重载,本质上是函数重载。 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容
        
阅读全文
 
    
        
        
摘要:友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。 友元函数 友元类 友元函数在类作用域外定义,但它需要在类体中进行说明。 为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下: frien
        
阅读全文
 
    
        
        
摘要:【栈是后进先出的】 先来定义栈的数据结构: 接下来定义栈的一些操作方法: ①、栈的初始化: #include <stdio.h> struct Link {//栈里面的数据结构由链表来表示 int data; struct Link* next; }; struct Stack { struct L
        
阅读全文
 
    
        
        
摘要:①、对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 ②、如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时我们可以用类的静态成员来解决这个问题。 ③、非static数据成员存在于类类型的每个对象中,static数据成员独
        
阅读全文
 
    
        
        
摘要:推荐在构造函数初始化列表中进行初始化什么是初始化列表呢?还是以上节中的时钟类的构造来说明:这是原来的构造函数的写法,而这里改成用构造函数初始化列表来进行成员的初始化,如下:测试一下代码:编译运行:构造函数的执行分为两个阶段:初始化段和普通计算段实际上对于这种形式不属于初始化了:因为这个对象空间已经生...
        
阅读全文
 
    
        
        
摘要:构造函数是特殊的成员函数。创建类类型的新对象,系统自动会调用构造函数。构造函数是为了保证对象的每个数据成员都被正确初始化。函数名和类名完全相同。不能定义构造函数的类型(返回类型),也不能使用void。通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用。构造函数被声明为私有有...
        
阅读全文