
c++
sunny_fbw
这个作者很懒,什么都没留下…
展开
-
深浅拷贝
深浅拷贝问题的由来:在C++使用过程中我们会用到类,当我们用类定义一个对象,然后用类拷贝构造一个对象时,会调用拷贝构造函数。当然,如果我们的数据成员都是基本数据类型时我们不用担心,但当我们的数据成员指向一定的内存空间,仅仅进行赋值是远远不够的,应为这样当析构时会对同一空间多次释放。 这样做能解决问题,但是占用内存,我们可以采用引用计数的方法,当计数为0时才释放空间。保证在最后换一个对象释放原创 2017-07-21 00:45:24 · 193 阅读 · 0 评论 -
纯虚函数
编程是要符合实际生活的,假如我们现在要实现一个观察动物生活的软件。我们要定义许多的动物类来具体记录它们的生活习性。假如我们要调用某一动物的资料,很简单我们可以通过实例化对象通过访问函数来得到。但是有一天领导要来检查,需要我们把所有动物的资料全部调出来,这时候通过定义对象,就显得佷麻烦。这样我们想通过调用一个公有函数来得到所有资料。函数参数要接受所有动物类,前边博文中提到的赋值兼容规则恰好符合我们的要原创 2017-08-14 15:24:17 · 523 阅读 · 0 评论 -
多态原理实现分析及重载,隐藏,覆盖的辨析
上一篇文章我讲到关于多态的使用,我们是不是感到非常神奇,为啥就是简单的加个virtual就能访问到子类的函数。无疑C++底层帮我们做很多的工作,C++的前辈们在底层加入__vfptr这样一个虚函数表,用来存我们申明为virtual的函数。加virtual之后访问子类函数的门道就在这里,我们以一个简单的程序来讲解: 我们在父类base中申明三个函数,两个虚函数,一个普通函数。在子类D中我们重写v原创 2017-08-14 11:07:07 · 250 阅读 · 0 评论 -
多态和虚函数的使用
上一篇博文我提到virtual用法,同时谈到它在多态的实现中有至关重要的位置。现在我们来学习多态到底是什么及其是如何实现的。 在C++中有两种多态性: 1>编译时的多态:通过函数的重载和运算符的重载来实现。 2>运行时的多态:无法根据函数名和参数来确定该调用哪个函数,必须在程序执行过程中,根据执行的具体情况来动态地确定。它是通过类继承关系和虚函数来实现的。在类继承中我们的父类对象,指针或引用只原创 2017-08-12 23:44:37 · 330 阅读 · 0 评论 -
同名隐藏与赋值兼容规则
在继承体系中我们的编写派生类一般可分四个步骤: 1>吸收基类成员(除构造函数和析构函数外全部接收) 2>改造基类成员(声明一个和某基类成员的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名隐藏) 3>发展新成员(派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展) 4>重写构造函数和析构函数同名隐藏:只要子类新成员的函数名与父类函数名相同,子类写的函数将会隐藏所有父类和原创 2017-08-11 22:44:19 · 550 阅读 · 0 评论 -
钻石继承和虚基类
当我们一个类去继承的两个父类有相同的数据成员时,我们想给这个成员赋值就要遇到问题了,我们必须用类名去驱动它,不然我们就不知道到底是给哪个成员赋值,下面举个例子。 这样看来是很好的解决我们的问题,但是当我们的父类继承它自己的父类,而我们想从子类中访问父类的父类数据时,我们通过加类名去驱动也可以实现。但是我们明明是修改的同一个数据但是却给的不同的值,和我们现实情况不同。语言可能生涩难懂,我们举个例原创 2017-08-11 17:22:54 · 290 阅读 · 0 评论 -
考虑异常安全性的赋值语句
前边写过关于赋值语句的博客(http://blog.youkuaiyun.com/f15829107089/article/details/75453192), 但是实现的方法存在异常安全性。当我们赋值的对象原本有指向内存时,释放内存后,重新给对象申请空间,如果内存不足导致导致new char抛出异常,但是被赋值的对象已经被赋值为空,非常容易导致程序崩溃。 1>我们可以先申请空间再释放原有内容,这样保证分配原创 2017-08-10 10:45:53 · 347 阅读 · 0 评论 -
拷贝构造和赋值语句
拷贝构造函数:用于对象初始化对象。函数名是类名。参数必须是对象的引用。 如果不采用引用传递会产生临时变量,要开辟空间并且要拿原有的对象初始化临时对象,继续调用拷贝构造函数,产生无限递归,这些对象都存储在栈里面,造成栈溢出。 拷贝构造函数三种调动情况: 1>对象初始化对象 2>如果函数的参数以对象A作为参数时,要创建对象A,要拿原有对象初始化对象A。 3>函数返回值是类对象时,在函数内部原创 2017-07-20 00:16:36 · 459 阅读 · 0 评论 -
构造函数和析构函数
C++的学习我们不免要从构造函数和析构函数开始。 构造函数:数据成员多为私有,要对他们进行初始化,必须有一个公有函数来进行。同时这个函数应该仅在定义对象时自动执行一次,称为构造函数。 主要有以下特征: 1>函数名与类名相同。 2>无返回值类型(即使是void也没有) 3>新的对象在被创建时,该对象所属类的构造函数被自动调用一次,且在该对象的生命周期内仅被调用一次。 4>构造函数可以被重原创 2017-07-19 22:45:26 · 220 阅读 · 0 评论 -
继承访问属性
我们都知道当实例化一个对象时我们的对象只能访问类里的公有数据或者函数。这样看来保护属性和私有属性似乎没有什么区别。这就要引出我们的主角继承。当我们的一个类D(子类)继承另一个类Base(父类)时,我们有公有,保护,私有三种继承方式。不能继承父类的构造和析构。那么我们的子类能访问父类的那些数据呢。 站的子类的角度,子类只能访问父类的公有和保护方法。继承也分别有公有,保护,私有三种方式。继承相当于给子原创 2017-08-01 00:16:26 · 407 阅读 · 0 评论 -
内联函数--讲的真好
转载自:http://blog.youkuaiyun.com/u011327981/article/details/50601800 1. 内联函数 在C++中我们通常定义以下函数来求两个整数的最大值: 复制代码 代码如下:int max(int a, int b) { return a > b ? a : b; } 为这么一个小的操作定义一个函数的好处有: ① 阅读和理解函数 max 的调转载 2017-09-18 16:48:47 · 490 阅读 · 0 评论