【C++】类和对象(上):带你速度了解什么是类,如何定义类!!

news2024/9/21 1:24:00

前言:

        前面我们学习C++一些基础的内容,也可以说C++针对C语言的缺陷进行改进。而今天我们要学的是C++的内容也就是类和对象。

一、初识类:

我们先来看看C语言解决一个问题的过程:

假设有以下这个场景:你需要手洗一件衣服,你需要做那几步?

拿盆—>放水—>放衣服—>放洗衣粉—>手搓—>换水—>放洗衣粉—>手搓—>拧干—>晾衣服

上面就是C语言解决一个问题的过程,现在我们来看看C++是怎么解决这个问题的:

        C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。例如上面例子:可以归类成这几个对象:你、衣服、洗衣机、洗衣粉。这几个对象都会有自己的属性,也就是自己的动作,比如对象“你”会实现:拿盆—>放水—>放衣服—>放洗衣粉。有了对象之后,洗衣服这个动作就由这四个对象交互完成,人不再关系洗衣机该如何洗、如何拧干等问题。 

二、类的引入:

        先来看看我们C语言中的struct,在C++中,它被升级成了类.

struct date
{
    int year;
    int month;
    int day;
};

         这是在C语言中的我们使用的方法,现在他被升级成了类,我们就可以在一个结构体中定义一个函数了:

#include<iostream>
using namespace std;

struct date
{
	int Add(int a,int b)
	{
		return a + b;
	}
	int year;
	int month;
	int day;
};
int main()
{
	date a;
	cout << a.Add(2, 8) << endl;
	return 0;

}

        大家发现没有,再main函数里使用结构体的时候我没有加struct,编译器也没有报错,这是因为C++把结构体当成类,而类不需要加struct,但是在C++中更喜欢用class来替换struct

三、类的定义:

        

class classname
{
    //类体;
};

        class为定义类的关键字,classname为类的名称,{}为类的主体,与结构体相同,类结束时也要加一个;

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

1.类的变量称为类的属性或成员变量。

2.类中的函数称为类的方法或者成员函数。

1.类的两种定义方式:

类定义了一个新的作用域仅能在这个作用域里访问private成员,与C相同定义一个函数的时候也可以采用声明与定义放在同一个地方:

class date
{
public:
    int max(int a, int b)
    {
        return a>b?a:b;
    }
};

虽然可以生命和定义放在一起,但是更推荐将函数声明放在类中,定义写在这个类的外面(也可以解释为将类的生命放在头文件当中,类的具体定义放到源文件中,这样做的好处和C一样),但注意,这样写要在定义出加上类作用声明符“::",例如:

class date
{
public:
    int max(int a, int b);

};
int date::max(int a, int b)
{
    return a > b ? a : b;
}

2.成员变量的命名规范:

 我们先来看看这段代码:

#include<iostream>
using namespace std;
class date
{
public:
    int Init(int day)
    {
        day = day;
    }
    int days()
    {
        return day;
    }
private:
    int day;
};

int main()
{
    date d1;
    d1.Init(6);
   
    cout << d1.days() << endl;
    return 0;
}

        这段代码中的day=day原意是想要将外部传进的参数放进这个d1的day中,但是编译器会优先使用局部变量,所以不能达到我们想要的结果。所以我们一般将成员变量名字前面加一个_来区分。

四、类的访问限定符与封装:

        这里介绍一下上述代码中出现的三个关键字:private、public、protected。这几个是访问限定符。

1.在类中出现访问限定符的作用域一直到下一个访问限定符出现为止。

2.public修饰的成员在类外可以直接被访问。

3.private与protected(他们有些差别,但是目前暂且认为他们是一样的)修饰的成员在类外无法被访问,通常通过public里的对应函数来进行访问。

4. 如果后面没有访问限定符,作用域就到 } 即类结束。

5. class的默认访问权限为private,struct为public(因为struct要兼容C)

五、类的实例化:

        类是对一个对象的描述,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;可以把类看成你建房子之前设计的图纸,这张图纸设计了你房子几个房间,几个客厅等等一系列东西。当你用这个图纸去造出一个个房子时,它就占用土地面积。建房子过程就是类实例化过程,类实例化之后就占用内存空间了。

1.类的空间计算:

#include<iostream>
using namespace std;
class date
{
public:
    int Init(int day)
    {
        _day = day;
    }
    int days()
    {
        return _day;
    }
private:
    int _day;
};

int main()
{
    date d1;//类的实例化
    d1.Init(6);
   
    cout << sizeof(date) << endl;
    return 0;
}

我们的正常想法是:类中有一个整形变量,还有两个成员函数,所以这个类的大小应该在4字节以上,但是结果呢?

