C++入门篇(4)—— 类与对象(1)

目录

1.类的引入

2.类的定义

3.类的访问限定符

4.类的作用域

5. 类对象的存储方式

6. this指针

6.1 this指针的引入

6.2 this指针的特性

6.3有意思的面试题


1.类的引入

C语言struct 结构体中只能定义变量,而C++中可以定义函数。

struct Date
{void Init(int year = 2023, int month = 12, int day = 1){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};

就像这样一个日期结构体,可以在内部定义函数,这就是一个类。在C++中,更喜欢用class来定义类。

2.类的定义

class className   //指定想要的类的名字
{// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号

这 就是类的定义方式。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。

类中的函数有两种定义方式

1.直接在类中定义函数,但需要注意,这样编译器可能将该函数视为内联函数。

2.类中函数声明,在类外定义函数。在类外定义函数需要注意成员函数名前加上类名。

struct Date
{void Init(int year = 2023, int month = 12, int day = 1);int _year;int _month;int _day;
};//注意成员函数名前加上类名
void Date::Init(int year = 2023, int month = 12, int day = 1)
{_year = year;_month = month;_day = day;
}

3.类的访问限定符

访问限定符会对访问类进行的操作进行限制,有三个访问限定符:public(公有)、private(私有)、protected(保护)

具体用法如下

class Date
{
public:void Init(int year = 2023, int month = 12, int day = 1){_year = year;_month = month;_day = day;}
private:	int _year;int _month;int _day;
};

这样外部只能访问Init这个成员函数而不能访问到类中的三个成员变量。 目前可以认为private和protected区别不大。

需要注意的是,class默认访问权限是private,而struct默认访问权限是public(为了兼容C),

访问限定符的作用范围是到下一个访问限定符或 } 为止。

访问限定符的出现是为了更好的管理,C语言中的结构体访问过于宽松自由以至于可能会造成一些意想不到的bug。而C++中的类可以限制对类对象的访问,这样更加安全。

4.类的作用域

类会有一个新的作用域,在外部定义类成员时,需要指定类名。

5. 类对象的存储方式

类对象中成员变量是存储在类对象中的,而会多次被调用的成员函数,并不会存储在类对象中,否则定义多个类对象会造成较大的空间浪费,因为每个类对象中都存储有同一个函数地址,这显然是不合理的,会造成很大的浪费。

class Date
{
public:void Init(int year = 2023, int month = 12, int day = 1);
private:	int _year;int _month;int _day;
};
void Date::Init(int year, int month, int day)
{_year = year;_month = month;_day = day;
}
int main()
{Date d;d.Init();cout << sizeof(d) << endl;return 0;
}

运行这段代码会发现结果是12,这说明成员函数并不存在类对象中。

成员函数被存放在公共的代码段。

这里注意一下,类的大小计算方式和结构体对齐规则相同,并且空类大小为1,不是0。

6. this指针

6.1 this指针的引入

class Date
{
public:void Init(int year = 2023, int month = 12, int day = 1){_year = year;_month = month;_day = day;}
private:	int _year;int _month;int _day;
};

先看这个类,我们在调用成员函数时是这样调用的

int main()
{Date d1;d1.Init();Date d2;d2.Init();return 0;
}

我们传参时并没有传入给哪个对象调用这个函数的信息。举个例子来理解一下。

C语言中要实现Date 类中的这个Init函数功能,一定会是这样的一个函数

void Init(struct Date* pd, int year, int month, int day);

总之一定会把对哪个对象调用函数的有关信息给写入形参列表,这个信息可能是那个对象的地址,

这样才能确定对哪个对象调用函数。

而C++中的成员函数都存放在公共的代码段,其中并没有任何关于对象的信息,如何确定对哪个对象操作呢?

实际上,C++在这里跟C语言的处理手法是一样的,同样传入了一个地址,用一个指针变量来接收,这样函数就能知道对哪个对象进行操作了。

6.2 this指针的特性

this指针类型:类类型* const ,对Date类来说,this指针类型就是Date* const,这意味着,this指针的值,是不能修改的。

this指针只能在成员函数内部使用。

this指针本质是成员函数的形参,是成员函数的一部分,是不会存在对象内部的。

this是由编译器自动传递的,不需要用户自己手动传递。

6.3有意思的面试题

// 1.下面程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行
class A
{
public:void Print(){cout << "Print()" << endl;}
private:int _a;
};int main()
{A* p = nullptr;p->Print();return 0;
}

相信一般都会认为会运行崩溃吧,但是实际结果既出人意料又在情理之中。结果是A。

根据上面对this指针的讲解,我们可以理解其实这里的p只是会传给Print作为形参,而Print函数中没有对p作解引用操作,因此自然不会崩溃,而是正常运行。

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

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

相关文章

基于Skywalking开发分布式监控(二)

续上篇&#xff0c;上一篇主要是讲了为啥选skywalking&#xff0c;以及怎么有针对性改造SW Agent&#xff0c;现在我们继续看看如何构建自定义Trace跟踪链 要对SW Agent插件做适当剪裁&#xff0c;原来包括customize插件在内SW 8.9有100多个插件&#xff0c;如果没有作用也就罢…

Spring Cloud使用ZooKeeper作为注册中心的示例

简单的Spring Cloud应用程序使用ZooKeeper作为注册中心的示例&#xff1a; 1.新建模块&#xff1a; 2.勾选依赖&#xff1a; 3.在pom.xml文件中做出部分修改及添加Spring Cloud Zookeeper 依赖版本&#xff1a; 完整pom文件 <?xml version"1.0" encoding&q…

【自然语言处理-工具篇】spaCy<1>--介绍及安装指南

目录 前言 安装指南 pip conda spaCy升级 总结 前言 spaCy是一个开源的自然语言处理库,用于处理和分析文本数据。它提供了许多功能,包括分词、词性标注

ES6扩展运算符——三个点(...)用法详解

目录 1 含义 2 替代数组的 apply 方法 3 扩展运算符的应用 &#xff08; 1 &#xff09;合并数组 &#xff08; 2 &#xff09;与解构赋值结合 &#xff08; 3 &#xff09;函数的返回值 &#xff08; 4 &#xff09;字符串 &#xff08; 5 &#xff09;实现了 Iter…

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -g cnpm --regi…

WordPress突然后台无法管理问题

登录WordPress后台管理评论&#xff0c;发现点击编辑、回复均无反应。 尝试清除缓存、关闭CF连接均无效。 查看插件时发现关闭wp-china-yes插件可以解决问题。 后来又测试了下发现加速管理后台这项&#xff0c;在启用时会发生点击无效问题&#xff0c;禁用就好了&#xff0c;不…

【Linux系统学习】6.Linux系统软件安装

实战章节&#xff1a;在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面&#xff0c;我们学习了许多的Linux命令和高级技巧&#xff0c;这些知识点比较零散&#xff0c;进行练习虽然可以基础掌握这些命令和技巧的使用&#xff0c;但是并没有一些具体的实…

详细介绍Python网络编程模块

根据前面对网络分层棋型的介绍&#xff0c;我们知道实际的网络模型大致分为四层&#xff0c;这四层各有对应的网络协议提供支持&#xff0c; 网络层协议主要是 IP&#xff0c;它是所有互联网协议的基础&#xff0c;其中 ICMP&#xff08;Internet Control Message Protocol&…

Junit常用注解

注解是方法的“标签” 说明每个方法的“职责” Q:总共有那些注解? 参见官方的API文档 0.常用主机及其特点 BeforeClass 只会执行一次必须用static修饰常用来初始化测试需要的变量 Before 会执行多次&#xff08;只要写一次&#xff09;在每个Test执行执行之前执行可以和…

滑块验证码识别代码分享

平时我们开发爬虫会遇到各种各样的滑动验证码&#xff0c;如下图所示&#xff1a; 为了解决这个问题&#xff0c;我写了一个通用的滑块验证码识别代码&#xff0c;主要是分析图片&#xff0c;然后计算出滑块滑动的像素距离。但是像素距离大多数情况下都不会等于滑动距离&#x…

企业数字化转型面临什么挑战?

数字化转型是一个复杂且持续的过程&#xff0c;涉及将数字技术集成到组织的各个方面&#xff0c;从根本上改变组织的运营方式和为客户提供价值的方式。虽然具体的挑战可能因企业的性质和规模而异&#xff0c;但一些常见的挑战包括&#xff1a; 1.抵制变革&#xff1a; 文化阻…

Android---Jetpack Compose学习002

Compose 布局。Compose 布局的目标&#xff1a;1&#xff09;实现高性能&#xff1b;2&#xff09;让开发者能够轻松编写自定义布局&#xff1b;3&#xff09;在 Compose 中&#xff0c;通过避免多次测量布局子级可实现高性能。如果需要进行多次测量&#xff0c;Compose 具有一…

【力扣】查找总价格为目标值的两个商品,双指针法

查找总价格为目标值的两个商品原题地址 方法一&#xff1a;双指针 这道题和力扣第一题“两数之和”非常像&#xff0c;区别是这道题已经把数组排好序了&#xff0c;所以不考虑暴力枚举和哈希集合的方法&#xff0c;而是利用单调性&#xff0c;使用双指针求解。 考虑数组 pri…

跟着cherno手搓游戏引擎【22】CameraController、Resize

前置&#xff1a; YOTO.h: #pragma once//用于YOTO APP#include "YOTO/Application.h" #include"YOTO/Layer.h" #include "YOTO/Log.h"#include"YOTO/Core/Timestep.h"#include"YOTO/Input.h" #include"YOTO/KeyCod…

第6节、T型加减速转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本章介绍步进电机T型加减速的控制方法&#xff0c;分三个小节&#xff0c;本小节主要内容为该控制方法的推导与计算。目前各平台对该控制方法介绍的文章目前较多&#xff0c;但部分关键参数并未给出推导…

【PTA|期末复习|编程题】数组相关编程题(一)

目录 7-1 乘法口诀数列 (20分) 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 样例解释&#xff1a; 代码 7-2 矩阵列平移(20分) 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; …

电子电器架构 —— 对车载软件开发新阶段的愿景

电子电器架构 —— 对车载软件开发新阶段的愿景 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝…

猫头虎分享已解决Bug || Kubernetes Error: Pods ‘pod-name‘ Not Found

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Linux系统基础 03 IP地址虚拟网络、Linux软件包管理、ssh服务、apache服务和samba服务的简单搭建

文章目录 一、IP地址虚拟网络二、Linux软件包管理1、rpm包管理器2、yum包管理器3、源码安装 三、ssh服务四、apache服务五、samba服务 一、IP地址虚拟网络 1、IP地址格式是点分十进制&#xff0c;例&#xff1a;172.16.45.10。即4段8位二进制 2、IP地址分为网络位和主机位。网…

【Leetcode】236. 二叉树的最近公共祖先

文章目录 题目思路代码结果 题目 题目链接 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可…