重学C++系列之const与static关键字分析

前言

        本篇幅讲解关键字const与static,主要围绕在类的范围内叙述,包括作用和使用场景等。

一、const与static的作用

        1、const修饰的成员变量,成员变量初始化后不能再修改。

        2、const修饰的成员函数,成员函数不可以修改成员变量,也不能间接修改。

        3、static修饰的成员变量,变为静态成员变量,只能在类外初始化,由静态成员函数来操作。

        4、static修饰的成员函数,变为静态成员函数,用来操作静态成员变量,不能访问非静态成员变量和非静态成员函数。

二、使用场景

        1、const修饰成员变量,通常用于修饰一经初始化后,不能修改的变量(如学号,姓名)。

        2、const修饰成员函数,通常用于返回成员变量的函数。

        3、static修饰成员变量,通常用于所有类对象共享的变量,该静态成员变量在类中只有一个副本,

        4、static修饰成员函数,通常用于需要操作静态变量的成员函数。

三、案例

        1、const修饰成员变量

#include <iostream>

using namespace std;


class Test
{
private:
    int a;
    const int b;
public:
    // const 修饰的成员变量采用构造函数初始化列表的方式
    Test(int a = 0, const int b = 0):b(b)
    {
        this->a = a;
        // this->b = b; // 上面已经初始化了,这里不允许再次初始化
    }
    void show()
    {
        cout << "a = " << a << endl;
        cout << "b = " << b << endl;
    }
};



int main()
{
    Test A(1, 10);
    A.show();

    return 0;
}

        2、const修饰成员函数

#include <iostream>

using namespace std;


class Test
{
private:
    int a;
    const int b;
public:
    // const 修饰的成员变量采用构造函数初始化列表的方式
    Test(int a = 0, const int b = 0):b(b)
    {
        this->a = a;
        // this->b = b; // 上面已经初始化了,这里不允许再次初始化
    }
    // 获取成员变量的函数通常用const修饰
    int getA()const
    {
        return a;
    }
    int getB()const
    {
        return b;
    }
};



int main()
{
    Test A(1, 10);
    cout << "A = " << A.getA() << endl;
    cout << "B = " << A.getB() << endl;

    return 0;
}

        3、static修饰成员变量和成员函数

#include <iostream>

using namespace std;


class Test
{
private:
    int a;
    const int b;
    static int c;   // 静态成员变量
public:
    // const 修饰的成员变量采用构造函数初始化列表的方式
    Test(int a = 0, const int b = 0):b(b)
    {
        this->a = a;
        c++;    
        // this->b = b; // 上面已经初始化了,这里不允许再次初始化
    }
    
    // 不能写成: static int getC()const, 静态成员函数不允许使用类型限定符
    static int getC()
    {
       
        return c;
    }
};

// 静态成员变量在类中声明,类外定义,定义时不需要加static
int Test::c = 0;


int main()
{
    Test A(1, 10);
    
    // 可以使用对象名.静态成员函数名来访问
    cout << "C = " << A.getC() << endl;

    Test B(2, 20);
    cout << "C = " << B.getC() << endl;

    // 可以使用类名::静态成员函数名来访问
    cout << "C = " << Test::getC() << endl;

    return 0;
}

        4、const和static共同修饰成员变量

#include <iostream>

using namespace std;


class Test
{
private:
    int a;
    const int b;
    const static int c;   // 用const来修饰静态成员变量
public:
    // const 修饰的成员变量采用构造函数初始化列表的方式
    Test(int a = 0, const int b = 0):b(b)
    {
        this->a = a;
        // c++;    // 静态成员变量不能修改
        // this->b = b; // 上面已经初始化了,这里不允许再次初始化
    }
    
    // 不能写成: static int getC()const, 静态成员函数不允许使用类型限定符
    static int getC()
    {
       
        return c;
    }
};

// 静态成员变量在类中声明,类外定义,定义时不需要加static
const int Test::c = 0;


