jquery 网站后台模板 仿/手机自己怎么建电影网站

jquery 网站后台模板 仿,手机自己怎么建电影网站,网站建设和管理中 经验,域名是指什么目录 一、设计一个类不能被拷贝 (一)C98 (二)C11 二、设计一个类只能在堆上创建对象 (一)将构造函数私有化,对外提供接口 (二)将析构函数私有化 三、设计一个类只…

目录

一、设计一个类不能被拷贝

(一)C++98

(二)C++11

二、设计一个类只能在堆上创建对象

(一)将构造函数私有化,对外提供接口

(二)将析构函数私有化

三、设计一个类只能在栈上创建对象

四、设计一个类不能被继承

(一)C++98

(二)C++11

五、设计一个类只能创建一个对象(单例模式)

(一)饿汉模式

(二)懒汉模式

六、类型转换

(一)C语言类型转换

(二)C++新增四种强制类型转换

1、static_cast

2、reinterpret_cast

3、const_cast

4、dynamic_cast


一、设计一个类不能被拷贝

(一)C++98

class banCopy
{
private:banCopy(const banCopy& bc);banCopy& operator=(const banCopy& bc);
};

        通过将拷贝构造以及赋值重载私有化使得外部不能调用拷贝构造以及赋值重载。但是对于内部而言仍可以进行类的拷贝。

(二)C++11

class banCopy
{banCopy(const banCopy& bc) = delete;banCopy& operator=(const banCopy& bc) = delete;
};

        通过使用关键字直接删除相关函数。

二、设计一个类只能在堆上创建对象

(一)将构造函数私有化,对外提供接口

class heapOnly
{
public:static heapOnly* createObj(){return new heapOnly;}
private:heapOnly() {};heapOnly(const heapOnly& h) = delete;heapOnly& operator = (const heapOnly& h) = delete;
};

        首先将构造函数私有化,可以禁止在栈帧以及静态区创建对象,专门提供创建堆上对象的接口。同时也需要将接口设置为静态成员函数,使得无需对象也可以直接调用该接口。

heapOnly* ph = heapOnly::createObj();

        需要注意的是,也要将拷贝构造与赋值重载删除掉,如果不进行删除,仍然可以通过拷贝对象生成在栈帧或者静态区的对象。

//若不禁用拷贝函数,即可通过拷贝仍在栈帧上生成对象
heapOnly* ph = heapOnly::createObj();
heapOnly h(*ph);

(二)将析构函数私有化

class heapOnly
{
public:heapOnly() {  };void destoy(){this->~heapOnly();}
private:~heapOnly() {  };
};

        利用类与对象的特性:局部对象出作用域会自动调用析构函数释放资源的特性,将析构函数私有化使得在栈上或静态区上开辟的对象会因此导致编译错误,只能在堆上开辟对象。

        因为在堆上开辟的对象需要手动 delete 释放资源,而使用 delete 关键字仍然会调用析构函数(私有化)而导致编译报错,因此可以提供释放资源的接口来实现资源的释放。

三、设计一个类只能在栈上创建对象

class stackOnly
{public:static stackOnly createObj(){return stackOnly();}
private:stackOnly() {  }
};

        通过构造函数私有化并提供创建对象接口实现只在栈帧上开辟空间。因此使用 new 生成对象会自动调用构造函数,又因构造函数被私有化了因此使用 new 关键字生成对象会编译报错,故禁止了在堆上开辟空间。

        但上述方法并不能禁用从静态区生成对象,仍然可以通过拷贝在静态区生成对象

static stackOnly so = stackOnly::createObj();

        如果想彻底解决以上问题则需要禁用拷贝构造,但是如果禁用了拷贝构造,就不能从 createObj() 返回生成对象了,只能生成临时对象或是临时对象的引用,但是不能修改。

stackOnly::createObj();	//临时对象
const stackOnly& so = stackOnly::createObj();	//临时对象的引用

四、设计一个类不能被继承

(一)C++98

class finalClass
{
public:static finalClass CreateObj(){return finalClass();}
private:finalClass() {  }
};

        因为子类构造函数会自动调用父类构造函数完成对父类变量的初始化,通过将父类构造函数私有化,使得子类无法调用父类的构造函数,因此使得该类无法被继承。

(二)C++11

class FinalClass final
{
};

        C++11直接使用 final 关键字使得该类无法被继承。

五、设计一个类只能创建一个对象(单例模式)

(一)饿汉模式

