C语言转型之路:从C到C++的类与对象初探

欢迎来CILMY23的博客

本篇主题为 C语言转型之路:从C到C++的类与对象初探

个人主页:CILMY23-CSDN博客

个人专栏系列: Python | C语言 | 数据结构与算法 | C++

感谢观看,支持的可以给个一键三连,点赞关注+收藏。


写在前头:

面向过程和面向对象的认识:

C语言是面向过程的,关注的是过程分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象将一件事情拆分成不同的对象,靠对象之间的交互完成。面向对象都有以下三种特性:封装、继承、多态

例如:人用洗衣机洗衣服,C语言关注的是如何洗衣服,而C++会将这件事拆分成多个对象,洗衣机,人,洗衣粉,衣服。我们关注这些对象,而不关心是如何洗衣服的。 


目录

一、类和对象

1.1 类的引入

1.2 类的访问限定符

1.3 类的定义 

1.3.1 声明和定义全在类中 

1.3.2 声明和定义分离 

1.4 类的封装 

1.5 类的作用域 


一、类和对象

在面向对象编程中,对象是类的一个实例。类是一个抽象的概念,它描述了一类对象共同的属性和行为。通过类可以创建多个具体的实例,这些实例就是对象

对象可以是现实世界中的物体(如汽车、动物等)、概念(如账户、订单等)或者抽象数据类型(如栈、队列等)。每个对象都有自己的状态(属性)和行为(方法)。状态是描述对象的特征,而行为是对象能够执行的操作。

例如,如果有一个“汽车”类,那么具体的一辆汽车(比如一辆特斯拉Model 3)就是这个类的一个对象。这辆汽车有自己的颜色、速度、品牌等属性,同时它能够进行加速、减速、转向等行为操作。

1.1 类的引入

 C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量;现在以C++方式实现, 会发现struct中也可以定义函数。

例如:

typedef int DataType;
struct Stack
{
    //栈的初始化
    void Init(size_t capacity)
    {
        _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;
};

 我们发现C++兼容C,在c++中同样可以运行C的玩法,同时我们把其中的变量叫做成员变量其中的函数称为成员函数。但C++更喜欢用class来定义上述的结构体,于是类的结构就确定了。

 类的结构如下:

//类的定义
class classname
{
	//类体,由类的成员变量和成员函数构成
	//…………………………
};	//注意有分号

class 是C++中类的关键字,classname为类的名字,{}为类的主体,注意和结构体一样,末尾的分号不能省略。

类体中内容称为类的成员:类中的变量称为类的属性或成员变量;   类中的函数称为类的方法或者 成员函数

我们习惯的在成员变量前加一个横杠以用来区分形参和成员变量。

1.2 类的访问限定符

C++中类的访问限定符有三种,

  1. public 公有
  2. protected 保护
  3. private 私有 

在目前这个学习阶段我们可以认为2,3没有区别(实际有区别),我们主要讲还是1,3。 

访问限定符的特点: 

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


 在这里我们使用日期类举例 :

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 d1;
	d1.Init(2024, 04, 17);

	//d1.year++; 无法被访问
	
	return 0;
}

 我们想让类的成员被访问就用公有,不想被访问就私有,如果我们这里把class改成struct也是可以的

1.3 类的定义 

1.3.1 声明和定义全在类中 

注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

 我们以学生类为例:

class Student
{
public:
	void StuInit(const char* name,int age,const char* sex)
	{
		strcpy(_name, name);
		_age = age;
		strcpy(_sex, sex);
	}

	void showInfo()
	{
		cout <<"名字:" << _name << "  " 
		  	 <<"年龄:" <<_age << "  "
			 <<"性别:" <<_sex << endl;
	}

private:
	char _name[20];
	char _sex[20];
	int _age;
};

int main()
{
	Student s1;
	s1.StuInit("zhangsan", 18, "male");
	s1.showInfo();

	return 0;
}

1.3.2 声明和定义分离 

假设我们要声明和定义分离,这里我们用来举例:

Stack.h:

//头文件我们放成员函数,成员变量的声明
class Stack
{
public:
	//成员函数
	void Init(int n);
	void Push(int x);

private:
	//成员变量
	int* a;
	int top;
	int capacity;
};

Stack.cpp:

#include"Stack.h"

void Init(int n = 4)
{
	a = (int*)malloc(sizeof(int) * n);
	if (a == NULL)
	{
		perror("malloc fail");
		return;
	}
	capacity = n;
	top = 0;
}

void Push(int x)
{
	//...
	a[top++] = x;
}

但是我们发现在上述情况下,编译器会报错,这是因为类也有自己的作用域,编译器会从全局域,局部域搜索,找不到就会报错了。所以我们需要去类中搜索。

 Stack.cpp

#include"Stack.h"

void Stack::Init(int n = 4)
{
	a = (int*)malloc(sizeof(int) * n);
	if (a == NULL)
	{
		perror("malloc fail");
		return;
	}
	capacity = n;
	top = 0;
}

