C++:const成员函数,初始化列表,static成员,友元

news2024/12/24 20:19:43

一.const成员函数

概念:将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。

在使用成员函数的过程中,我们在函数参数位置是无法显示调用this指针的,但很多函数的使用又不会改变this指针指向的内容(比如说打印成员函数的值),这时候我们就可以直接在成员函数后加上一个const即可:

//比如我们要实现一个日期类打印成员函数:
void Print()//这时候传入的this指针类型为Date const* this
{
    //.......
};
//如果这样写:
void Print()const//传入的this类型就变为const Date const* this
{
    //.......
}

二.(补充构造函数内容)初始化列表:

我们之前说过,C++中一共有三种默认构造函数,我们通常需要自己去写我们的构造函数,而对成员的初始化我们通常以给定数值或使用缺省参数去完成初始化。但实际上,C++中的初始化都会去使用构造函数中的初始化列表进行初始化:

//本文的参考类均为普通日期类
class Date
{
public:
	Date(int year = 2024, int month = 8, int day = 13)
		:_year(year),
		_month(month),
		_day(day)
	{

	}
private:
	int _year;
	int _month;
	int _day;
};

这就是初始化列表的一般形式。

初始化列表的特点: 

1.每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。
2.引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。引用与const都是在定义的时候直接初始化,后面无法改变,所以必须要在初始化列表进行初始化。
3.C++11支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的。

比如说这样也可以达到对日期类的初始化目的:

class Date
{
public:
	Date(int year = 2024, int month = 8, int day = 13)
		:_year(year),
		_month(month),
	{

	}
private:
	int _year;
	int _month;
	int _day = 0;
};


4.尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。
5.初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序和初始化列表顺序保持一致。
 

总结图表:

三.static成员与友元

 2.1Static成员

1.用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。
2.静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。
3.用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
4.静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
5.非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
6.突破类域就可以访问静态成员,可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。
7.静态成员也是类的成员,受public、protected、private 访问限定符的限制。
8.静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。

这里我们可以用牛客网的一道题目去介绍下这些特点    求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com):

class Sum{
public:
Sum()
{
    _ret += _i;
    ++_i;
}
static int GetResult()
{
    return _ret;
}
private:
static int _ret;
static int _i;
};
int Sum:: _i = 1;
int Sum:: _ret = 0;



class Solution {
public:
    int Sum_Solution(int n) {
        Sum arr[n];
        return Sum::GetResult();
    }
};

这是一种利用static特性解决该问题的解法,因为开始的时候我们创建了一个Sum类型的数组,编译器这时就会去调用n次的Sum的构造函数,每次调用后静态成员值保持不变,就达到了我们预期的等差数列之和。其次,最终返回值的时候,由于静态成员函数突破类域即可使用,所以我们使用一个静态成员函数去获取我们的累加值,完成题目。

2.2友元 

简单来说,由于我们类成员一般是private或protect,所以外部函数无法直接访问类对象的成员,虽然我们可以直接写一个成员函数来返回成员的值,但远不如直接将其设置为友元更加方便:

class Date
{
	friend void Print(const Date& d);
public:
	Date(int year = 2024, int month = 9, int day = 13)
		:_year(year),
		_month(month),
		_day(day)
	{

	}
private:
	int _year;
	int _month;
	int _day;
};

void Print(const Date& d)
{
	cout << d._year << '-' << d._month << '-' << d._day << endl;
}

int main()
{
	Date d;
	Print(d);
	return 0;
}

这样就可以轻松调用类的成员。当然你的friend放的位置不影响其发挥作用,但我一般习惯放到开头。

TIps:

1.友元提供了一种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类声明的前面加friend,并且把友元声明放到一个类的里面。
2.外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,他不是类的成员函数。
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
4.一个函数可以是多个类的友元函数。
5.友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。
6.友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元。
7.友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。
8.有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

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

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

相关文章

