《Effective C++》讓自己習慣C++:條款26-條款31
阿新 • • 發佈:2018-12-28
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