void Stack::Push(int x)
{
	//...
	a[top++] = x;
}

 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::,一般情况下,更期望采用第二种声明和定义分离的方式。

1.4 类的封装 

面向对象的三大特性:封装、继承、多态。(是面向对象编程都有的)
C++中,在类和对象阶段,主要是研究类的封装特性,那什么是封装呢?
封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互。
封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用 户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日 常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如 何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计 算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以 及键盘插孔等,让用户可以与计算机进行交互即可。
在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来 隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

C++将数据和方法都放到类中,利用访问限定符对成员进行限制,想访问的设置成公有,不想访问的设置成私有。

1.5 类的作用域 

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

如果我们需要访问类域,就需要用::来访问

例如:当我们在声明和定义分离的时候,我们就会将类前面加个作用域操作符,来表明是哪个类域的。

class Student
{
public:
	void StuInit(const char* name, int age, const char* sex);
	void showInfo();

private:
	char _name[20];
	char _sex[20];
	int _age;
};

void Student::StuInit(const char* name, int age, const char* sex)
{
	strcpy(_name, name);
	_age = age;
	strcpy(_sex, sex);
}

void Student::showInfo()
{
	cout << "名字:" << _name << "  "
		<< "年龄:" << _age << "  "
		<< "性别:" << _sex << endl;
}

int main()
{
	Student s1;
	s1.StuInit("zhangsan", 18, "male");
	s1.showInfo();

	return 0;
}

一些总结:

  • C++ 兼容C struct的用法,但是同时升级成了类,可以将函数写于类中
  • 类要定义哪些东西是不确定的,类要设计哪些东西,取决于要完成哪些东西
  • 类提供了三种访问限定符,它们分别是public(公有),private(私有),protected(保护)
  • class 的访问默认是private,而struct默认访问是public
  • 声明和定义分离的时候,成员函数的定义需要加 类名::
  • 封装的本质是一种管控

感谢各位同伴的支持,本期C++篇就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。 

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

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

相关文章

hive搭建完整教学

目录 简介准备工作安装步骤&#xff08;一&#xff09;、下载hive包并解压到指定目录下&#xff08;二&#xff09;、设置环境变量&#xff08;三&#xff09;、下载MySQL驱动包到hive的lib目录下&#xff08;四&#xff09;、将hadoop的guava包拷贝到hive&#xff08;五&#…

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

更多大厂面试内容可见 -> http://11come.cn 美团财务科技Java后端一面&#xff1a;面向对象、类加载过程、全限定类名相同的类是否可以同时被加载 如何理解面向对象&#xff1f; 面向对象 是具有对象概念的编程范式&#xff0c;面向对象将程序实现分为了一个个独立的对象&…

cdh cm界面HDFS爆红:不良 : 该 DataNode 当前有 1 个卷故障。 临界阈值:任意。(Linux磁盘修复)

一、表现 1.cm界面 报错卷故障 检查该节点&#xff0c;发现存储大小和其他节点不一致&#xff0c;少了一块物理磁盘 2.查看该磁盘 目录无法访问 dmesg检查发现错误 dmesg | grep error二、解决办法 移除挂载 umount /data10 #可以移除挂载盘&#xff0c;或者移除挂载目…

WPS的bug问题(解决方法->换成office吧):表格数据和透视图数据不一致问题,多次尝试确定该bug

1.软件版本 2.问题描述 我在原始表中对其中一列进行筛选&#xff0c;选择95%以上这个选项值&#xff0c;343个数据。 在筛选了95%以上这个选项之后&#xff0c;我的另一列的值全部是no&#xff0c;343个数据。 然后进行透视图之后&#xff0c;在绘制的图形中发现&#xff0c…

怎么压缩图片200k以下?压缩图片到指定大小

在工作中&#xff0c;会遇到在某些系统要上传照片&#xff0c;但是对于上传的照片大小有限制&#xff0c;比如限制大小不能超过200KB等&#xff0c;而外业拍摄的照片往往会超过限制的大小&#xff0c;那么这时就需要对照片进行压缩。尤其是我们在面对大量图片需要处理的时候&am…

一周IT资讯

又降了&#xff1f;运维4月平均月薪1W6&#xff1f; 薪资作为大部分人的主要收入来源&#xff0c;是每个人最关注的话题之一。 最近&#xff0c;小编搜索了近半年的运维薪资趋势&#xff0c;看看你的钱包缩水了没&#xff1f; *数据来自看准网 据了解&#xff0c;运维2024年…

Python 爬虫如何配置代理 IP (Py 采集)

在Python中配置代理IP&#xff0c;可以通过设置requests库的proxies参数来实现。以下是一个示例&#xff1a; import requests# 则立可以获取稳定代理Ip&#xff1a;https://www.kuaidaili.com/?refrg3jlsko0ymg # 推荐使用私密动态 IP proxies {"http": "ht…

