【C++】认识类和对象

在这里插入图片描述
🔥博客主页 小羊失眠啦.
🎥系列专栏《C语言》 《数据结构》 《C++》 《Linux》 《Cpolar》
❤️感谢大家点赞👍收藏⭐评论✍️


在这里插入图片描述

文章目录

  • 一、什么是面向对象?
  • 二、类的引入
  • 三、类的定义
  • 四、类的访问限定符与封装
    • 4.1 访问限定符
    • 4.2 封装
  • 五、类的作用域
  • 六、类的实例化
  • 七、类对象模型
  • 八、this指针
    • 8.1 this指针的特性
  • 九、C语言与C++实现栈的对比
    • 9.1 C语言实现
    • 9.2 C++实现

一、什么是面向对象?

学习C语言时,我们就经常听说C语言是面向过程的,那么什么是面向过程呢?举个例子,我们现在要完成洗衣服的工作,此刻我们关注的是洗衣服的过程:

  1. 拿个盆子;

  2. 接水;

  3. 放衣服;

  4. 到洗衣粉

  5. 在这里插入图片描述

    C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题

    C++是面向对象的,关注的是对象,在解决问题时,通过对象间的交互来完成,每个对象负责不同的工作。


二、类的引入

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

以前用C语言实现数据结构——栈时,我们这样定义:

//C语言
typedef int DataOfStackType;

typedef struct stack
{
	DataOfStackType* a;
	int top;
	int capacity;
}stack;

void StackInit(stack* ps);

void StackPush(stack* ps, DataOfStackType data);

void StackPop(stack* ps);

//...

而在C++中,我们可以这样定义:

//C++
typedef int DataOfStackType;

typedef struct stack
{
	void StackInit(stack* ps);

	void StackPush(stack* ps, DataOfStackType data);

	void StackPop(stack* ps);
//...

	DataOfStackType* a;
	int top;
	int capacity;
}stack;

像上面的定义方式,C++中更喜欢用一个新的名字——class来代替struct

class stack
{
	void StackInit(stack* ps);

	void StackPush(stack* ps, DataOfStackType data);

	void StackPop(stack* ps);
//...

	DataOfStackType* a;
	int top;
	int capacity;
};

命名规则建议:C++类的成员我们习惯在前面加一个_(来区分类的对象和传入的参数)


三、类的定义

class className
{
	//...类的主体:由成员函数和成员变量组成
};//一定要注意后面的分号

如上所示,类的定义与结构体的定义非常相似,但我们还是得认识几个专有名词。

  • class :定义类的关键字;
  • class Name:类的名字;
  • 类的主体:{}中为类的主体,由成员变量成员方法组成;
  • 成员变量:又称类的属性,指在类中定义的变量;
  • 成员函数:又称类的方法,指在类中定义的函数;

类的定义方式一般有两种:

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

    //日期类
    class Date
    {
    	void Init(int year, int month, int day)
    	{
    		_year = year;
    		_month = month;
    		_day = day;
    	}
    	void Print()
    	{
    		cout << _year << "-" << _month << "-" << _day << endl;
    	}
    
    	int _year;
    	int _month;
    	int _day;
    };
    
  2. 类的声明放在.h文件中成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

    //Date.h文件中声明类
    //日期类
    class Date
    {
    public:
    
    	void Init(int year, int month, int day);
    	void Print();
    	
    	int _year;
    	int _month;
    	int _day;
    };
    
    //Date.c文件中定义成员函数
    #include"Date.h"
    
    void Date::Init(int year, int month, int day)
    {
    	_year = year;
    	_month = month;
    	_day = day;
    }
    void Date::Print()
    {
    	cout << _year << "-" << _month << "-" << _day << endl;
    }
    

一般情况下,更期望采用第二种方式。至于其中的public是什么意思,这个等下再说。


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

4.1 访问限定符

我们在类中定义了各种成员函数与成员变量,有时候,我们不想让别人随便访问类中的某些成员,比如成员变量,但其它的成员对外开放,比如成员函数,那么我们就需要用到访问限定符来修饰这些成员。

