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,一经查实,立即删除!

相关文章

PyCharm基本配置内容

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

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;这种…

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

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

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采用分…

【NumPy】全面解析NumPy随机数生成器:使用numpy.random的实用技巧

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

产线虚拟现实vr仿真软件开发在线上能全面呈现企业品质和专业度

在数字化浪潮中&#xff0c;上海VR全景场景制作公司凭借其领先的VR全景制作技术&#xff0c;正为各行各业带来前所未有的沉浸式体验。无论是学校企业场地的生动展示&#xff0c;还是汽车内饰与外观的360度全景呈现&#xff0c;我们都能通过VR虚拟现实制作技术&#xff0c;让您的…

斯坦福大学ALOHA家务机器人团队发布了最新研究成果—YAY Robot语言交互式操作系统

ALOHA YAY 演示视频-智能佳 斯坦福的ALOHA家务机器人团队&#xff0c;发布了最新研究成果—Yell At Your Robot&#xff08;简称YAY&#xff09;&#xff0c;有了它&#xff0c;机器人的“翻车”动作&#xff0c;只要喊句话就能纠正了&#xff01; 标ALOHA2协作平台题 而且机器…

SpringSecurity登录和校验流程简述

认证&#xff1a; 验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户 授权&#xff1a; 经过认证后判断当前用户是否有权限进行某个操作 一、入门案例实现 搭建springboot工程后&#xff0c;创建启动类和Controller&#xff0c;引入SpringSecurity依…

CCF- CSP 2018.12 - 1.2题 Java语言解题

2018.12-1 小明上学 import java.util.Scanner;public class text01_RedLight {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int r scanner.nextInt();int y scanner.nextInt();int g scanner.nextInt();int n scanner.nextInt();in…

springboot 两个相同类型的Bean使用@Resouce加载

问题描述 有两个相同类型的Bean 使用Service等注解注入或者Bean注入启动以后报错&#xff1a; qualifying bean of type com.fasterxml.jackson.databind.ObjectMapper available: expected single matching bean but found 2提示有相同的类型两个。 解决 * 每个Bean Resour…

第15章-超声波避障功能 HC-SR04超声波测距模块详解STM32超声波测距

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 15.1-超声波测距 完成超声波测距功能、测量数据显示在OLED屏幕上 硬件介绍 使用&#…