C++学习笔记----8、掌握类与对象(二)---- 成员函数的更多知识(1)

news2024/10/3 2:27:45

        c++提供了成员函数的更多选择,我们来进行更多解密

1、静态成员函数

        成员函数,与数据成员一样,有时候整体应用于类,而不是每个对象。可以写与数据成员一样的静态成员函数。举个例子,考虑上一章的SpreadsheetCell类。有两个辅助函数:stringToDouble()与doubleToString()。这些成员函数不访问特定对象的信息,所以它们可以是静态的。下面是带有静态成员函数的类定义:

export class SpreadsheetCell
{
// Omitted for brevity
private:
	static std::string doubleToString(double value);
	static double stringToDouble(std::string_view value);
    // Omitted for brevity
};

        这两个成员函数的实现与前面的实现一样。不需要在成员函数定义前面再重复static关键字。注意静态成员函数关不在某个特定的对象上进行调用,所以它们没有shis指针,不会访问非静态成员进行执行。实际上,一个静态成员函数就像一个通常的函数。唯一的不同就是它可以访问private static和protected static成员。还有,它也可以访问对象上的同样类型的private与protected非静态成员。如果这些对象对静态成员函数可见,例如,通过传递引用或者作为参数指向这样的一个对象的指针。

        像一个通常的成员函数那样在类的任何成员函数中调用静态成员函数。这样,在SpreadsheetCell中的所有的成员函数的实现可以保持不变。

        在类之外,需要用类名来赋权给静态成员函数名,使用范围解析符。像通常一样应用访问控制。例如,如果有一个带有叫做bar()的公共静态成员函数,可以在下面代码的任何地方调用bar():

Foo::bar();

        注意:例子中作为private static定义的doubleToString()与stringToDouble()成员函数只是为了演示怎么定义与使用静态成员函数。对于这样的特定场景,两个成员函数都不会访问重写SpreadsheetCell实例中的任何数据。这样的话,也可以把这些辅助函数定义在SpreadsheetCell类之外spreadsheet_cell模块实现的一个非命名空间。

2、常量成员函数

        常量对象就是其值不能改变的对象。如果有一个const,const引用,或者指向const对象的指针,编译器是不会让你调用该对象上的任何成员函数,除非成员函数保证它们不会改变任何数据成员。保证成员函数不会改变数据成员的方式就是用const关键字标记成员函数自身。在上一章开发SpreadsheetCell类的过程中已经完成。提醒一下,下面是用const标记带有不会改变任何成员数据的成员函数的SpreadsheetCell类的一部分:

export class SpreadsheetCell
{
public:
	double getValue() const;
	std::string getString() const;
    // Omitted for brevity
};

        const规格是成员函数原型的一部分,必须在定义中也保持:

double SpreadsheetCell::getValue() const
{
	return m_value;
}

string SpreadsheetCell::getString() const
{
	return doubleToString(m_value);
}

        用const标记一个成员函数相当于与客户端代码签署了一个你不会在成员函数中改变对象的内部值的一个合约。如果你声明了一个成员函数const而实际上修改了数据成员,编译器就会报错。const成员函数通过使其在对每一个数据成员拥有reference-to-const的成员函数中出现来工作。这样的话,如果尝试改变一个数据成员,编译器就会报错。

        不可以声明静态成员变量为const,因为这样就重复了。静态成员函数在特定的类的实例上不管用,所以它不可能改变内部值。

        可以在非常量对象上调用const与non-const成员函数。然而,只能在常量对象上调用常量成员函数。下面举例:

int main()
{
	SpreadsheetCell myCell { 5 };
	println("{}", myCell.getValue());    // OK
    myCell.setString("6");               // OK

    const SpreadsheetCell& myCellConstRef { myCell };
    println("{}", myCellConstRef.getValue()); // OK
    myCellConstRef.setString("6"); // Compilation Error!
}

        应该养成把不修改对象的成员函数声明成const的习惯,这样就可以在程序中使用对常量对象的引用。

        注意常量对象仍然可以被破坏,可以调用其析构函数。然而,析构函数不允许声明成const。

