上一页 1 2 3 4 5 6 7 ··· 11 下一页
摘要: 自我赋值发生在对象被赋值给自己:class Widget {...}Widget w ;…w = w // 赋值给自己还有一个隐含的会发生自我赋值的例子: a[i] = a[j];//当i = j时下面有这样一个类:class Bitmap{};class Widget { ...private : Bitmap *pb;};l 版本一Widget& Widget::operator= (const Widget& rhs){ delete pb; pb = new Bitmap(*rhs.pb); return *this;}注意:这里存在一个问题,那就是如果rhs所指的对象 阅读全文
posted @ 2012-11-15 22:31 loveyakamoz 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 关于赋值,我们知道可以连续的进行赋值如: int x, y, z; x = y = z = 12;为了实现连锁的赋值,赋值操作符必须返回一个reference指向操作符的左侧实参,这是你要为class实现赋值操作符时,应该遵循的协议:class Widget {public : ... Widget& operator= (const Widget& rhs){ ... return *this; }}这个协议不仅适用于以上的标准赋值形式,也适用于所有的赋值相关运算,例如:class Widget {public : ... Widget& operator= (con 阅读全文
posted @ 2012-11-15 22:30 loveyakamoz 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 看下面一个类:class TimeKeeper{public : TimeKeeper(); ~TimeKeeper(); ....};class AtomicClock : public TimeKeeper{...};class WaterClock : public TimeKeeper{...};class WristClock : public TimeKeeper{...}; 当我们使用时,我们可以采用一个工厂方法,用基类的指针指向派生类的对象: TimeKeeper * getTimeKeeper();TimeKeeper * ptk = getTimeKeeper(); //用 阅读全文
posted @ 2012-11-15 22:29 loveyakamoz 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 如果你是一个地产商,一个中介软件系统自然而然的想有一个class来描述一个房屋。Class HomeForSale{…};每一个地产商,都会说自己的房子是独一无二的,所以不允许别人复制或赋值。也就是说: HomeForSale h1; HomeForSale h2; HomeForSale h3(h1); // 企图拷贝h1,不应该通过编译 H1 = h2; //企图赋值h1,不应该通过编译这时我们要如何去做呢? 如果我们不定义copy 构造函数或赋值构造函数,则编译器会为我们生成。那么这时我们要怎么办呢? 有一个办法,我们把copy 构造函数或赋值构造函数定义为私有的。 但是问题来了,虽然为 阅读全文
posted @ 2012-11-15 22:28 loveyakamoz 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 读取未初始化的值会造成不明确的行为。对于内置类型来说,我们必须手工完成初始化。对于类类型来说,这个责任由构造函数来承担,所以构造函数要确保所有的数据成员有被初始化。例如下面这个构造函数:ABEntity::ABEntity(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones) { theName = name; theAddress = address; thePhones = phones; }注意这是我们新手比较容易犯的一个错误 阅读全文
posted @ 2012-11-15 22:27 loveyakamoz 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 什么时候一个空类,不再是空类了呢?当c++编译器处理之后。如果没有定义,编译器会为你产生四个函数:1) 默认构造函数2) Copy构造函数3) 赋值构造函数4) 析构函数注意这些函数都是public且是inline的。这里还有一点要说明的:不是说编译器一定会为你产生这些函数,而是说,当这些函数被调用时,它们才会被编译器创建出来。下面主要谈一谈赋值构造函数:举一个例子: template<class T>class NamedObject{ public: NamedObject(std::string& name, const T& value); ... priv 阅读全文
posted @ 2012-11-15 22:27 loveyakamoz 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 我们经常用define做什么?1) 定义一个常量2) 定义一个宏为什么说尽量不用define。那么以这两个方面来解释:1) 当我们定义一个常量时,我们可以用以下方式:#define ASPECT_PATIO 1.653我们知道编译器并没有看到ASPECT_PATIO符号(为什么?复习程序的预编译,编译,链接,运行)。于是这个记号ASPECT_PATIO并没有进行编译器的记号表内。恰巧如果我们获得了一个编译时期的错误,这个错误信息中会提到1.653而不是ASPECT_PATIO。这时,你会感到不解。如果这个符号ASPECT_PATIO并没有定义在此文件内,则你就可能一头雾水。引起这两种情况的原因 阅读全文
posted @ 2012-11-15 22:26 loveyakamoz 阅读(585) 评论(0) 推荐(0) 编辑
摘要: 计算机操作系统之存储器管理程序运行将用户的一个源程序变成一个可在内存中执行的程序,通常要经过以下几个步骤:l 编译:由编译程序,将程序编译成若干个目标模块l 链接:由链接程序将编译后形成的一组目标模块,以及他们所需要的库函数链接在一起,形成一个完整的装入模块。l 装入:由装入程序将装入模块装入内存具体讨论一下如何把一个装入模块,装入内存:l 绝对装入方式:编译程序产生带有绝对地址的目标代码,只适合于单道程序环境。l 可重定位装入方式:所得到的模块都是以0开始的,程序中的其它地址也都是相对于起始地址计算的,此时可重写位装入方式,根据内存的情况,将装入模块装入到内存的适当位置。通常把在装入时对目标 阅读全文
posted @ 2012-11-14 23:55 loveyakamoz 阅读(3053) 评论(0) 推荐(0) 编辑
摘要: 死锁的原因和必要条件什么是死锁所谓死锁:是指多个进程在运行过程中因争夺资源而造成的一种僵局。产生死锁的原因l 竞争资源:当系统中多个进程使用共享资源,并且资源不足以满足需要,会引起进程对资源的竞争而产生死锁。l 进程间推进的顺序非法:请求和释放资源的顺序不当,也同样会导致产生进程死锁产生死锁的必要条件互斥条件:进程对所分配到的资源进行排它性使用,在一段时间内某资源只由一个进程占用。请求和保持条件:指一个进程已经保持了至少一个资源,但又提出新的资源请求,而此资源被其他占用,此时请求进程阻塞,但又对自己已经占用的资源保持不放。不剥夺条件:进程已经获得资源,在未使用完之前,不能被剥夺,只能在使用完时 阅读全文
posted @ 2012-11-14 23:50 loveyakamoz 阅读(6504) 评论(0) 推荐(0) 编辑
摘要: 计算机操作系统之进程与线程进程通信方式l 低级方式n 信号量n 管程l 高级方式n 共享存储器系统n 消息传递系统n 管道通信线程通信方式l 互斥锁l 条件变量l 计数信号量l 多读,单写锁进程线程的区别进程是系统分配资源的单位,每一个进程对应与一个活动的程序,当进程激活时,操作系统就将系统的资源包括内存、I/O和CPU等分配给它,使它执行。线程是CPU分配时间的单位,每一个线程对应于它在进程中的一个函数,也就是内存中的代码段,多个线程执行时CPU会根据它们的优先级分配时间,使它们完成自己的功能。一般来说,进程中至少一个线程,一个主线程和其他线程组成一个进程。多个线程的目的在于... 阅读全文
posted @ 2012-11-14 23:49 loveyakamoz 阅读(4324) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 ··· 11 下一页