代码运行之后:

 为什么只有4字节呢?

        还是刚刚那个图纸,但是现在的图纸是建小区的图纸,小区都有篮球场,但我需要为每个家庭都建一个篮球场吗?显然不需要,如果每个家庭都建一个篮球场的话,而且篮球场需要好几个人才能一起打,会造成大量的空间浪费,所以我们就画出一块地方专门建篮球场供大家使用。类中的成员函数也一样,我们为了避免造成空间浪费将他们放在公共区域,这样每一个对象使用的成员函数都是用一个。所以计算一个对象的所占内存大小的时候仅需要计算成员变量的内存大小(符合结构体内存对齐的规则)

六、this指针:

我们来看看这段代码:

#include<iostream>
using namespace std;
class date
{
public:
	void Init(int year, int month, int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void Print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	date d1;
    date d2;
	d1.Init(2023, 5, 20);
	d1.Print();
	return 0;
}

输出结果:

Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?

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

        也就是说其实上面的代码在编译器看来其实是这样的:

#include<iostream>
using namespace std;
class date
{
public:
    //因为规定this只能在成员函数内部使用,所下面采用屏蔽
	//void Init(date* this,int year, int month, int day);
	void Init(int year, int month, int day)
	{
		this->_year = year;
		this->_month = month;
		this->_day = day;
	}
    //因为规定this只能在成员函数内部使用,所下面采用屏蔽
	//void Print(date* this);
	void Print()
	{
		cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};
int main()
{
	date d1;
	d1.Init(2023, 5, 20);
	d1.Print();
	return 0;
}

this指针特性:

1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。

2. 只能在“成员函数”的内部使用。

3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。 所以对象中不存储this指针。

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

5.this指针存储在栈中。

总结:

