当前位置: 首页 > news >正文

C++之类和对象:定义,实例化,this指针,封装

C语言是面向过程的,C++是面向对象的,利用对象交互,接口完成事情。

类的定义:

我们在C语言中可以用struct创建自定义结构体,在C++中可以在结构体中定义函数了,这种就被称为类。

#include<iostream>
using namespace std;class Data
{
public:void Print(int day, int month, int year)//成员函数{cout << year << " " << month << " " << day << endl;}private:int _day;//成员变量int _month;int _year;
};

上述就是一个简单的类,可以用class或者struct,我们一般是用class。 

需要注意的是,成员函数如果在类里声明和定义可能会被编译器当作内联函数处理,所以一般我们在类里面定义函数声明,在另一个文件里定义函数(函数前需要加 Data::之类的类名)。

注意成员变量命名的时候也建议加个前缀之类的。

类定义了一个新的作用域,所有的成员都在类作用域里,在类外定义成员,需要使用  :: 作用域操作符。

类的访问限定符:

我们看到上面有 private 之类的符号,这些被称为访问限定符。

 公有修饰的成员可以在类外被访问,其他两个都不能在类外被访问(保护在继承才涉及)。

class的默认访问权限是私有的,而struct是公有的。

访问限定符的作用域从该访问符出现到下一个访问限定符出现的位置。如果没有后面没有限定符了,到类结束就结束。

封装:

C++中有了访问限定符,不得不提面向对象的三大特性:封装,继承,多态。

封装本质是一种管控,这里只是封装的一部分,将类的内部隐藏起来,仅对外公开接口来和对象进行交互。

实例化:

用类创建对象的过程叫做实例化,类是一个类似模型的东西,在没有实例化之前是没有分配实际的内存空间的,一个类是可以实例化多个对象,实例化出的对象分配实际的内存空间,存储类成员变量。

today就是用Data类实例化出的对象,只有对象才可以用Print函数。

类对象存储模式:

一个类中既有成员变量,也有成员函数,那么类对象中到底是怎么存储这些的?

所以是只保存成员变量,成员函数存储在公共的代码段里。

所以一个类的大小,其实就是该类中成员变量之和,和结构体差不多,也有内存对齐。(注意空类的大小,编译器给了空类一个字节来唯一标识这个类的对象)。

this指针:

class Data
{
public:void Print(){cout << _year << " " << _month << " " << _day << endl;}private:int _day = 24;//缺省值,成员变量也可以设置缺省值int _month = 4;int _year = 2025;
};int main()
{Data today;today.Print();
}

我们能看到上述代码,Print函数没有形参,但是还是可以打印出 today 的成员变量,但是函数是怎么知道打印的是 today 对象的成员变量呢。

原因就是因为C++给每个非静态的成员函数增加了一个隐藏的指针参数,让指针指向当前对象(函数运行时调用的对象),在函数体中所有成员变量的操作,都可以提高该指针去访问,只不过所有的操作都是透明的,不用用户传递,编译器自动完成。

this指针特性:

1.this的类型:类类型* const,成员函数不可以给this赋值。

2.只能在成员函数内部使用

3.this指针本质上是成员函数的形参,所以对象中不存储this指针。

4.this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。

5.this指针存在栈上,因为他是形参(有些编译器可能会存储在寄存器)

提出一个疑问:this指针可以是空吗?可以

相关文章:

  • (转)正则化等最优化方法介绍
  • 「图文互搜+情感分析」聚客AI前沿技术拆解:用Hugging Face玩转多模态AI大模型
  • windows安装Mysql
  • 手机端本地服务与后端微服务的技术差异
  • Tailwind CSS 初学者入门指南:项目集成,主要变更内容!
  • 探秘 FFmpeg 版本发展时间简史
  • 解决VS Code中Vue项目不识别`@/`的可能解决方案及总结
  • 【mdlib】0 全面介绍 mdlib - Rust 实现的 Markdown 工具集
  • 模板元编程(Template Metaprogramming, TMP)
  • PCB封装主要组成元素
  • Hadoop基础知识
  • 用 PyQt5 和 asyncio 打造接口并发测试 GUI 工具
  • 数据结构-查找
  • 在vue项目中实现svn日志打印
  • LeetCode hot 100—最长有效括号
  • HTML应用指南:利用GET请求获取微博签到位置信息
  • 中介者模式:解耦对象间复杂交互的设计模式
  • 虚拟机详解
  • 音视频之H.265/HEVC环路后处理
  • 修改了Element UI中组件的样式,打包后样式丢失
  • 企业称县政府为拆迁开发借款2亿元逾期未还,河北青龙县:开发搁置,将继续沟通
  • 11-13世纪的地中海贸易
  • 体坛联播|卡马文加预计伤缺三个月,阿尔卡拉斯因伤退赛
  • 过敏性鼻炎,不只是“打喷嚏”那么简单
  • 人民日报:外卖平台应保障好骑手就业权益,消除后顾之忧
  • 国防部发布、中国军号及多家央媒官博发祝福海报:人民海军76岁生日快乐