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://xiahunao.cn/news/2778344.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

VitePress-14- 配置-titleTemplate 的作用详解

作用描述 1、titleTemplate 是标题的后缀&#xff1b;2、可以自定义标题的后缀&#xff1b;3、可以自定义整个的标题以及后缀&#xff0c;语法如下&#xff1a; titleTemplate: :title 链接符号 自己定义的后缀 【:title】&#xff1a;从页面的第一个 <h1> 标题推断出的…

记录一次centos 使用selenium运行环境

这里写自定义目录标题 宝塔面板 安装 selenium安装google-chrome 宝塔面板 安装 selenium 安装google-chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本 google-chrome --version 下载对应chrome版本的chro…

python实现基数排序

如果在给不同的整形数组排序的时候,一般会这样做,也就是先看最高位,如果最高位数值大的话也就意味着它的数值是最大的,而如果两个数字的最高位的数值是一样的,则继续比较次高位,这样依次去比较可以决定数字的排序。而对于基数排序来说,其思想是与以上的思想是不同的,基…

开源!免费!Hugging Face推出GPT商城

Hugging Face发布开源AI助手制造工具&#xff0c;与OpenAI的定制GPT形成竞争 Hugging Face今年1月31日推出一款开源AI代码库——Hugging Chat Assistants&#xff0c;允许用户轻松创建特定功能的定制AI聊天机器人。 不同于OpenAI的ChatGPT商城需要每月20美金成为会员才能使用…

【MySQL】字符串函数的学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-J7VN4RbrBi51ozap {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【Larry】英语学习笔记语法篇——从句=连词+简单句

目录 三、从句连词简单句 1、必须有连词 主从结构 疑问词的词性 2、名词性从句 同位语从句 形式主语 形式宾语 that的省略 3、形容词性从句&#xff08;上&#xff09; 关系代词 关系词的作用 介词前置问题 4、形容词性从句&#xff08;中&#xff09; 定语关系…

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…

如何在Linux上部署1Panel运维管理面板并实现无公网ip远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

数据结构——5.5 树与二叉树的应用

5.5 树与二叉树的应用 概念 结点的权&#xff1a;大小可以表示结点的重要性 结点的带权路径长度&#xff1a;从树的根到该结&#xff0c;的路径长度&#xff08;经过的边数&#xff09;与该结点权的乘积 树的带权路径长度&#xff1a;树中所有叶结点的带权路径长度之和(WPL) …

给定长度为n的01串s,有两种操作:1、交换相邻的两个字符,花费为1e12;2、删除一个字符,花费为1e12 + 1,求使s不递减的最少花费

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e12, maxm 4e4 5, …

反序列化漏洞——PHP原生类

Error类 PHP>7.0&#xff0c;因为存在__toString&#xff0c;可以进行XSS Exception类 因为存在__toString&#xff0c;可以进行XSS DirectoryIterator类 因为存在__toString&#xff0c;可以获取符合要求的第一个文件名 SplFileObject类 因为存在__toString&#xff0c…

Python 数据可视化之山脊线图 Ridgeline Plots

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 JoyPy 是一个基于 matplotlib pandas 的单功能 Python 包&#xff0c;它的唯一目的是绘制山脊线图 Joyplots&#xff08;也称为 Ridgeline Plots&…

滑块验证码识别代码分享

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

记:STM32F4参考手册-存储器和总线架构

STM32F4参考手册-存储器和总线架构 目录 STM32F4参考手册-存储器和总线架构 系统架构 AHB/APB总线桥&#xff08;APB&#xff09; 存储器组织结构 存储器映射 SRAM概述 Flash概述 位段 自举配置 嵌入式自举程序 物理重映射 系统架构 主系统由32位多层AHB总线矩阵构…

cximage在vs2013下使用方法

1.下载源码 Cximage源码官网 CxImage download | SourceForge.net 下载最新版本 702版本 Download cximage702_full.7z (CxImage) 2.编译 vs2013打开CxImageFull_vc10.sln 这个源码版本是vc10的版本&#xff0c;所以vs2013会自动更新项目 因为cximage需要在后面的项目中使…

零基础学python之高级编程(1)---面向对象编程及其类的创建

面向对象编程及其类的创建 文章目录 面向对象编程及其类的创建前言一、面向过程编程和面向对象编程的概念1.面向过程编程(Procedural Programming)2.面向对象编程(Object-Oriented Programming&#xff0c;OOP) 二、面向对象编程基础1.初识类(class)和对象调用方法 2.类中的两种…

HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-时间管理

目录 一、时间管理1.1、时间接口 一、时间管理 时间管理以系统时钟为基础&#xff0c;给应用程序提供所有和时间有关的服务。系统时钟是由定时器/计数器产生的输出脉冲触发中断产生的&#xff0c;一般定义为整数或长整数。输出脉冲的周期叫做一个“时钟滴答”。系统时钟也称为…

视觉开发板—K210自学笔记(三)

本期我们来遵循其他单片机的学习路线开始去做一位点灯大师—点亮一个LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看上一节的文档&#xff0c;看看开发板原理图到底是哪个LED跟哪个IO连在一起。 一、硬件电路 根据之前官方提供的assembly draw…

Redis进阶(二):事务

redis事务特点 弱化的原子性 redis事务的原子性不像MySQL原子性一样&#xff0c;执行不成功的话&#xff0c;redis事务不会进行回滚操作 不具备一致性 redis没有约束&#xff0c;也没有回滚机制&#xff0c;因此事务执行的过程中如果某个修改操作出现失败&#xff0c;就可能引起…

【【C++类与对象(下)】】

1. 再谈构造函数 构造函数体赋值 在创建对象时&#xff0c;编译器会通过调用构造函数&#xff0c;给对象中的各个成员变量一个合适的初始值&#xff1a; class Date { public:// 构造函数Date(int year 0, int month 1, int day 1){_year year;_month month;_day day;}…