        这篇文章,我们学习了什么是类,如何定义一个类,类的实例化还有如何计算类的空间计算,最后介绍了this,解释了函数是如何知道应该设置对象的。今天我们的学习到此结束。

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

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

相关文章

算法Day09 | KMP,28. 实现 strStr() ,459.重复的子字符串

Day09 KMP28. 实现 strStr()459.重复的子字符串 KMP KMP是三个人人名缩写&#xff0c;用于在文本字符串text中搜索pattern字符串&#xff0c;返回在text中第一出现的位置。 算法做法就是在暴力匹配的基础上加速匹配。通过对pattern字符串求next数组(该数组也成为前缀表)&#…

element ui 表格内嵌图片预览展示样式问题 (element plus)

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言一、问题二、解决 前言 一、问题 二、解决 添加上preview-teleported 属性即可。

ChatGPT ✖️ 前端 = 有点er意思

HOT! HOT! HOT! &#x1f525; &#x1f525; &#x1f525; ChatGPT登上了国内各大平台的热搜榜&#xff0c;应该在去年11月末的时候就有不少同学了解并使用过&#xff0c;那个时候它刚刚问世&#xff0c;在互联网圈子里有了很大的热度&#xff0c;但是对于大众来说&#xff…

OpenGLES读写图像数据(内存与GPU)——使用PBO

一、什么是PBO 在 OpenGL 开发中&#xff0c;特别是在低端平台上处理高分辨率的图像时&#xff0c;图像数据在内存和显存之前拷贝往往会造成性能瓶颈&#xff0c;而利用 PBO 可以在一定程度上解决这个问题。 PBO &#xff08;Pixel Buffer Object&#xff09;是 OpenGL ES 3.…

iOS开发提效cocoapods插件cocoapods-util

cocoapods-util介绍 cocoapods-util是一个iOS开发提效的cocoapods插件。 取名util的原因是我想做一个通用的插件&#xff0c;把一些iOS中常用的命令或问题整理起来。 插件中除了package命令是根据cocoapods-packager插件做了修改而来&#xff0c;其余命令都是属于自己总结开…

uwb高精度定位系统源码 UWB高精度定位技术原理与实现

uwb高精度定位系统 UWB高精度定位技术原理与实现 近些年物联网产业高速发展&#xff0c;越来越多的物联网终端连上了网络&#xff0c;实现了人与物&#xff0c;甚至物与物之间的互连互通。随着智能化要求的进一步提高和物联网应用的进一步拓展&#xff0c;除了互联互通&#x…

Doxygen源码分析:doxygen执行过程的拆解

Doxygen源码分析&#xff1a;doxygen执行过程的拆解 2023-05-19 23:09:17 ~ 2023-05-20 16:38:13 ChrisZZ imzhuofoxmailcom Hompage https://github.com/zchrissirhcz 文章目录 Doxygen源码分析&#xff1a;doxygen执行过程的拆解1. doxygen 版本2. doxygen 可执行程序的入口…

System V方案 — 共享内存

目录 System V方案 — 详述共享内存共享内存共享内存的原理共享内存数据结构共享内存函数实例 消息队列消息队列数据结构消息队列函数创建删除 信号量信号量数据结构信号量函数创建删除 进程互斥 总结 System V方案 — 详述共享内存 SystemV标准的进程间通信方式&#xff0c;是…

【react 全家桶】react-Hook(上)

本人大二学生一枚&#xff0c;热爱前端&#xff0c;欢迎来交流学习哦&#xff0c;一起来学习吧。 <专栏推荐> &#x1f525;&#xff1a;js专栏 &#x1f525;&#xff1a;vue专栏 &#x1f525;&#xff1a;react专栏 文章目录 14【react-Hook &#xff08;上&#x…

计算机网络基础知识(六)—— 什么是HTTP协议?你听我说

文章目录 01 | 基本概念02 | 工作原理 && 特点03 | URI && URL04 | 消息结构05 | 请求方法06 | http响应头信息07 | 状态码08 | HTTP的常见安全机制09 | HTTP的缓存机制10 | HTTP/2 && HTTP/3新特性11 | 面试中常见问题 超文本传输协议&#xff08;Hyp…

【前端知识】Cookie, Session,Token和JWT的发展及区别(四)

【前端知识】Cookie, Session,Token和JWT的发展及区别&#xff08;四&#xff09; 9. JWT9.1 JWT的背景及定义&#xff08;1&#xff09;JWT的字面理解&#xff08;2&#xff09;JWT与传统Token的区别 9.2 JWT的组成&#xff08;1&#xff09; Header&#xff08;头部&#xff…

【UDS】诊断故障代码老化机制

文章目录 简介相关术语1. 老化计数器 Ageing counter2. 诊断故障代码已老去 DTC aged3. 已老去计数器 Aged counter4. 操作循环 Operation cycle5. 诊断故障代码老化机制 DTC aging mechanism 总结 ->返回总目录<- 简介 诊断故障代码&#xff08;DTC&#xff09;一旦生…

【IDEA使用指南】使用Hibernate框架的Java项目,如何找到并打开 “Import Database Schema”窗口?

【IDEA使用指南】使用Hibernate框架的Java项目&#xff0c;如何找到并打开 “Import Database Schema”窗口&#xff1f; 背景&#xff1a; 使用 Hibernate 框架时&#xff0c;假如在 “Import Database Schema” 窗口&#xff08;如下图所示&#xff09;时&#xff0c;点击了…

day06_Java中的流程控制语句

流程控制 简单来讲所谓流程就是完成一件事情的多个步骤组合起来就叫做一个流程。在一个程序执行的过程中&#xff0c;各条语句的执行顺序对程序的结果是有直接影响的。我们必须清楚每条语句的执行流程。而且&#xff0c;很多时候要通过控制语句的执行顺序来实现我们想要的功能…

.Net6 使用aspose.cells23.5.0破译

一、测试代码 internal class Program { static void Main(string[] args) { WorkbookDesigner wb new WorkbookDesigner(new Workbook()); var style new CellsFactory().CreateStyle(); style.Borders.SetColor(C…

路径规划算法:基于缎蓝园丁鸟算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于缎蓝园丁鸟优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于缎蓝园丁鸟优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能…

交换式以太网的诞生

电路交换&#xff0c;终端(电话)独占端线路自然而然&#xff0c;天经地义&#xff0c;可计算机收发的是数据包(即数据分组)&#xff0c;当多台终端接入到同一个共享介质的网络&#xff0c;所有终端可 “同时” 收发数据&#xff0c;一起统计复用网络&#xff0c;多台终端如何协…

Linux常用命令——htop命令

在线Linux命令查询工具 htop [非内部命令]一个互动的进程查看器&#xff0c;可以动态观察系统进程状况。 补充说明 htop命令 是Linux系统中的一个互动的进程查看器&#xff0c;一个文本模式的应用程序(在控制台或者X终端中)&#xff0c;需要ncurses。 与Linux传统的top相比…

【5.20】五、安全测试——概念与漏洞

目录 5.1 安全测试概述 5.1.1 什么是安全测试 5.1.2 安全测试的基本原则 5.2 常见的安全漏洞 5.2.1 SQL注入 5.2.2 XSS跨站脚本攻击 5.2.3 CSRF攻击 软件安全测试是软件测试的重要研究领域&#xff0c;它是保证软件能够安全使用的最主要手段&#xff0c;做好软件安全测试…