类和对象深入讲解(1)

news2025/1/21 21:59:39

目录

1.类和对象的初步认识

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

1.2类的引入

 1.3内的定义

1.4类的访问限定符及封装

1.4.1访问限定符

1.4.2 封装

1.5类的作用域

1.6类对象模型

1.6.1如何计算类对象大小


1.类和对象的初步认识

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

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

举一个简单的例子:

设计简单外卖系统
面向过程:关注实现下单、接单、送餐这些过程。体现到代码层面--方法/函数
面向对象:关注实现类对象及类对象间的关系,用户、商家、骑手以及他们之间的关系。体现到代码层面 --类的设计及类之间关系
 

1.2类的引入

在C语言中,我们已经学过了结构体这个自定义类型,我们就用结构体来定义一个学生的类型吧:

struct Student
{
	char name[10];
	int age;
	int id;
};

int main()
{
	struct Student s1; //兼容C
	Student s2;        //升级到类,Student为类名,也是类型
	return 0;
}

 由于C++兼容C的语法,所以struct在C++中也升级成了类,在C语言中,我们在定义结构体变量后,不能对成员变量进行初始化,但是,在C++中,我们可以在结构体中定义成员函数,同时可以利用成员函数对结构体变量进行初始化等操作,来看看是怎样操作的吧:

struct Student
{
	//成员变量
	char _name[10];
	int _age;
	int _id;//前面加_是为了和后面函数的形参进行区分
	//成员方法
	//初始化成员变量
	void Init(const char* name, int age, int id)
	{
		strcpy(_name, name);
		_age = age;
		_id = id;
	}
	//打印成员变量
	void Print()
	{
		cout << _name << endl;
		cout << _age << endl;
		cout << _id << endl;
	}
};

int main()
{
	struct Student s1; //兼容C
	Student s2;        //升级到类,Student为类名,也是类型

	s1.Init("张三", 18, 1);
	s2.Init("李四", 19, 2);

	s1.Print();
	s2.Print();
	return 0;
}

 打印输出的结果:

 1.3内的定义

class为定义类的关键字:

class className
{
	//类体:由成员变量和成员函数组成
};

 那么,上面那段结构体代码的关键字struct可不可以改成class呢?试一试就知道了:

 很显然,编译器给我们报错了。别着急,下面我将一一为大家介绍报错的原因:

首先,面向对象有三大特性:封装,继承,多态

我们要先了解的是什么是封装 :

1.在面向对象中,数据和方法都在类中都放到了一起

2.C++通过访问限定符实现封装

下面要介绍的是访问限定符

1.4类的访问限定符及封装

1.4.1访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

 访问限定符说明: 

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

这里的第5点class的默认访问权限为private,就是上面代码编译器报错的原因,如果我们将成员函数设置为公有的(或者将成员变量和成员函数都设为公有),编译器就不会报错了:

因此我们定定义类的时候,尽量明确定义访问限定符,不要用class/struct默认的限定符,这样别人在读我们的代码时,一眼便知道成员属性。

1.4.2 封装

 
封装是一种严格管理,不封装是一种自由管理

在C++中,数据和方法都封装到类里面,可以给你访问的成员定义为共有,不想给你访问的成员定义为私有。

使用封装的好处:
1、我们能修改自己的代码,而不用修改那些调用我们代码的程序片段,从而可以让程式码更容易维护。
2、将相关联的变量和函数封装成一个对象,变量描述对象的属性,函数描述对象的行为,这符合我们对客观世界的认识。
3、还实现了对属性的数据访问限制,也加强了程式码的安全性。

1.5类的作用域

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

在实际开发模块化编程中的使用:

 Stack.h文件:

#pragma once

class Stack
{
public:
	void Init();
	void Push(int x);
	// ...
//private:
	int* _a;
	int _top;
	int _capacity;
};

Stack.cpp文件:

#include "Stack.h"

void Stack::Init()
{
	_a = nullptr;
	_top = _capacity = 0;
}

这样实现了数据与方法的分离。

1.6类对象模型

1.6.1如何计算类对象大小

