C++之对象的使用

1、static成员

2、static成员优点

2、static成员函数

静态成员函数不能访问非静态成员原因:因为没有this指针。也不可以访问非静态成员函数。

可以通过对象来访问静态成员,但是不推荐这么使用,会让人误解成这个x_是属于对象的,但是静态成员是属于类的。

3、类/对象大小计算

一个虚函数,会增加4个字节,因为增加了一个虚函数表指针。

4、四种对象的作用域与生存期

bss区,即block started by symbol,因为未初始化的数据,在可执行文件中不占用空间,因为他们的初始值都为0,既然等于0,我们只需要一个符号来表示即可,不需要再为它们分配空间。

5、static用法总结

6、static与单例模式

禁止拷贝:将拷贝构造函数和等号运算符声明为私有的,这样就不允许拷贝和赋值

#include <iostream>
using namespace std
class Singleton
{
public:static Singleton* GetInstance(){if(instacne_== NULL){instacne_= new Singleton;}return instacne_}~Singleton(){cout<<"Singleton"<<endl;}
private:Singleton(const Singleton& other);Singleton& operator=(const Singleton& other)Singleton(){cout << "Singleton..." << endl;}static Singleton* instacne_;
}Singleton* Singleton::instacne_;int main(void)
{//Singleton sl;//Singleton s2;Singleton* sl = Singleton::GetInstance();Singleton* s2 = Singleton::GetInstance();//Singleton s3(*s1)  // 调用拷贝构造函数return 0;
}

还有就是:在构造函数中,开辟的内存,在单例的这个对象生命周期结束的时候自动释放

方法一:提供一个释放内存的方法,主动调用

#include <iostream>
using namespace std
class Singleton
{
public:static Singleton* GetInstance(){if(instacne_== NULL){instacne_= new Singleton;}return instacne_}~Singleton(){cout<<"Singleton..."<<endl;}static void Free(){if (instance_ != NULL){delete instance_;}}
private:Singleton(const Singleton& other);Singleton& operator=(const Singleton& other)Singleton(){cout << "Singleton..." << endl;}static Singleton* instacne_;
}Singleton* Singleton::instacne_;int main(void)
{//Singleton sl;//Singleton s2;Singleton* sl = Singleton::GetInstance();Singleton* s2 = Singleton::GetInstance();//Singleton s3(*s1)  // 调用拷贝构造函数Singleton::Free()return 0;
}

但是这样缺点也很明显:如果一个程序很多地方都使用了一个单例的对象,我们要释放,要在哪里释放?这个就不好控制了。我们需要的是在这个对象的声明周期结束的时候自动释放。

方法二:提供一个内嵌的嵌套类,然后再定义一个嵌套类的对象,当该单例对象的声明周期结束的时候,这个嵌套类的对象也就释放了。

