1. 类和面向对象编程
2. 定义类
3. 构造函数
4. 访问私有成员
5. this指针
Box* Box::setLength(double lv) { if(lv > 0) length = lv; return this; } Box* Box::setWidth(double wv) { if(wv > 0) width = wv; return this; } Box* Box::setHeight(double hv) { if(hv > 0) height = hv; return this; } Box myBox {3.0, 4.0, 5.0}; myBox.setLength(-20.0)->setWidth(40.0)->setHeight(10..0);
6. const 对象和const成员函数
double Box::volume() const { return length * length * length; }
double &length() { return _length; } // 重载为 const double & length()const { return _length; } // 但是double是基础类型,一般按值进行传递 double length() const { return _length; } // 对象是否为const决定了哪个成员函数会被调用 // 错误情况,开头没有const。 // 因为const成员函数隐含的this指针是const,类成员的名称是对const引用,所以返回类型是const引用 double & length() const { return _length; }
7. 友元
8. 类的对象数组
9. 类的静态成员:
综述:
10. 析构函数
11. 使用指针作为类成员
12. 嵌套类
SharedBox findLargestBox(const Truckload& truckload) { SharedBox largestBox { truckolad.getFirstBox() }; SharedBox nextBox { truckload.getNextBox() }; while(nextBox) { if(nextBox->compare(*largestBox) > 0) largestBox = nextBox; nextBox = truckload.getNextBox(); } return latgestBox; } // 存在的问题:getFirstBox() 和 getNextBox()都在更新内部的指针pCurrent,即它们必须是非const成员,但实参是引用const值的实参。 // 解决方法一是mutable,但存在缺陷,并发问题,会对同一集合使用嵌套循环。每个遍历都需要一个pCurrent指针。 // 解决方法二是为遍历Truckload而设计和创建另一个对象。这种对象叫做“迭代器”
class Truckload { private: class Package { public: SharedBox pBox; Package* pNext; Package(SharedBox pb):pBox{pb}, pNext{nullptr} {} ~Package() { delete pNext; } }; Package* pHead {}; Package* pTail {}; public: class Iterator { private: Package* pHead; Package* pCurrent; friend class Truckload; explicit Iterator(Package* head) : pHead{head}, pCurrent{nullptr} {} public: SharedBox getFirstBox(); SharedBox getNextBox(); }; Iterator getIterator() const { return Iterator{phead}; } // other };
SharedBox findLargestBox(const Truckload& truckload) { auto iterator = truckload.getIterator(); SharedBox largestBox { iterator.getFirst(); }; SharedBox nextBox { iterator.getNextBox() }; while(nextBox) { if (nextBox->compare(*largestBox) > 0) largestBox = nextBox; nextBox = iterator.getNextBox(); } return largestBox; }