华为大咖说 | 智能时代,为什么“流动性”是生态产业的核心?

本文作者&#xff1a;任旭东&#xff08;华为首席开源联络官&#xff09;全文约4205字&#xff0c;阅读约需9分钟 经济全球化主要表现为全球性或区域性的商品、资本、技术和劳动力等的高度流动性与市场一体化进程&#xff0c;以及由此而导致的商品和要素的价格趋同、交易成本的…

大模型从失败中学习 —— 微调大模型以提升Agent性能

人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时&#xff0c;通常只使用成功的交互轨迹&#xff0c;而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费&#xff0c;也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…

1.基础计算01

1.基础计算 比方有10用户对象信息list对象&#xff0c;通过ID进行从小到大排序&#xff0c;如何进行&#xff0c;第一位对象信息除了ID复制到第二位&#xff0c;第二位复制到第三位&#xff0c;第三位复制到第4位&#xff0c;…一直到最后一位&#xff0c;将最后一位信息除ID外…

位运算符的优先级

四则运算在位运算符的中间&#xff0c;优先级从高到低排列如下&#xff1a; 口诀&#xff1a;反四夷&#xff0c;与异火。 反对四方蛮夷&#xff0c;拿什么反对呢&#xff1f;与异族火拼。 反指按位取反&#xff08;~&#xff09;&#xff0c;四指四则运算&#xff08;*、/、…

开发者说:使用通义灵码,参与开源项目全程纪实

缘起 OceanBase。作为一个充满好奇心的 DBA&#xff0c;一直一来想探寻数据库的内部世界。开源为我们这些好奇的猫打开了一扇新世界的大门。OceanBase 作为分布式关系型数据库的排头兵&#xff0c;自然进入了我的优选名单。起初走进了 OceanBase[1]的世界逛了一圈&#xff0c;这…

OpenAI 发布 o1 模型具备类似人类的推理能力,大模型已经达到人类博士水平了吗?

什么是OpenAI o1&#xff1f; OpenAI o1&#xff08;后面简称o1&#xff09;是OpenAI在2024.9.12号发布的最新大模型&#xff0c;主要针对的任务是复杂任务推理&#xff0c;比如竞赛难度的编程问题&#xff0c;奥赛难度的数学问题等。参考OpenAI原始介绍: https://openai.com…

学习笔记 - 知识图谱的符号表示方法

学习笔记 - 知识图谱的符号表示方法 说明&#xff1a; 首次发表日期&#xff1a;2024-09-13个人阅读学习并摘录成笔记 知识表示的相关名词定义 以下内容摘录自 Knowledge Graphs Applied 2.3小节&#xff0c;然后AI翻译人工润色。 实体&#xff08;Entities&#xff09;—表…

【CTF Web】BUUCTF BUU BURP COURSE 1 Writeup(X-Real-IP伪造+POST请求)

BUU BURP COURSE 1 1 点击启动靶机。 解法 用 hackbar 将 X-Forwarded-For 设为 127.0.0.1&#xff0c;无效。提示&#xff1a;只能本地访问。 将 Referer 设为 127.0.0.1&#xff0c;无效。提示&#xff1a;只能本地访问。 将 X-Real-IP 设为 127.0.0.1&#xff0c;成功&am…

快速开发与维护:探索 AndroidAnnotations

在移动应用开发的世界中&#xff0c;效率和可维护性是两个至关重要的要素。随着应用功能的不断增长和用户需求的不断变化&#xff0c;开发者们一直在寻找能够提高生产力的工具和框架。今天&#xff0c;我们将深入探讨一个能够帮助开发者实现快速开发和易于维护的框架——Androi…

Unity for Android使用蓝牙低功耗Bluetooth LE

Unity2021.3.35f1 插件&#xff1a;Bluetooth LE for iOS and Android v2.3.unitypackage 1、将插件资源包导入unity中 2.修改插件中的AndroidManifest文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schem…

