摘要: 关于赋值,可以写成连锁形式:int x, y, z;x = y = z = 15; //赋值连锁形式赋值采用右结合律,故上述赋值被解析为:x = (y = (z = 15)); 为了实现连锁赋值,赋值操作符必须返回一个reference引用指向操作符的左侧实参。下面示例是为classes实现赋值操作符时应该遵循的协议:class Widget{public: ... Widget& operator=(const Widget& rhs) //返回类型是个reference,指向当前对象 { ... return *this; //返回左侧对象 } ...};这个协议不仅适用于 阅读全文
posted @ 2013-12-10 23:59 陌上归人 阅读(179) 评论(0) 推荐(0) 编辑
摘要: 不该在构造函数和析构函数期间调用virtual函数,这一点是C++与jave/C#不同的地方之一。假设有一个class继承体系,用来模拟股市交易如买进、卖出的订单等等。这样的交易一定要经过审计,所以每当创建一个交易对象,在审计日志中也需要创建一笔适当记录。正确的做法是在基类Transaction内将logTransaction函数改为non-virtual,然后要求派生类构造函数传递必要信息给基类Transaction的构造函数,这样那个构造函数便可安全地调用non-virtuallogTransaction。正确用法如下:class Transaction{public: Transacti 阅读全文
posted @ 2013-12-10 23:21 陌上归人 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 问题:如果一个类的析构函数必须执行一个动作,而该动作可能会在失败时抛出异常,该怎么办?举个例子,假设使用过一个class负责数据库连接:class DBConnection{public: ... static DBConnection create(); //此函数返回DBConnection对象 void close(); //关闭联机;失败则抛出异常};一个较佳策略是创建一个用来管理DBConnection资源的DBConn类,DBConn类自己提供一个close函数,因而赋予客户一个机会得益处理“因该操作而发生的异常”。DBConn也可以追踪其所管理的DBConnection是否已.. 阅读全文
posted @ 2013-12-10 22:12 陌上归人 阅读(371) 评论(0) 推荐(0) 编辑