当前位置: 首页 > article >正文

类和对象(上篇)

类和对象

  • 面向过程和面向对象的区别:
  • 结构体变为类
  • 类的一些性质
    • 类的访问限定符
    • 类的实体化
    • 类对象的大小
    • this指针

面向过程和面向对象的区别:

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
在这里插入图片描述
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
在这里插入图片描述

结构体变为类

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

比如用C语言的结构体写一个栈,成员变量和函数是分离的

struct Stack
{
	int* a;
	int capacity;
	int size;
};

void Init(struct Stack* p);
void push(struct Stack* p);

而C++来定义栈的时候,结构体里面也可以定义函数,且在不对结构体重命名的情况下,在定义结构体变量的时候也可以省了前面的struct

typedef int DataType;
struct Stack
{
//函数可以写在结构体的里面
	void Init(size_t capacity)//接收的时候也不需要定义一个指针接收结构体变量的的地址,因为有一个默认指针thiS来接收
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (nullptr == _array)
		{
			perror("malloc申请空间失败");
			return;
		}
		_capacity = capacity;
		_size = 0;
	}
	void Push(const DataType& data)
	{
		// 扩容
		_array[_size] = data;
		++_size;
	}
	DataType Top()
	{
			return _array[_size - 1];
	}
	void Destroy()
	{
		if (_array)
		{
			free(_array);
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}
	DataType* _array;
	size_t _capacity;
	size_t _size;
};
int main()
{
	Stack s;//可以省去前面的struct
	s.Init(10);//且调用函数的时候不在是传结构体变量的指针,而是用结构体变量点函数;
	s.Push(1);
	s.Push(2);
	s.Push(3);
	cout << s.Top() << endl;
	s.Destroy();
	return 0;
	}

此外它也可以申明和定义分离,但是要注意的是,他的作用域,定义的函数要用 结构体名::函数
来实现才能找到这个结构体里申明的函数
当然在声明和定义分离的情况下,.h文件中也可以出现函数的定义。
在这里插入图片描述
到了这里我们就可以把结构体变成类了

类的一些性质

在这里插入图片描述

所以在C++中我们定义成员变量的时候一般在前面加一个—

class Date
{
public:
	void Init(int year)
	{
		_year = year;
	}
private:
	int _year;
};

类的访问限定符

public:公有
private:私有
protected:保护
当前阶段我们认为私有private和保护protected没有区别

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
3. 如果后面没有访问限定符,作用域就到 } 即类结束
class的默认访问权限为private,struct为public(因为struct要兼容C)——这也是struct和class的一个重要区别
在这里插入图片描述

注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

类的实体化

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它;
在这里插入图片描述
只有把类实例化为一个个对象,然后通过这个对象才能访问类中的值
类和对象是一对多的(设计图和房子)

类对象的大小

在这里插入图片描述
一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐

注意空类(无成员变量)的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象(表示他存在过)
在这里插入图片描述

this指针

在这里插入图片描述
C++里影藏的形参指针this
实际上是这样的,只不过C++编译器帮我们做了,所以我们不可以写出来
在这里插入图片描述
不过这里是可以写出来的
在这里插入图片描述
所以在调用类的的成员函数的时候,是不需要把对象的&地址写在实参里的,只需要对象名.函数,所以,函数的形参是影藏了一个this指针的。

因为对象的大小只有成员变量的大小,所以this指针的大小是不可能存在对象里面的。是存在栈帧上面的。


http://www.kler.cn/news/155163.html

相关文章:

  • css中的 Grid 布局
  • 使用docker切换任意版本cuda使用GPU
  • wvp如果确认音频udp端口开放成功
  • 中断方式的数据接收2
  • 在 AlmaLinux9 上安装Oracle Database 23c
  • 回归预测 | MATLAB实现基于LightGBM算法的数据回归预测(多指标,多图)
  • 壹财基金杨振骏:资本如何做好Web3布局?
  • 整数转罗马数字算法(leetcode第12题)
  • 单片机第三季-第六课:STM32标准库
  • sql27(Leetcode1729求关注者的数量)
  • 国家数据局首次国考招聘12人
  • vue面试题整理(1.0)
  • 深入理解 Vue 中的指针操作(二)
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • 跟我学c++高级篇——动态反射之一遍历
  • 代码浅析DLIO(四)---位姿更新
  • LeetCode(49)用最少数量的箭引爆气球【区间】【中等】
  • 基本计算器[困难]
  • 【日常踩坑】Debug 从入门到入土
  • 完美解决:wget命令下载时遇到“错误 308:Permanent Redirect。”
  • 大数据Hadoop-HDFS_架构、读写流程
  • 【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)
  • LeetCode每日一题 | LeetCode-1094.拼车
  • 栈实现队列,力扣
  • ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO
  • MVCC-
  • 【.NET全栈】.net的微软API接口与.NET框架源码
  • LLM推理部署(三):一个强大的LLM生态系统GPT4All
  • AI - FlowField(流场寻路)
  • 2023年第十二届数学建模国际赛小美赛B题工业表面缺陷检测求解分析