访问限定符有三个:publicprotectedprivate

在这里插入图片描述

访问限定符说明

  • class的默认访问权限为privatestructpublic(因为struct要兼容C);
  • public修饰的成员在类外可以直接被访问
  • protectedprivate修饰的成员在类外不能直接被访问(此处 protected 和 private 是类似的);
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;
  • 如果后面没有访问限定符,作用域就到 } 即类结束。

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

一道面试题

问题:C++中 struct 和 class 的区别是什么?

解答: C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private

4.2 封装

面向对象有三大特性:封装、继承、多态。在当前阶段,我们只学习封装的特性。

  • 什么是封装呢?

用专业一点的话来回答就是:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互

封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以及键盘插孔等让用户可以与计算机进行交互即可

在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用


五、类的作用域

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

class Person
{
public:
	void PrintPersonInfo();
private:
	char _name[20];
	char _gender[3];
	int  _age;
};
// 这里需要指定PrintPersonInfo是属于Person这个类域
void Person::PrintPersonInfo()
{
	cout << _name << " "<< _gender << " " << _age << endl;
}

六、类的实例化

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

//类的声明
class Date
{
public:

	void Init(int year, int month, int day);
	void Print();

	int _year;
	int _month;
	int _day;
};

有这样一个问题

  • 上面实现的Date类占用多大的内存空间?

答案是,不占用空间。因为定义类只是一个描述对象的过程

类实例化出对象就像现实中使用设计图建造出房子,就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,而实例化出的对象才是真正盖好的房子,能实际存储数据,占用物理空间。

像设计图一样,并不是一幅设计图只能盖一个房子,一个类也可以实例化出多个对象

class Date
{
public:
	//...
	int _year;
	int _month;
	int _day;
};
int main()
{
	Date d1;
	Date d2;
	Date d3;
	cout << sizeof(d1) << endl;
	cout << sizeof(d2) << endl;
	cout << sizeof(d3) << endl;
	return 0;
}

在这里插入图片描述

  • 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  • 一个类可以实例化出多个对象,实例化出的对象占用 实际的物理空间,存储类成员变量

七、类对象模型

我们刚刚用sizeof观察了实例化出来的对象确实占用了内存空间,但是我们并不知道结果为什么是 12 。

上文已经提到,C++中,类与结构体本质是相同的。为了兼容C语言,C++肯定不能改变结构体大小的计算规则,而类与结构体相同(除默认访问限定符不同),那么类当然也是运用与结构体相同的计算规则

  • 类中定义的成员函数不会占用空间吗?

答案是并不占用,因为成员函数公共代码段

简单写个程序验证一下:

// 类中既有成员变量,又有成员函数
class A1 {
public:
	void f1() {}
private:
	int _a;
};

// 类中仅有成员函数
class A2 {
public:
	void f2() {}
};

// 类中什么都没有---空类
class A3
{};

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

	return 0;
}

在这里插入图片描述

结果显而易见,仅有成员函数的类与空的类大小是相同的,那么就验证了上面的说法。但是又出来一个新的问题:

  • 为什么空类的大小为 1 呢?

答案是,空类比较特殊,编译器会给空类一个字节来唯一标识这个类的对象

总结

一个类的大小,实际上是该类中成员变量的大小之和,当然与结构体相同,需注意内存对齐空类须特殊处理,大小为1字节。

在C语言阶段,博主已经对结构体的内存对齐做了超级详细的讲解,若有遗忘的小伙伴点击此处跳转。

以下是对内存对齐的简单回忆。

结构体内存对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

八、this指针

在类的成员函数中,有这样一个存在,我们无时无刻不在用它,但是我们却看不见它,这个神奇的存在就是this指针

我们如何证明它存在呢?首先定义一个日期类。

//日期类
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, d2;
	d1.Init(2022, 1, 11);
	d2.Init(2022, 1, 12);
	d1.Print();
	d2.Print();
	return 0;
}

对于上述操作,有这样一个疑问:

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

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

