类和对象一

news2025/4/8 19:16:34

目录

1.类的引入

2.类的定义

3.访问限定符

4.类的作用域

5.类对象模型

6.类的大小


1.类的引入

C语言结构体中只能定义变量,在C++中,结构体不仅可以定义变量,也可以定义函数。

C++兼容C语言,结构用法可以继续使用

同时sruct也升级成了类

struct Stack
{
	int* a;
	int top;
	int capacity;
};
int main()
{
	struct Stack s1;
	Stack s2;
	return 0;
}

我们可以用两种方式定义结构体,s1是C语言的。s2是C++的

上面那串的Stack是类名,有了类名就可以作下面的类型

还有一个成员函数,C语言的初始化都要放在外面去写,现在我们还可以在类里面写成员函数了,而且不用传这个参数了,成员变量它直接就能访问

struct Stack
{
	void Init()
	{
		a = nullptr;
		top = capacity = 0;
	}
	int* a;
	int top;
	int capacity;
};
int main()
{
	Stack s2;
	s2.Init();
	return 0;
}

还有比如说push我们也可以类似上面一样的写法

s2.Push(1);

2.类的定义

class className
{

};

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略;

那么class和struct有什么区别呢

class引入了访问限定符这一类的概念

3.访问限定符

访问限定符分为了三个1.public(公有)2.protected(保护)3.private(私有)

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

2.protected和private的成员在类外不能直接被访问

3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

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

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

class Stack
{
	void Init()
	{
		a = nullptr;
		top = capacity = 0;
	}
	void Push(int x)
	{
		if (top == capacity)
		{
			size_t newcapacity = capacity == 0?4:capacity * 2;
			a = (int*)realloc(a,sizeof(int) * newcapacity);
			capacity = newcapacity;
		}
		a[top++] = x;
	}
	int* a;
	int top;
	int capacity;
};
int main()
{
	Stack s2;
	s2.Init();
	s2.Push(1);
	return 0;
}

这里是无法被访问的,那么我们为什么要引入class呢

	cout << s2.a[s2.top] << endl;
	cout << s2.a[s2.top-1] << endl;

有人以为可以访问栈顶元素是可以这样子搞,但是它不知道是指向栈顶元素还是指向栈顶元素的下一个位置

实际上指向的是栈顶元素的下一个位置,所以C++就不希望别人这样随意的访问

class Stack
{
public:
	void Init()
	{
		a = nullptr;
		top = capacity = 0;
	}
	void Push(int x)
	{
		if (top == capacity)
		{
			size_t newcapacity = capacity == 0?4:capacity * 2;
			a = (int*)realloc(a,sizeof(int) * newcapacity);
			capacity = newcapacity;
		}
		a[top++] = x;
	}
	int Top()
	{
		return a[top - 1];
	}
private:
	int* a;
	int top;
	int capacity;
};
int main()
{
	Stack s2;
	s2.Init();
	s2.Push(1);
	cout << s2.Top() << endl;
	return 0;
}

这样子通过private和public的限定我们就能让你访问到我想让你访问到的和不想让你访问到的,比如说你想访问栈顶元素,我们在类里面通过操作来反馈给你就大大减少了出错的可能性了

但是我们上面一个public去掉就跑不动了,因为class默认是私有的

类里面不受访问限定符的限制,限制的是类外面的

类的两种定义方式

1.声明和定义全部放在类体中,需注意,成员函数如果在类中定义编译器可能会将其当成内联函数处理

2.类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名

这里是.h文件里面的

class Stack
{
public:
	void Init();
	void Push(int x);
	int Top();
private:
	int* a;
	int top;
	int capacity;
};

这里是.cpp文件里面的

void Stack::Init()
{
	a = nullptr;
	top = capacity = 0;
};
void Stack::Push(int x)
{
	if (top == capacity)
	{
		size_t newcapacity = capacity == 0 ? 4 : capacity * 2;
		a = (int*)realloc(a, sizeof(int) * newcapacity);
		capacity = newcapacity;
	}
	a[top++] = x;
};
int Stack::Top()
{
	return a[top - 1];
};

这里加Stack::是为了区分全局函数和成员函数,还可以使用类域里面的成员变量和成员函数(编译器默认去全局域里面找)

注意:类里面没有向上查找这种说法,类是类域范围里面都可以使用的,你在上面使用一个变量,它会在类域这个范围内查找

这里我们引入一个日期类

class Date
{
public:
	void Init(int year, int month, int day)
	{
		year = year;
	month = month;
	day = day;
	}
private:
	int year;
	int month;
	int day;
};
int main()
{
	Date d;
	d.Init(2022, 7, 19);
}

