C++学习—类的成员函数和变量的访问、静态与非静态成员函数

2023-10-27

类的成员访问方式可以分为两类

  • 没有实例化对象的访问
  • 有实例化对象的访问

一、没有实例化对象的访问

class controller
{
publicstatic void func();

protectedint a;
int b;
};

int main()
{
	controller::func();
}

没有实例化的对象,可以通过类名+::的方式访问成员函数,但是只能访问静态成员函数

二、具有实例化对象的访问

具有实例化的对象时,在访问成员函数时,有两种方式:

  • 通过对象名.成员函数
  • 指针
int main()
{
//对象名+`.`
	controller mpc;
	mpc.func();
// 指针
	controller *p = new controller();
	p->func();
	//或者
	controller lqr;
	controller *p = &lqr;
	p->func();
}

三、什么是静态成员和非静态成员

1、静态数据成员

  • 静态数据成员是被所有的类对象共享的,也就是说无论创建了多少了对象静态数据成员就只有一份,只要有一个对象修改了静态数据成员,其他对象的该成员也会改变。简单的说,就是所有对象都使用这一个数据成员,并不是每个对象单独一个。
  • 静态成员变量在对象创建之前就已经被分配了内存空间。
  • 由于静态数据成员先于类的实例化对象而存在,因此,访问静态数据成员不能通过类的实例化对象访问,可以直接通过类的作用符::访问,即static int Np; controller::Np;
  • 静态成员不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化。
  • 关键字static只出现类的内部。
  • 在类外定义且初始化,初始化的格式如下:数据类型 类名::静态成员变量名 = 初值;
  • 不能用参数初始化表,对静态成员变量进行初始化。因为初始化列表是构造函数独有,而静态成员数据不能用构造函数初始化(静态数据成员先于对象,不属于任何一个对象)。
  • 常量静态成员可以在类内初始化

类的静态数据成员的访问

  • 使用类的对象访问
  • 成员函数可以直接访问
  • 类作用符::直接访问

2、非静态数据成员

  • 非静态数据成员,类的每个实例都有一份拷贝(动态区)。

非静态数据成员的访问

非静态数据必须通过类的实例化对象访问,常用的访问方式有以下两种:

  • 类的实例化对象
  • 类指针

4、静态成员函数

  • 被说明为static的成员函数,由一个类的所有对象共享。
  • 引入静态成员函数的目的:访问同一类中的静态数据成员,维护对象之间共享的数据。
  • 一般而言,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象。静态成员函数没有隐含的this指针。所以,它就无法访问自己类的非静态成员。

静态成员函数的调用方式
在类外调用,两种方式

  • 类名::静态公有成员函数名(实参表)
  • 对象名.静态公有成员函数名(实参表)

在类内调用:

  • 直接调用静态成员函数

静态成员函数访问本类成员的权限

  • 可以直接访问该类的静态数据和静态函数成员
  • 访问非静态数据成员,必须通过参数传递方式得到对象名,再通过对象名来访问

5、非静态成员函数(普通成员函数)

  • 非静态成员函数属于类的实例化对象所有,所以只有在创建类的实例化对象的时候才会分配内存,访问类的非静态函数要通过对象来实现。
  • 非静态成员函数通过对象(或对象指针)来访问,有this指针。

总结

  • 静态数据成员:是类的一部分,为类的所有实例共享(静态区)
  • 非静态数据成员:类的每个实例都有一份拷贝(动态区)
  • 静态数据成员先于类的实例化对象而存在,没有有this指针;非静态数据成员存在于类的实例化对象之后,具有this指针

四、this指针

1、什么是this指针

  • 在建立对象时,系统会为每一个对象分配独立的存储空间,也就是给每个对象中的数据成员都分配有自己独立的存储空间。

  • 如果对同一个类定义多个对象,则有多个同样大小的空间存放对象中的数据成员,但对于成员函数来说,一个函数的代码段在内存中只有一份。也就是说,同一个类中的不同对象在调用自己的成员函数时,其实它们调用的是同一段函数代码。

  • 那么,当一个对象调用自己的成员函数时,如何保证成员函数中对数据成员的处理是针对自己的数据成员而不是其他对象的数据成员呢?

    答案就是:this指针
    具体来说,就是,每一个非静态成员函数中都包含一个隐藏的this指针

2、this指针存放的地址是什么

this指针记录的是当前对象的内存地址,也就是this指针指向当前对象

3、this指针的特点

  • this指针的类型:类类型* const
  • this指针并不是对象本身的一部分,不影响sizeof的结果
  • this指针的作用域在类成员函数的内部
  • this指针是”类成员函数”的第一个默认隐含参数,编译器自动维护 传递,类编写者不能显式传递
  • 只有在类的非静态成员函数中才可以使用this指针,其它任何函数都不可以

this指针示例:

class A
{
public:
	void set(int x)
	{
		this->a = x;
	}
	void print()
	{
		cout << "this" << this << endl;
	}
private:
	int a;
};
int main()
{
	A a1;
	cout << "&a1=" <<&a1<< endl;
	a1.print();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++学习—类的成员函数和变量的访问、静态与非静态成员函数 的相关文章

  • Taglib:性能和崩溃问题

    我在 Qt 应用程序中使用 taglib 库 1 7 2 从音乐文件夹中读取 mp3 文件的一些元数据 问题是我发现它非常慢 例如 这是代码 QString path C Music QDir d path QStringList file
  • 如何重写实体数据模型创建的对象上的 Equals?

    我创建了一个实体数据模型 它从 SQLite 数据库中提取记录 其中一个表是 People 我想重写 person Equals 方法 但我不确定去哪里进行这样的更改 因为 Person 对象是自动生成的 我什至看不到该 autogen 代
  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 使用可加载内核模块修改帧缓冲区(/dev/graphics/fb0)参数

    Problem 我必须配置 Android 平台使用的各种 LCD 显示器 几乎在所有情况下 都没有针对感兴趣的 LCD 显示器免费提供的电气规格 但通过经验和逆向工程 可以很好地猜测参数 我正在尝试使用可加载内核模块来微调显示参数 也欢迎
  • HTML 文档

    有没有一个工具可以从 VS2010 生成的 XML 文档文件生成 HTML 页面 我在谷歌上搜索了这样的工具 但没有找到 我下载并安装了SandCastle 但我不明白如何使用它 尝试使用Sandcastle 帮助文件生成器 http sh
  • gets 和 scanf 有什么区别?

    如果代码是 scanf s n message vs gets message 有什么区别 似乎两者都获取消息的输入 基本区别 参考您的特定场景 scanf 遇到一个时结束接受输入whitespace newline or EOF gets
  • 外部剃刀视图看不到外部模型

    我对外部剃刀视图有疑问 在我的项目中 我有主 mvc Web 程序集和动态加载的外部类库程序集 来自 DB 及其自己的控制器 视图和模型 这些程序集在运行时不会直接引用和加载 我能够通过为控制器创建自定义控制器工厂 为视图创建自定义虚拟路径
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • 如何处理作为参数传递到方法中的 Lambda 表达式 - C# .NET 3.5

    我对 Lambda 表达式的了解有点不稳定 虽然我可以编写使用 Lambda 表达式 又名 LINQ 的代码 但我正在尝试编写自己的方法 该方法采用一些 Lambda 表达式类型的参数 背景 我正在尝试编写一个方法 该方法从任何其他对象类型
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 是否有理由为什么用 XmlInclude 修饰的基类在序列化时仍然会抛出类型未知的异常?

    我将简化代码以节省空间 但所提供的内容确实说明了核心问题 我有一个类 它的属性是基类型 有 3 个派生类可以分配给该属性 如果我将任何派生类分配给容器并尝试序列化容器 XmlSerializer 会抛出可怕的错误 类型 x 不是预期的 使用
  • 如何通过 Excel 互操作对象自动调整列大小?

    下面是我用来将数据加载到 Excel 工作表中的代码 但我希望在加载数据后自动调整列的大小 有谁知道自动调整列大小的最佳方法 using Microsoft Office Interop public class ExportReport
  • 是否可以在 Eclipse 中为除 Java 之外的 Eclipse 编写插件?

    谁能帮我用c 写一个eclipse插件 weekens 和 celavek 感谢您提供的信息 我正在研究 JNI 并将尝试实现它 celavek 我们必须做什么样的主控 控制 在C 和java接口中处理是否风险更大 我的要求是在 Java
  • 在 C# 中为 ListBox 分配数据源时,如何从 ListBox 中删除所选项目?

    在 C 中为 ListBox 分配数据源时 如何从 ListBox 中删除所选项目 尝试删除时出现错误 设置 DataSource 属性后 无法修改项目集合 但是当我尝试从数据源 数据表 中删除项目时 它会抛出错误 因为 数据行不在当前行集
  • RC4 实现与 openssl 输出不匹配

    我的目标是在 C C 中实现 RC4 流密码 并确保它产生与使用时相同的输出openssl命令 按照伪代码维基百科 https en wikipedia org wiki RC4 该实现似乎有效 因为它可以加密和解密内容 但是 加密的输出与
  • Unity 错误“内部构建系统错误。后端退出,代码为 -1073740791。”摧毁/杀死了我的项目

    好吧 我可能在这里夸大了 但这是真的 当我开始打开它时 该项目由于错误 内部构建系统错误 后端退出 代码为 1073740791 而被破坏 应用程序 这个项目已经在Google Play上发布了 也许和设置有关 有人可以帮忙吗 完整错误 I
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • 2.5万字讲解DDD领域驱动设计,从理论到实践掌握DDD分层架构设计,赶紧收藏起来吧

    推荐好文 2 5万字详解23种设计模式 微服务springcloud环境下基于Netty搭建websocket集群实现服务器消息推送 netty是yyds 代码中如何干掉太多的if else即if else的多种替代方案以提高代码质量通过公
  • 工作流程引擎之flowable(集成springboot)

    0 背景 现状 公司各部门业务系统有各自的工作流引擎 也有cross function的业务在不同系统或OA系统流转 没有统一的去规划布局统一的BPM解决方案 近期由于一个项目引发朝着整合统一的BPM方案 特了解一下市面上比较主流的开源和收
  • 充分必要条件

    充分必要条件 p 是 q 的充分必要条件 等价于 q 的充分必要条件是 p 则 p 可 推出 q 证明了 充分性 q 可推出 p 证明了必要性
  • nvprof 性能评估主要指标

    nvprof 用于性能评估的三个主要指标 occupancy nvprof metrics achieved occupancy helloCuda out gld throughput nvprof metrics gld through
  • 数据分析|情绪字典 绘图 火星坐标转换 「某社交平台」内容情绪分析

    任务要求 情绪理解是文本处理里最常见任务之一 现提供一个五类情绪字典 由情绪词组成 5 个文件 人工标注 实现一个情绪分析工具 并利用该工具对10000条 某社交平台 内容进行测试和分析 一行一条 某社交平台 内容 字典数据见公开数据中的e
  • Windows内核中的数据结构与函数调用

    2 3重要的数据结构 2 3 1驱动对象 Windows内核认为许多东西都是 对象 比如一个驱动 一个设备 一个文件 甚至其他的一些东西 采用面对对象的编程方式 但是使用的是C语言 一个驱动对象代表了一个驱动程序 或者说一个内核模块 驱动对
  • mybatis selectKey 标签

    1 插入返回主键
  • 基于springboot+vue+Java的自习室预定系统+数据库(附源码,文档)

    今天为大家带来的是 基于springboot vue自习室预定系统 源码 文档 开发环境 源码下载地址 https download csdn net download gdutxiaoxu 87595996 后端 开发语言 Java 框架
  • 华为OD机试 - 告警抑制(Python)

    题目描述 告警抑制 是指高优先级告警抑制低优先级告警的规则 高优先级告警产生后 低优先级告警不再产生 请根据原始告警列表和告警抑制关系 给出实际产生的告警列表 不会出现循环抑制的情况 告警不会传递 比如A gt B B gt C 这种情况下
  • 一个200W+30W播放量的物联网创意小视频是怎么创作的?

    title B站拆解视频的创作 tags 拆解 date 2020 5 18 00 53 00 urlname bilibili iphoneSE 折腾的最高境界 把iPhone SE改装成台式机全纪录 这是在B站和达尔闻合作的拆解视频 达
  • 用户分析报告

    用户分析报告 随着国民消费水平的提高和年轻消费群体的崛起 中国的新式茶饮市场不断快速发展 新式茶饮已成为绝大多数年轻人接触茶及茶文化的渠道来源 在市场竞争如此激烈的前提下 品牌如何发挥自身的优势和凝聚力 将这一群对新式茶饮有需求的人集结在一
  • 移动软件技术——Activity(1)

    Part1 Activity基础 1 概念 Activity是Android程序中最基本的组件 显示可视化的用户界面 接收与用户交互所产生的界面事件 一个Activity代表一个单独的屏幕 可以添加多个控件如 Button TextView
  • Linux的top命令解析

    Top命令是什么 TOP命令是Linux下常用的性能分析工具 能够实时显示系统中各个进程的资源占用状况 TOP是一个动态显示过程 即可以通过用户按键来不断刷新当前状态 如果在前台执行该命令 它将独占前台 直到用户终止该程序为止 比较准确的说
  • java Process.waitFor阻塞

    关于java Process waitFor 进程阻塞问题 摘录自 http lelglin iteye com blog 1487351 问题 有同学遇到java调用Process exec node purppeteer插件去浏览器截图
  • js浏览器打开小窗口

    export const openWindow url title w h gt Fixes dual screen position Most browsers Firefox const dualScreenLeft window sc
  • 华为机试:停车场车辆统计(Java解法)

    停车场车辆统计 特定大小的停车场 数组cars 表示 其中1代表有车 0代表无车 车辆大小不一 统计停车场最少可以停多少辆车 返回具体的数字 长度小于1000 输入 小车占一个车位 长度1 中车占两个车位 长度2 大车占三个车位 长度3 输
  • 虚函数在对象中的内存布局

    典型地 C 通过虚函数实现多态性 多态性的定义 无论发送消息的对象属于什么类 他们均发送具有相同形式的消息 对消息的处理方式可能随接受消息的对象而变 具体地说 在某个基类上建立起来的类的层次结构中 可以对任何一个派生类的对象中的同名成员函数
  • VirtualKD-3.0双机调试过程问题记录

    1 vmware虚拟机本身不需要额外配置 但虚拟机名不要是中文 不然会卡死 2 打开virtual 然后点击debugger path 选择windbg exe 此时必须选windbg 选windbgx会没有效果 然后windug exe
  • 报错 RuntimeError: No such operator image::read_file

    初学者在刚接触cv时经常会遇到的问题 一般是文件输入的路径不对 linux 系统使用 分割地址 Windows 使用 分割 如果直接使用某个文件的地址 注意在双引号外加 r 如 r C Users master Desktop 1 jpg
  • C++学习—类的成员函数和变量的访问、静态与非静态成员函数

    类的成员访问方式可以分为两类 没有实例化对象的访问 有实例化对象的访问 一 没有实例化对象的访问 class controller public static void func protected int a int b int main