1.类大小计算遵循结构体对齐原则

2。类的大小与数据成员有关与成员函数无关(空类大小为1个字节),类的大小与静态数据成员无关

3.空类会给一字节,这一字节不存储有效数据,只是为了占位,表示对象存在

 情况一:类中既有成员变量又有成员函数

class A1
{
public:
	void f1() {}
private:
	int _a;
};

  大小:4字节

情况二:类中仅有成员函数

class A2
{
public:
	void f1() {}
};

   大小:1字节

情况三:类中什么也没有

class A3
{
}; ​

    大小:1字节

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

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

相关文章

大模型混战,阿里百度华为谁将成就AI时代的“新地基”?

从算力基础到用户生态&#xff0c;群雄逐鹿大模型 自2022年stable diffusion模型的进步推动AIGC的快速发展后&#xff0c;年底&#xff0c;ChatGPT以“破圈者”的姿态&#xff0c;快速“吸粉”亿万&#xff0c;在全球范围内掀起了一股AI浪潮&#xff0c;也促使了众多海外巨头竞…

Golang每日一练(leetDay0030)

目录 88. 合并两个有序数组 Merge Sorted Array &#x1f31f; 89. 格雷编码 Gray Code &#x1f31f;&#x1f31f; 90. 子集 II Subsets II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/…

为什么要创建FAQ?这篇文章告诉你

什么是FAQ 通过上述的引入大家应该也了解到了&#xff0c;FAQ是为了“解决问题”而存在的。FAQ是英文Frequently Asked Questions的缩写&#xff0c;中文意思就是“经常问到的问题”&#xff0c;或者更通俗地叫做“常见问题解答”。FAQ是当前网络上提供在线帮助的主要手段&…

小程序开发收费价目表

小程序作为一种新兴应用形式&#xff0c;正在逐渐成为企业和个人推广、运营的重要手段。然而&#xff0c;小程序开发的价格因项目规模和复杂程度差异较大&#xff0c;令不少人望而却步。本文将从小程序开发的相关因素入手&#xff0c;探讨小程序开发的价格范围和算法。 一、小…

【JLink仿真器】盗版检测、连接故障、检测不到芯片问题

【JLink仿真器】盗版检测、连接故障、检测不到芯片问题一、问题描述二、解决方法1、降低驱动&#xff08;解决非法问题以及连接故障&#xff09;2、SWD引脚被锁&#xff08;解决检测不到芯片&#xff09;三、说明一、问题描述 盗版检测&#xff1a;the connected probe appear…

【Linux】Mysql之索引的基本操作

一、为什么要使用索引 索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表&#xff0c;实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。 索引是 MySQL 中十分重要的数据库对象&#xff0c;是数据库性能调优技术的基础&…

GraphCL方法介绍(Graph Contrastive Learning with Augmentations)

论文链接&#xff1a;https://arxiv.org/pdf/2010.13902.pdf 附录链接&#xff1a;https://yyou1996.github.io/files/neurips2020_graphcl_supplement.pdf 代码链接&#xff1a;https://github.com/Shen-Lab/GraphCL 1 图的数据增强 我们专注于图级扩充。给定 M 个图的数…

【分布式】熔断、降级傻傻分不清楚-熔断和降级的真实关系

文章目录前言降级熔断什么是服务熔断熔断和降级的关系降级方式1、熔断降级&#xff08;不可用&#xff09;2、超时降级3、限流降级总结前言 刚开始我以为熔断和降级是一体的&#xff0c;以为他们必须配合使用&#xff1b; 只不过名字不一样而已&#xff0c;但是当我经过思考过…

[架构之路-164]-《软考-系统分析师》-3-操作系统基本原理-文件系统(文件的逻辑组织、文件的物理组织、硬盘空间管理、分布式文件系统)

目录 3 . 4 文件系统 3.4.1文件的组织结构 1 . 逻辑结构 2 . 物理结构 3 . 树形文件结构 3.4.2 硬盘存储空间管理 1 . 空闲文件目录 2 . 空闲块链 3 . 位示图法 4 . 成组链接法 3.4.3分布式文件系统 1. D F S 的特点 2. DFS 的组成 3. DFS 的架构 3 . 4 文件系统…

