C++基础08---this,static

2023-10-30

1. this

(1)在我们利用某个类对象调用成员函数时,编译器将这个对象的地址传递给该成员函数中的一个隐藏的this形参。
(2)任何对类成员变量的直接访问都被看作是通过this做隐式调用
(3)this指针只能在成员函数中使用,全局函数、静态函数都不能使用this
(4)在普通成员函数中,this是一个指向非const对象的const指针(类型为Time, 则this就是Time *const this),表示this只能指向当前Time对象。
(5)在const成员函数中,this是一个指向const对象的const指针(类型为Time, 则this就是const Time *const this)即this只能指向当前Time对象,且无法修改Time对象的成员变量。

#ifndef DAY02_TIME_H
#define DAY02_TIME_H

//类的声明
class Time
{
public:
    int m_Hour;
    int m_Minute;
public:
    Time(int hour, int minute);
    Time& add_hour(int add_hour);
    Time& add_minute(int add_minute);
};

#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"

//构造函数初始化
Time::Time(int hour, int minute) : m_Hour(hour), m_Minute(minute){}


//成员函数
Time& Time::add_hour(int add_hour)    //等价于 Time& Time::add_Hour(Time* const this, int add_hour)
{
    m_Hour += add_hour;   //this->m_Hour += add_hour
    return *this;  //this是指向Time实例对象的指针。*this则是该对象自己
}

Time& Time::add_minute(int add_minute)
{
    m_Minute += add_minute;
    return *this;
}

int main(){
    Time time1(10, 10);
    time1.add_hour(8);     //等价于 time1.add_hour(&time1, 8)
    time1.add_minute(2); //m_Minute:12
    time1.add_hour(2).add_minute(1).add_hour(2);  //由于每次返回的都是time1对象,因而可以连续调用

    cout << time1.m_Hour << endl;  //m_Hour:22
    cout << time1.m_Minute << endl; //m_Minute:13
}


2. static

2.1 static 修饰变量

(1)static修饰的变量被存储在静态存储区。
(2)局部静态变量(函数中static型变量),值维持上次调用函数时的值。

int func1()
{
    static int a = 0;  //下次调用func1()时,a维持上一次的值
    a++;
    return a;
}

int main() {
    cout << func1() << endl;  // 1 
    cout << func1() << endl;  // 2
}

(3)全局静态变量,限制该全局变量只能够在本文件中使用。

2.2 static成员变量

(1)静态成员变量属于整个类。
(2)若在某个对象中修改了静态成员变量的值,则其它对象能直接看到修改结果。
(3)利用类名::成员变量名可以直接调用静态成员变量。

#ifndef DAY02_TIME_H
#define DAY02_TIME_H

//类的声明
class Time
{
public:
    int m_Hour;
    static int staticHour;  //静态成员变量的声明,此时还没有分配内存,因而不可以初始化
public:
    Time(int hour);
};

#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"

//静态成员变量的定义(分配内存)
int Time::staticHour = 12; // 定义时不加static,可以不给初值,系统默认给0

Time::Time(int hour)
{
    m_Hour = hour;
}


int main() {
    //1. 直接访问
    cout << Time::staticHour << endl; //12
    //2. 对象访问
    Time time1(10);
    Time time2(20);
    time1.staticHour = 15; //静态成员变量跟着类走,此时类中的staticHour被改为15
    cout << time1.staticHour << endl; //15,time1.staticHour、time2.staticHour、Time::staticHour地址相同
    cout << time2.staticHour << endl; //15
    cout << Time::staticHour << endl; //15
}
2.3 static成员函数

(1)静态成员函数属于整个类。
(2)静态成员函数中不可修改和对象相关的成员变量,但是可以修改与类相关的成员变量(静态成员变量)。
(3)利用类名::成员函数名可以直接调用静态成员函数。

#ifndef DAY02_TIME_H
#define DAY02_TIME_H

