2012年2月28日

摘要: 在用C++写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节。也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来。这个时候就要用到接口与实现分离的技术。 下面用一个最简单的例子来说明。 类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下: lxTest.h文件内容:class ClxTest {public: ClxTest(); virtual ~ClxTest(); void DoSomething();}; lxTest.cpp文件内容:#include "lxTest 阅读全文
posted @ 2012-02-28 17:05 很多不懂呀。。 阅读(867) 评论(0) 推荐(0) 编辑
摘要: 一、类嵌套的疑问C++头文件重复包含实在是一个令人头痛的问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:class B;class A{ public: B b;};class B{ public: A a;};因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的。在这里我们只需要把其中的一个A类中的B类型成员改成指针形式就可以避免这个无限延伸的怪圈了。为什么要更改A而不是B?因为就算你在B中做了类似的动作,也仍然会编译错误,表面上这仅仅上一个先后顺序的问题。 为什么会这样呢? 阅读全文
posted @ 2012-02-28 16:44 很多不懂呀。。 阅读(563) 评论(0) 推荐(0) 编辑
摘要: 1. 为什么需要智能指针?简单的说,智能指针是为了实现类似于Java中的垃圾回收机制。Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收。但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟病。更进一步地说,智能指针的出现是为了满足管理类中指针成员的需要。包含指针成员的类需要特别注意复制控制和赋值操作,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象。当类的实例在析构的时候,可能会导致垂悬指 阅读全文
posted @ 2012-02-28 15:38 很多不懂呀。。 阅读(1116) 评论(0) 推荐(0) 编辑
摘要: 我们知道,当一个源文件所依赖的头文件被修改时,这个源文件需要被重新编译(易碎的基类问题),为了能讲述我将说明的这个方法,我们先来看看一个简单的例子,其代码如下://head.hstruct A{ int i;};class B{ A* a;public: B(int n = 0); void show(); ~B();};//head.cpp#include "head.h"#include <iostream.h>B::B(int n){ a = new A; a->i = n;}void B::show(){ cout << a->i 阅读全文
posted @ 2012-02-28 13:30 很多不懂呀。。 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 代理类,这个类能让我们在一个容器中存储类型不同但相互关联的对象。创建代理将会复制所代理的对象,如果想避免这些复制该怎么办?通常参数和返回值是通过复制自动传递的,用引用传递参数可以避免这样的复制,但是这样对返回值来说不太容易(比如局部对象)。同样可以用指针来避免复制,但是使用指针有几个问题:(1)使用对象指针比直接使用对象要困难。(2)未初始化的指针非常危险,在c++实现中,只要对这样的指针实施复制操作就会出现问题。(3)无论何时,只要有几个指针指向同一个对象,就必须考虑在什么时候删除这个对象。为了能够在保持多态性的前提下避免复制对象,c++解决方法就是定义句柄类,将句柄类的对象绑定到它们所控制 阅读全文
posted @ 2012-02-28 11:33 很多不懂呀。。 阅读(450) 评论(0) 推荐(0) 编辑
摘要: 一、类的 static 数据成员1. 类的 static 数据成员必须在类外部进行初始化。 class Test { public: ... ... private: static int ival; }; int Test::ival=0; //必须初始化,否则编译出错!2. static 数据成员的类型可以是该成员所属的类类型。而非static数据成员被限定声明为其自身类对象的指针或引用。 class Test { public: ... ... private: static Test stobj; //正确。static数据成员stobj的类型可以为Test类型 Test *ptobj 阅读全文
posted @ 2012-02-28 11:22 很多不懂呀。。 阅读(356) 评论(0) 推荐(1) 编辑
摘要: 一、类的设计的几个问题1、数据成员变量私有化: 大多数public变量都是不安全的,我们无法保证使用者对它进行无意的篡改,对于一些成员变量,如果类外需要对其进行访问,可以通过两种方式对数据进行保护,一种是函数的调用,一种是引用的实现;如下代码所示:class A{public:int length;......}复制代码函数的方式实现对数据的保护:(注:类成员函数后面加const修饰,表明成员函数隐式传入的指针是const指针,因此不能对类数据成员进行修改;)?class A { public: int Getlength()const; private: int length; ...... 阅读全文
posted @ 2012-02-28 09:56 很多不懂呀。。 阅读(354) 评论(0) 推荐(2) 编辑

导航