C++:初识类与this指针

文章目录

  • 前言
  • 一、类
    • 类的定义和实例化
    • 类的访问限定符
    • 类的作用域
    • 计算类的大小
  • 二、类的成员函数的this指针
  • 总结


在这里插入图片描述

个人主页 : 个人主页
个人专栏 : 《数据结构》 《C语言》《C++》

前言


一、类

类的定义和实例化

在这里插入图片描述
注意类定义结束时后面分号( ; )不能省略。

类体中的内容称为类的成员:

  • 类中的变量称为类的属性or成员变量;
  • 类中的函数称为类的方法or成员函数;

类的两种定义方式

  • 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理
//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;  //年int _month; //月int _day;   //日
};

  • 类的声明放在.h文件,成员函数定义在.cpp文件。要注意在类外面定义函数要加上类名::(类的作用域)

在这里插入图片描述
在这里插入图片描述


类的实例化

用类类型创建对象的过程,被称为类的实例化。

  • 类是对对象进行描述的,限定了类有哪些成员,定义一个类并没有分配实际的内存空间。
  • 一个类可以实例化出多个对象,实例化出的对象,占实际的物理空间,存储类成员变量
//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{// 类的实例化Date d;d.Init(2023, 9, 3);d.Print();
}

在这里插入图片描述


类的访问限定符

在上面类的定义中,我们看到了 private 和 public这两个关键字就是类的访问限定符。
在这里插入图片描述
访问限定符的作用域:从访问限定符出现的位置开始直到下一个访问限定符出现 或 如果后面没有访问限定符,作用域就到 } 即类的结束为止。

  • public修饰的成员在类外可以直接访问
  • protectedprivate修饰的成员在类外不能直接被访问
  • class的默认访问权限是private,struct的默认访问权限是public

private修饰的成员在类外不可直接访问。
在这里插入图片描述
在这里插入图片描述

public修饰的成员可以在类外直接访问

//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{Date d;d.Init(2023, 9, 3);d.Print();//d._year = 0;
}

在这里插入图片描述


类的作用域

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

//日期类
class Date
{
public://打印日期void Print();void Init(int year = 0, int month = 0, int day = 0);
private:int _year;  //年int _month; //月int _day;   //日
};void Date::Init(int year = 0, int month = 0, int day = 0)
{_year = year;_month = month;_day = day;
}void Date::Print()
{cout << _year << "/" << _month << "/" << _day << endl;
}

计算类的大小

类对象的存储方式

  • 只保存成员变量,成员函数存储放到公共代码区
//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{Date d1;Date d2;return 0;
}

对于下面代码对象 d1,d2的展示如下:

在这里插入图片描述


那么Date类的大小是多少?
在这里插入图片描述
结论:一个类的大小,实际就是该类中成员变量之和,并且和计算结构体大小一样要注意内存对齐。
注意空类的大小是1。编译器给空类一个字节来标识这个类的对象

结构体内存对齐


二、类的成员函数的this指针

//日期类
class Date
{
public://打印日期void Print(){cout << _year << "/" << _month << "/" << _day << endl;}void Init(int year = 0, int month = 0, int day = 0){_year = year;_month = month;_day = day;}
private:int _year;  //年int _month; //月int _day;   //日
};int main()
{Date d1;d1.Init(2023, 9, 3);d1.Print();Date d2;d2.Init(2023, 9, 3);d2.Print();
}

对于上面代码有这样一个问题,我们用Date类实例化了两个对象d1,d2。那么当d1调用Init函数时,该函数如何知道应该设置d1对象,还是d2对象?

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


this指针的特性

  • this指针的类型:类类型* const,即成员函数中,不能改变this的值。
    在这里插入图片描述
    在这里插入图片描述

  • 只能在成员函数内部使用
    在这里插入图片描述

  • this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针(对象的大小只有成员变量之和)

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

  • 不能在成员函数的形参中显示写出
    在这里插入图片描述


这里出一个题。
对于下面代码的结果是?

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

在这里插入图片描述
结果正常运行。为什么?
因为Print是成员函数并不在对象内部存储,而是在公共代码区存储。编译器并不会区访问nullptr的位置,而是直接去公共代码区找Print函数。
在这里插入图片描述


总结

以上就是我对于C++中初识类与this指针的总结。感谢支持!!!
在这里插入图片描述

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

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

相关文章

【前端demo】倒计时器 可选择时间 原生实现