2.1、可变的数据成员

        有时候你写了一个成员函数,“逻辑上”const但是碰巧改变了对象的一个数据成员。这种改变对任何用户可见的数据没有影响,但是技术上确实是一个改变,所以编译器是不会让你声明该成员函数为const的。例如,你想记录你的spreadsheet应用包含数据被阅读的频率。简单粗暴的方式就是给SpreadsheetCell类添加一个计数器记录每次对getValue()或者getString()的调用。不幸的是,在编译器看来,这就使得那些成员函数变成了non-const,这可不是你想要的。解决方案是使你的新计数器变量为可变的,它会告诉编译器在一个const成员函数中这种修改是没有问题的。下面是新的SpreadsheetCell类定义:

export class SpreadsheetCell
{
// Omitted for brevity
private:
    double m_value { 0 };
    mutable unsigned m_numAccesses { 0 };
};

        下面是getValue()与getString()的定义:

double SpreadsheetCell::getValue() const
{
    ++m_numAccesses;
    return m_value;
}

string SpreadsheetCell::getString() const
{
    ++m_numAccesses;
    return doubleToString(m_value);
}

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

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

相关文章

UFS 3.1架构简介

整个UFS协议栈可以分为三层:应用层(UFS Application Layer(UAP)),传输层(UFS Transport Layer(UTP)),链路层(UIC InterConnect Layer(UIC))。应用层发出SCSI命令(UFS没有自己的命令使用的是简化的SCSI命令),在传输层将SCSI分装为UPIU,再经过链路层将命令发送给Devices。下…

通信工程学习:什么是TCP传输控制协议

TCP:传输控制协议 TCP(Transmission Control Protocol,传输控制协议)是因特网协议套件中最重要的协议之一,它为应用程序提供了可靠、面向连接的通信服务。以下是TCP协议的详细解释: 一、TCP传输控制协议的…

双十一有哪些值得入手的好物?这五款宝藏好物不容错过!

在这个金秋送爽、收获满满的季节里,我们迎来了万众瞩目的双十一购物狂欢节。这不仅仅是一场简单的消费盛宴,更是每一位消费者期待已久、精心筹备的年度购物盛典。随着电商平台的不断革新与优惠力度的持续加码,双十一已经从一个简单的促销日成…

使用百度文心智能体创建多风格表情包设计助手

文章目录 一、智能定制,个性飞扬二、多元风格,创意无限 百度文心智能体平台为你开启。百度文心智能体平台,创建属于自己的智能体应用。百度文心智能体平台是百度旗下的智能AI平台,集成了先进的自然语言处理技术和人工智能技术&…

单目3d重建DUSt3R 笔记

目录 DUSt3R 三维重建 报错RecursionError: maximum recursion depth exceeded in comparison 报错 numpy.core.multiarray failed to import 报错Numpy is not available 解决 升级版mast3r 速度变慢 修改了参数设置脚本: 测试效果 操作技巧 DUSt3R 三维重…

[已解决] Install PyTorch 报错 —— OpenOccupancy 配环境

目录 关于 常见的初始化报错 环境推荐 torch, torchvision & torchaudio cudatoolkit 本地pip安装方法 关于 OpenOccupancy: 语义占用感知对于自动驾驶至关重要,因为自动驾驶汽车需要对3D城市结构进行细粒度感知。然而,现有的相关基准在城市场…

torchvision.transforms.Resize()的用法

今天我在使用torchvision.transforms.Resize()的时候发现,一般Resize中放的是size或者是(size,size)这样的二元数。 这两个里面,torchvision.transforms.Resize((size,size)),大家都很清楚,会将图像的h和w大小都变成size。 但是…

【python实操】python小程序之过七游戏以及单词单复数分类