这里就涉及到域搜索的知识,一个是局部域的year,一个是类域的year,局部优先,所以是自己赋值给自己,所以好区分我们通常可以这样子写

	int _year;
	int _month;
	int _day;

C++标准并没有这么写,看你的个人意愿,就形成了风格

4.类的作用域

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

这个我们在上面的内容也有间接提到,不做过多的解释

5.类对象模型

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

1.类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间类储存它;

2.一个类可以实例化出多个对象,实例化的对象,占用实际的物理空间,存储类成员变量

我们解除私有,我们能不能这样访问

int main()
{
	Date::_year;
	Date._year;
}

这样是不行的,因为我们上面的年月日是声明不是定义,声明没有给它开空间不能访问

Date d;

这才是定义,定义开出来空间上面的空间就都开出来了我们就可以访问它了

而且我们不能直接去访问,因为是私有的,我们要通过间接的方式去访问

d._year=1;

这样是不行的

类就像一个图纸,我们只有建出来才是实体

6.类的大小

我们来看这个类的大小

cout << sizeof(Date) << endl;
cout << sizeof(d) << endl;

我们可以看见函数的大小是不包括在里面的,为什么呢

Date d1;
d1.Init(1,2,3);
Date d2;
d2.Init(4, 5, 6);

如果我们在每个对象中都存一个这样一个函数肯定是不划算的,就像是我们小区里面的公共空间这个小区里面都可以使用,但是像年月日就是自己房子里面的家具,自己使用

所以类里面的函数都存在公共代码区,所以每次使用的时候都会去这个区域里面使用

这一点我们通过汇编代码也可以得到证实 

我们看一下类中仅有成员函数和空类的大小

class A2
{
public:
	void f2(){}
};
class A3
{

};
int main()
{
	cout << sizeof(A2) << endl;
	cout << sizeof(A3) << endl;
}

有成员函数和没有成员函数是没有区别的,成员函数也不存在对象里面

这里涉及到占位的知识

C++对于这种只有成员函数和空类,分配1byte,不存储数据,只是占位

设想一下我们如果连一个byte位都不给它分配我们怎么区别,不定义过怎么证明这个对象存在

A2 a1;
A2 b1;
cout <<& a1 << endl;
cout << &b1 << endl;

类和对象的知识和指针一样都起到承上启下的作用,而且类和对象的知识也是很多的,学好了类和对象才好理解下面的STL知识等等,如果写的不好欢迎大家指出

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

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

相关文章

Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置&#xff0c;进而将其写入到本地或者数据库中。 学习Xpath爬虫&#xff0c;我们首先学习一下python中lxml库 关于库 lxml 终端下载Xpath需要用到的模块 pip install lxml 关于HTML 超文本标…

vulnhub靶场【hacksudo】之LPE的后续提权方法学习

前言 靶场&#xff1a;hacksudo-lpe的后几个challenge 基于上篇靶场hacksudo-ple的sudo提权 SUID文件提权 ar文件提权 使用find寻找具有SUID权限的文件 find / -perm -us -type f 2>/dev/null查看ar的SUID用法 sudo install -m xs $(which ar) .TF$(mktemp -u) LFILE&…

uniapp -- 实现页面滚动触底加载数据

效果 首选,是在pages.json配置开启下拉刷新 {"path": "pages/my/document/officialDocument","style": {"navigationStyle":</

【Windows11系统局域网共享文件数据】

【Windows11系统局域网共享文件数据】 1. 引言1. 规划网络2. 获取必要的硬件3. 设置网络4. 配置网络设备5. 测试网络连接6. 安全性和维护7. 扩展和优化 2. 准备工作2.1: 启用网络发现和文件共享2.2: 设置共享文件夹 3. 访问共享文件夹4. 小贴士5. 总结 1. 引言 随着家庭和小型办…

学习Ajax (概述,应用场景,使用jQury 实现ajax)

目录 前言 概述 什么是Ajax? 同步交互与异步交互的区别是什么呢&#xff1f; 应用场景 场景1 在搜索框搜索 资源 场景2 登录业务的对用户名处理 AJAX的优缺点 优点&#xff1a; 缺点&#xff1a; 使用jQury 实现ajax 使用步骤 1 引入jQury 文件 2 使用Ajax 函数…

【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]

目录 参考资料&#xff1a; 利用 Boot 选择不同的启动方式&#xff1a; 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM)&#xff1a; 1. Cortex-M 内核芯片——启动原理&#xff1a; 1.1. 启动流程&#xff1a; 1.2. 根据单片机的存储器映射和架构图&#xff1a;启动…

C语言(指针基础2练习)

利用指针变量将一个数组中的数据反向输出。 #include <stdio.h>void rev(int *arr, int size) {int *end arr size - 1;for (int *ptr end; ptr > arr; ptr--){printf("%-3d", *ptr);}printf("\n"); } void get(int arr[], int len) {for (in…

微信小程序web-view 嵌套h5界面 实现文件预览效果

实现方法&#xff1a;(这里我是在小程序里面单独加了一个页面用来下载预览文件) 安装 使用方法请参考文档 npm 安装 npm install weixin-js-sdk import wx from weixin-js-sdk预览 h5界面代码 <u-button click"onclick" type"primary" :loading"…

C—初阶调试

对你有帮助的话能否一键三连啊&#xff01;祝每个人心想事成&#xff01; 什么是Bug? 首先我们先了解一下日常口语中的“Bug”是什么 Bug可以理解为计算机程序错误&#xff0c;编程时的漏洞 调试及重要性 顾名思义&#xff0c;调试就是通过工具找出bug存在&#xff0c;找出…

vs打开unity项目 新建文件后无法自动补全

问题 第一次双击c#文件自动打开vs编辑器的时候能自动补全&#xff0c;再一次在unity中新建c#文件后双击打开发现vs不能自动补全了。每次都要重新打开vs编辑器才能自动补全&#xff0c;导致效率很低&#xff0c;后面发现是没有安装扩展&#xff0c;注意扩展和工具的区别。 解决…

中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)