8.1 this指针的特性

在这里插入图片描述

this指针有以下特性:

  • this指针的类型:类的类型* const,即成员函数中,不能给this指针赋值;
void Init(int year, int month, int day)
{
	//错误示例
	this=nullptr;
}
  • 只能在成员函数的内部使用;
  • this指针本质上是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针
  • this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递;

有了this指针,我们上面实现的日期类还可以这样实现。

//日期类
class Date
{
public:
	void Init(int year, int month, int day)
	{
			this->_year = year;
			this->_month = month;
			this->_day = day;
	}
	void Print()
	{
		cout <<this-> _year << "-" <<this-> _month << "-" <<this-> _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

但是在实际写代码的过程中没有必要这样写,既然编译器已经帮我们做了,我们就不要干吃力不讨好的事情。

到目前为止,我们已经简单的认识了类和对象,更多关于类和对象的内容还没有讲到。认识了类与对象,我们就简单对比一下C语言实现栈和C++中运用类实现的过程。


九、C语言与C++实现栈的对比

9.1 C语言实现

typedef int DataType;

typedef struct Stack
{
	DataType* array;
	int capacity;
	int size;
}Stack;

void StackInit(Stack* ps)
{
	assert(ps);
	ps->array = (DataType*)malloc(sizeof(DataType) * 3);
	if (NULL == ps->array)
	{
		assert(0);
		return;
	}
	ps->capacity = 3;
	ps->size = 0;
}

void StackDestroy(Stack* ps)
{
	assert(ps);
	if (ps->array)
	{
		free(ps->array);
		ps->array = NULL;
		ps->capacity = 0;
		ps->size = 0;
	}
}

void CheckCapacity(Stack* ps)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity * 2;
		DataType* temp = (DataType*)realloc(ps->array,
			newcapacity * sizeof(DataType));
		if (temp == NULL)
		{
			perror("realloc申请空间失败!!!");
			return;
		}
		ps->array = temp;
		ps->capacity = newcapacity;
	}
}

void StackPush(Stack* ps, DataType data)
{
	assert(ps);
	CheckCapacity(ps);
	ps->array[ps->size] = data;
	ps->size++;
}

int StackEmpty(Stack* ps)
{
	assert(ps);
	return 0 == ps->size;
}

void StackPop(Stack* ps)
{
	if (StackEmpty(ps))
		return;
	ps->size--;
}

DataType StackTop(Stack* ps)
{
	assert(!StackEmpty(ps));
	return ps->array[ps->size - 1];
}

int StackSize(Stack* ps)
{
	assert(ps);
	return ps->size;
}

int main()
{
	Stack s;
	StackInit(&s);
	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	printf("%d\n", StackTop(&s));
	printf("%d\n", StackSize(&s));
	StackPop(&s);
	StackPop(&s);
	printf("%d\n", StackTop(&s));
	printf("%d\n", StackSize(&s));
	StackDestroy(&s);
	return 0;
}

可以看到,在用C语言实现时,Stack相关操作函数有以下共性:

  • 每个函数的第一个参数都是Stack*
  • 函数中必须要对第一个参数检测,因为该参数可能会为NULL
  • 函数中都是通过Stack*参数操作栈的
  • 调用时必须传递Stack结构体变量的地址

结构体中只能定义存放数据的结构,操作数据的方法不能放在结构体中,即数据和操作数据的方式是分离开的,而且实现上相当复杂一点,涉及到大量指针操作,稍不注意可能就会出错。

9.2 C++实现