腾讯云服务器TencentOS系统安装宝塔Linux面板命令

腾讯云服务器TencentOS Server操作系统安装宝塔Linux面板命令选择CentOS安装脚本即可&#xff0c;TencentOS用户态环境与CentOS保持兼容&#xff0c;在CentOS上开发的应用程序可直接在TencentOS Server上运行。腾讯云百科分享腾讯云服务器TencentOS操作系统安装宝塔Linux面板命…

客户端ack模块的实现

文章目录背景第一版设计第二版设计第三、四版设计写在最后背景 所谓客户端ack模块是在我们推送服务中一个技术需求&#xff0c;本文主要介绍其迭代过程。 首先简单介绍下推送服务的架构&#xff0c;如下图。用户请求ws服务&#xff0c;建立ws长连接&#xff0c;并通过login和…

类和对象(C++11)

目录 一、类的定义 1.定义与声明放一起 2.定义与声明分开 二、类的访问限定符及封装 1.类的访问限定符 2.类的封装 三、类的实例化 四、类对象 1.类对象的存储方式 2.计算类对象的大小 面试题 1.结构体怎么对齐&#xff1f; 为什么要进行内存对齐&#xff1f; 2.如…

Python数据结构与算法-树

一、树的概念详情见 https://blog.csdn.net/little_limin/article/details/129845592 Python数据结构与算法-堆排序&#xff08;NB组&#xff09;—— 一、树的基础知识二、树的实例&#xff1a;模拟文件系统1、树的存储树结构也是链式存储的&#xff0c;与链表的结构相似&…

java通过URLClassLoader类加载器加载外部jar

相信在实际工作中&#xff0c;大家可能会遇到这种需求&#xff0c;这个jar是外部的&#xff0c;并没有添加到项目依赖中&#xff0c;只能通过类加载器加载并调用相关方法。 这种jar加载&#xff0c;其实也简单&#xff0c;我们通过普通的URLClassLoader就可以加载。代码如下所示…

netfilter filter表

iptables是linux下常用的一个防火墙软件&#xff0c;可以实现对网络访问的各种限制。iptables相当于防火墙的客户端&#xff0c;与用户进行交换&#xff0c;其后台依赖于内核的netfilter模块。iptables的各种配置&#xff0c;最终都是netfilter模块来实现的。 iptables分为4个…

Python-DQN代码阅读(12)

目录 1.代码 1.1代码解读 1.2 代码分解 1.2.1 latest_checkpoint tf.train.latest_checkpoint(checkpoint_dir) 1.2.2 saver.restore(sess, latest_checkpoint) 1.2.3 sess.run(tf.global_variables_initializer()) 1.2.4 deep_q_learning() 1.3 输出结果 1.4 问题 1…

v-for比v-if优先级更高?

前言 v-if和v-for哪个优先级更高呢&#xff1f;这是面试官常常问到的一个问题&#xff0c;如果是在三年前&#xff0c;我会毫不犹豫的回答当然是v-for哩&#xff0c;但在3202的今天&#xff0c;如果还这么答&#xff0c;显然是低估了前端技术的日新月异啰。下面我们就来结合编…

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 E 题

颜色平衡树问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序问题描述 格式输入 输入的第一行包含一个整数 n &#xff0c;表示树的结点数。 接下来 n 行&#xff0c;每行包含两个整数 Ci , Fi&#xff0c;用一个空格分隔&#xff0c;表示第 i 个结点 …

动态内存管理【下篇】

文章目录⚙️5.C/C程序的内存开辟⚙️6.柔性数组&#x1f514;6.1.柔性数组的特点&#x1f514;6.2.柔性数组的使用⚙️5.C/C程序的内存开辟 C/C程序内存分配的几个区域&#xff1a; &#x1f534;1.栈区&#xff08;stack&#xff09;&#xff1a;在执行函数时&#xff0c;函数…