一、概述 MongoDB是一种常见的Nosql数据库&#xff08;非关系型数据库&#xff09;&#xff0c;以文档&#xff08;Document&#xff09;的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中&#xff…

基于大模型的 AI Agent 技术框架全解析

一、AI Agent 与大语言模型&#xff1a;智能时代的双璧合辉 &#xff08;一&#xff09;AI Agent&#xff1a;智能化浪潮的引领者 在科技迅猛发展的当下&#xff0c;AI Agent 作为一种能够自主感知环境、决策并行动的智能系统&#xff0c;正引领着智能化的新潮流。与传统智能系…

5.ABAP结构体和内表

总学习目录请点击下面连接 SAP ABAP开发从0到入职&#xff0c;冷冬备战-CSDN博客 目录 5.1.结构化数据对象 定义 如何引用结构化的数据对象 拷贝 实战练习 创建 拷贝 调试代码 5.2.内表 行类型 键 表种类 存取类型 表类型 如何在本地定义表类型 内表三种可能的…

3D 生成重建030-SV3D合成环绕视频以生成3D

3D 生成重建030-SV3D合成环绕视频以生成3D 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文提出了Stable Video 3D (SV3D)——一个用于生成围绕三维物体的高分辨率图像到多视角视频的潜在视频扩散模型。最近关于三维生成的文献提出了将二维生成模型应用于新视图合成…

中介者模式的理解和实践

一、中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;&#xff0c;也称为调解者模式或调停者模式&#xff0c;是一种行为设计模式。它的核心思想是通过引入一个中介者对象来封装一系列对象之间的交互&#xff0c;使得这些对象不必直接相互作用&#xff0c;从…

【蓝桥杯每日一题】砍竹子

砍竹子 2024-12-7 蓝桥杯每日一题 砍竹子 STL 贪心 题目大意 这天, 小明在砍竹子, 他面前有 nn 棵竹子排成一排, 一开始第 ii 棵竹子的 高度为 h i h_i hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为…

泷羽sec-burpsuite(5)app渗透测试(上) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

从一个Bug谈前端响应拦截器的应用

一、问题场景 今天在开发商品管理系统时&#xff0c;遇到了一个有趣的问题&#xff1a;当添加重复的商品编号时&#xff0c;页面同时弹出了两条 "商品编号已存在" 错误提示&#xff1a; 这个问题暴露了前端错误处理机制的混乱&#xff0c;让我们从这个问题出发&…

量子变分算法---损失函数

引子 关于损失函数&#xff0c;我们知道在强化学习中&#xff0c;会有一个函数&#xff0c;用来表示模型每一次行为的分数&#xff0c;通过最大化得分&#xff0c;建立一个正反馈机制&#xff0c;若模型为最优则加分最多&#xff0c;若决策不佳则加很少分或者扣分。而在神经网络…

车间的图纸在传输过程的安全怎么保障?

车间的图纸在传输过程的安全保障&#xff0c;要从很多方面出发分析&#xff0c;本文从以下几点为大家列出几个&#xff0c;看看有没有你想知道的呢~ 1、采用先进的图纸加密软件 采用先进的加密算法对图纸进行加密处理&#xff0c;确保图纸文件在存储、传输和使用过程中的安全性…