C++中的const \static \this

目录

前言

一、const关键字

1、const修饰类的成员变量

2、const修饰类的成员函数

3、const修饰类的对象

二、static关键字

1、static修饰类中的成员变量

1. 共享性

2. 初始化

3. 访问权限

4. 内存分配

5. 不依赖于对象

2、static修饰类中的成员函数

三、this关键字

返回当前对象的指针


前言

        前面我们说到了C++中的类创建,其中类包括了函数,变量,以及构造函数,但是和C语言当中一样,我们对变量和函数有const和static修饰,在C语言当中我们用const修饰变量表示不可修改的变量,那么在C++中是不是也是这样呢?明确告诉大家,有共同点也有不同点,大多是不同的

一、const关键字

1、const修饰类的成员变量

        当我们用const修饰类的成员变量时,这个变量在使用时和其他没有被修饰的变量有区别,即这个成员变量不能被修改,即在创建后不能被进行赋值操作。只能进行初始化。

        对于const 修饰的成员变量,必须进行初始化,在创建对象时,就必须要进行初始化赋值

在类的构造函数定义的()后 添加 : 成员变量(值) , 类的初始化列表可以对成员进行初始化;

        如果你要在普通函数中修改,那么是不行的,因为在我们创建对象的时候,成员变量就已经进行创建了,这时候在普通函数当中进行你所谓的“初始化”,不过是对成员变量进行赋值操作罢了。

2、const修饰类的成员函数

        表示类的成员函数中,函数中没有任何的修改变量操作,只有访问变量

        怎么理解呢,假如你在类的成员函数中使用了const修饰这个函数,那么你就不能在这个函数当中有任何的赋值操作,即不能在这个函数当中将某个值更改,但是能进行值的访问,

        下面是某个类的成员函数声明,如果现在在getid()这个函数后面使用const修饰,那么在定义这个函数的时候,函数当中不能有更改值的操作,只能进行访问变量的功能

        当然,这里使用const修饰函数写在函数后面,在声明的时候写,在定义的时候不用写const 

 这里我们说

声明函数是指:在头文件中声明某个函数,后面要使用时在调用头文件

定义函数是指:在.cpp文件中定义的函数功能,具体哪个函数实现什么功能就写你想要实现的功能

3、const修饰类的对象

         const修饰对象时,表示整个对象不能进行修改,不能执行修改操作

        被修饰的对象,只能调用const成员函数,不能调用普通成员函数

         怎么样理解呢,就是说当我们在用const修饰一个对象后,这个对象里面的所有东西都不能进行修改,相当于固定不动的东西,而且被修饰的对象也不能调用普通函数,就只能调用const修饰的成员函数,和const修饰的成员变量,我们知道const修饰的成员函数只能进行成员的访问,不能进行赋值操作,那么其实对于被const修饰的对象而言,使用起来有很多限制条件,在使用时务必小心;

        看代码解释:

class MyClass {
public:void myConstFunc() const; // const成员函数void myNormalFunc();      // 普通成员函数
};void MyClass::myConstFunc() const {// 不能修改成员变量
}void MyClass::myNormalFunc() {// 可能修改成员变量
}void example() {const MyClass obj;obj.myConstFunc(); // 可以调用// obj.myNormalFunc(); // 编译错误,不能调用
}

 

class MyClass {
public:int getValue() const { return value; } // const成员函数void setValue(int val) { value = val; } // 普通成员函数private:int value;
};void example() {const MyClass obj;int val = obj.getValue(); // 可以调用,因为getValue是const成员函数// obj.setValue(10); // 编译错误,不能调用,因为setValue不是const成员函数
}

二、static关键字

1、static修饰类中的成员变量

        static修饰成员变量,表示成员变量不再是属于单个对象,而是属于整个类,每个类对象在访问时,都是访问同一个共有成员,整个类的所有对象只有同一个 static成员变量

        其实这个有点像我们将一个静态局部变量变成一个全局变量,但是在C语言中是不能实现的,在c++中我们将其称为共享性

1. 共享性

static成员变量属于类本身,而不是类的任何特定实例。换句话说,所有对象共享同一个static成员变量。你可以通过类名来访问它,也可以通过类的实例访问它,但通常推荐使用类名来访问

