【C++】 类和对象(上)

article/2025/6/11 11:00:08

1.类的定义

1.1类的定义格式

• class为定义类的关键字,后跟一个类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。

• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_或者m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。

 • C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还是推荐⽤class定义类。

• 定义在类⾯的成员函数默认为inline。

通俗点来说说呢,类就是struct的升级plus版本,将成员由c语言中struct只能够是变量增添了函数,下面我们写一个简单的日期类

class Date
{
public:void Init(int year, int month, int day){_year = year;_month = month;_day = day;}
private:// 为了区分成员变量,⼀般习惯上成员变量 // 会加⼀个特殊标识,如_ 或者 m开头 int _year; // year_ m_yearint _month;int _day;
};
int main()
{Date d;d.Init(2024, 3, 31);return 0;
}

可以看出相较于c语言中的struct,类可以以函数作为成员

1.2访问限定符

我们在上述代码中,我们看到了其中有public和private,其中是什么意思呢?

• C++⼀种实现封装的⽅式,⽤类将对象的属性与⽅法结合在⼀块,让对象更加完善,通过访问权限 选择性的将其接⼝提供给外部的用户使⽤。

• public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访 问,protected和private是⼀样的,以后继承章节才能体现出他们的区别。

 • 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有 访问限定符,作⽤域就到}即类结束。

• class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

• ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public

 

 在如图所示我们就可以看到在main函数中,_year并不能被识别,这就是因为_year是被private修饰的

1.3类域

 • 类定义了⼀个新的作⽤域,类的所有成员都在类的作⽤域中,在类体外定义成员时,需要使⽤::作 ⽤域操作符指明成员属于哪个类域。

• 类域影响的是编译的查找规则,下⾯程序中Init如果不指定类域Stack,那么编译器就把Init当成全 局函数,那么编译时,找不到array等成员的声明/定义在哪⾥,就会报错。指定类域Stack,就是知 道Init是成员函数,当前域找不到的array等成员,就会到类域中去查找。

 

