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

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指针可以是空吗?可以

http://www.xdnf.cn/news/1730.html

相关文章:

  • 【OpenCV图像处理实战】从基础操作到工业级应用
  • EFISH-SBC-RK3588 —— 厘米级定位 × 旗舰算力 × 工业级可靠‌
  • SpringBoot集成RabbitMQ使用过期时间+死信队列实现延迟队列
  • Linux系统----进程的状态
  • [创业之路-384]:企业法务 - 初创公司,如何做好知识产品的风险防范?
  • 质检LIMS系统在金融咨询行业的应用 金融咨询行业的实验室数字化
  • Linux下编译opencv-4.10.0(静态链接库和动态链接库)
  • Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置
  • 2025-04-24 Python深度学习4—— 计算图与动态图机制
  • 极狐GitLab 如何 cherry-pick 变更?
  • STM32移植最新版FATFS
  • Godot开发2D冒险游戏——第二节:主角光环整起来!
  • C# new Bitmap(32043, 32043, PixelFormat.Format32bppArgb)报错:参数无效,如何将图像分块化处理?
  • STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
  • Python爬虫去重策略:增量爬取与历史数据比对
  • VulnHub-DC-2靶机渗透教程
  • zip是 Python 中 `zip` 函数的一个用法
  • 数模学习:一,层次分析法
  • flutter 小知识
  • 在Ubuntu 18.04 和 ROS Melodic 上编译 UFOMap
  • 跨浏览器音频录制:实现兼容的音频捕获与WAV格式生成
  • Spring Security认证流程
  • LabVIEW实现Voronoi图绘制功能
  • 【MQ篇】初识RabbitMQ保证消息可靠性
  • 信息系统项目管理工程师备考计算类真题讲解七
  • KMS工作原理及其安全性分析
  • Java Agent 注入 WebSocket 篇
  • java方法引用
  • kotlin和MVVM的结合使用总结(二)
  • 一种Spark程序运行指标的采集与任务诊断实现方式