int main()
{
    Test A(1, 10);
    
    // 可以使用对象名.静态成员函数名来访问
    cout << "C = " << A.getC() << endl;

    Test B(2, 20);
    cout << "C = " << B.getC() << endl;

    // 可以使用类名::静态成员函数名来访问
    cout << "C = " << Test::getC() << endl;

    return 0;
}

四、总结

        const与static关键字都可以修饰成员变量和函数,但是作用有所不同。如果是获取非静态成员变量的返回值的函数,通常用const来修饰,增加可读性。如果是用static来修饰成员变量,该成员变量变为静态成员变量,不属于任何类对象,只属于类,只有一个副本,类对象成员之间共享。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数值线性代数:知识框架

记录数值线性代数研究的知识框架。 软件包线性方程组直接法Guass消元法/LU分解、Cholesky分解 LAPACK oneAPI MKL ARPACK Octave 迭代法Jacobi迭代、SOR迭代、共轭梯度法最小二乘特征值/特征向量非对称幂法、QR、Arnoldi分解对称QR、Jacobi、二分法、分治法、SVD 参考资料 G…

PDF添加水印以及防止被删除、防止编辑与打印

方法记录如下&#xff1a; 1、添加水印&#xff1b; 2、打印输出成一个新的pdf&#xff1b; 3、将pdf页面输出成一张张的图片&#xff1a;&#xff08;福昕pdf操作步骤如下&#xff09; 4、将图片组装成一个新的pdf&#xff1a;&#xff08;福昕pdf操作步骤如下&#xff09;…

多线程面试题--使用场景

线程池使用场景&#xff08;CountDownLatch、Future&#xff09; 在使用的时候&#xff0c;首先会给一个初始值&#xff0c;比如图中是3&#xff0c;然后在其他线程中调用countdown&#xff08;&#xff09;方法&#xff0c;当count0则继续执行 多线程使用场景一&#xff08; e…

【Spring Boot】Web开发 — 数据验证

Web开发 — 数据验证 对于应用系统而言&#xff0c;任何客户端传入的数据都不是绝对安全有效的&#xff0c;这就要求我们在服务端接收到数据时也对数据的有效性进行验证&#xff0c;以确保传入的数据安全正确。接下来介绍Spring Boot是如何实现数据验证的。 1.Hibernate Vali…

Python爬虫实战(基础篇)—4获取古诗词给孩子学习(附完整代码)

今天我们来获取古诗词网站的一些古诗词来提供给孩子们学习 PS前面几节课的内容在专栏这里&#xff0c;欢迎大家考古&#xff1a;点我 首先我们看一下网站&#xff1a;点我&#xff0c;今天我们来获取一下【唐诗三百首】 第 1 步&#xff1a;网页分析 在网页中我们发现有许多以…

mysql -速成

目录 1.概述 1.3SQL的优点 1.4 SQL 语言的分类 2. 软件的安装与启动 2.1 安装 2.2 MySQL服务的启动和停止 2.3 MySQL服务的登录和退出 ​编辑 2.4 mysql常用命令 2.5 图形化用户结构Sqlyong 3.DQL 语言 3.1 基础查询 3.1.1、语法 3.1.2 特点 3.2 条件查询 3.2.1 …

N位分频器的实现

N位分频器的实现 一、 目的 使用verilog实现n位的分频器&#xff0c;可以是偶数&#xff0c;也可以是奇数 二、 原理 FPGA中n位分频器的工作原理可以简要概括为: 分频器的作用是将输入时钟频率分频,输出低于输入时钟频率的时钟信号。n位分频器可以将输入时钟频率分频2^n倍…

SQL-每日一题【620.有趣的电影】

题目 某城市开了一家新的电影院&#xff0c;吸引了很多人过来看电影。该电影院特别注意用户体验&#xff0c;专门有个 LED显示板做电影推荐&#xff0c;上面公布着影评和相关电影描述。 作为该电影院的信息部主管&#xff0c;您需要编写一个 SQL查询&#xff0c;找出所有影片…

【Spring框架】spring对象注入的三种方法

