C++ 类和对象 (上)

类的引入:

由于C语言是面向过程的编程语言,我们在完成一件事的时候通常习惯将一件事拆分成一个一个小过程来实现,而到了C++就习惯将一件事分成不同的模块,交给不同的对象来处理,每一个对象中承载着数据类型和函数。
(up也是刚刚开始学习C++,对于面向对象的了解还未非常充分,具体阐述请读者查阅其他优秀资料)
既然如此,创建对象的任务自然而然地交到了程序手中,需要创造一个自定义类型变量来实现目的,在C语言阶段的时候我们接触到的自定义类型有struct/union/enum,其中最常用的就是strcut了,故我们重点从struct引导,C语言环境下struct只能定义变量,而不能存放函数,C++环境下struct可以定义函数,但是既有变量又有函数的struct类型我们在C++下习惯使用class来代替,称为

定义类:class classname{ };,classname称作类类型或类对象

其中我们把类中的变量称为类的成员变量或类的属性,类中的函数称为类的方法或成员函数

struct SA
{
public:const char* Fun();
private:char* _member;
}//
class SA
{
public:const char* Fun();
private:char* _member;
}//注意分号

👆两端代码是完全等价的

那么可以说C++中struct和class完全一样吗?不然,为了继承C语言,struct中默认所有属性和方法可在类外访问,而class中默认所有属性和方法只能在类中访问。

这里引入两个关键字:public、private 分别代表公有和私有,
一般我们习惯把方法设为公有,属性设为私有

类的作用域:

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。

class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{cout<<_name<<" "_gender<<" "<<_age<<endl;
}

在这里插入图片描述
我们更加推荐声明和定义分离使用。

类的实例化:

当我们写好一个类的框架时,编译器不会为其开辟空间,原因是这里我们只是做了一个声明,并没有进行实例化,就好比做好了设计图,还没有具体造房。

类的实例化非常简单:
classname obj;

类的大小:

多次实例化类对象时对于每一个对象它们中的方法是一模一样的,功能也是完全一致,没有必要让每一个对象都有一个独立的方法,故对于类中的方法编译器将其存储到公共代码段存储,不存储在类本身中。

反观之属性对于每一个类是专有的,不容许与其他对象共享,编译器就把属性存储在类中。

因此我们计算类对象大小时,只需要考虑属性即可,大小计算方式与C语言中的结构体相同,需要进行内存对齐,这里不做过多阐述,具体过程可查阅《结构体》一章

this指针:

class Date
{ 
public :void Display (){cout <<_year<< "-" <<_month << "-"<< _day <<endl;}void SetDate(int year , int month , int day){_year = year;_month = month;_day = day;}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};
int main()
{Date d1, d2;d1.SetDate(2018,5,1);d2.SetDate(2018,7,1);d1.Display();d2.Display();return 0;
}

思考一下,在执行SetDate函数时,编译器是怎么知道_year、_month、_day是d1还是d2的呢?
其实这里编译器自动补充了一指针,即this
编译时编译器会将SetDate(int year,int month,int day)处理成SetDate(Date* this,int year,int month,int day),这里的Date* this必须交给编译器来做,于是函数中的所有赋值操作就变成了this->_year、this->_month、this->_day,这里的this是可以手动补充的,但一般我们不这么做。

this的一些特性:

1. this指针类型:类对象 const this
2. 只能在方法中使用
3. 作为一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针
4. this指针是成员函数第一个隐含的指针形参,一般由编译器通过ecx寄存器自动传递*

文章的末尾留给读者一个思考题:
this可以为空指针吗?

文中若有错误,欢迎读者指出,对up来说是莫大的帮助,蟹蟹。
对惹,up如果想要一起学习UU的可以私有Up哈!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE 游戏模板】 游戏分类(RPG、RST等)

目录 0 引言1 游戏分类1.1 角色扮演游戏&#xff08;RPG&#xff09;1.2 第一人称射击游戏&#xff08;FPS&#xff09;1.3 即时策略游戏&#xff08;RTS&#xff09;1.4 VR游戏1.5 集换式卡牌游戏&#xff08;TCG&#xff09;1.5 塔防游戏&#xff08;Tower Defense Games&…

双语!性能优越|融合黏菌和差分变异的量子哈里斯鹰算法SDMQHHO

前面的文章里卡卡介绍了哈里斯鹰优化算法(Harris Hawks Optimization, HHO).HHO是 Heidari等[1]于2019年提出的一种新型元启发式算法&#xff0c;设计灵感来源于哈里斯鹰在捕食猎物过程中的合作行为以及突然袭击的狩猎风格&#xff0c;具有需调参数少、原理简单易实现、局部搜索…

CRM诞生到现在历经了哪些发展阶段?CRM系统的五个关键节点

CRM管理系统从被发明到现在&#xff0c;历经多次迭代已经成为一个相对成熟的系统。企业可以靠它管理客户信息&#xff0c;提升盈利能力。今天就来介绍一下CRM的发展历程。 一、CRM系统的雏形 广义上的CRM系统其实可以追溯到古希腊时期。当时的商人靠书写记录自己与客户和合作…

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目&#xff08;jar&#xff09; 1.3、编写 Dockerfile 文件&#xff0c;构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a&#xff09;简…

基于Java车间工时管理系统(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

论文润色改善附录内容质量

大家好&#xff0c;今天来聊聊论文润色改善附录内容质量&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文润色改善附录内容质量――提升论文的完整性与…

OpenCV-Python(30):Harris角点检测

目标 理解Harris角点检测的概念掌握函数cv2.cornerHarris()、cv2.cornerSubPix()的用法 Harris算法原理 通过前面的图像特征介绍&#xff0c;我们知知道了角点的一个特性&#xff1a;向任何方向移动变化都很大。Chris_Harris 和Mike_Stephens 在1988 年的文章《A Combined Co…

直流电机驱动开发笔记

直流电机总体来说应用非常广泛&#xff0c;最近项目需要直流电机&#xff0c;本想着应该是很简单的事情&#xff0c;结果也搞了好久&#xff0c;今天算是可以阶段性总结下。也不知道怎么总结好。就拿碰到问题记录下。前提&#xff1a;本人一直是软件开发&#xff0c;对这个之前…

【盘点】再见2023年,年度总结

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容事业AI大模型交互式问答图文视频生成功能型应用生成 行情危机感 爱情情绪价值会撩沟通 生理价值颜值相貌、身材体态、审美穿搭关于男性与女性间的那份本能需求生育 物质价值 &#x1f4e2;文章总结&#x1f4e5;博主目标 &…

使用ffmpeg调整视频分辨率/帧率并保持高清晰度

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg -i input.mp4 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-ve…

众和策略:人工智能风起云涌 算力基建支撑加速前进

2023年&#xff0c;人工智能技术完结质的飞跃。通过生成式AI&#xff08;AIGC&#xff09;技术&#xff0c;人们可用自然语言与机器进行便捷交互&#xff0c;并将海量的数据通过训练、推理&#xff0c;快速转化为出产力&#xff0c;发生实践商业价值。 AI技术加快向各行各业渗…

【iptables】修改规则和保存规则

1 修改规则 &#xff08;1&#xff09;修改指定表中指定链的规则 iptables -t 表名 -R 链名 规则序号 -s 源地址 -j 处理动作 接着上面的例子&#xff0c;假如我们想把下面的规则中的动作从DROP改为ACCEPT 可以使用-R选项来修改指定的链中的规则&#xff0c;在修改规则时指定规…