#include <iostream>
using namespace std
class Singleton
{
public:static Singleton* GetInstance(){if(instance_== NULL){instance_= new Singleton;}return instance_}~Singleton(){cout<<”Singleton'<<endl;}//static void Free()//{//    if (instance_ != NULL)//    {//        delete instance_;//    }//}class Garbo{public:~Garbo(){if(Singleton::instance_!= NULL){delete instance_,}}}private:Singleton(const Singleton& other);Singleton& operator=(const Singleton& other)Singleton(){cout << "Singleton..." << endl;}static Singleton* instance_;static Garbo garbo_;  // 利用对象的确定性析构:因为是在栈上的内存,生命周期结束的时候会自动调用~Garbo()这个析构函数
}Singleton* Singleton::instance_;
Singleton::Garbo Singleton::garbo_;int main(void)
{//Singleton sl;//Singleton s2;Singleton* sl = Singleton::GetInstance();Singleton* s2 = Singleton::GetInstance();//Singleton s3(*s1)  // 调用拷贝构造函数return 0;
}

但是这样的情况下在类中又嵌套了一个类,看起来还是不美观。

方法三:auto_ptr智能指针,这个等后期再讲

方法四:这边是利用了一个static的特性,如果你第二次调用的话,那就不会再重新生成一个static对象,会用原来的。而且是一个局部静态对象,当程序结束的时候,就会调用析构函数销毁。但是这样,不是线程安全的。

#include <iostream>
using namespace std
class Singleton
{
public:static Singleton& GetInstance(){static Singleton instance;return instance;}~Singleton(){cout<<"~Singleton..."<<endl;}private:Singleton(const Singleton& other);Singleton& operator=(const Singleton& other)~Singleton(){cout << "Singleton..." << endl;}}int main(void)
{Singleton& sl = Singleton::GetInstance();Singleton& s2 = Singleton::GetInstance();return 0;
}

7、const成员函数

const也可以构成重载。

#include <iostream>
using namespace std;class Test
{
public:Test(int x):x_(x){}int GetX() const{cout << "const GetX ..." << endl;//x_ = 100;  // 这样会报错return x_;}int GetX(){cout << "GetX ..." << endl;return x_;}
private:int x_;
}int main(void)
{return 0;
}

8、const对象

因为const对象不允许修改,所以如果const对象允许调用非const成员函数,那就有被修改的风险。

#include <iostream>
using namespace std;class Test
{
public:Test(int x):x_(x){}int GetX() const{cout << "const GetX ..." << endl;//x_ = 100;  // 这样会报错return x_;}int GetX(){cout << "GetX ..." << endl;return x_;}
private:int x_;
}int main(void)
{const Test t(10);t.GetX();Test t2(20);t2.GetX();return 0;
}

9、mutable

#include <iostream>
using namespace std;class Test
{
public:Test(int x):x_(x){}int GetX() const{cout << "const GetX ..." << endl;//x_ = 100;  // 这样会报错return x_;}int GetX(){cout << "GetX ..." << endl;return x_;}void OutPut() const{cout << "x = " << x_ << endl;outputTimes_++;}int GetOutputTimes() const{return outputTimes_;}
private:int x_;mutable int outputTimes_;
}int main(void)
{const Test t(10);t.GetX();Test t2(20);t2.GetX();t.Output();t.Output();cout << t.GetOutputTimes() << endl;return 0;
}

10、const总结

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

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

相关文章

贪心算法典型题目

糖果 有n个小朋友&#xff0c;有m袋糖果&#xff0c;第i袋的糖果数量是a[i]。已知n<m<2n。 每个小朋友至少要有一袋糖果&#xff0c;至多只能要两袋糖果。 分配的目标是把这m袋糖果全部分完&#xff0c;而且要使得每个小朋友最终得到的糖果数量都是相等的。 如果可以…

“大一新生接单:专业打造单页HTML网站,让你的项目脱颖而出!”

我是大一新生&#xff0c;对HTML有浓厚的兴趣&#xff0c;并且已经掌握了一些基础知识。 学会了使用htmlcss的网页设计&#xff08;暂未学JavaScript&#xff09; 如果你需要代写的服务可以在本作品下方 评论留言

PyCharm基本配置内容

如何更换 Python 解释器 输入一段代码点击运行后&#xff0c;画面下方有一个路径如图中框中所示&#xff1a; 上面的路径为虚拟路径&#xff0c;可以改为我们自己设置的路径 点击设置&#xff0c;选择settings 选择Project&#xff1a;y002———》Python Interpreter&#…

C++课程设计实验杭州电子科技大学ACM题目(中)

题目四&#xff1a;2016.数据的交换输出 题目描述 Problem Description&#xff1a; 输入n(n<100)个数&#xff0c;找出其中最小的数&#xff0c;将它与最前面的数交换后输出这些数。 Input&#xff1a;输入数据有多组&#xff0c;每组占一行&#xff0c;每行的开始是一…

python爬虫之pandas库——数据清洗

安装pandas库 pip install pandas pandas库操作文件 已知在本地桌面有一名为Python开发岗位的csv文件(如果是excel文件可以做简单修改即可&#xff0c;道理是通用的) 打开文件&#xff1a; 打开文件并查看文件内容 from pandas import DataFrame import pandas as pd data_c…

【自动驾驶技术栈学习】2-软件《大话自动驾驶》| 综述要点总结 by.Akaxi

----------------------------------------------------------------------------------------------------------------- 致谢&#xff1a;感谢十一号线人老师的《大话自动驾驶》书籍&#xff0c;收获颇丰 链接&#xff1a;大话自动驾驶 (豆瓣) (douban.com) -------------…

nuxt3+Element Plus项目搭建过程记录

背景 本文只记录项目搭建过程中遇到的一些问题和关键点&#xff0c;nuxt框架的说明和API请参照官网学习 官网&#xff1a;https://nuxt.com/docs/getting-started/introduction 1. 初始化项目 指令如下: npx nuxilatest init <project-name>我在安装过程中出现报错&a…

本地源码方式部署启动MaxKB知识库问答系统,一篇文章搞定!

MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。 开箱即用&#xff1a;支持直接上传文档、自动爬取在线文档&#xff0c;支持文本自动拆分、向量化、RAG&#xff08;检索增强生成&#xff09;&#xff0c;智…

AI视频智能分析技术赋能营业厅:智慧化管理与效率新突破

一、方案背景 随着信息技术的快速发展&#xff0c;图像和视频分析技术已广泛应用于各行各业&#xff0c;特别是在营业厅场景中&#xff0c;该技术能够有效提升服务质量、优化客户体验&#xff0c;并提高安全保障水平。TSINGSEE青犀智慧营业厅视频管理方案旨在探讨视频监控和视…

七人拼购新模式:革新购物体验,共创价值

在数字时代&#xff0c;消费者的购物体验正经历着前所未有的变革。七人拼购模式作为一种新兴的购物方式&#xff0c;通过汇集消费者的力量&#xff0c;实现商品价格的最优化&#xff0c;让消费者享受到前所未有的实惠与便利。以下&#xff0c;我们将以一款标价499元的商品为例&…

消防体验馆升级,互动媒体点亮安全之路!

在当下这个科技日新月异的时代&#xff0c;多媒体互动技术已深深融入现代化消防体验馆的设计之中&#xff0c;它们不仅为这些场馆注入了前所未有的创意与活力&#xff0c;更通过其互动性、趣味性等独特优势&#xff0c;彻底革新了消防宣传教育的传统模式。如今&#xff0c;这种…

边缘计算一些指标介绍

AI 性能&#xff1a; 边缘计算服务器中的AI性能参数是指用来描述服务器在进行人工智能任务时的性能表现的参数。这些参数可以包括以下几个方面&#xff1a; 计算能力&#xff1a;描述服务器处理AI任务的速度和效率。常见的指标有浮点运算能力&#xff08;FLOPS&#xff09;和图…

联想打印APP添加打印机方法

联想打印APP添加打印机操作方法&#xff1a; 1、在手机上下载“联想打印”APP&#xff1b; 2、打开“联想打印”APP,然后在软件内右下角找到“我的”图标并选择&#xff1b; 3、点击“请登录/注册”&#xff1b; 4、勾选“我已阅读并同意”然后在上面填写手机号码后&#xff0…

量子计算在科技浪潮中的引领作用

随着科技的不断进步&#xff0c;人类社会正在经历一场前所未有的技术革命。在这场革命中&#xff0c;量子计算以其独特的计算方式和巨大的计算潜力&#xff0c;正逐渐成为引领科技浪潮的重要力量。本文将深入探讨量子计算的基本原理、发展历程、应用领域以及在未来科技浪潮中的…

经典的无限极(权限管理,菜单权限)

// 权限添加 router.post(/jia,(req,res)>{ menuModel.create(req.body) res.send({ code:200, msg:添加成功 }) }) // 角色添加 router.post("/jjia",(req,res)>{ req.body.pidJSON.parse(req.body.pid) roleModel.create(req.body) res.send({ code:200, …

克服焦虑与迷茫:在学习与成长的旅程中找到自我

在现代社会&#xff0c;信息和技术的快速发展使得我们时常感到追赶不及。在学习和工作中&#xff0c;我们经常会遇到这样的问题&#xff1a;自己做不出来的题别人会做&#xff0c;自己写不出的代码别人会写。这种情况常常让我们感到焦虑和迷茫。然而&#xff0c;如何面对和克服…

Ansys Speos|微光学结构尾灯设计

附件下载 联系工作人员获取附件 汽车照明行业在过去几年中有了很大的发展&#xff0c;对复杂光学结构的需求需要先进的设计能力。Speos 3D Texture是一个独特的功能&#xff0c;允许在给定的身体表面以图案的形式设计和模拟微纹理。它的优点依赖于图案(网格)的光学模拟模型&a…

Java—二分查找

介绍 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。其基本思想是将目标值与数组中间的元素进行比较&#xff1a; 如果目标值等于中间元素&#xff0c;则查找成功。如果目标值小于中间元素&#xff0c;则在数组左半部分继续进行二…

点赋科技:闪耀荆州科技活动周,引领创新未来

在荆州 2024 科技活动周的舞台上&#xff0c;点赋科技以其卓越的科技实力和创新精神&#xff0c;成为了众人瞩目的焦点。 点赋科技&#xff0c;作为一家引领科技潮流的企业&#xff0c;一直致力于推动科技创新的发展。此次参加荆州科技活动周&#xff0c;更是展示了其在科技领域…

网络——多区域OSPF配置(OSPF系列第1篇)

简介 路由协议OSPF全称为Open Shortest Path First&#xff0c;也就开放是的最短路径优先协议&#xff0c;使用链路状态路由算法&#xff0c;isis协议也是使用链路状态路由算法。而RIP协议使用距离矢量路由算法。 区域 为了能够降低OSPF计算的复杂程度&#xff0c;OSPF采用分…