- 博客(8)
- 资源 (3)
- 收藏
- 关注
原创 条款20:宁以pass-by-reference-to-const替换pass-by-value
我们考虑以下class继承体系: class Person { public: Person(); virtual ~Person(); ... private: string name; string address; }; class Student : public Person { public: Student(); ~Student(); ... privat
2009-10-30 13:59:00 476
原创 条款17:以独立语句将newed对象置入智能指针
假设我们有一个函数用来揭示处理程序的优先权,另外一个函数用来在某动态分配所得的Widget上进行某些带有优先权的处理: int Priority(); void ProcessWidget(std::auto_ptr pw, int priority); 由于谨记“以对象管理资源”的智慧铭言,processWidget决定对其动态分配得来的Widget运用智能指针。 现在我们来调用这
2009-10-28 18:08:00 387
转载 __cdecl __stdcall __fastcall
1.如果函数func是__cdecl(默认调用方式),调用时情况如下 int main() ...{ //参数从右到左压栈 push 4 push 3 push 2 push 1 call func add esp 0x10 //调用者恢复堆栈指针esp,4个参数的大小是0x10(4x4) }
2009-10-25 23:18:00 387
原创 条款12:复制对象时勿忘其每一个成分
当我们编写一个copying函数,请确保(1)复制所有local成员变量,(2)调用所有base class内的适当的copying函数下面我们来看一个例子怎样来具体实现子类的copying函数void logCall(const string &funcNmae){ cout }class Customer{public: Customer(const string &strname) :
2009-10-23 17:51:00 420
原创 条款11:在operator= 中处理“自我赋值”
我们来看看下面一段代码,class Widget中自己实现了拷贝构造函数class Bitmap{};class Widget{public: Widget () { pb = new Bitmap; } Widget& operator=(const Widget &rhs);private: Bitmap *pb;};下面有三种方式对Widget& operator=(const
2009-10-23 17:49:00 731 1
原创 条款10:令operator= 返回一个reference to *this
以前没有太注意在重载类的赋值操作时,为什么总是返回一个类类型的引用。下面我们来看看这是为什么:class CExample{public: CExample (const string &str, int v) : m_str(str), m_val(v) { } void operator=(const CExample &rhs); CExample& operator+=(const
2009-10-22 18:34:00 477
原创 条款09:绝不在构造和析构过程中调用virtual函数
我们设计一个class继承体系来模拟交易如买进、卖出的订单,对于每一笔交易,我们会在审计日志中创建相应的记录,也许我们会这样设计该class体系class Transaction{public: Transaction(); virtual void logTransaction() const = 0;};Transaction::Transaction(){ cout logTran
2009-10-21 18:38:00 444
原创 条款06: 若不想使用编译器自动生成的函数,就该明确拒绝
如果我们不想使用编译器自动生成的函数,但是你自己又不想提供自己编写的这些编译器可以自动生成的函数给自己或别人使用,此时,你可以将自己编写的这些函数声明为private。我们有一个class HomeForSale,但是我们不希望别人使用HomeForSale中的copy 构造函数和copy assignment操作符,我们可以这样设计此类。class HomeForSale{public: H
2009-10-21 18:32:00 478
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人