类和对象基础知识

news2024/12/19 10:51:19

1. C++和C语言最大的区别

以洗衣服为例,

C语言是手洗,你需要对每一个过程非常的清楚,一步一步都需要自己亲自去完成,

而C++更像是机洗,整个过程划分为人、衣服、洗衣粉、洗衣机四个对象的交互过程, 而人是不需要知道洗衣机是如何把衣服洗干净的。

也就是所谓的面向过程面向对象的区别。

2. 什么是类

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

类其实有点类似结构体,只不过在C++中更加常用。

【关键字】class

【定义方式】类似结构体

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

1)声明和定义均在类体中

​​​​​​​​​​​​​​​​​​​​​

你可能会好奇,为什么成员变量前面要加个下划线?

其实是为了和之后传进来的形参作区分

像Init函数中出现了成员变量和形参同在一个函数的情况,如果用一个下划线作区分就很容易辨别了

2)类声明放在.h文件中,定义放在.cpp文件中(常用

PS:“ :: ”是类作用限定符,在类体外定义成员时用来指明属于哪个类域

3. 类访问限定符及封装

在使用计算机的时候,我们不需要关心内部的核心固件,只需要知道键盘鼠标怎么用即可。同理,在 C++ 中,通过类访问限定符来进行权限的管理,控制那些方法可供外部使用,也就是所谓的封装

类访问限定符分为以下三类:

【说明】

1. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止,如果后面没有访问限定符,作用域就到类结束。

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

3. 一般来说,成员变量用private,成员函数用public

4. 类的实例化

【不好理解的概念】类只是对一类对象进行描述,而对象是一个具体的类。

以学生信息为例,里面包括成员属性和成员方法,学生类里面包括学生的姓名、班别、性别(成员属性),学生交作业、参加考试(成员方法);

而学生张三、李四、王五(对象),就是属于学生类的对象

5. 类对象的存储方式

每个对象的成员变量不一样,但是调用的都是同一份函数

所以为了节约空间,每个对象只保存成员变量,而成员函数保存在公共代码区

【小练习】

判断这三个类的大小是多少?

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

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

class A3
{};

答案:4,1,1

A1:有成员变量,就按照内存对齐的规则进行计算;

A2:没有成员变量,成员函数在公共代码区,不占内存

A3:空类,默认 1 字节,用来表示对象存在过,标识对象实例化

如果不熟悉内存规则的小伙伴可以看看这篇文章:链接

6. this指针

问题引入:既然不同对象的成员函数在同一个空间,那该如何区分函数内的成员变量属于哪个对象?

this指针就是解决这个问题的,它隐含在函数的参数中,传过去的是该对象的指针,不用显式写(显式写会报错),也不用传参,编译器通过寄存器ecx自动会传,此处只是为了说明。

注意:this 指针是 const 类,不可以修改

【面试题扩展】

1. this指针存在哪里?

它是形参,存在栈中,有的编译器会进行优化,存储在寄存器中

2. this指针能不能为空?

这个问题需要分情况讨论,见下面的分析

例子如下,当 A 类中的成员函数没有调用成员变量时,正常运行。因为成员函数存在公共代码区,如果没有调用成员变量,就不需要到对象的空间里面去获取成员变量的数据,所以此处并不会对空指针进行解引用。

class A
{
public:
	void Print()
	{
		cout << "Print()" << endl;
	}
private:
	int _a;
};
 
int main()
{
	A* p = nullptr;
	p->Print();
	return 0;
}

而如果把 A 类改成如下,就会发生程序崩溃,也就是对空指针进行了解引用操作。

注意空指针是不会在编译时报错的,而是在运行时会崩溃

class A
{
public:
	void Print()
	{
		cout << _a << endl;
	} 
private:
	int _a;
};

7. C和C++再对比

在我们实现 Stack 的时候,C语言需要每次都传 Stack* 参数,而C++里有 this 指针会让编译器自动调用,减少了出错。且C++中有封装,设置不同方法不同权限。

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

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

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

相关文章

C语言指针的初步认识--学习笔记(2)

1.数组名的理解 我们在使⽤指针访问数组的内容时&#xff0c;有这样的代码&#xff1a; int arr[10]{1,2,3,4,5,6,7,8,9,10}; int* p&arr[0]; 这⾥我们使⽤ &arr[0] 的⽅式拿到了数组第⼀个元素的地址&#xff0c;但是其实数组名本来就是地址&#xff0c;⽽且 是数组…

React 事件机制原理

相关问题 React 合成事件与原生 DOM 事件的区别React 如何注册和触发事件React 事件如何解决浏览器兼容问题 回答关键点 React 的事件处理机制可以分为两个阶段&#xff1a;初始化渲染时在 root 节点上注册原生事件&#xff1b;原生事件触发时模拟捕获、目标和冒泡阶段派发合…

羊大师揭秘羊奶与健康,美味的保健佳品

羊大师揭秘羊奶与健康&#xff0c;美味的保健佳品 羊奶确实是一种美味且健康的保健佳品&#xff0c;其独特的营养成分和风味使其成为许多人的健康选择。以下是一些羊奶与健康的关系&#xff1a; 营养丰富&#xff1a;羊奶含有丰富的蛋白质、脂肪、矿物质和维生素&#xff0c;…

Go字符串实战操作大全!

目录 1. 引言文章结构概览 2. Go字符串基础字符串的定义与特性什么是字符串&#xff1f;Go字符串的不可变性原则 字符串的数据结构Go字符串的内部表达byte和rune的简介 3. 字符串操作与应用3.1 操作与应用字符串连接字符串切片字符串查找字符串比较字符串的替换字符串的大小写转…

【动态规划专栏】

动态规划基础知识 概念 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;&#xff1a;用来解决最优化问题的算法思想。 动态规划是分治思想的延伸&#xff0c;通俗一点来说就是大事化小&#xff0c;小事化无的艺术。 一般来说&#xff0c;…

Android 开发环境搭建的步骤

本文将为您详细讲解 Android 开发环境搭建的步骤。搭建 Android 开发环境需要准备一些软件和工具&#xff0c;以下是一些基础步骤&#xff1a; 1. 安装 Java Development Kit (JDK) 首先&#xff0c;您需要安装 Java Development Kit (JDK)。JDK 是 Android 开发的基础&#xf…

教师的调动谁有决定权

当你身边的老师突然“消失”&#xff0c;在另一所学校出现&#xff0c;你是否好奇过&#xff0c;这背后的调动是如何发生的&#xff1f;谁又是这场“迁徙”背后的决定者&#xff1f; 很多人可能首先想到的是校长。毕竟&#xff0c;在学校里&#xff0c;校长似乎是那个“发号施令…

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进&#xff0c;前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说&#xff0c;在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在&#xff0c;本文将梳理前端登录的演变过程。 1、无状态的HTTP H…

【论文阅读】TensoRF: Tensorial Radiance Fields 张量辐射场

发表于ECCV2022. 论文地址&#xff1a;https://arxiv.org/abs/2203.09517 源码地址&#xff1a;https://github.com/apchenstu/TensoRF 项目地址&#xff1a;https://apchenstu.github.io/TensoRF/ 摘要 本文提出了TensoRF&#xff0c;一种建模和重建辐射场的新方法。不同于Ne…

面试题HTML+CSS+网络+浏览器篇

文章目录 Css预处理sass less是什么&#xff1f;为什么使用他们怎么转换 less 为 css&#xff1f;重绘和回流是什么http 是什么&#xff1f;有什么特点HTTP 协议和 HTTPS 区别什么是 CSRF 攻击HTML5 新增的内容有哪些Css3 新增的特性flex VS grid清除浮动的方式有哪些&#xff…

嵌入式入门必经之路:C语言学习计划

1、学习计划 学习基本语法和语言特性&#xff1a; 了解C语言的基本语法结构&#xff0c;如变量、数据类型、运算符等。学习控制流程语句&#xff0c;如条件语句、循环语句等。熟悉函数的定义和使用&#xff0c;包括参数传递和返回值。掌握C语言的输入输出操作&#xff0c;如pri…

力扣hot100:1.两数之和

输入中可能存在重复值 。 分析&#xff1a; 本题需要返回的是数组下标&#xff0c;因此如果需要使用排序然后双指针的话&#xff0c;需要用到哈希表&#xff0c;但是由于输入中可能存在重复值&#xff0c;因此哈希表的value值必须是vector<int>。 使用双指针求目标值targ…

lv20 QT事件5

1 事件模型 2 事件处理 virtual void keyPressEvent(QKeyEvent *event) virtual void keyReleaseEvent(QKeyEvent *event) virtual void mouseDoubleClickEvent(QMouseEvent *event) virtual void mouseMoveEvent(QMouseEvent *event) virtual void mousePressEvent(QMou…

打造专属投屏体验:Windows系统投屏到iOS系统

想要将电脑投屏共享给同事或朋友&#xff0c;又担心隐私内容泄露&#xff1f;来来来&#xff0c;这里有妙招&#xff01; AirDroid Cast网页版让电脑投屏变得挑剔&#xff0c;只展示你允许共享的内容。会议资料、个人照片、敏感文件&#xff0c;都将得到严格的筛选&#xff0c;…

js中find和findLast的区别

一、概念 find()&#xff1a;从数组中查找第一个匹配的元素 findLast()&#xff1a;从数组中查找最后一个匹配的元素 二、用法 array.find((项)>{return 筛选项的条件 })array.findLast((项)>{return 筛选项的条件 }) 三、区别 find方法是从数组头部往后检测&#xff…

AwesomeTechnologyWeekly值的关注的中文社区优质技术周刊一览

作为开发者&#xff0c;我们每天都需要吸收大量的信息补充我们的知识体系. Awesome Technology Weekly Zh-Hans 项目收集了中文技术社区各个领域的高质量的中文技术月/周/日刊&#xff0c;定时刷新获取最新一期中文技术月/周/日刊进行展示. 访问网站开始关注吧~&#xff1a;ht…

自动驾驶感知面试-coding应用题

感知面试手撕代码&#xff1a;这个博主总结的很好&#xff0c;尤其是关于叉积的计算 双线性插值 双线性插值公式记忆方法和Python实现 NMS算法 #include<iostream> #include<vector> #include<algorithm>using namespace std; struct Box {int x1,x2,y1,…

【仿真基本功】【PyTorch】从头安装PyTorch(GPU版本)【2024/03/03更新】

【仿真基本功】【PyTorch】从头安装PyTorch&#xff08;GPU版本&#xff09;【2024/03/03更新】 安装步骤1. 安装Anaconda2. 查看显卡对CUDA版本的支持3. 查看PyTorch的安装需求4. 安装PyTorcha) 配置新环境b) 进入新环境c) 按照CUDA版本要求&#xff0c;必须小于等于显卡支持的…

Linux系统——Tomcat优化

目录 一、JVM组成 1.JVM的组成及详解 2.内存的由来 3.虚拟机 3.1 Garbage 垃圾确定方法 3.2垃圾回收基本算法 3.2.1标记-清除 Mark-Sweep 3.2.2标记压缩&#xff08;压实&#xff09;Mark-Compact 3.2.3复制 Copying 3.2.4 多种算法总结 3.2.5拓展——STW 4.分代堆…

C语言-------指针进阶(2)

1.指针数组 指针数组表较简单&#xff0c;类比整型数组&#xff0c;字符数组&#xff0c;整型数组里面的元素都是整型变量&#xff0c;字符数组里面 的元素是字符类型&#xff0c;那么指针数组就是数组里面的每个元素都是指针类型&#xff0c;例如int*arr[5]就是一个 指针数…