引言 python小程序之过7游戏、单词单复数分类 文章目录 引言一、过7游戏1.1 题目1.2 代码1.2.1 while循环1.2.2 for循环1.2.3 调用函数形式 1.3 代码解释 二、单词单复数分类2.1 题目2.2 代码2.3 代码解释 三、思考3.1 过七游戏3.2 单词单复数分类 一、过7游戏 1.1 题目 7的倍…

大模型 LLaMA-Omni 低延迟高质量语音交互,开源!

最近这一两周看到不少互联网公司都已经开始秋招发放Offer。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球…

python-patterns:Python 设计模式大全

python-patterns 是一个开源的 Python 项目,它提供了各种经典的设计模式的 Python 实现。设计模式是一种针对常见软件设计问题的可复用解决方案,通过使用设计模式,开发者可以编写出结构更加合理、易于维护和扩展的代码。 Python 是一门动态语…

GraphEval: A Knowledge-Graph Based LLM Hallucination Evaluation Framework

文章目录 题目摘要引言问题陈述相关工作GraphEval:我们的评估方法使用LLM构建知识GraphCorrect:使用GraphEval纠正幻觉实验讨论结论 题目 GraphEval:一个基于知识图的LLM幻觉评估框架 论文地址:https://arxiv.org/abs/2407.10793 摘要 评估大型语言模型(LLM)响应和…

【计算机科研方法指南】- 读书笔记《学术咸鱼自救指南》+于老师科研课

前言简介 因为自己在做计算机科研的时候,一开始很不顺利,所以专门去研究了一些具体的计算机科研方法。这里的方法主要参考了两个资料,一个是《学术“咸鱼”自救指南》,一个是于静老师科研课。 《学术“咸鱼”自救指南》是作者钱…

【微服务】组件、基础工程构建(day2)

组件 服务注册和发现 微服务模块中,一般是以集群的方式进行部署的,如果我们调用的时候以硬编码的方式,那么当服务出现问题、服务扩缩容等就需要对代码进行修改,这是非常不好的。所以微服务模块中就出现了服务注册和发现组件&…

视频创作黑科技!CogVideoX秒生成艺术视频

视频创作黑科技!CogVideoX秒生成艺术视频 CogVideoX上线啦!🎉 它能把文字和图片变成惊艳视频🎥。CogVideoX-5B如同好莱坞导演,快速生成高质量内容⚡,完美捕捉创意细节✨。让你轻松成为视频创作大师&#x…

Linux命令--03----帮助类命令、开关机类命令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.帮助类命令man获取帮助信息help获得shell内置命令的帮助信息 2.开关机类命令2.1 开关机命令一般Linux不会经常进行关机操作,正确的关机流程为: sync>shutdown&…

初识TCP/IP协议

回顾上文 来回顾一下TCP协议的特性,有一道比较经典的题:如何使用UDP实现可靠传输,通过应用程序的代码,完成可靠传输的过程? 原则,TCO有啥就吹啥,引入滑动窗口,引入流量控制&#x…

电子连接器温升仿真教程 二

在《电子连接器温升仿真教程 一》中详细介绍了用内热法做电子连接器温升仿真的操作步骤与方法,本教程将讲解用电流电压法做电子连接器温升仿真。 本教程,将以下面产品为例演示温升仿真方法其操作步骤。 该连接器为电池连接器,其Housing材料为LCP+30%GF,端子材质为铍铜…

IDEA中配置启动类的Active Profiles

如现在有以下三个配置文件 application.yaml application-dev.yaml application-local.yaml 当我在本机启动时,想使用application-local.yaml,而不是application-dev.yaml,那么可以这样配置:(我这是添加启动类一起的&a…

基于深度学习的乳腺癌分类识别与诊断系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 乳腺癌是全球最常见的癌症之一,早期诊断对于治疗效果至关重要。近年来,深度学习技术在医学图像分析领域取得了显著进展,能够从大量的医学影像数据中自动学习和提…

10.2学习

1.IOC控制反转 IoC(Inverse of Control:控制反转)是⼀种设计思想,就是将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语⾔中也有应⽤,并⾮ Spring 特有。 ​ IoC 容器是 Spring⽤来实现 IoC …