交叉编译Python3.8

1. 交叉编译python 工程组织&#xff1a;根目录设置为/home/a123/xxx/tools/4python 内容创作不易&#xff0c;对您有帮助的话&#xff0c;可以支持打赏一下下 配置脚本统一命名为conig_arm/pc_<package>.sh 交叉编译出的头文件以及动态库文件统一放在cross_compile_de…

“爱学术”期刊采编系统的设计与实现---附源码 76126

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用SpringBoot技术建设“爱学术”期刊…

【Qt】样式属性

样式属性 QSS 中的样式属性⾮常多, 不需要都记住. 核⼼原则还是⽤到了就去查. ⽂档的 Qt Style Sheets Reference 章节详细介绍了哪些控件可以设置属性, 每个控 件都能设置哪些属性等. 在样式属性中有一个“盒子模型需要重点介绍” 盒子模型 在⽂档的 Customizing Qt Widget…

Kubernetes从零到精通(10-服务Service)

Service简介 Deployment这种工作负载能管理我们应用Pod的副本数&#xff0c;并实现动态的创建和销毁&#xff0c;所以Pod本身是临时资源&#xff08;IP随时可能变化&#xff09;。现在如果某组Pod A需要访问另一组Pod B&#xff0c;A就需要在应用的配置参数里动态跟踪并更改B的…

java(1)数据类型,运算符,逻辑控制语句以及基本应用

目录 ​编辑 1.前言 2.正文 2.1数据类型与变量 2.1.1字面常量 2.1.2数据类型 2.1.3变量 2.1.3.1整型 2.1.3.2浮点型 2.1.3.3字符型 2.1.3.4布尔型 2.1.4类型转换与类型提升 2.1.4.1字符串的拼接 2.1.4.2整型转字符串 2.1.4.3字符串转整数 2.2运算符 2.2.1算术运…

【效果+教程】免费!实操用AI设计图标Logo,不仅省了设计费,还是副业新赛道!

Logo是一个品牌或公司的视觉标识 一个好的logo可以帮助消费者快速识别品牌&#xff0c;增强品牌的可见性和记忆度。 一个专业设计的logo能够提升品牌的可信度&#xff0c;给人一种专业和可靠的印象。 一个设计精美且富有意义的logo能够与消费者建立情感联系&#xff0c;增强…

10887辆 捷途旅行者8月再夺方盒子销冠

近日&#xff0c;8月汽车销量排行榜正式出炉。捷途旅行者年内第四次实现月销过万&#xff0c;以10887辆的优异成绩&#xff0c;持续领跑方盒子市场。作为名副其实的畅销车型&#xff0c;捷途旅行者自去年上市以来&#xff0c;不仅连续三个季度卫冕方盒子销量冠军&#xff0c;创…

C++类与对象(下)--最后的收尾

内部类 • 如果⼀个类定义在另⼀个类的内部&#xff0c;这个内部类就叫做内部类。内部类是⼀个独⽴的类&#xff0c;跟定义在 全局相⽐&#xff0c;他只是受外部类类域限制和访问限定符限制&#xff0c;所以外部类定义的对象中不包含内部类。 #include<iostream> using…

C++中string使用

目录 介绍 使用 迭代器&#xff08;Iterator&#xff09; begin&#xff0c;end rbegin&#xff0c;rend 容量&#xff08;Capacity&#xff09; size&#xff0c;length capacity empty clear resize reserve 元素访问&#xff08;Element access&#xff09; ope…

美国陆军发布下一代目标识别和感知倡议

文章目录 前言一、下一代目标识别与感知倡议的内容二、下一代目标识别与感知倡议重点关注领域(1)目标标记、跟踪和定位 (TTL)(2)侦察和监视 (R&S)(3)无人系统 (UMS)前言 2024年7月23日,美国陆军发布了下一代目标识别与感知倡议,希望工业界能够开发战场态势感知、侦…