#include<iostream>
using namespace std;
class Stack
{
public:// 成员函数 void Init(int n = 4);
private:// 成员变量 int* array;size_t capacity;size_t top;
};
// 声明和定义分离,需要指定类域 
void Stack::Init(int n)
{array = (int*)malloc(sizeof(int) * n);if (nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;
}
int main()
{Stack st;st.Init();return 0;
}

2.this指针

• Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调⽤Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了 ⼀个隐含的this指针解决这⾥的问题

我们看看下列代码 

#include<iostream>
using namespace std;
class Date
{
public:// void Init(Date* const this, int year, int month, int day)void Init(int year, int month, int day){// 编译报错:error C2106: “=”: 左操作数必须为左值 // this = nullptr;// this->_year = year;_year = year;this->_month = month;this->_day = day;}void Print()
{cout << _year << "/" << _month << "/" << _day << endl;}
private:// 这⾥只是声明,没有开空间 int _year;int _month;int _day;
};
int main()
{// Date类实例化出对象d1和d2 Date d1;Date d2;// d1.Init(&d1, 2024, 3, 31);d1.Init(2024, 3, 31);d1.Print();d2.Init(2024, 7, 5);d2.Print();return 0;
}

我们可以看到d1和d2都是同样的参数,那么类是怎么区分d1和d2的呢,这就因为其中存在一个隐形指针this

⽐如Date类的Init的真实原型为

 void Init(Date* const this, int year, int month, int day)

C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显 ⽰使⽤this指针。

能够准精确的分辨d1和d2就是因为有this指针

2.1this指针示例 

让我们看看下列题目

1.下⾯程序编译运⾏结果是()

 A、编译报错 B、运⾏崩溃 C、正常运⾏

#include<iostream>
using namespace std;
class A
{
public:void Print(){cout << "A::Print()" << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

答案是C正常运行

在看看下面这题

#include<iostream>
using namespace std;
class A
{
public:void Print(){cout << "A::Print()" << endl;cout << _a << endl;}
private:int _a;
};
int main()
{A* p = nullptr;p->Print();return 0;
}

答案是B运行错误,这是为什么呢?

原因就在于

下面的代码比上面的代码多了一行

cout << _a << endl

其中涉及了成员_a,所以这里进行访问时对空指针进行了解引用,因此报错。

本次的分享就到这里结束,后续会继续分享,感谢阅读!


http://www.hkcw.cn/article/qRIeXIMdUy.shtml

相关文章

Spring之循环依赖源码解析

在学习Spring源码流程解析之前&#xff0c;首先要清楚什么是循环依赖&#xff0c;怎么解决循环依赖再去跟着源码学习一遍&#xff0c;更能加深印象。Mark

贾乃亮晒与甜馨端午节合照 父女笑容神同步

5月31日,贾乃亮在社交媒体上晒出与女儿甜馨的端午节合照,并提问大家猜猜他和甜馨吃的是甜粽还是咸粽。有网友评论说,两人的脸看起来非常相似,就连笑容都很像。甜馨,本名贾云馨,2012年10月23日出生于北京,是演员贾乃亮与李小璐的女儿。2014年4月,她与父亲一起参加了明星…

外交部深夜发声:勿要玩火 坚决反对美方消极言论

6月1日,外交部发言人就美国防长赫格塞思在香格里拉对话会上的涉华消极言论回答了记者提问。有记者问,5月31日,美国防长赫格塞思在香格里拉对话会上发表演讲,大肆渲染中国威胁,并就涉台、南海等问题发表消极言论。对此,中方表示强烈不满和坚决反对,已向美方提出严正交涉。…

零跑汽车5月交付量45067辆 增速超148%

6月1日,据零跑汽车公众号消息,2025年5月,零跑汽车单月交付量45067辆,增速超148%。连续三个月稳居造车新势力领先地位。责任编辑:zx0176

债市全年低点出现在何时 8月和12月规律探析

自2019年降息周期以来,10年国债收益率的全年低点容易出现在8月和12月。这背后的原因可以从基本面、政策面、资金面及机构行为等角度进行分析。从基本面来看,2019年以来,从第二季度开始,GDP增速容易低于全年预期目标,PMI也容易进入下行或低于枯荣线的阶段。而政策发力可能使…

中方回应美防长涉华消极言论 坚决反对美方挑衅挑拨

6月1日,外交部发言人针对美国防长赫格塞思在香格里拉对话会上的涉华消极言论进行了回应。有记者提问称,5月31日,赫格塞思在香格里拉对话会上发表演讲,渲染中国威胁,并就台湾、南海等问题发表负面言论。发言人在回答中指出,赫格塞思无视地区国家追求和平与发展的愿望,兜售…

孟维瞻:马斯克挥一挥衣袖,带走了什么,留下了什么?

【文/观察者网专栏作者 孟维瞻】马斯克离开白宫了。尽管这是一个早就预定好的结局,但在他和特朗普两人关系热火朝天的时候,大家不是没有想过另一种结局。当然,也有很多人在期待,两个人如胶似漆的蜜月期之后是否会反目成仇。如今看来,虽然说不上是反目成仇,至少也是话不投…

南航通报飞机起飞后突然返航 电池冒烟险情妥善处置

5月31日13时许,中国南方航空发布通报称,当天CZ6850杭州飞往深圳的航班上,一名旅客携带的相机电池和充电宝出现冒烟情况。乘务组迅速采取措施,妥善处置,及时排除了安全风险。为确保乘客安全,机组决定立即返航,航班在起飞15分钟后安全降落。航空公司积极做好后续服务保障工…

浙江暴雨将持续至明天上午 需防范次生灾害

不怕七月半鬼,最怕端午水。5月31日,西湖景区一景被拍摄下来。当天下午,浙西北地区开始下雨。到晚上8时,杭州、湖州累计雨量超过了14毫米,单站点最大雨量为52.9毫米,出现在临安区龙塘山。省气象台在16时20分发布暴雨警报:受西南暖湿气流和弱冷空气影响,5月31日夜里至6月…

奇瑞董事长说降价是被绑架的 反内卷呼声高

汽车行业近期出现了对“反内卷”的强烈呼声。在5月31日的2025(第三届)未来汽车先行者大会上,奇瑞汽车董事长尹同跃针对车市价格战表示,“‘价格战’是我最不喜欢的一个词,因为我是被绑架的。”他提到销售团队会告诉他竞争对手已经采取了降价措施,这让他感到非常痛苦和违背…

go|context源码解析

文章目录 Context接口Deadline()Done()Err()Value() canceler接口ctxemptyCtxcancelCtxtimerCtxvalueCtx 基本使用cancelCtxvalueCtx 首先看一下源码对“context”的描述&#xff0c; When a Context is canceled, all Contexts derived from it are also canceled. 当一个Cont…

香港中乐团六月京津巡演 携多位国际艺术家献演

被誉为“民乐翘楚”的香港中乐团受邀于6月13至18日赴北京及天津举行三场“阎惠昌与香港中乐团2025”内地巡演。乐团荣幸获得中华人民共和国香港特别行政区政府驻北京办事处&#xff0c;及巡演赞助商李锦记国际控股有限公司全力支持&#xff0c;将于北京艺术中心的《笙与管风琴的…

[yolov11改进系列]基于yolov11引入高效上采样卷积块EUCB的python源码+训练源码

【EUCB介绍】 论文介绍 题目 EMCAD:Efficient Multi-scale Convolutional Attention Decoding for Medical Image Segmentation 论文地址 https://arxiv.org/pdf/2405.06880 创新点 多尺度卷积解码器&#xff1a;提出了一种高效的多尺度卷积注意力解码器&#xff08;EMCAD&a…

oscp练习PG Monster靶机复现

端口扫描 nmap -A -p- -T4 -Pn 192.168.134.180 PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.41 ((Win64) OpenSSL/1.1.1c PHP/7.3.10) |_http-server-header: Apache/2.4.41 (Win64) OpenSSL/1.1.1c PHP/7.3.10 | http-methods:…

樊振东莫雷加德成为队友 共迎新挑战

6月1日,萨尔布吕肯俱乐部宣布樊振东加盟德甲联赛。在萨尔布吕肯乒乓球甲级俱乐部的官宣消息中,樊振东表示他非常期待在萨尔布吕肯和德甲的新挑战,体验新的环境,并与球队一起赢得更多胜利。球队经理透露,这一切来得如此令人惊讶且迅速,他们仍然难以完全相信。但这是现实—…

任务中心示例及浏览器强制高效下载实践

1. 效果展示 这里的进度展示&#xff0c;可以通过我们之前讲到的Vue3实现类ChatGPT聊天式流式输出(vue-sse实现) SSE技术实现&#xff0c;比如用户点击全量下载时&#xff0c;后台需要将PDF文件打包为ZIP文件&#xff0c;由于量较大&#xff0c;需要展示进度&#xff0c;用户点…

危地马拉发现2800多年前玛雅城市遗址

var chan_v_w = 960,chan_v_h = 540,chan_v_p = https://mts-audio.huawangzhixun.com/image/20250601/news/5512b3f2-c97c-4299-b34c-8f5e57413ca6.jpg,chan_v_s = https://vmts.china.com/api/video/onaliyun/query?id=3101125&ttype=mp4;据危地马拉媒体5月30日报道,危…

姜老师MBTI课程:4条轴线的总结

文稿&#xff1a; 第一点是有的时候真的分不清到底是N还是S而且会跟自己的朋友去争论他这个表现到底是J还是P说不清。感觉有些案例姜老师讲的也是既有J又有P最后娶了一个什么&#xff1f;能不能够给我们提一些非常精准的标准&#xff0c;帮我们来做尽量精准的判断。好&#xff…

限流算法相关知识点

目录 固定窗口算法滑动窗口算法漏桶算法令牌桶算法Sentinel限流例子 固定窗口算法 固定窗口算法的实现相对简单。系统维护一个计数器&#xff0c;每当请求到来时&#xff0c;计数器加一。当时间窗口结束时&#xff0c;计数器清零。如果在一个时间窗口内请求数量超过了预设的阈…

第N个泰波那契数列 --- 动态规划

目录 一&#xff1a;题目 二&#xff1a;算法原理 三&#xff1a;代码实现 一&#xff1a;题目 题目链接&#xff1a;1137. 第 N 个泰波那契数 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代码实现 class Solution { public:int trib…