class InfoSingleton
{
public://返回私有静态成员static InfoSingleton& GetInstance(){return _sins;}void insert(string name, int salary){_um[name] = salary;}void Print(){for (auto& e : _um){cout << e.first << ":" << e.second << endl;}cout << endl;}
private://构造函数私有化InfoSingleton(){}//删除拷贝构造以防新建对象InfoSingleton(const InfoSingleton& sins) = delete;InfoSingleton& operator=(const InfoSingleton& sins) = delete;//示例功能 无特殊含义unordered_map<string, int> _um;//定义静态类型成员static InfoSingleton _sins;
};InfoSingleton InfoSingleton::_sins;	//初始化静态变量int main()
{//下列代码可证明返回的是同一个对象InfoSingleton& sins1 = InfoSingleton::GetInstance();sins1.insert("张三", 15000);sins1.insert("李四", 20000);sins1.insert("王五", 10000);sins1.insert("赵六", 30000);sins1.Print();InfoSingleton& sins2 = InfoSingleton::GetInstance();sins2.insert("赵六", 20000);sins2.Print();return 0;
}

        以上是利用所有对象公用一个类静态成员的特性,通过私有构造函数以及删除拷贝函数给出静态类型成员变量的静态接口函数,使得该类只能通过该接口返回静态成员对象

        因为静态成员变量需要在类外进行初始化,而在初始化的同时会自动调用构造函数进行初始化。因此该静态成员对象的初始化,也就是调用构造函数会在main函数之前。

InfoSingleton InfoSingleton::_sins;	//初始化静态变量

        饿汉模式的特点:

        1、 单例对象初始化时,数据太多会导致启动慢;

        2、如果多个单例类有初始化的依赖关系,饿汉模式无法控制。例如A和B都是单例类,因为B的启动依赖A,所以需要先初始化A,再初始化B,但是饿汉模式无法控制对象的初始化顺序;

        3、饿汉模式创建的对象不会有线程安全问题,因为该模式的对象在main函数之前已经被创建好了,而mian函数之前线程都没启动。

(二)懒汉模式

class InfoSingleton
{public://返回私有静态成员static InfoSingleton& GetInstance(){if (_sins == nullptr){_sins = new InfoSingleton;}return *_sins;}void insert(string name, int salary){_um[name] = salary;}void Print(){for (auto& e : _um){cout << e.first << ":" << e.second << endl;}cout << endl;} 
private://构造函数私有化InfoSingleton(){}//删除拷贝构造以防新建对象InfoSingleton(const InfoSingleton& sins) = delete;InfoSingleton& operator=(const InfoSingleton& sins) = delete;//示例功能 无特殊含义unordered_map<string, int> _um;//定义静态类型成员static InfoSingleton* _sins;
};
InfoSingleton* InfoSingleton::_sins = nullptr; //初始化静态变量int main()
{//下列代码可证明返回的是同一个对象InfoSingleton& sins1 = InfoSingleton::GetInstance();sins1.insert("张三", 15000);sins1.insert("李四", 20000);sins1.insert("王五", 10000);sins1.insert("赵六", 30000);sins1.Print();InfoSingleton& sins2 = InfoSingleton::GetInstance();sins2.insert("赵六", 20000);sins2.Print();return 0;
}

        同样的,私有构造函数以及删除拷贝函数并提供生成对象接口都是为了单例模式做准备,与饿汉模式类同。        

        与饿汉模式不同的是,懒汉模式封装的是静态对象指针,也就是在 createObj() 函数第一次进入时会在堆区新建一个对象,而之后的进入则是返回该对象,以此实现只能生成一个对象。

        但是以上的代码存在线程安全问题,多个线程进入 createObj() 函数可能会导致多个线程都会在堆上新建对象导致内存泄漏,因此需要对以上接口进行修改。

class InfoSingleton
{public://返回私有静态成员static InfoSingleton& GetInstance(){if (_sins == nullptr){_mutex.lock();if (_sins == nullptr){_sins = new InfoSingleton;}_mutex.unlock();}return *_sins;} 
private:static mutex _mutex;
};

        将 _sins 的检查以及赋值进行加锁保护,这里进行了两层 if 进行条件判断。

        如果只有内部一层 if 判断,会导致每个线程进入该函数都会先加锁,进行判断操作后再解决,降低了系统性能。

        在外层再加一个 if 判断,当第一个线程进入时正常加锁判断操作,但是当之后的线程进入以后,再遇到第一个 if 判断后因为此时 _sins 不为空而无需进行加锁判断了,直接返回 _sins 即可,提高了性能效率。

        懒汉模式的特点:

        1、对象在main函数之后才会创建

        2、可以主动控制对象的创建时机。

        3、创建对象时存在线程安全问题,因此需要用户进行保护控制。

六、类型转换

(一)C语言类型转换

        在C语言中,如果赋值运算符两边类型不同,或是函数形参实参类型不同,或是函数返回值和接收值类型不同时等情况都会发生类型转换。C语言中共有两种形式的类型转换:显式类型转换或是隐式类型转换。

