C++系列——————类和对象(上)

server/2024/11/14 20:18:28/

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、面向对象的三大特征
  • 二、类的引入
    • 2.1类的定义
  • 三.类的访问限定符
    • 3.1访问限定符的介绍
    • 3.2.访问限定符的使用
  • 四、类的作用域
  • 五、类的实例化
  • 六、类对象模型
    • 6.1 如何计算类对象的大小
  • 总结


前言

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

一、面向对象的三大特征

c++面向对象的语言,同样的具备面向对象的特性:分装、继承、多态

特性一:封装
将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进交互。
(简单来说,就好比我们在学习c语言时使用的一些函数如:printf函数,我们在使用它的时候并不知道它的底层是怎么实现的)
特性二:继承

继承是一个进程,通过一个进程,一个对象可以获得另一个对象的属性(数据和函数),且可以想起加入属于自己的方法和属性。用这种方法可以自动的对一个类中提供另一个类的成员和数据结构。当A类被另B类继承,A类可以称之为基类或者父类;B类被称之为派生类或者子类。
特性三:多态

如果几个相似而不完全相同的对象,当对他发出同一个消息时,他们的反映各不相同,执行不同的操作。这种现象叫做多态现象。在C++中多态是指由继承而产生的相关的不同的类,其对象会对同一消息做出不同的相应。他能增加程序的灵活性。

二、类的引入

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

在学习C语言时,我们并没有听到类的概念,c++是以C语言为基础,对其进行完善和拓展的,而c++是兼容C语言的,所以在c++中定义类的方式有两种。

struct classname
{//成员变量//成员函数
};class classname
{//成员变量//成员函数
};
        当然以上两种方式存在差别,等一下我们会展开介绍。

2.1类的定义

代码如下(示例)
也可以将关键字struct替换为关键字class(可以将class看作struct的升级版)
也可以将关键字struct替换为关键字class
struct为定义类的关键字,stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

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

这里需要注意,如果类的成员函数声明和定义都在类的内部,可能会被编译器当作内敛函数来处理。

  上面结构体的定义,在C++中更喜欢用class来代替 

三.类的访问限定符

3.1访问限定符的介绍

成员访问修饰符: 描述了类成员的访问控制,即所能使用的一个范围

公有的public:没有访问限制,其他类可以访问公有成员变量和方法。

保护的protected:只能在当前类和继承该类的子类中访问,受保护成员变量和方法对于其他类不可见。

私有的private :只能在当前类中访问,其他类无法直接访问。
在上面我们提到,虽然c++支持使用关键字struct和class来创建类,但是这两种方法还是会存在差异:
对于使用关键字class创建的类,其默认成员函数及成员变量是私有的(只允许该种类创建出来的对象访问),若是想进行访问,必须使用关键字public来修饰。

在这里插入图片描述

使用关键字struct创建的类,默认成员变量及成员函数是共有的,可以对它直接访问,这里就不演示了。

3.2.访问限定符的使用

访问限定符的作用域,是从使用第一个访问限定符开始,直到出现下一个访问限定符为止,若是此后未再出现访问限定符,则生效区域直到类的结束。
示例:
在这里插入图片描述

四、类的作用域

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

示例:(声明定义分离)

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

还有一种静态变量值的缺省,也需要用到,这个以后在介绍,感兴趣的可以搜搜。

五、类的实例化

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

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

六、类对象模型

6.1 如何计算类对象的大小

class Stack
{
public:void Init(){int* pos;pos = nullptr;top = capacity = 0;}
private:int* a;int top;int capacity;
};

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小呢?
接下来我们就用上面的类展开讨论
我们回想在C语言中,我们计算一个对象的大小时,会使用操作符sizeof,那么我们尝试一下会得到什么结果:
在这里插入图片描述
可以看到计算的结果为16,只计算了类中的成员变量,成员函数所占的空间并没有计算。看来设计还是挺合理的,如果每用这个类型创建的一个对象,都要给它配一套成员函数,那也太浪费了。为了避免浪费,我们的C++祖师爷只保存了类中成员变量,成员函数存放在公共的代码段(所有使用这个类创建的对象,共有一块函数代码)

总结

在上面我们并没有提及结构对其的原则,大家在进行类大小计算时,要将其考虑在内!!!!!


http://www.ppmy.cn/server/45903.html

相关文章

计算24点的python代码

计算24点的python代码 GPT-4o 确实不错&#xff0c;以后3.5和4.0都难以一次性解决的问题&#xff0c;4.0都要对话许多次才能完美实现&#xff0c;现在4o一次就解决了&#xff0c;记录一下。 import itertools import operator# Define the basic operations ops {: operator…

2024版能源领域网络与数据安全政策全集

能源是工业的粮食&#xff0c;能源安全事关国家根本安全。当今国际局势风云变幻&#xff0c;全球地缘政治、经济、科技体系正经历深刻变化&#xff0c;能源局势将更加错综复杂&#xff0c;威胁能源安全的各种“灰犀牛”“黑天鹅”事件时有发生&#xff0c;促使国际能源版图深刻…

Android 系统中AHardwareBuffer、ANativeWindowBuffer和GraphicBuffer的关系

Android Camera软件系统中&#xff0c;每路Stream的Buffer都是DMA-BUF&#xff0c;这种Buffer通常对外暴露的结构是ANativeWindowBuffer或GraphicBuffer&#xff08;跨进程传递时用的native_handle_t&#xff09;&#xff0c;本文介绍Android系统中AHardwareBuffer、ANativeWin…

JavaScript基础知识1(引入方式、注释、输入输出、变量、数组)

JavaScript基础知识1&#xff08;引入方式、注释、输入输出、变量、数组&#xff09; javascript 引入方式内部方式外部形式 注释和结束符单行注释多行注释 结束符 输入和输出输出输入 alert(你好JS);document.write(js我来了);console.log(看看对不对);prompt(输入您的姓名&am…

学 Go 具体能干什么?

学习 Go (Golang) 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;Go 语言以其高性能、并发处理和简洁的语法而闻名&#xff0c;特别适合以下几个领域&#xff1a; 1. 后端开发 Go 在后端开发中非常流行&#xff0c;特别适合构建高性能的 Web 服务和 API。 Web 框…

5.二叉树详解(附习题)

1.二叉树链式结构的实现 1.1 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。本文准备讲述一些二叉树的基础知识&#xff0c;此处手动快速创建一棵简单的二叉树&#xff0c;来快速进入二叉 树 操作学习&#x…

【Oracle】修改已经存在的序列的当前值

前情提要 在oracle中一般使用序列来实现ID自增。但是oracle中序列维护的没有mysql那么好。只是单存的递增。 比如新建了一个序列&#xff0c;从1开始&#xff0c;每次递增1。此时我向数据库里插入一条id10的数据。那么在序列查询到10的时候&#xff0c;插入就会报错。 所以比较…

3225mm晶振SG3225CAN专用于蓝牙模块应用

在无线通信技术迅猛发展的今天&#xff0c;蓝牙技术因其低功耗、高传输速率和广泛的应用范围&#xff0c;成为物联网和智能设备的重要组成部分。晶振在蓝牙模块中无处不在&#xff0c;大部分的智能手机&#xff0c;打开设置工具里面就会有一个是蓝牙功能&#xff0c;蓝牙技术引…