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.mzph.cn/news/677773.shtml

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

相关文章

vue常用9个事件修饰符

第075个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

vueRouter中Hash模式和History模式有什么区别

VueRouter是Vue.js官方推荐的前端路由库&#xff0c;它提供了一种方便的方式来构建单页应用&#xff08;SPA&#xff09;。在使用VueRouter时&#xff0c;我们可以选择不同的路由模式&#xff0c;其中最常见的是Hash模式和History模式。本文将深入探讨这两种模式的区别&#xf…

逐行拆解Guava限流器RateLimiter

逐行拆解Guava限流器RateLimiter 常见限流算法 计数器法 设置一个时间窗口内允许的最大请求量&#xff0c;如果当前窗口请求数超过这个设定数量&#xff0c;则拒绝该窗口内之后的请求。 关键词&#xff1a;时间窗口&#xff0c;计数器。 举个例子&#xff0c;我们设置1秒钟…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数&#xff0c;只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。&#xff08;了解即可&am…

JVM相关-JVM模型、垃圾回收、JVM调优

一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分&#xff0c;分别是&#xff1a;类加载器&#xff08;ClassLoader&#xff09;子系统、运行时数据区&#xff08;内存&#xff09;和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统&#xff08;class l…

Spring Batch 批处理框架适配达梦数据库,实现从文件批量读取写入数据库(完整教程)

效果展示(达梦数据库): 技术简介: Spring Batch 是一个基于 Spring 的批处理框架,用于开发和执行大规模、高性能、可靠的批处理应用程序。它提供了丰富的功能和组件,用于处理复杂的批处理任务,例如大数据ETL(Extract-Transform-Load)、数据清洗、数据迁移、报表生成…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…

React18原理: Fiber架构下的单线程CPU调度策略

概述 React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略CPU现在都是多核多进程的&#xff0c;重点研究的是 CPU是单核单线程&#xff0c;它是如何调度的?为什么要去研究单线程的CPU&#xff1f; 浏览器中的JS它是单线程的JS 的执行线程和浏览器的渲染GUI 是互斥…

缺省参数(c++)

void fun(int a0) { cout<<a<<endl; } 当我们调用函数时: fun(10) 输出10; fun&#xff08;&#xff09; 未传参时&#xff1a; 输出0; 未传参时a就会接受0&#xff0c;相当于这个0就是“备胎” 传参了0就没有用 全缺省 void fun2(int a10,int b3,int…

为什么无法正常访问TikTok?该使用跨境专线吗?

TikTok作为全球范围内备受欢迎的社交媒体平台&#xff0c;吸引了数以亿计的用户。然而&#xff0c;有时候用户可能会遇到无法正常访问TikTok的问题&#xff0c;这可能涉及到多方面的因素。本文将深入探讨为什么可能无法正常访问TikTok&#xff0c;并考虑是否使用 TikTok跨境专线…

使用vue-client-only 解决组件不兼容SSR问题

目录 前言 一、解决方案 1.基于Nuxt 框架的SSR应用 2.基于vue2框架的应用 3.基于vue3框架的应用 二、总结 往期回顾 前言 最近在我的单页面SSR应用上开发JSON编辑器功能&#xff0c;在引入组件后直接客户端跳转OK&#xff0c;但是在直接加载服务端渲染的时候一直报这…

ADMap:Anti-disturbance framework for reconstructing online vectorized HD map

参考代码&#xff1a;ADMap 动机与出发点 局部地图构建算法在实际中会遇到部分车道线偏离的或是错误的情况&#xff0c;这往往是全局信息获取上存在欠缺&#xff0c;毕竟地图元素的回归很依赖于全局信息的获取。那么从特征提取、attention layer设计和loss构建上可以做一些工作…

visual studio和cmake如何编译dlib库

官网 dlib C Library 对应的是最新版本&#xff0c;只能用到vs2015版本及以后 如果使用vs2013&#xff0c;所以需要下载vs2013可用的版本。 就是说dlib版本与vs版本有对应关系 所有版本 dlib C Library - Browse /dlib at SourceForge.net Releases davisking/dlib GitHu…

Go语言每日一练——链表篇(八)

传送门 牛客面试笔试必刷101题 ----------------两个链表的第一个公共结点 题目以及解析 题目 解题代码及解析 解析 这一道题使用的还是双指针算法&#xff0c;我们先求出两个链表的长度差n&#xff0c;然后定义快慢指针&#xff0c;让快指针先走n步&#xff0c;最后快慢指…

【数学建模】【2024年】【第40届】【MCM/ICM】【B题 搜寻潜水器】【解题思路】

一、题目 &#xff08;一&#xff09;赛题原文 2024 MCM Problem A: Resource Availability and Sex Ratios Maritime Cruises Mini-Submarines (MCMS), a company based in Greece, builds submersibles capable of carrying humans to the deepest parts of the ocean. A …

app逆向-⽹络请求库okhttp3

文章目录 一、前言二、应用1、添加权限AndroidManifest.xml2、添加依赖okhttp33、编写界面文件activity_main.xml4、编写Activity代码 三、效果 一、前言 OkHttp是由Square公司开发的用于Java和Android的开源HTTP客户端库。它被广泛用于在Java和Android应用程序中进行HTTP请求…

结构体数组所有元素(1亿个元素)初始化为相同的值

一个结构体数组&#xff0c;有1亿个元素&#xff0c;每个元素都要初始化为相同的值&#xff0c;如果没有现成的语法直接支持这样的初始化操作&#xff0c;就得用for循环写&#xff0c;会不会非常耗时&#xff1f; 如果结构体里的成员都是一些简单的基本数据类型&#xff0c;整…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…

Linux中常用的工具

软件安装 yum 软件包 在Linux中&#xff0c;软件包是一种预编译的程序集合&#xff0c;通常包含了用户需要的应用程序、库、文档和其他依赖项。 软件包管理工具是用于安装、更新和删除这些软件包的软件。常见的Linux软件包管理工具包括APT&#xff08;Advanced Packaging To…

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础&#xff1a;网页的智能眼镜3.1.1 基础知识3.1.2 重点案例&#xff1a;适应三种设备的响应式布局3.1.3 拓展案例 1&#xff1a;改变字体大小3.1.4 拓展案例 2&#xff1a;暗模式适配 3.2 响应式图片和视频&#xff1a;让内容自由呼吸3.2.1 基础知识3.…