int main()
{int a = 0;//隐式类型转换double b = a;int* pa = &a;//显示类型转换int c = (int)pa;return 0;
}

        C语言的类型转换可能会存在一些问题,例如精度丢失或是隐式转换可能带来一些隐藏的bug等,因此C++提出了新的类型转换方式。

(二)C++新增四种强制类型转换

1、static_cast

        static_cast 常用于非多态类型的转换,在C语言中能隐式转换的都可以使用 static_cast 进行转换,其主要用于相近类型转换

int main()
{double a = 1.1;int b = static_cast<int>(a);std::cout << b << std::endl;return 0;
}

2、reinterpret_cast

        reinterpret_cast 用于将一种类型转换为另一种不同的类型,常用于不相关类型的转换

int main()
{int a = 1;int* pa = &a;//这里如果使用 static_cast 会编译报错int b = reinterpret_cast<int>(pa);std::cout << b << std::endl;return 0;
}

3、const_cast

        const_cast 用于对具有 const 属性的变量进行转换,常用于删除变量的const属性,方便赋值

int main()
{//volatile const int a = 1;const int a = 1;int* b  = const_cast<int*>(&a);++(*b);std::cout << a << std::endl << *b << std::endl;return 0;
}

        以上代码运行结果为 1 2,使用const_cast 取消了变量 a 的常量属性,但指针 b 仍然指向变量 a 在内存中的位置,因此可以通过指针 b 修改内存中 a 的值。

        对于最后的运行结果在不同平台下的运行结果可能不同,因为编译器对 const 变量会有优化,认为 const 变量在运行中不会改变,因此将 const 变量存入寄存器或告诉缓存中,方便访问读取。而通过指针 b 修改的值实际是修改了于内存中的值,因此打印结果不同。

        可以使用 volatile 关键字保持内存可见性,编译器将取消以上优化仍从内存读取 const 变量,因此加入关键字后打印输出的值相同。

4、dynamic_cast

        以上三种类型转换实际在C语言中已经存在,只是将其更加规范化。

        dynamic_cast 用于将一个父类的指针或引用转换为子类对象的指针或引用。

        向上转型:子类对象指针或引用 -> 父类对象指针或引用 (无需进行转换,发生切片)

        向下转型:父类对象指针或引用 -> 子类对象指针或引用 (使用 dynamic_cast 进行类型转换)

        需要注意的是:dynamic_cast 只能用于父类含有虚函数的类,如果转换失败会返回0。

class A
{
public:virtual void func() { }
};
class B : public A
{
};
void function(A* pa)
{B* pb1 = static_cast<B*>(pa);B* pb2 = dynamic_cast<B*>(pa);std::cout << "pb1:" << pb1 << std::endl;std::cout << "pb2:" << pb2 << std::endl;
}
int main()
{A a;B b;function(&a);function(&b);return 0;
}

        以下是上述代码的运行结果,我们来简要分析以下:

        实际上 function() 函数是一个多态调用。如果传入的是类型为 B 的对象,无论是 static_cast 还是 dynamic_cast 转换都可以成功,因为函数参数指针 pa 本身指向的就是类型为 B 的对象,因此可以正常使用转换后的指针。

        但是当传入的是类型为 A 的对象, 我们可以从图可知, static_cast 转换成功了但是 dynamic_cast 转换失败指向为0,而指向为0这也符合 dynamic_cast 的特性。虽然 static_cast 转换成功了,但是在使用该转换后的指针存在着极大的风险会造成未定义行为。

        在以上场景中,相较于 static_cast, dynamic_cast 相当于多了一层检查,如果不能确保能够安全转换,那不建议使用 static_cast 进行强制类型转换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系

今天刚好看到官方发布了一篇文章&#xff0c;用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别&#xff0c;突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”&#xff0c;刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…

TRTC实时对话式AI解决方案,助力人机语音交互极致体验

近年来&#xff0c;AI热度持续攀升&#xff0c;无论是融资规模还是用户热度都大幅增长。2023 年&#xff0c;中国 AI 行业融资规模达2631亿人民币&#xff0c;较2022年上升51%&#xff1b;2024年第二季度&#xff0c;全球 AI 初创企业融资规模为 240 亿美金&#xff0c;较第一季…

Android多语言开发自动化生成工具

在做 Android 开发的过程中&#xff0c;经常会遇到多语言开发的场景&#xff0c;尤其在车载项目中&#xff0c;多语言开发更为常见。对应多语言开发&#xff0c;通常都是在中文版本的基础上开发其他国家语言&#xff0c;这里我们会拿到中-外语言对照表&#xff0c;这里的工作难…

最新最详细的配置Node.js环境教程