typedef int DataType;
class Stack
{
public:
	void Init()
	{
		_array = (DataType*)malloc(sizeof(DataType) * 3);
		if (NULL == _array)
		{
			perror("malloc申请空间失败!!!");
			return;
		}
		_capacity = 3;
		_size = 0;
	}
	void Push(DataType data)
	{
		CheckCapacity();
		_array[_size] = data;
		_size++;
	}
	void Pop()
	{
		if (Empty())
			return;
		_size--;
	}
	DataType Top() { return _array[_size - 1]; }
	int Empty() { return 0 == _size; }
	int Size() { return _size; }
	void Destroy()
	{
		if (_array)
		{
			free(_array);
			_array = NULL;
			_capacity = 0;
			_size = 0;
		}
	}
private:
	void CheckCapacity()
	{
		if (_size == _capacity)
		{
			int newcapacity = _capacity * 2;
			DataType* temp = (DataType*)realloc(_array, newcapacity *
				sizeof(DataType));
			if (temp == NULL)
			{
				perror("realloc申请空间失败!!!");
				return;
			}
			_array = temp;
			_capacity = newcapacity;
		}
	}
private:
	DataType* _array;
	int _capacity;
	int _size;
};

int main()
{
	Stack s;
	s.Init();
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);
	printf("%d\n", s.Top());
	printf("%d\n", s.Size());
	s.Pop();
	s.Pop();
	printf("%d\n", s.Top());
	printf("%d\n", s.Size());
	s.Destroy();
	return 0;
}

C++中通过类可以将数据 以及 操作数据的方法进行完美结合,通过访问权限可以控制那些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。而且每个方法不需要传递Stack*的参数了,编译器编译之后该参数会自动还原,即C++中 Stack *参数是编译器维护的,C语言中需用用户自己维护。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(C语言)Sleep函数,system函数,数组练习,详解与运用

一维数组详解&#xff1a;http://t.csdnimg.cn/zahZF 二维数组详解&#xff1a;http://t.csdnimg.cn/h2mLe 我们看过可一维数组与二维数组&#xff0c;现在我们来进行简单的练习。 题目&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 1. …

AI大模型 拍照搜题

最近&#xff0c;发现一款小程序【问智通】&#xff0c;实现了拍照搜题结合AI大模型&#xff0c;省去了打字和敲数学公式向AI提问&#xff0c;完美的补充了其它拍照搜题平台拍不到&#xff0c;没解析等不足&#xff01;&#xff01;&#xff01; 小程序码&#xff1a; APP下载…

Python:运算符、内置函数和序列基本用法

一、学习目标 1&#xff0e;熟练使用Python运算符。 2&#xff0e;熟练使用Python内置函数。 3&#xff0e;掌握输入、输出函数的使用方法。 4&#xff0e;了解列表、元组、字典、集合的概念和基本用法。 二、相关练习 1&#xff0e;输入一个自然数250&#xff0c;输出其…

如何识别代理服务器的IP地址?

识别一个IP地址是否是由代理服务器发出的&#xff0c;是一项具有挑战性的任务。代理服务器是一种中间网络设备&#xff0c;用于转发客户端的请求和响应&#xff0c;从而隐藏原始客户端的IP地址。由于代理服务器的广泛使用&#xff0c;识别它们对于网络安全、数据分析和市场调研…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…

爬取一人之下所有图片网址以及图片的源代码

将网址保存到join中&#xff0c;图片源代码保存到本地目录中 import requests from lxml import etree import json import os from urllib import request# 设置Bing搜索URL和请求头 url https://cn.bing.com/images/search?q%E4%B8%80%E4%BA%BA%E4%B9%8B%E4%B8%8B%E5%9B%B…

BUUCTF AWD-Test1

打开靶场是这个有些简陋的界面。 随便点点&#xff0c;找到这个东西。 看到ThinkPHP&#xff0c;思路瞬间清晰&#xff0c;老熟人了。这个就是ThinkPHP漏洞。根据版本我们去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

通过多进程并发方式(fork)实现服务器

以下内容为视频学习记录。 1、父进程accept后返回的文件描述符为cfd以及用于创建连接的lfd; 调用fork()创建子进程后&#xff0c;子进程继承cfd,lfd&#xff0c;通过该cfd与连接过来的客户端通信,lfd对子进程来说没用&#xff0c;可以直接close(lfd); 对于父进程来说&#x…

Presto简介、部署、原理和使用介绍