Pulsar 社区周报 | No.2024-04-19 | Pulsar Meetup 深圳 2024 邀您报名

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;周五发布。 ” Pulsar Meetup 深圳 2024 Pulsar Meetup 深圳 2024 将于 2024 年 4 月 27 日 周六举办&#xff0c;此次活动由 AscentStream 谙&a…

HR招聘测评,人才测评的方法有哪些?

各企业都需要人才&#xff0c;如果招聘不到合适的人才&#xff0c;就会对自身的发展带来极大的限制&#xff0c;很难找到自己的一席之地。一个优秀的人才&#xff0c;通常会成为许多公司争先哄抢的对象&#xff0c;在招聘过程中会成为一个香饽饽。但是要选出一个优秀的人才&…

戴尔电脑怎么关闭开机密码?

1.同时按键盘上是“window键”&#xff08;一般是键盘最下面一排第二个&#xff09;和“R键“&#xff0c;并在弹出的窗口输入“netplwiz”然后确定。 2.然后会弹出的“用户账户”窗口&#xff0c;接下来取消勾选“要使用本计算机&#xff0c;用户必须输入用户名和密码” 3.上面…

C语言---贪吃蛇(一)---准备工作

文章目录 前言1.Win32 API介绍1.1.Win32 API1.2. 控制台程序1.3.控制台屏幕上的坐标[COORD](https://learn.microsoft.com/zh-cn/windows/console/coord-str)1.4.[GetStdHandle](https://learn.microsoft.com/zh-cn/windows/console/getstdhandle)1.5.[GetConsoleCursorInfo](h…

运动想象 (MI) 分类学习系列 (9) :FBCNet

运动想象分类学习系列:FBCNet 0. 引言1. 主要贡献2. 提出的方法2.1 滤波器组卷积网络2.2 方差层结构介绍 3. 实验结果3.1 基线方法比较3.2 方差层对结果的影响3.3 脑卒中患者在相关模型中观察到更大的受试间变异性 4. 总结欢迎来稿 论文地址&#xff1a;https://arxiv.org/abs/…

详细UI色彩搭配方案分享

UI 配色是设计一个成功的用户界面的关键之一。UI 配色需要考虑品牌标志、用户感受、应用程序的使用场景&#xff0c;这样可以帮助你创建一个有吸引力、易于使用的应用程序。本文将分享 UI 配色的相关知识&#xff0c;帮助设计师快速构建 UI 配色方案&#xff0c;以满足企业的需…

什么是IoT?

什么是IoT&#xff1f; IoT&#xff0c;即物联网&#xff08;Internet of Things&#xff09;&#xff0c;是通过信息传感设备和互联网将各种物品连接起来&#xff0c;实现智能化的识别、定位、跟踪、监控和管理的网络系统。 以下是关于IOT的一些详细解释&#xff1a; 基本概…

【RAG 论文】面向知识库检索进行大模型增强的框架 —— KnowledGPT

论文&#xff1a;KnowledGPT: Enhancing Large Language Models with Retrieval and Storage Access on Knowledge Bases ⭐⭐⭐⭐ 复旦肖仰华团队工作 论文速读 KnowledGPT 提出了一个通过检索知识库来增强大模型生成的 RAG 框架。 在知识库中&#xff0c;存储着三类形式的知…

记录一下flume中因为taildir_position.json因位置不对导致数据无法从kafka被采到hdfs上的问题

【背景说明】 我需要用flume将kafka上的数据采集到hdfs上&#xff0c;发现数据怎么到不了hdfs。 【问题排查】 1.kafka上已有相应的数据 2.我的flume配置文档&#xff08;没问题&#xff09;&#xff0c; 3.时间拦截器&#xff08;没问题&#xff09;&#xff0c; 4.JSONObje…

DNS域名系统(Domain Name System)基础知识

目录 1.定义 2.DNS系统组成 3.DNS系统作用 4.域名系统命名规则 5.记录类型 6.DNS查询过程 7.DNS查询方式 8.DNS文件 1.定义 DNS系统是一个分布式的主机信息数据库&#xff0c;采用客户机/服务器模式。 域名系统&#xff08;英文&#xff1a;Domain Name System&#xf…

Python中的设计模式与最佳实践

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的设计模式与最佳实践 在软件开发中&#xff0c;设计模式是一种解决常见问题的经过…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT&#xff08;JSON Web Token&#xff09;和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证&#xff1a;无状态。服务器生成一个令牌&#xff0c;客户端存储该令牌并随每个请求一起提供&#xff0c;服务端仅需按照…

椭圆曲线密码学(ECC)基本介绍和总结

背景 ECC英文全称"Elliptic Curve Cryptography"&#xff0c;其背后的密码学原理或者说安全性&#xff0c;是基于椭圆曲线离散对数问题&#xff08;Elliptic Curve Discrete Logarithm Problem&#xff0c;ECDLP&#xff09;。ECC密码学被普遍认为是RSA密码系统的接…