class MyClass {
public:static int staticVar; // 声明静态成员变量void printStaticVar() {std::cout << "Static Var: " << staticVar << std::endl;}
};// 静态成员变量必须在类外定义
int MyClass::staticVar = 0; // 定义并初始化静态成员变量int main() {MyClass obj1;MyClass obj2;obj1.staticVar = 10; // 通过对象访问obj2.printStaticVar(); // 输出: Static Var: 10MyClass::staticVar = 20; // 通过类名访问obj1.printStaticVar(); // 输出: Static Var: 20return 0;
}

2. 初始化

static成员变量必须在类外进行定义和初始化,通常在源文件(.cpp文件)中完成。类内的声明只是告诉编译器该成员变量存在,但不提供存储空间。初始化仅需一次,因此只需在一个地方进行。

3. 访问权限

static成员变量的访问权限(publicprivateprotected)与普通成员变量一样。它可以被类的成员函数、友元函数或通过对象/类名进行访问,具体取决于它的访问控制级别。

4. 内存分配

static成员变量的内存分配在程序的全局/静态存储区域中,而不是在每个对象的内存中。这使得它们对于所有对象是共享的。

5. 不依赖于对象

static成员变量在对象创建之前就已存在,因此它不依赖于对象的生命周期。它的值在程序运行期间保持不变,直到被修改。

2、static修饰类中的成员函数

        静态成员函数也只能访问static成员变量,不能访问非静态成员变量或成员函数。这是因为静态成员函数没有this指针,它们不与具体的对象实例关联。

        static修饰成员,让静态成员函数属于整个类,访问 static 成员变量,不能访问普通成员,可以通过类名访问,注意,这里用static修饰的成员函数只能访问static修饰的成员变量,不能访问普通变量,否则报错

class MyClass {
public:
//静态成员函数static void staticFunc() {std::cout << "Static Var: " << staticVar << std::endl; // 访问静态成员变量}private:static int staticVar; // 静态成员变量
};// 定义静态成员变量
int MyClass::staticVar = 0;int main() {MyClass::staticVar = 100;MyClass::staticFunc(); // 输出: Static Var: 100return 0;
}

三、this关键字

        对于类的成员函数,为了访问在调用成员函数时确定对象,编译器会为类的每个成员函数(除了static函数)都会隐式的添加一个 类* this 作为函数参数。通过对象调用函数时,会由编译器传递对象的地址 给这个this指针。this指针存储的是调用成员函数的对象的地址,防止访问错误(访问其他的对象)

        对于this指针可以将其理解为当成员函数需要明确访问当前对象的成员变量时,this指针可以用来区分局部变量和成员变量。只能在非静态成员函数中使用

class MyClass {
private:int value;
public:MyClass(int value) {// 使用 this 指针区分成员变量和参数this->value = value;}void printValue() {std::cout << "Value: " << this->value << std::endl;}
};
返回当前对象的指针

this指针可以用于在成员函数中返回当前对象,便于链式调用(即多个操作连接在一起,连续调用)。

class MyClass {
private:int value;
public:MyClass& setValue(int value) {this->value = value;return *this; // 返回当前对象的引用}void printValue() const {std::cout << "Value: " << value << std::endl;}
};int main() {MyClass obj;obj.setValue(10).setValue(20).printValue();  // 链式调用return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

「C++系列」异常处理

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、异常处理1. 基本概念2. 示例代码3. 注意事项 二、常见的异常类…

三维天地创新方案助力实验室信息自动化技术深入发展

实验室环境条件控制非常重要,它直接影响着最终的实验或检测结果。例如不同的实验室对于温湿度有不同的要求,这就给实验室温湿度监测与采集带来了一定的困难。 三维天地自主研发的实验室信息管理系统(SW-LIMS)提出了一种检化验记录温湿度自动采集的创新方案,这一方案致力于实现…

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…

解决nginx代理SSE接口的响应没有流式返回

目录 现象原来的nginx配置解决 现象 前后端分离的项目&#xff0c;前端访问被nginx反向代理的后端SSE接口&#xff0c;预期是流式返回&#xff0c;但经常是很久不响应&#xff0c;一响应全部结果一下子都返回了。查看后端项目的日志&#xff0c;响应其实是流式产生的。推测是n…

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Markdown书写技巧深度解析

引言 在数字化时代&#xff0c;文本编辑与格式化的效率与美观性显得尤为重要。Markdown&#xff0c;作为一种轻量级的标记语言&#xff0c;以其简洁的语法和高效的文档转换能力&#xff0c;在多个领域得到广泛应用。本文将全面探讨Markdown的由来、定义、原理、内部流程、应用场…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

探索Facebook的黑暗面:数字化社交的双面剑

Facebook作为全球最大的社交平台&#xff0c;改变了我们的沟通和互动方式。虽然它带来了便利&#xff0c;但也存在不少隐忧。本文将探讨Facebook的负面影响&#xff0c;包括隐私问题、信息操控、心理健康危机及社交表面化等。 一、隐私问题&#xff1a;数据收集的隐忧 Facebo…

2024蓝桥杯省B好题分析

题解来自洛谷&#xff0c;作为学习 目录 宝石组合 数字接龙 爬山 拔河 宝石组合 # [蓝桥杯 2024 省 B] 宝石组合## 题目描述在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美…

乐vs悲观锁,重vs轻量级锁,公vs非公平锁,不vs可重入锁,等等锁策略

这里讲的“乐观锁”“悲观锁”“轻量级锁”等等&#xff0c;都不是一个锁&#xff0c;而是一类锁。 比如&#xff1a;我们班有“带眼镜”的同学&#xff0c;这里“带眼镜”并不是指一个人&#xff0c;而是指一类人。 并且这里的锁&#xff0c;并不局限于Java&#xff0c;而是只…

优化数据的抓取规则:减少无效请求

在爬取房价信息的过程中&#xff0c;如何有效过滤无效链接、减少冗余请求&#xff0c;是提升数据抓取效率的关键。本文将介绍如何优化爬虫抓取贝壳等二手房平台中的房价、小区信息&#xff0c;并通过代理IP、多线程、User-Agent和Cookies的设置&#xff0c;确保数据抓取的稳定性…

(娱乐)魔改浏览器-任务栏图标右上角加提示徽章

一、目标&#xff1a; windows中&#xff0c;打开chromium&#xff0c;任务栏中会出现一个chromium的图标。我们的目标是给这个图标的右上角&#xff0c;加上"有1条新消息"的小提示图标&#xff0c;也叫徽章(badge)注意&#xff1a;本章节纯属娱乐&#xff0c;有需要…

手脱简单upx

大一下的事情&#xff0c;补个档 手动脱壳の新年快乐 查壳&#xff0c;有壳&#xff0c;UPX X32dbg打开文件&#xff0c;查看初始断点 点击PUSHAD跟进&#xff0c;CTRL*设置EIP&#xff0c;开始F8步过&#xff0c;寻找ESP寄存器第一次单个变红的地址 此时的内存窗口 开始步过…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件&#xff0c;特此记一笔。 其中针对esp32s3各类参数设定&#xff08;用idf.py menuconfig)&#xff0c;做个记录。 CPU Frequency去240MHz&#xff08…

【H2O2|全栈】关于CSS(6)CSS基础(五)

目录 CSS基础知识 前言 准备工作 网页项目规范 创建项目 布局 补充一部分属性 outline border-radius 预告和回顾 后话 CSS基础知识 前言 本系列博客将分享层叠样式表&#xff08;CSS&#xff09;有关的知识点。 本期博客主要分享的是网页项目规范&#xff0c;ou…

VC++以资源方式打开可执行文件

刚看一个资料说可以在VC中&#xff0c;以资源方式打开可执行文件&#xff0c;然后它如果包含对话框一些资源&#xff0c;会呈现出来&#xff0c;可以把其他程序界面上的控件直接拷贝到自己程序&#xff1b; 但是操作了一下没有成功&#xff0c; 先新建一个空对话框准备拷贝东…

Linux运维篇-服务器简介

目录 前言服务器分类&#xff08;按服务器的机箱结构来划分&#xff09;台式服务器机架式服务器刀片式服务器 外观部件内部结构前面板前面板组件前面板接口说明前面板指示灯和按钮前面板指示灯/按钮说明 后面板后面板组件后面板接口说明后面板指示灯后面板指示灯说明 主板和 iB…

uni-app生命周期(三)

文章目录 一、uni-app的生命周期二、应用生命周期三、页面的生命周期函数1.简介2.页面加载时序介绍3.页面加载常见问题4.页面加载顺序4.部分生命周期介绍 四、组件的生命周期函数 一、uni-app的生命周期 应用生命周期&#xff08;整个App的生命周期&#xff09; 在app.vue里面…

C++之仿函数和虚函数

仿函数&#xff08;Functor&#xff09;和虚函数&#xff08;Virtual Function&#xff09;是 C 中两个不同的概念&#xff0c;它们在功能和使用场景上有显著的区别。 1. 仿函数&#xff08;Functor&#xff09; 定义&#xff1a; 仿函数&#xff08;也称为函数对象&#xf…