首页 > 代码库 > C++盲点
C++盲点
const
const指针
1 char greeting[] ="hello"; 2 char* p = greeting; // non-const pointer, non-const data3 const char* p = greeting; // non-const pointer, const data4 char* const p = greeting; // const pointer, non-const data5 const char* const p = greeting; //const pointer, const data
1 void f1(const Object* o); 2 void f2(Object const* o);
这两个是一样的;
const vector<int>::iterator更像是T* const;
vector<int>::const_iterator更像是const T*;
enum不能取地址,const可以取地址,define没有任何约束;
const函数是为了可以操作const对象;
1 class Test { 2 public: 3 void print() const {} 4 void mut() const { m1 = 1; } 5 private: 6 mutable int m1; // can be changed even in const functions 7 }; 8 const Test t; 9 t.print(); 10 t. mut(); //legal
const版本和非const版本的代码重用。实现const函数,在non-const函数中调用const版本。
1 class Test {2 public:3 const int& operator[](int i) const {...} 4 int& operator[](int i) {5 const_cast<int&>(static_cast<const Test&>(*this)[i]);6 }7 };
singleton的初始化实现
local static 能够确保在调用时已经初始化。但是仍然不能确保线程安全。所有non-const的static对象,无论它是local还是non-local,在多线程环境下都会有问题。解决的方法就是在一开始的单线程环境下,手动调用这些函数实现初始化。这样可以避免与初始化有关的race conditions。
1 class Test {2 public:3 Test& test() {4 static Test t;5 return t;6 } 7 };
virtual
多态的析构函数,设成virtual,这样在delete的时候才会释放子类的所有资源。
1 class Parent {2 public:3 virtual ~Parent() {...} 4 };5 class Child1: public Parent {};6 Parent* p = new Child1;7 delete p;
多态的析构函数必须是virtual。
在析构函数里,尽量不要调用会发生异常的操作。如果有,也要提供额外的接口,让用户有机会自己调用处理。
不要在构造函数或析构函数里调用virtual 函数。此时调用virtual函数,调用的是base类的版本。
线程安全;
C++盲点
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。