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

news2024/11/28 6:39:17

前言

        本篇幅讲解关键字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来修饰成员变量,该成员变量变为静态成员变量,不属于任何类对象,只属于类,只有一个副本,类对象成员之间共享。

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

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

相关文章

063、故障处理之快速恢复数据

数据丢失快速恢复的重要性 目的&#xff1a;尽快修复数据&#xff0c;恢复业务 快速恢复相关技术对比 常用备份恢复技术 数据快速恢复原理 MVCC 是TiDB数据库原生的一项功能&#xff0c;默认使用无需配置&#xff0c;它使用多个历史快照的方式来维护数据在某个时间点对并…

五步快速搭建个性化外卖小程序商城

随着人们生活节奏的加快&#xff0c;外卖行业蓬勃发展。为了满足用户的需求&#xff0c;许多企业开始使用小程序商城来提供外卖服务。那么&#xff0c;如何制作一个功能完善、用户友好的外卖小程序商城呢&#xff1f;下面就来为大家详细介绍一下制作的步骤。 首先&#xff0c;我…

【深度学习】以图搜索- facebook的faiss 从环境搭建到运行案例从0到1

文章目录 前言安装小试牛刀项目延伸总结 前言 Faiss的全称是Facebook AI Similarity Search。 这是一个开源库&#xff0c;针对高维空间中的海量数据&#xff0c;提供了高效且可靠的检索方法。 暴力检索耗时巨大&#xff0c;对于一个要求实时人脸识别的应用来说是不可取的。 …

当深度强化学习(DRL)遇见图神经网络(GNN)

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…

day02.数组

一,数组 数组:一组有序的相同类型数据的集合 1.1声明数组: 数组元素类型 数组名【】;数组元素类型【】 数组名; 🎃more : 数组元素类型【】【】数组名;注:Java的数组是先声明对象再分配空间(而C语言是声明数组的同时指明了数组的长度,给数组分配了…

fastadmin采坑之接口分页处理

其实不算fastadmin的代码而是thinkphp自带的分页代码 paginate函数就是自带的分页函数&#xff0c;开始我以为这个只能用于渲染模板不能用于接口&#xff0c;后面看到源代码发现请求参数带page就可以 /*** ApiTitle (获取协会会员)* ApiSummary (获取协会会员)* ApiMethod …

买卖股票的最佳时机系列

//方法一 class Solution { public:int dp[100005];int maxProfit(vector<int>& prices) {//dp[i]表示前i天买入卖出的获取的最大利润//min_val表示前i-1天买入的最小值&#xff1b;dp[0]0;int min_valprices[0];for(int i1;i<prices.size();i){dp[i]max(dp[i-1],…

7.26 作业

1. 完善登录界面 main.c #include "widget.h" #include "second.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();Second s;QObject::connect(&w,&Widget::to_second,&s,…

利用mysqldump实现分库分表备份的shell脚本

一、信息摘要 linux版本&#xff1a;CentOS 7.9 mysql版本&#xff1a;MySQL 5.7.36 脚本实现功能&#xff1a;利用mysqldump工具实现对mysql中的数据库分库备份&#xff0c;和对所备份数据库中的表分表备份 二、shell脚本 #!/bin/bash ######################### #File n…

ROS1ROS2之CmakeList.txt和package.xml用法详解

前言&#xff1a;目前还在学习ROS无人机框架中&#xff0c;&#xff0c;&#xff0c; 更多更新文章详见我的个人博客主页【前往】 文章目录 1. CMakeLists.txt与package.xml的作用2. 生成CMakeLists.txt2.1 ROS12.2 ROS2 3. CMakeLists.txt编写3.1 ROS13.2 ROS2 4. package.xml…

【Linux指令集】---tar指令(超详细)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

常见面试题之设计模式--策略模式

1. 概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿&#xff0c;开发需要选择一款开发工具&#xff0c;当然可以进行代码开发的工具有很多&#xff0c;可以选择Idea进行开发&a…

(学习日记)2023.04.30

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

JS基础算法03--俩数之和

最简单 &#xff0c; 最基础的。 如果不会 &#xff0c; 请写会 &#xff0c;请掌握&#xff0c;请让心安定 给定一个数组 nums 和一个目标值 target&#xff0c;在该数组中找出和为目标值的两个数 const nums [1, 2, 3, 4, 5, 6, 7, 8]const target 5function find(nums, t…

Vue.js入门指南:从基础到进阶,掌握现代JavaScript框架的核心概念与高级特性(2W字小白教程)

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于 Python 的性能测试工具 locust (与 LR 的简单对比)

目录 前言&#xff1a; 背景 基础 测试需求 服务器端 LR 中的测试脚本 locust 中的测试脚本 LR 中的测试过程和结果 Locust 中的测试过程和结果 结果比较 总结 前言&#xff1a; Locust 是一种开源的性能测试工具&#xff0c;可以帮助我们快速地进行网站、应用程序…

Linux:入门学习知识及常见指令

文章目录 入门介绍操作系统的概念Linux机器的使用Linux上的指令 对文件知识的补充文件的定义和一些含义文件和目录的存储绝对路径和相对路径 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令rm指令man指令cp指令mv指令cat指令more指令echo指令输出重定向 less指令find指令grep…

【UE5 多人联机教程】05-生成玩家

步骤 1. 新建一个游戏模式基础 命名为“GM_Lobby” 2. 新建一个玩家控制器&#xff0c;命名为“PC_Lobby” 3. 新建一个游戏状态基础 命名为“GS_Lobby” 重新设置游戏模式重载、玩家控制器类、游戏状态类 4. 新建一个控件蓝图&#xff0c;命名为“UMG_Lobby” 打开“UMG_Lobb…

AI数字人为千行百业赋能,具有哪些优势?

AI产业的发展迅速&#xff0c;促使AI数字人产业也迎来了高速发展&#xff0c;数字人凭借愈发逼真的形象&#xff0c;开始在更多的场景、行业中进行赋能&#xff0c;为千行百业注入新的灵魂。 现阶段&#xff0c;数字人理论和技术正在不断成熟&#xff0c;应用范围也在不断扩大&…

opencv-25 图像几何变换04- 重映射-函数 cv2.remap()

什么是重映射&#xff1f; 重映射&#xff08;Remapping&#xff09;是图像处理中的一种操作&#xff0c;用于将图像中的像素从一个位置映射到另一个位置。重映射可以实现图像的平移、旋转、缩放和透视变换等效果。它是一种基于像素级的图像变换技术&#xff0c;可以通过定义映…