摘要:
自我赋值发生在对象被赋值给自己: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所指的对象 阅读全文
摘要:
关于赋值,我们知道可以连续的进行赋值如: 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 阅读全文
摘要:
看下面一个类:class TimeKeeper{public : TimeKeeper(); ~TimeKeeper(); ....};class AtomicClock : public TimeKeeper{...};class WaterClock : public TimeKeeper{...};class WristClock : public TimeKeeper{...}; 当我们使用时,我们可以采用一个工厂方法,用基类的指针指向派生类的对象: TimeKeeper * getTimeKeeper();TimeKeeper * ptk = getTimeKeeper(); //用 阅读全文
摘要:
如果你是一个地产商,一个中介软件系统自然而然的想有一个class来描述一个房屋。Class HomeForSale{…};每一个地产商,都会说自己的房子是独一无二的,所以不允许别人复制或赋值。也就是说: HomeForSale h1; HomeForSale h2; HomeForSale h3(h1); // 企图拷贝h1,不应该通过编译 H1 = h2; //企图赋值h1,不应该通过编译这时我们要如何去做呢? 如果我们不定义copy 构造函数或赋值构造函数,则编译器会为我们生成。那么这时我们要怎么办呢? 有一个办法,我们把copy 构造函数或赋值构造函数定义为私有的。 但是问题来了,虽然为 阅读全文
摘要:
读取未初始化的值会造成不明确的行为。对于内置类型来说,我们必须手工完成初始化。对于类类型来说,这个责任由构造函数来承担,所以构造函数要确保所有的数据成员有被初始化。例如下面这个构造函数:ABEntity::ABEntity(const std::string& name, const std::string& address, const std::list<PhoneNumber>& phones) { theName = name; theAddress = address; thePhones = phones; }注意这是我们新手比较容易犯的一个错误 阅读全文
摘要:
什么时候一个空类,不再是空类了呢?当c++编译器处理之后。如果没有定义,编译器会为你产生四个函数:1) 默认构造函数2) Copy构造函数3) 赋值构造函数4) 析构函数注意这些函数都是public且是inline的。这里还有一点要说明的:不是说编译器一定会为你产生这些函数,而是说,当这些函数被调用时,它们才会被编译器创建出来。下面主要谈一谈赋值构造函数:举一个例子: template<class T>class NamedObject{ public: NamedObject(std::string& name, const T& value); ... priv 阅读全文
摘要:
我们经常用define做什么?1) 定义一个常量2) 定义一个宏为什么说尽量不用define。那么以这两个方面来解释:1) 当我们定义一个常量时,我们可以用以下方式:#define ASPECT_PATIO 1.653我们知道编译器并没有看到ASPECT_PATIO符号(为什么?复习程序的预编译,编译,链接,运行)。于是这个记号ASPECT_PATIO并没有进行编译器的记号表内。恰巧如果我们获得了一个编译时期的错误,这个错误信息中会提到1.653而不是ASPECT_PATIO。这时,你会感到不解。如果这个符号ASPECT_PATIO并没有定义在此文件内,则你就可能一头雾水。引起这两种情况的原因 阅读全文