//类的声明
class Time
{
public:
    int m_Hour;
    static int staticHour;  //静态成员变量的声明,此时还没有分配内存,因而不可以初始化
public:
    Time(int hour);

public:
    static void staticFunc(int val);  //静态成员函数的声明
};

#endif //DAY02_TIME_H
#include <iostream>
using namespace std;
#include "Time.h"

//静态成员变量的定义(分配内存)
int Time::staticHour = 12; // 定义时不加static,可以不给初值,系统默认给0

Time::Time(int hour)
{
    m_Hour = hour;
}

void Time::staticFunc(int val)
{
//    m_Hour = 5;  //错误,m_Hour是和对象相关的成员变量,无法修改
    staticHour = val; //正确,staticHour也是属于类的成员变量,可修改
}

int main() {
    //1. 直接访问
    Time::staticFunc(0);
    cout << Time::staticHour << endl;  //0
    //2. 对象访问
    Time time1(10);
    Time time2(20);
    time1.staticFunc(10); //静态成员函数跟着类走,此时类中的staticHour被改为10
    cout << time1.staticHour << endl; //10,time1.staticHour、time2.staticHour、Time::staticHour地址相同
    cout << time2.staticHour << endl; //10
    cout << Time::staticHour << endl; //10
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++基础08---this,static 的相关文章

  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • 成员字段、构建顺序

    在 C 中 当执行如下所示的操作时 构造顺序是否得到保证 Logger Logger kFilePath logs runtime log logFile kFilePath 是的 施工顺序始终得到保证 但是 不能保证它与对象在初始值设定项
  • C# 中直接从 URL 获取图像尺寸

    我正在尝试使用以下代码直接从网络上获取图片的尺寸 string image http www hephaestusproject com csharp3 png byte imageData new WebClient DownloadDa
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • BufferBlock 连续

    我想使用以下方式实现消费者 生产者模式BufferBlock
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • Code::Blocks 中的调试似乎不起作用 - 缺少调试符号

    我正在尝试在 Code Blocks 中调试程序 我跟着本指南 http wiki codeblocks org index php title Debugging with Code Blocks and 这个短视频 http www y
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • 交叉验证(Cross-Validation)

    交叉验证 Cross Validation 目录 交叉验证 Cross Validation 一 基本方法 1 保留交叉验证 hand out cross validation 2 k折交叉验证 k fold cross validatio
  • 【android】ListView之BaseAdapter使用详解

    android中ListView是一个比较常用的控件 它用于方便的列表显示可见数据 当数据过多时 会出现滚动条 并且可以根据屏幕长度进行自适应显示 1 为什么使用BaseAdapter ListView需要设置数据适配 就是添加你需要显示的
  • BootStrap实现带有增删改查功能的表格(DEMO详解)

    前言 bootstrap的表格样式 有类似EasyUI的表格 也有卡片式表格 放到移动端显示 各有千秋 但是BootStrap自带的表格是没有操作列的 网上的资源不少 但是都是比较单一 零碎 JS CSS也经常给的不全 自己经过大概一个月左
  • 【Spring Data JPA】JPA常用注解

    文章目录 常用基本注解 Entity 指定该实体类被JPA管理 Table 指定该实体类对应哪张表 Id 单个主键 IdClass 联合主键 Column 表示实体类属性对应数据库表的哪一字段 列 OneToOne 联合主键代码示例 常用基
  • Dsp28335点亮LED灯(学习笔记)

    文章目录 一 前言 1 1 设计思路 1 2 工具 1 3 原理介绍 二 步骤 2 1 程序编写 三 验证 一 前言 1 1 设计思路 用DSP28335GPIO68管脚输出低电平 点亮LED灯 1 2 工具 1 普中科技开发板 TMS32
  • Python报UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position的解决办法

    with open input txt as f for line in f print line 按行读取文本文件时报错 UnicodeDecodeError gbk codec can t decode byte 0xad in pos
  • MYSQL 存储过程详解

    用了多年的mysql 基本上都是在写增删改查的SQL语句 对存储过程只是有所耳闻 一直没有认真的去了解 使用过 所以编写这篇文档 记录对存储过程的学习笔记 和 mysql函数编程的一些基础知识 目录 概念 创建存储过程 IN OUT INO
  • 用Python+PIL将目录下jpg图像批量转成pdf文件

    一 引言 最近单位有个事 需要将一堆图片文件先转成pdf文件 同事下了个windows下的图形软件 但要一个个转 几百个jpg文件 太过麻烦 因此想用Python批量来做 一查 图像处理库PIL库可以支持 一试 花了半个小时搞定 在此分享一
  • finclip小程序运行机制与微信小程序运行机制

    根据运行小程序的宿主应用环境不同 小程序也会有不同的启动机制 1 小程序启动 小程序会有两种情况 一种是冷启动 一种是热启动 冷启动 用户首次打开或小程序被宿主应用主动销毁后再次打开的情况 此时小程序需要重新加载启动 即冷启动 热启动 假如
  • openWRT系统删除文件出现 Read-only file system 错误

    是因为断电意外关机 再重启后系统文件变成了只读 我用下面办法解决了 ssh登录后执行命令 e2fsck y dev sda2 然后reboot一下就可以了 goodluck
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Notepad++的HEX-Editor插件

    安装HEX Editor既可以联网安装如下 也可以直接把HexEditor dll下载好了放到plugins插件文件夹里面 1 到网站下载Hex Editer工具 https sourceforge net projects npp plu
  • arduino uno r3 控制42不进电机+TB6600驱动

    1 接线图如下 2 arduino和TB6600链接 arduino TB6600 GND ENA 空 ENA GND DIR 5口 DIR GND PUL 6口 PUL 3 TB6600和42不进电机链接 TB6600 42不进电机 A
  • Spring系列学习之Spring Cloud GCP Google云平台消息传递及存储

    英文原文 https spring io projects spring cloud gcp 目录 概述 特性 入门 快速开始 学习 文档 示例 概述 Spring Cloud GCP项目旨在使Spring Framework成为Googl
  • Scanner注意事项与报错(next()、nextInt()、nextline()等)

    首先介绍一个经典的问题 nextline和nextInt混用出现的问题 当前面有nextInt时 nextLine不会等待你输入字符串 如下 如图 控制台还没有等我输入字符串就直接输出了num 因为你输入10的时候实际是按了回车 因此输入的
  • Hive常用函数介绍(窗口函数)

    1 窗口函数介绍 窗口函数 也叫也叫OLAP函数 Online Anallytical Processing 联机分析处理 可对数据库数据进行实时分析处理 2 窗口函数入门 2 1 函数说明 窗口函数 也可以叫做开窗函数 其从本质来看是将
  • Parasoft SOAtes发布最新v9.10.7版本,采用全新的测试数据管理方法!

    Parasoft SOAtest是业内最全面的测试解决方案 有着和loadrunner同样强大的性能测试 压力测试 负载测试功能 很高兴的告诉大家 Parasoft SOAtest更新至v9 10 7版本 新增多种功能并实现全面的API测试
  • IMU数据手套控制无人机飞行

    在未知和复杂的飞行环境中 无人机飞行动作的规划 需要手势辅助人机 针对这一问题 军事科学院国防技术国家创新研究所联合天津人工智能创新中心和华东理工大学团队研发了一款可以捕捉指尖运动和手势的IMU数据手套 用以实现人与无人机的交互和辅助控制
  • ipa-apk.cn/dbl.html,ComicBook/package-lock.json at master · liyuechun/ComicBook · GitHub

    name comicbook version 0 0 1 lockfileVersion 1 dependencies abab version 1 0 3 resolved https registry npmjs org abab ab
  • C++基础08---this,static

    1 this 1 在我们利用某个类对象调用成员函数时 编译器将这个对象的地址传递给该成员函数中的一个隐藏的this形参 2 任何对类成员变量的直接访问都被看作是通过this做隐式调用 3 this指针只能在成员函数中使用 全局函数 静态函数