1. 程式人生 > >《Effective C++》讓自己習慣C++:條款26-條款31

《Effective C++》讓自己習慣C++:條款26-條款31

ble names 返回 調用構造 lin virt 時間 inter ESS

條款26:盡可能延後變量定義式的出現時間

  • C++推薦在使用對象前才定義對象(調用構造函數賦初值)
  • 只在循環中使用的變量定義在循環內部(除非"賦值"成本低於"構造+析構"成本)

條款27:盡量少做轉型動作

  • 舊式風格轉型
    • C風格轉型 \((T)expression\)
    • 函數風格轉型 \(T(expression)\)
  • C++四種新式轉型(new-style 或 C++-style cases)
    • const_cast
    • dynamic_cast
    • reinterpret_cast
    • static_cast
  • 盡量避免轉型(特別是dynamic_cast)
#include <iostream>
#include <string>
#include <memory>

using namespace std;

class base {
public:
    virtual void type() {cout << "base" << endl;}
};

class drive : public base {
public:
    drive( double d) : dou(d) {}
    virtual void type() {cout << "drive" << endl;}

    void show() {
        cout << dou << endl;
    }

private:
    double dou;
};

int main() {
    shared_ptr<base> b = shared_ptr<base>(new drive(1.2));
    shared_ptr<drive> d = dynamic_pointer_cast<drive>(b);
    d->show();
}

///寫成

#include <iostream>
#include <string>
#include <memory>

using namespace std;

class base {
public:
    virtual void type() {cout << "base" << endl;}
    virtual void show() {}
};

class drive : public base {
public:
    drive( double d) : dou(d) {}
    virtual void type() {cout << "drive" << endl;}

    virtual void show() {
        cout << dou << endl;
    }

private:
    double dou;
};

int main() {
    shared_ptr<base> b = shared_ptr<base>(new drive(1.2));
    b->show();
}
  • 使用C++新式轉型,而非使用舊式轉型

條款28:避免返回handles指向對象內部成分

條款29:為“異常安全”而努力是值得的

條款30:透徹了解inlining的裏裏外外

條款31:將文件間的編譯依存關系降至最低

《Effective C++》讓自己習慣C++:條款26-條款31