今天遇到的問題是構造函數的初始化列表需要和數據成員聲明的順序保持一致才可以,不然會有warning或者意想不到的錯誤。以下是遇到問題的代碼:
1 //Quote.h 2 #ifndef QUOTE_H 3 #define QUOTE_H 4 5 #include <string> 6 7 class Quote 8 { 9 public: 10 Quote() = default; 11 Quote(const std::string& book, double sales_price) : 12 //price(sales_price), bookNo(book) { } 13 bookNo(book), price(sales_price) { } 14 15 const std::string& isbn() const { return bookNo; } 16 virtual double net_price(std::size_t n) const { return n*price; }//虛函數,子類實現 17 virtual ~Quote() = default;//對析構函數動態綁定 18 protected: 19 double price = 0.0;//普通狀態下不打折價格 20 private: 21 std::string bookNo;//書籍的ISBN編號 22 23 }; 24 25 #endif // QUOTE_H
如果按照第13行的那種初始化列表順序進行初始化的話,會出現如下的warning:
所以簡單的方法就是根據類內數據成員的聲明順序進行初始化列表的排序。另外,派生類的初始化列表中基類的數據成員初始化應當放在派生類的前面。