今天遇到的问题是构造函数的初始化列表需要和数据成员声明的顺序保持一致才可以,不然会有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:
所以简单的方法就是根据类内数据成员的声明顺序进行初始化列表的排序。另外,派生类的初始化列表中基类的数据成员初始化应当放在派生类的前面。