目录 1.属性注入问题&#xff1a;同类型的Bean存储到容器多个&#xff0c;获取时报错的问题&#xff1b;1.将属性的名字和Bean的名字对应上。2.使用AutoWiredQualifier来筛选bean对象&#xff1b; 属性注入优缺点 2.Setter注入Setter注入优缺点 3.构造方法注入&#xff08;Spri…

【Android知识笔记】UI体系(一)

Activity的显示原理 setContentView 首先开发者Activity的onCreate方法中通常调用的setContentView会委托给Window的setContentView方法: 接下来看Window的创建过程: 可见Window的实现类是PhoneWindow,而PhoneWindow是在Activity创建过程中执行attach Context的时候创建的…

0-超级计算机

超级计算机 概述主要特点处理能力并行处理大规模存储应用领域能耗云超算 中国超算流行体系结构片内异构节点内异构 概述 当谈到超级计算机时&#xff0c;我们指的是性能超高、处理能力强大的计算机系统。 它们通常由数以千计的处理器核心组成&#xff0c;并具备大规模的内存和…

小程序如何将商品添加到分类

​将商品添加到分类是非常重要的功能&#xff0c;可以让商家更方便地管理分类和商品。下面将具体介绍如何将产品添加到分类中。 步骤一&#xff1a;选中商品 在个人中心点击管理入口&#xff0c;然后找到“商品管理”菜单并点击。找到需要添加的商品&#xff0c;然后选中它。…

【网络安全带你练爬虫-100练】第15练:模拟用户登录

目录 一、目标1&#xff1a;理清逻辑 二、目标2&#xff1a;将每一步用代码进行表示 三、网络安全O 一、目标1&#xff1a;理清逻辑 模拟登录的基本流程 1、进入入口程序 2、读取目标URL 3、请求加上线程 4、确定请求数据包 5、请求格式的确认 6、数据的处理与判断 二、目标…

MixFormerV2: Efficient Fully Transformer Tracking

摘要 基于变压器的跟踪器在标准基准测试上取得了很强的精度。然而&#xff0c;它们的效率仍然是在GPU和CPU平台上实际部署的一个障碍。在本文中&#xff0c;为了克服这一问题&#xff0c;我们提出了一个完全变压器跟踪框架&#xff0c;称为MixFormerV2&#xff0c;没有任何密集…

我的2023上半年总结

Hi~C站的小伙伴们好久不见哇&#xff01;釉色终于回到C站&#xff0c;开始要输出了&#xff01;这一篇文章是我的2023上半年的总结&#xff0c;以此&#xff0c;致敬那段迷茫但又不曾被辜负的时光。 文章目录 总括——你愿意花五分钟时间读读我的文章吗学习——制定目标&#…

GB/T 25000.51解读——软件产品的性能效率怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中&#xff0c;我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

电机故障诊断(python程序,模型为CNN结合LSTM)

代码运行环境要求&#xff1a;TensorFlow版本>2.4.0&#xff0c;python版本>3.6.0 运行效果视频&#xff1a;电机故障诊断&#xff08;python代码&#xff09;_哔哩哔哩_bilibili 1.电机常见的故障类型有以下几种&#xff1a; 轴承故障&#xff1a;轴承是电机运转时最容…

新星计划打卡学习:VUE3引入element-plus

目录 1、安装element-plus 2、安装按需导入插件 3、修改配置文件 4、添加页面内容 5、保存并重启项目 1、安装element-plus 官网说要想使用element-plus需要先进行安装&#xff0c;并给出了三种安装方式&#xff0c;我选择了第三种。 报错了&#xff1a; 解决的办法&…

同步、异步、阻塞、非阻塞

一、概念 同步与异步&#xff08;线程间调用&#xff09;的区别&#xff1a;关注的是调用方与被调用方之间的交互方式。同步调用会等待被调用方的结果返回&#xff0c;而异步调用则不会等待结果立即返回&#xff0c;可以通过回调或其他方式获取结果。 阻塞非阻塞&#xff08;…

SpringBoot 和 Vue 参数类型不对应,导致method parameter is not present

org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter id for method parameter type String is not present 客户端&#xff1a; requestUserInfoById()const requestUserInfoById async (id?: string) > {} 服务器端&am…