ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C++(21)——特殊类设计

C++(21)——特殊类设计 1. 不能被拷贝的类实现方式1.私有化C98将拷贝构造函数与赋值运算符重载只声明不定义并且将其访问权限设置为私有即可原理1. 只声明不定义防止类内部不小心调用2. 设置成私有外部不能访问私有成员因此无法拷贝缺点1. 如果类里面的成员函数调用了拷贝编译不会报错链接阶段报错2. 可读性差2.删除函数C11将拷贝构造函数与赋值运算符重载后面加上 delete原理1. 在默认成员函数后写上 delete 表示该禁止生成该默认成员函数2. 只能在堆上创建对象的类实现方式1. 构造函数私有化首先将类的构造、拷贝构造声明为私有类内部提供一个静态的成员函数用来完成堆对象的创建原理将构造函数私有化外部无法访问类内部的静态成员函数可以访问私有构造拷贝构造私有化防止栈上通过调用拷贝构造来创建对象2. 析构函数私有化备选将类的析构函数声明为私有类内部提供一个静态的成员函数用来完成堆对象的释放原理栈对象出作用域时编译器自动调用析构函数将析构私有外部无法访问编译器预判栈对象无法销毁直接禁止创建栈对象缺点可以生成匿名临时对象有漏洞、会报错3. 只能在栈上创建对象的类实现方法在类里面把类专属的 operator new 用 delete 删除原理new的底层有两步1. 调用全局的 operator new(size_t) 函数在堆上开辟一块内存 2. 编译器调用构造函数初始化这块内存。当new该类对象时编译器优先找类内的 operator new 该函数被删除编译失败无法开辟。缺点不能阻止定位new定位new不会调用 operator new 只调用构造4. 不能被继承的类实现方法类名后加上 final 关键字原理加上 final 表示该类不能被继承5. 只能创建一个对象的类——单例模式单例模式一个类只能创建一个对象保证系统中该类只有一个实例并提供一个访问它的全局访问点该实例被所有程序模块共享核心要点1.构造函数私有化2.类内部保存唯一静态对象/指针3. 提供一个public静态成员函数GetInstances()用来拿取该唯一对象4.禁止拷贝防止拷贝出新对象实现方法1. 饿汉模式类外初始化静态对象程序启动时就创建好唯一对象原理无论什么时候调用 GetInstances()对象都已经存在class Singleton { private: //构造私有外部不能创建 Singleton(){} //唯一对象静态成员 static Singleton _inst; public: //获取实例 static Singleton GetInstance() { return _inst; } //禁止拷贝防止复制出新对象 Singleton(const Singleton) delete; Singleton operator(const Singleton) delete; }; //类外初始化静态对象main运行前就创建完成 Singleton Singleton::_inst; int main() { Singleton s1 Singleton::GetInstance(); Singleton s2 Singleton::GetInstance(); // s1 和 s2 是同一个对象 return 0; }优点线程安全多线程场景不会创建多个对象代码简单缺点程序一开始就占用内存可能会导致进程启动慢多个单例类对象实例启动顺序不确定不能控制初始化时机2. 懒汉模式类外指针初始化为空第一次调用 GetInstances() 时才new对象原理第一次访问时判断为空new出对象之后每次直接返回已存在的对象class Singleton { private: Singleton(){} //初始为空不创建对象 static Singleton* _pinst; public: static Singleton GetInstance() { if (_pinst nullptr) { _pinst new Singleton; } return *_pinst; } Singleton(const Singleton) delete; Singleton operator(const Singleton) delete; }; //静态指针初始化为空 Singleton* Singleton::_pinst nullptr; int main() { Singleton s Singleton::GetInstance(); return 0; }优点需要时才创建节省内存缺点多线程不安全代码较复杂
返回列表