文章目录 效果过程日历与获取时间居中背景与字计时器清空计时器 代码HTMLCSSJS 其他demo 效果 效果预览&#xff1a;倒计时器 可选择时间 (codepen.io) 参考&#xff1a; Simple Clock/Countdown timer (codepen.io) 前端页面实现倒计时效果的几种方法_前端倒计时__Boboy的…

2023年“羊城杯”网络安全大赛 Web方向题解wp 全

团队名称&#xff1a;ZhangSan 序号&#xff1a;11 不得不说今年本科组打的是真激烈&#xff0c;初出茅庐的小后生没见过这场面QAQ~ D0n’t pl4y g4m3!!! 简单记录一下&#xff0c;实际做题踩坑很多&#xff0c;尝试很多。 先扫了个目录&#xff0c;扫出start.sh 内容如下…

微信小程序手机号快速验证组件调用方式

目录 一、测试环境 二、问题现象 三、总结 手机号验证组件&#xff08;包括快速验证组件和实时验证组件&#xff09;调用后无法对事件进行回调这个问题&#xff0c;先说结论&#xff0c;以下是正确的使用方式&#xff1a; <!-- 手机号快速验证组件 --> <button op…

【LeetCode-中等题】199. 二叉树的右视图

文章目录 题目方法一&#xff1a;层序遍历取每一层最后一个元素方法二&#xff1a;深度优先搜索 题目 方法一&#xff1a;层序遍历取每一层最后一个元素 // 方法一 &#xff1a;层序 集合(取每层子集合最后一个元素)// List<List<Integer>> Rlist new ArrayList…

2023数学建模国赛四天速成计划来啦!(内含大量资料)

大家好呀。高教社杯全国大学生数学建模竞赛&#xff08;下称国赛&#xff09;9.7日下午6点就正式开始了&#xff1a; 在这里给大家带来一个五天的速成计划啦&#xff01;大家可以收藏本文章或者转发到你们队友群哈&#xff0c;此外我还会发放很多资料给大家&#xff0c;注意&am…

【Day-27慢就是快】代码随想录-二叉树-二叉树的最小深度

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 —————————————————————————————————— 1. 递归法 确定单层递归的逻辑&#xff1a; 与最…

Docker进阶:mysql 主从复制、redis集群3主3从【扩缩容案例】

Docker进阶&#xff1a;mysql 主从复制、redis集群3主3从【扩缩容案例】 一、Docker常规软件安装1.1 docker 安装 tomcat&#xff08;默认最新版&#xff09;1.2 docker 指定安装 tomcat8.01.3 docker 安装 mysql 5.7&#xff08;数据卷配置&#xff09;1.4 演示--删除mysql容器…

阿里云对象存储oss-文件上传过程详解(两种方式)

阿里云对象存储oss-文件上传过程详解{两种方式} 方式一(最新代码,时间:2023/8/27)(1)如何配置系统变量(2)完整代码 方式二(跟黑马最新教程同代码)(1)在复制下来的代码中(2)完整代码 方式一(最新代码,时间:2023/8/27) 问题:需要配置系统变量才能够使用 (1)如何配置系统变量 以wi…

Java设计模式:四、行为型模式-10:访问者模式

一、定义&#xff1a;访问者模式 访问者模式&#xff1a;核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下&#xff0c;例如用户信息、雇员信息等&#xff0c;增加易变的业务访问逻辑。为了增强扩展性&#xff0c;将两部分的业务解耦的一种设计模式。 二…

Code Snippet的使用

文章目录 前言Code Snippet:就是咱们在VS中敲的prop、propfull、ctol【构造器快捷键】、for等快捷键&#xff0c;然后按tab键自动生成代码1.VS自带的&#xff1a;prop、propfull、ctol【构造器快捷键】、for等快捷键&#xff0c;直接使用2.自定义Snippet&#xff1a; 巨人的肩膀…

【Apollo学习笔记】——规划模块TASK之SPEED_DECIDER

文章目录 前言SPEED_DECIDER功能简介SPEED_DECIDER相关配置SPEED_DECIDER流程MakeObjectDecisionGetSTLocationCheck类函数CheckKeepClearCrossableCheckStopForPedestrianCheckIsFollowCheckKeepClearBlocked Create类函数 前言 在Apollo星火计划学习笔记——Apollo路径规划算…

使用Fiddler模拟网络

Fiddler已经预置提供了模拟Modem速度的选项&#xff0c;其位置位于&#xff1a; Rules->Performances->Simulate Modem Speeds 勾选该选项后&#xff0c;所有通过Fiddler代理的流量都会变得用56k modem上网一般。 要直观观察限速后的效果&#xff0c;最好使用运行在浏览…