配置Node.js环境 一、前言 &#xff08;一&#xff09;为什么要配置Node.js&#xff1f;&#xff08;二&#xff09;NPM生态是什么&#xff08;三&#xff09;Node和NPM的区别 二、如何配置Node.js环境 第一步、安装环境第二步、安装步骤第三步、验证安装第四步、修改全局模块…

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…

WPF基础 | WPF 基础概念全解析:布局、控件与事件

WPF基础 | WPF 基础概念全解析&#xff1a;布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…

2K高刷电竞显示器推荐

2K高刷电竞显示器推荐&#xff0c;各位喜欢打游戏&#xff0c;身为电竞迷的小伙伴&#xff0c;如果你想选一款2K高刷电竞显示器&#xff0c;那么下面的内容不容错过。 1.HKC G27H4Pro - 2K高刷电竞显示器推荐 外观 - HKC G27H4Pro 2K高刷电竞显示器 初见 HKC G27H4Pro&#x…

【29】Word:李楠-学术期刊❗

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

随机矩阵投影长度保持引理及其证明

原论文中的引理 2 \textbf{2} 2 1. \textbf{1. } 1. 引理 1 \textbf{1} 1(前提之一) 1.1. \textbf{1.1. } 1.1. 引理 1 \textbf{1} 1的内容 &#x1f449;前提&#xff1a; X ∼ N ( 0 , σ ) X\sim{}N(0,\sigma) X∼N(0,σ)即 f ( x ) 1 2 π σ e – x 2 2 σ 2 f(x)\text{}…

C语言-构造数据类型

1、构造数据类型 结构体、共用体、枚举。 2、结构体 1、结构体的定义 结构体是一个自定义的复合数据类型&#xff0c;它允许将不同类型的数据组合在一起。 struct 结构体名 {数据类型1 成员变量1;数据类型2 成员变量2;数据类型3 成员变量3;数据类型4 成员变量4; } 2、结构体变…

CLOUDFLARE代理请求重定向你太多次

现象 使用CLOUDFLARE代理前请求正常&#xff0c;使用CLOUDFLARE代理请求后出现 原因分析 以下是我的猜测&#xff0c;在默认情况下 CLOUDFLARE代理&#xff0c;可能是直接请求我们服务器的IP&#xff0c;比如&#xff1a;http://1.1.1.1 而不是通过域名的方式&#xff08;如…

vue router路由复用及刷新问题研究

路由复用问题 当路由匹配路径未发生变化时&#xff0c;只是相关的参数发生了变化&#xff0c;路由跳转时&#xff0c;会发现虽然地址栏中的地址更新到了新的链接&#xff0c;但是页面渲染并未触发响应路由组件的created,mounted等钩子函数&#xff0c;也就意味着组件并没有被重…

Android各个版本存储权限适配

一、Android6.0-9.0 1、动态权限申请&#xff1a; private static String[] arrPermissions {android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE,android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.…

房租管理系统的智能化应用助推租赁行业高效运营与决策优化

内容概要 在现代租赁行业中&#xff0c;房租管理系统的智能化应用正在逐步成为一个不可或缺的工具。通过整合最新技术&#xff0c;这些系统为租赁管理的各个方面提供了极大的便利和效率提升。从房源管理到合同签署再到财务监控&#xff0c;智能化功能能够帮助运营者在繁琐的事…

数据结构初阶之队列的介绍与队列的实现

一、概念与结构 概念&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO (First In First Out) 的特点。 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为…

GTO 门级可关断晶闸管,全控性器件

介绍 门级可关断晶闸管是一种通过门极来控制器件导通和关断的电力半导体器件。 结构特点 - 四层半导体结构&#xff1a;与普通晶闸管相似&#xff0c;GTO也是由PNPN四层半导体构成&#xff0c;外部引出三个电极&#xff0c;分别是阳极&#xff08;A&#xff09;、阴极&#x…

FlinkSql使用中rank/dense_rank函数报错空指针

问题描述 在flink1.16(甚至以前的版本)中&#xff0c;使用rank()或者dense_rank()进行排序时&#xff0c;某些场景会导致报错空指针NPE(NullPointerError) 报错内容如下 该报错没有行号/错误位置&#xff0c;无法排查 现状 目前已经确认为bug&#xff0c;根据github上的PR日…

序列标注:从传统到现代,NLP中的标签预测技术全解析

引言 序列标注任务是自然语言处理&#xff08;NLP&#xff09;中的核心任务之一&#xff0c;广泛应用于信息抽取、文本分类、机器翻译等领域。随着深度学习技术的快速发展&#xff0c;序列标注任务的性能得到了显著提升。本文将从基础概念入手&#xff0c;逐步深入探讨序列标注…