11/4/16-01:
如果你想禁止某些东西,就应该把完成它的操作定义为一个私用的成员函数。(the design and evolution of cpp)
如1)只要将析构函数声明为私用就可以避免堆栈和全局分配,这样做还能防止随便使用delete:
class sample{ ~sample(); // private destructor public: static void free(sample* p) { delete p; } }; sample global; // error: private destructor void f() { sample loc; // error sample* p = new sample; // fine ... delete p; // error sample::free(p); // fine }
2)声明一个不大寻常的operator new(), 只允许全局和堆栈变量,禁止自由空间分配;
class sample{ class Dummy {}; void* operator new(size_t, Dummy); }; sample glob; //fine void g() { sample loc; //fine sample* p = new sample; // error }
3) 对派生的控制, 一个比较tricky的方法
class Usable_lock { friend Usable; private: Usable_lock() {} } class Usable : public virtual Usable_lock { //... public: Usable(); Usable(char*); //... }; Usable a; class DD : public Usable {}; DD dd; // error: DD::DD() cannot access Usable_lock::Usable_lock(): private member
11/4/16-02: 操作符重载 prefix ++ and postfix ++
class Ptr_to_X { X& operator++(); // prefix X operator++(int); // postfix }
11/4/22 __FUNCTION__ Macro get the name of a function as a string