上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页
摘要: 当你使用new,有两件事情发生。 第一,内存被分配出来(通过名为operator new的函数)。 第二,针对此内存会有一个(或多个)构造函数被调用。当你使用delete,也有两件事情发生:针对此内存会有一个或多个析构函数被调用,然后内存被释放。 数组所用的内存通常还包括”数组大小”的记录,以便delete知道调用多少次析构函数。 当你调用new时使用[],你必须在对应... 阅读全文
posted @ 2012-01-15 16:43 lidan 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 资源管理类避免直接处理资源,但是许多APIs直接涉及资源,所以应该提供返回原始资源的函数。 tr1::shared_ptr和auto_ptr都提供一个get成员函数,用来执行显式转换,返回智能指针内部的原始指针(的复件)。 std::tr1::shared_ptr<Investment> pInv(createInvestment()); int daysHeld(const ... 阅读全文
posted @ 2012-01-14 22:49 lidan 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 并非所有的资源都是heap-based,对那种资源来讲,auto_ptr和shared_ptr这样的智能指针往往不适合作为资源掌管着。你可能需要 自己建立自己的资源管理类。 例如,处理类型为Mutex的互斥器对象,有lock和unlock两函数可用。 void lock(Mutex* pm); void unlock(Mutex* pm); class Loc... 阅读全文
posted @ 2012-01-14 21:22 lidan 阅读(346) 评论(0) 推荐(0) 编辑
摘要: 资源是,一旦用了,将来必须还给系统,除了内存常见的还有文件描述符(file description)、互斥锁、图形界面中的笔刷、数据库连接 以及网络socket。考虑到异常、函数内多重回传路径、程序维护员软件改动却没有理解随之而来的冲击,发现资源管理的特殊手段还不很充分够用。 假设一个各式各样的投资类型继承的一个root class Investment: class Inve... 阅读全文
posted @ 2012-01-14 10:56 lidan 阅读(291) 评论(0) 推荐(0) 编辑
摘要: copy构造函数和copy assignment操作符,我们称他们为copying函数。这些“编译器生成版”的行为:将被烤对象的所有成员变量 都做一份拷贝。 声明自己的copying函数, void logCall(const std::string funcName); class Customer { public: Custo... 阅读全文
posted @ 2012-01-13 22:49 lidan 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 假设建立一个class来保存一个指针指向一块儿动态分配的位图(bitmap) class Bitmap{...}; class Widget { public: protected: private: Bitmap* pb; }; 这个operator=实现代码表面看上来合理, 但自我赋值出现时并不安全,也不... 阅读全文
posted @ 2012-01-13 21:34 lidan 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 赋值的连锁式 x=y=z=3;被解析成x=(y=(z=3));为了实现“连锁赋值”,赋值操作符必须返回一个reference指向操作符的左侧实参, 这是你为class实现赋值操作符时应该遵循的协议: class Widget { public: Widget& operator=(const Widget& rhs) //返回类型是referenc... 阅读全文
posted @ 2012-01-13 16:46 lidan 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 每当创建一个交易对象,在审计日志中也要创建一笔适当记录。下面是一个看起来比较合理的做法: class Transaction { public: Transaction() { init(); } virtual void logTransaction() const { std::cout << "tran... 阅读全文
posted @ 2012-01-13 15:53 lidan 阅读(591) 评论(0) 推荐(0) 编辑
摘要: c++并不禁止析构函数抛出异常,但它不鼓励这样做: class Widget{ public: … ~Widget(); //假设可能抛出异常 }; void doSomething() { std::vector<Widget> v; … } 当vector v被销毁,它有责任销毁其内含的所有W... 阅读全文
posted @ 2012-01-13 10:29 lidan 阅读(740) 评论(1) 推荐(0) 编辑
摘要: c++明确指出,当derived class对象由一个base class指针删除,而该base class带着一个non-virtual析构函数,其结果未有定义— 实际执行时,通常发生的是对象的derived成分没被销毁。会造成“局部销毁”对象。 而避免这个问题很简单:给base class一个virtual析构函数。 任何class只要带有virtual函数,都几乎确定应该有一个v... 阅读全文
posted @ 2012-01-12 19:27 lidan 阅读(308) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 14 下一页