程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 《Effective C++》讀書筆記04:確保對象在使用之前被初始化

《Effective C++》讀書筆記04:確保對象在使用之前被初始化

編輯:關於C++

我自己在寫代碼的時候也經常會遇到忘記初始化某對象的問題,而且這些錯誤比較難 以調試,Meyers提出了一些避免這些錯誤的解決方法:

1.手工初始化所以內置類 型:

這一條很好理解,對於int,enum等內置類型,在使用前一定要初始化。

2.對於類類型等用戶自定義的對象,使用成員初值列初始化所有的對象:

1 using namespace std;
2
3 class PhoneNumber{};
4 class Customer
5 {
6 public:
7    Customer(const  string& name, const string& address,
8              const PhoneNumber& phone);
9 private:
10    string  theName;
11    string theAddress;
12    PhoneNumber  thePhone;
13    int usedTimes;
14 }

對於Customer 類的構造函數定義,一般我們會這麼寫:

1 Customer::Customer(const  string& name, const string& address, const PhoneNumber&  phone)
2 {
3   theName = name; //這些都是賦值
4    theAddress = address; //而不是初始化
5   thePhone = phone;
6    usedTimes = 0;
7 }

可是,在c++中,對不是內置型的對 象的初始化都發生在進入構造函數之前,也就是說,在進行theName = name;賦值之前, theName就已經進行了初始化了,這個過程調用自己的默認構造函數。

緊接著有立 刻進行了賦值操作,這樣會造成額外的浪費,所以我們可以這樣寫構造函數:

1 Customer::Customer(const string& name, const  string& address, const PhoneNumber& phone)
2   :theName (name),//成員初始化列
3    theAddress(address),
4     thePhone(phone),
5    usedTimes(0)//內置類型也一並初始化
6 {
7 }

使用了成員初始化列的方法,在進入構造函數體之前就進行了初始 化,減少了賦值的開銷,同時為了保持一致性,將內置類型也一並進行了初始化。

還有一點要記住:在成員初始化列中對變量的初始化次序是按照變量聲明的次序 的,也就是說,即使將上面的次序任意改變,也改變不了初始化次序,所以我們要盡可能 地按照使用的順序來聲明變量!

3.在多個編譯單元內的non-local static對象的 初始化次序問題:

non-local static對象表示在程序執行過程中一直存在的對象 ,像類中聲明的static變量,全局變量,而在普通函數中聲明的static變量稱為local static變量。

那麼當有多個不同的編譯單元(即存在於不同的文件中)時,對這 些non-local static對象的初始化次序,在c++中,是不確定的,而且也沒法確定!

當兩個或多個文件中的non-local static對象發生關聯時,問題就出現了。

解決方法就是使用了設計模式中的:Singleton單件模式,將對non-local static 的訪問移到函數中,將其轉變為local static變量,確保其被初始化了再使用。

如果是多個non-local static對象互相之間都有關聯,那。。對不起,是設計出了問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved