C++中的const \static \this

news2024/9/20 7:50:52

目录

前言

一、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: 10

    MyClass::staticVar = 20; // 通过类名访问
    obj1.printStaticVar(); // 输出: Static Var: 20

    return 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: 100

    return 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.coloradmin.cn/o/2145202.html

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

相关文章

OpenHarmony(鸿蒙南向开发)——标准系统方案之扬帆移植案例

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案…

SHL笔试测评系统题库考什么?如何通过综合测评|附性格测试104道

嘿&#xff0c;各位求职小伙伴们&#xff01;我是职小豚&#xff0c;今天就来带大家深入了解神秘又充满挑战的 SHL 笔试测评系统。 一、SHL 人才测评系统介绍 SHL 呀&#xff0c;那可是人才测评领域的超级大明星&#xff01;就像一个智慧的魔法师&#xff0c;用各种神奇的题目…

Linux系统之head命令的基本使用

Linux系统之head命令的基本使用 一、head命令介绍二、head命令的使用帮助2.1 head命令的help帮助信息2.2 head命令的语法解释 三、head的基本使用3.1 直接使用3.2 查看文件前N行3.3 查看多个文件3.4 查询文件的前5行3.5 显示文本所有内容&#xff08;除了后5行内容&#xff09;…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿&#xff1a;Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

No module named MYSQLdb 问题解决

问题&#xff1a; 导入写好的数据库时报错 解决&#xff1a;pip install mysql-python &#xff08;又报错&#xff09; 找了网上的方法&#xff1a; 执行 pip install PyMySQL&#xff0c;将数据库连接改为 mysqlpymysql://username:passwordserver/db&#xff0c;接下来的操…

eggtart队比赛攻略

关联比赛: “新内容 新交互”全球视频云创新挑战赛--算法挑战赛道 赛题回顾 本次赛题核心为高清视频人像分割&#xff0c;属于无监督视频物体分割任务&#xff0c;要求在未提供任何额外输入的情况下&#xff0c;识别并定位视频中的主要人物&#xff0c;并精确到图像的每个像素…

微服务配置中心介绍

在微服务架构中&#xff0c;配置中心是一个非常重要的组件&#xff0c;它负责管理所有服务的配置信息&#xff0c;使得配置管理变得更加集中和动态。配置中心能够极大地提高微服务架构的灵活性和可维护性。 为什么需要配置中心&#xff1f; 在传统的单体应用中&#xff0c;配置…

22:SPI一:简单的使用

SPI简单的使用 1、什么是SPI2、数据通信2.1&#xff1a;5个重要参数2.2&#xff1a;4种传输模式 3、程序模拟SPI通信时序3、片上外设SPI通信时序 1、什么是SPI SPI是一种同步的&#xff0c;全双工&#xff0c;支持总线挂载多设备的通信协议。它特别适用于高效&#xff0c;快速…

【Python报错已解决】 TypeError: Descriptors cannot not be created directly

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

计算机毕业设计 健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

MUNIK谈ASPICE系列专题分享(六)企业为什么要做ASPICE?

前言&#xff1a; 知名的几家主机厂对ASPICE有什么各自的要求&#xff1f;企业应该做哪些应对 1-说到“企业为什么要做ASPICE”这个话题&#xff0c;我们首先需要了解一下ASPICE的历史。 在1993年&#xff0c;国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&am…

C++_类和对象(下篇)—— 内部类、匿名对象、对象拷贝时的编译器优化

目录 四、类和对象&#xff08;下篇&#xff09; 5、内部类 6、匿名对象 7、对象拷贝时的编译器优化 四、类和对象&#xff08;下篇&#xff09; 5、内部类 如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫做内部类。内部类是⼀个独立的类&#xff0c;跟定义…

基于SpringBoot+WebSocket实现地图上绘制车辆实时运动轨迹图

实现基于北斗卫星的车辆定位和轨迹图的Maven工程&#xff08;使用模拟数据&#xff09;&#xff0c;我们将使用以下技术&#xff1a; Spring Boot&#xff1a;作为后端框架&#xff0c;用来提供数据接口。Thymeleaf&#xff1a;作为前端模板引擎&#xff0c;呈现网页。Leaflet…

Agile Modbus STM32裸机移植 从机使用

本教程手把手教你实现Agile Modbus&#xff0c;照抄就能成。 并且会解读函数功能含义。 1. 引言 Agile Modbus 是一个轻量级的 Modbus 协议栈&#xff0c;可以满足用户在任何场景下的需求。 功能 支持 rtu 和 tcp 协议&#xff0c;使用纯 C 语言开发&#xff0c;不涉及任何硬…

安科瑞AIM-D100系列 光伏直流系统直流绝缘监测仪——保障光伏发电运行稳定可靠

应用场景&#xff1a;发电厂家、变电站的直流屏、电动汽车充电装置、UPS供电系统、光伏直流系统、储能系统及其它直流电网等直流系统。 随着工业的发展&#xff0c;很多用电设备和工厂设备采用直流系统供电&#xff0c;直流系统的正极和负极不接地。对于不接地&#xff08;IT&…

Axure中后台管理信息系统通用原型方案

Axure中后台管理信息系统通用原型方案中的12套模板&#xff0c;旨在帮助开发者与设计师快速搭建出标准且美观的中后台产品原型&#xff0c;提升开发效率和节省协作成本。这些模板覆盖了多样化的中后台管理系统开发需求&#xff0c;具有高度的灵活性和可定制性。 以下是对这些模…

LINUX网络编程:传输层

目录 1.端口号 1.1知名端口号 1.2注意 2.UDP协议 2.1UDP报头的格式 2.2UDP的特点 2.3UDP的缓冲区 1.端口号 端口号的作用标识一个网络中主机的一个进程。 网络之间通信无非就是&#xff0c;发送端和接受端进程之间的通信&#xff0c;所以通过ip地址找到目标主机之后&am…

城市道路街景的绿视率计算 绿化率计算(包括街景的获取)

项目背景 随着城市化进程的加快&#xff0c;城市绿地的重要性日益凸显。合理的绿化不仅能美化城市环境&#xff0c;还能净化空气、调节气候、减轻热岛效应等。因此&#xff0c;对城市道路街景的绿视率和绿化率进行量化分析&#xff0c;对于促进城市可持续发展具有重要意义。 项…

基于stm32的四旋翼无人机控制系统设计系统设计与实现

文章目录 前言资料获取设计介绍功能介绍设计程序 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业…

基于SpringBoot+Vue+MySQL的家乡特色推荐系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当今数字化时代&#xff0c;随着旅游业的蓬勃发展和人们对本土文化探索的热情日益增长&#xff0c;一个基于SpringBoot、Vue.js与MySQL的家乡特色推荐系统应运而生。该系统旨在通过现代互联网技术&#xff0c;深度挖掘并展示各…