Presto简介、部署、原理和使用介绍 1. Presto简介 1-1. Presto概念 ​ Presto是由Facebook开发的一款开源的分布式SQL查询引擎&#xff0c;最初于2012年发布&#xff0c;并在2013年成为Apache项目的一部分&#xff1b;Presto 作为现在在企业中流行使用的即席查询框架&#x…

用flymsg代替飞鸽传书(ipmsg、IPMessenger、聊天、文件传输)

用flymsg代替飞鸽传书(ipmsg、IPMessenger、聊天、文件传输) 一&#xff0e;简介 flymsg是由国人所开发的免费软件&#xff0c;是一款局域网内即时通信软件&#xff0c;基于TCP/IP&#xff08;UDP&#xff09;,可运行于多种操作平台&#xff08;Win,Mac,UNIX,Java&#xff09…

统计业务流量的毫秒级峰值 - 华为机试真题题解

考试平台&#xff1a; 时习知 分值&#xff1a; 200分&#xff08;第二题&#xff09; 考试时间&#xff1a; 两小时&#xff08;共3题&#xff09; 题目描述 业务模块往外发送报文时&#xff0c;有时会出现网卡队列满而丢包问题&#xff0c;但从常规的秒级流量统计结果看&…

MyBatis 学习(一)之 MyBatis 概述

目录 1 MyBatis 介绍 2 MyBatis 的重要组件 3 MyBatis 执行流程 4 参考文档 1 MyBatis 介绍 MyBatis 是一个半自动化的 ORM &#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;持久层框架&#xff0c;它允许开发者通过 XML 或注解将对象与数据库中…

【python】Python Turtle绘制流星雨动画效果(附源码)

在这篇技术博客中&#xff0c;我们将学习如何使用 Python 的 Turtle 模块绘制一个流星雨的动画效果。通过简单的代码实现&#xff0c;我们可以在画布上展现出流星闪耀的场景&#xff0c;为视觉带来一丝神秘与美感。 一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入…

生产报工异常信息提示器如何精确提醒管理人员

在现代生产环境中&#xff0c;生产报工异常信息的及时提醒对于管理人员来说至关重要。为了精确提醒管理人员并确保生产流程的顺利进行&#xff0c;智能信息接收腕表作为一种先进的工具&#xff0c;结合了多项功能&#xff0c;可以有效地实现生产报工异常信息的精确提醒。以下将…

【vmware安装群晖】

vmware安装群晖 vmware安装群辉&#xff1a; vmware版本&#xff1a;17pro 下载链接&#xff0c; https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-1751-WIN&productId1376&rPId116859 激活码可自行搜索 教程&#xff1a; https://b…

RK3568 Android12 适配抖音 各大APP

RK3568 Android12 适配抖音 各大APP SOC RK3568 system:Android 12 平台要适配抖音和各大APP 平台首先打开抖音发现摄像头预览尺寸不对只存在右上角,我将抖音APP装在手机上预览,发现是全屏 一开始浏览各大博客 给出的解决方法是修改framework 设置为全屏显示: framewo…

day09_面向对象_构造方法_封装

今日内容 零、 复习昨日 一、构造方法 二、重载 三、封装 零、 复习昨日 1 类和对象是什么关系? 类是模板(原材料)对象是具体实例(成品)类创建出对象 2 类中有什么?(类的成员) 成员属性(成员变量), 成员方法 3 创建对象的语法? 类名 对象名 new 类名(); 4 调用对象属性,方法…

Spade CNN技术细节

Input: (1,3,256,64,128) 做downsample 成 : (1,3,8,16,32) 首先有一个 EqualConv3D(3,128,3,3,stride1,padding1) 对 input 进行卷积得到&#xff1a; (1,128,8,16,32) input channel: 3 output channel: 128 EqualConv3D 就是一个普通的3D CNN&#xff0c; 只是 用到了 equ…

如何使用Docker部署IT-Tools并结合内网穿透实现公网访问本地工具箱服务

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录&#xff0c;以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息&#xff0c;并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件&#xff0c;包括以 ​.​开头的…