C++类与对象的详细说明
类的引入
在引入类之前,先来回忆一下C语言中的结构体。结构体是一种自定义类型,可以在其中定义变量,如我们所熟悉的日期结构体:
struct Date { int year; int month; int day; };
而在C++中,结构体被升级成了类,结构体中不仅可以定义成员变量,也可以定义成员函数(成员方法):
struct Date { //成员变量 int year; int month; int day; //成员方法 void print() { cout << year << "-" << month << "-" << "day" << endl; } };
在C++中,更喜欢使用class来替代struct,当然它们也有所差别,在之后会说明。
类的定义
类的定义可以分为两种,即声明和定义全部放在类体中与声明与定义分离。
1、声明和定义全部放在类体中
该方式即为上一举例代码的定义方式。但要注意,如果采用这种方法定义成员函数,编译器可能会将该函数作为内联函数处理。
2、声明放在头文件,定义放在源文件中
头文件中成员函数只需要声明:
struct Date { //成员变量 int year; int month; int day; //成员方法 void print(); };
在源文件中对函数进行定义:
void Date::print() { cout << year << "-" << month << "-" << "day" << endl; }
需要注意,print为类域中的函数,如果不加Date::用以指定类域,会导致定义出错。因此,使用该方式定义成员函数时,一定要注意指定类域。
类的访问限定符号及封装
访问限定符
访问限定符分为三种:
(1)public修饰的成员在类外可以直接被访问:
class Date { public: int year; int month; int day; void print() { cout << year << "-" << month << "-" << "day" << endl; } }; int main() { Date date; date.day = 0; }
如上代码,在main函数中可以直接对对象中的成员变量day进行访问。
(2)protected和private修饰的成员变量在类外不能被直接访问
class Date { private: int year; int month; int day; void print() { cout << year << "-" << month << "-" << "day" << endl; } }; int main() { Date date; date.day = 0; }
此时如果在main函数中对直接对象中的成员变量day进行访问,会导致错误
(3)访问权限作用域是从该访问限定符的位置开始直到下一个访问限定符出现时为止
class Date { private: int year; int month; int day; public: void print() { cout << year << "-" << month << "-" << "day" << endl; } };
如上代码,成员变量均为私有的,而成员函数print为公有的。
(4)class的默认访问权限(即不写访问限定符时)为private,struct为public
封装
封装实际上是一种更好的严格管理
将数据和方法封装到类里,可以访问的定义为共有,不想给他人访问的定义为私有或保护。如此一来就做到了隐藏对象的属性和细节,仅仅对外公开接口来和对象进行交互,更加安全高效。
类的实例化
所谓类的实例化,简而言之就是用类类型创建对象的过程。
打个比方,类就好似建筑的图纸,而对象就是根据图纸造出的建筑。对象是真实存在摸得着的,只有实例化出的对象才能够实际存储数据。
类对象模型
学过C语言我们知道如何计算结构体的大小,那么在C++中,类的大小如何确定呢?
我们所不清楚的,就是类中成员函数的大小如何计算。实事上对于同一类的不同对象,处理问题的方法是相同的,如果每个对象都要保存一遍成员方法,未免有些过于浪费空间了。
因此在C++中,成员函数存放在公共代码段。计算类的大小只需要按照C语言中结构体大小的计算规则即可,不需要考虑成员函数。
注意:空类的大小为1byte,不存储有效数据,但需要占位用以表示对象存在。
this指针
class Date { private: int _year; int _month; int _day; public: void init(int year, int month, int day) { _year = year; _month = month; _day = day; } }; int main() { Date date1, date2; date1.init(2022, 2, 14); date2.init(2022, 2, 15); }
对于上述代码,有一个问题,date1与date2这两个对象分别都调用了init进行初始化,那么init函数是如何区分该为哪个对象进行初始化的呢?
C++通过引入this指针解决了这个问题。
this指针的特性
1、this指针的类型:类类型* const,存放对象的地址
2、只能在成员函数内部使用
3、this指针本质上是成员函数的形参,传参时存放在栈帧中,对象中不存储this指针
4、this指针为隐藏的形参,不需要用户传递
在上述代码实际被处理成了这样:
void init(int year, int month, int day) { this->_year = year; this->_month = month; this->_day = day; }
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注猪先飞的更多内容!
原文出处:https://blog.csdn.net/qq_54946964/article/details/122934296
相关文章
- 以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
- vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- 这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
- 本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
- 整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
- 本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
牛叉的Jquery――Jquery与DOM对象的互相转换及DOM的三种操作
只有jQuery对象才能调用jQuery类库的各种函数,同样有些dom对象的属性和方法在jQuery上也是无法调用的,不过基本上jQuery类库提供的函数包含了所有的dom操作。这就需要我们知道如何将jQuery对象和DOM的相互转换的方法。1...2015-10-30- 无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
- 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性。那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类。 递归,简单的说就是一段程序代码的重复调用,当把...2015-10-23
- 这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25