private 子private成员 子private成员 -
1、public:只继承基类的接口。当继承是接口的一部分时,就选用public继承。
2、private:只继承基类的实现。当继承是实现细节时,就选用private继承。
3、protected:当继承是面向派生类而不是面向用户接口中的一部分时,就选用protected继承。
private意味着”根据某物实现出“的语义。和复合拥有同样的语义。
10、如何实现单例模式?如何避免发生对象的用户复制行为?如何实现线程安全的单例模式?DCLP是什么,有什
么问题?
答:
(1)、将构造函数、析构函数、复制构造函数、赋值操作符声明为私有,即可实现单例模式
单例模式实现代码通常为:
1. class Singleton
2. {
3. public:
4. static Singleton* Instance();
5. protected:
6. Singleton();
7. private:
8. static Singleton* _instance;
9. };
10. Singleton::Singleton(){}
11. Singleton* Singleton::_instance = nullptr;
12.
13. Singleton* Singleton::Instance()
14. {
15. if(_instance == nullptr)
16. _instance = new Singleton;
17. return _instance;
18. }
(2)、避免用户的复制行为,可以将复制构造函数声明为private或者使用C++11中的delete语法。
(3)、实现线程安全的单例模式:上面实现中的GetInstance()不是线程安全的,因为在单例的静态初始化中存在竞
争条件。如果碰巧有多个线程在同时调用该方法,那么就有可能被构造多次。
比较简单的做法是在存在竞争条件的地方加上互斥锁。这样做的代价是开销比较高。因为每次方法调用时都需
要加锁。
比较常用的做法是使用双重检查锁定模式(DCLP)。但是DCLP并不能保证在所有编译器和处理器内存模型下都
能正常工作。如,共享内存的对称多处理器通常突发式提交内存写操作,这会造成不同线程的写操作重新排序。这
种情况通常可以采用volatile解决,他能将读写操作同步到易变数据中,但这样在多线程环境下仍旧存在问题。
11、相等和等价的区别?哪些类型的容器使用相等或等价?
答: 相等(equality)是以operator==为基础,如果x==y为真,则判定x和y相等。
等价(equavalence)是以operator<为基础,如果!(x < y) && !(y < x)为真,则判定x和y等价。
通常,关联容器采用“等价”,而顺序容器采用“相等”。
12、如何实现仿函数?为什么需要通过继承自unary_function 或者 binary_function来实现仿函数?