C++中类与对象的关系

2023-05-16

C++是一门面向对象的编程语言,理解C++,首先要理解类(Class)和对象(Object)这两个概念。


C++中的类(Class)可以看做C语言中结构体(Struct)的升级版。结构体是一种构造类型,可以包含若干成员变量,每个成员变量的类型可以不同;可以通过结构体来定义结构体变量,每个变量拥有相同的性质。例如:


#include <stdio.h>

//定义结构体 Student
struct Student{
    //结构体包含的成员变量
    char *name;
    int age;
    float score;
};
//显示结构体的成员变量
void display(struct Student stu){
    printf("%s的年龄是 %d,成绩是 %f\n", stu.name, stu.age, stu.score);
}

int main(){
    struct Student stu1;
    //为结构体的成员变量赋值
    stu1.name = "小明";
    stu1.age = 15;
    stu1.score = 92.5;
    //调用函数
    display(stu1);

    return 0;
}  
运行结果:
小明的年龄是 15,成绩是 92.500000

C++中的类也是一种构造类型,但是进行了一些扩展,类的成员不但可以是变量,还可以是函数;通过类定义出来的变量也有特定的称呼,叫做“对象”。例如:


#include <stdio.h>

//通过class关键字类定义类
class Student{
public:
    //类包含的变量
    char *name;
    int age;
    float score;
    //类包含的函数
    void say(){
        printf("%s的年龄是 %d,成绩是 %f\n", name, age, score);
    }
};

int main(){
    //通过类来定义变量,即创建对象
    class Student stu1;  //也可以省略关键字class
    //为类的成员变量赋值
    stu1.name = "小明";
    stu1.age = 15;
    stu1.score = 92.5f;
    //调用类的成员函数
    stu1.say();

    return 0;
}  
运行结果与上例相同。
对于熟悉C++的读者,这段代码并不规范,请忽略这一细节,本节的重点是引入类和对象的概念。这套C++教程是在C的基础上编写的,我并不希望一开始就提出过多的C++概念,让读者吃不消,我希望读者从C逐渐过渡到C++,从第二章开始编写规范的C++代码。也就是说,包括本节在内,第一章有很多不规范的C++代码,再次请熟悉C++的读者忽略。
class 和 public 都是C++中的关键字,初学者请先忽略 public(后续会深入讲解),把注意力集中在 class 上。


C语言中的 struct 只能包含变量,而C++中的 class 除了可以包含变量,还可以包含函数。display() 是用来处理成员变量的函数,在C语言中,我们将它放在了 struct Student 外面,它和成员变量是分离的;而在C++中,我们将它放在了 class Student 内部,使它和成员变量聚集在一起,看起来更像一个整体。


结构体和类都可以看做一种由用户自己定义的复杂数据类型,在C语言中可以通过结构体名来定义变量,在C++中可以通过类名来定义变量。不同的是,通过结构体定义出来的变量还是叫变量,而通过类定义出来的变量有了新的名称,叫做对象(Object)。


在第二段代码中,我们先通过 class 关键字定义了一个类 Student,然后又通过 Student 类创建了一个对象 stu1。变量和函数都是类的成员,创建对象后就可以通过点号.来使用它们。


可以将类比喻成图纸,对象比喻成零件,图纸说明了零件的参数(成员变量)及其承担的任务(成员函数);一张图纸可以生产出多个具有相同性质的零件,不同图纸可以生产不同类型的零件。


类只是一张图纸,起到说明的作用,不占用内存空间;对象才是具体的零件,要有地方来存放,才会占用内存空间。


在C++中,通过类名就可以创建对象,即将图纸生产成零件,这个过程叫做类的实例化,因此也称对象是类的一个实例(Instance)。


有些资料也将类的成员变量称为属性(Property),将类的成员函数称为方法(Method)。
面向对象编程(Object Oriented Programming,OOP)


类是一个通用的概念,C++、Java、C#、PHP 等很多编程语言中都支持类,都可以通过类创建对象。可以将类看做是结构体的升级版,C语言的晚辈们看到了C语言的不足,尝试加以改善,继承了结构体的思想,并进行了升级,让程序员在开发或扩展大中型项目时更加容易。


因为 C++、Java、C#、PHP 等语言都支持类和对象,所以使用这些语言编写程序也被称为面向对象编程,这些语言也被称为面向对象的编程语言。C语言因为不支持类和对象的概念,被称为面向过程的编程语言。


在C语言中,我们会把重复使用或具有某项功能的代码封装成一个函数,将拥有相关功能的多个函数放在一个源文件,再提供一个对应的头文件,这就是一个模块。使用模块时,引入对应的头文件就可以。


而在C++中,多了一层封装,就是类(Class)。类由一组相关联的函数、变量组成,你可以将一个类或多个类放在一个源文件,使用时引入对应的类就可以。下面是C和C++项目组织方式的对比:




图1:C语言中项目的组织方式
 


图2:C++中项目的组织方式


不要小看类(Class)这一层封装,它有很多特性,极大地方便了中大型程序的开发,它让C++成为面向对象的语言。


面向对象编程在代码执行效率上绝对没有任何优势,它的主要目的是方便程序员组织和管理代码,快速梳理编程思路,带来编程思想上的革新。


面向对象编程是针对开发中大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。如果你希望开发一个贪吃蛇游戏,类和对象或许是多余的,几个函数就可以搞定;但如果开发一款大型游戏,那你绝对离不开面向对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中类与对象的关系 的相关文章

  • Android Fragment退出 返回上一个Fragment与直接退出

    例如应用底部有两个导航按钮A与B xff0c 刚进入的时候显示为第一个AFragment xff0c 点击B切换到BFragment 如果需求是在BFragment点击返回键回到AFragment xff0c 需要配置 app defaul
  • Android基础 -- 子线程可以修改UI吗?

    子线程可以修改UI吗 xff1f 为什么会产生这样的问题 xff0c 可能是因为在开发过程中遇到了 34 Only the original thread that created a view hierarchy can touch it
  • leetcode 417. 太平洋大西洋水流问题

    https leetcode cn com problems pacific atlantic water flow 思路是从海洋开始逆流 如果可以逆流到 就标记为1 然后检查两个海洋都可以逆流到的区域 DFS public List lt
  • Android模拟器检测常用方法

    在Android开发过程中 xff0c 防作弊一直是老生常谈的问题 xff0c 而模拟器的检测往往是防作弊中的重要一环 xff0c 接下来有关于模拟器的检测方法 xff0c 和大家进行一个简单的分享 1 传统的检测方法 传统的检测方法主要是
  • RecyclerView 隐藏部分分割线

    在项目中遇到复杂点的RecyclerView xff0c 可能会有隐藏部分分割线的需求 xff0c 例如item1和item3之间的分割线隐藏 xff0c item4和item5之间的分割线隐藏等 在看了文档里的ItemDecoration
  • 浅谈去中心化应用

    1 中心化应用 现在我们所使用的应用基本上都是中心化的应用 xff0c 什么是中心化应用呢 xff0c 举个栗子 xff0c 我们在天猫买东西的时候 xff0c 需要先付款给支付宝 xff0c 然后卖家发货 xff0c 我们确认收货之后 x
  • EGL综述

    参考 xff1a https www khronos org registry EGL specs eglspec 1 5 pdf 什么是EGL EGL是支持多平台 多操作系统的 xff0c 比如安卓 Unix Windows等 为了扩展性
  • Java二分搜索树及其添加删除遍历

    对于树这种结构 xff0c 相信大家一定耳熟能详 xff0c 二叉树 二分搜索树 AVL树 红黑树 线段树 Trie等等 xff0c 但是对于树的应用以及编写一棵解决特定问题的树 xff0c 不少同学都会觉得不是一件简单的事情 xff0c
  • Android自定RadioGroup实现点击切换效果

    一 xff1a java文件 public class SegmentedGroup extends RadioGroup private int mMarginDp private Resources resources private
  • opencv--将本地摄像头数据转换成ip摄像头数据流,并在客户端获取该流进行显示

    项目介绍 xff1a 在本项目中 xff0c 实现从本地摄像头获取数据帧 xff0c 然后将其转换成ip摄像头数据流并在客户端通过opencv代码实时获取该图像数据进行显示 xff1a 当然也能在浏览器通过输入地址进行视频的访问 方式一 x
  • 8. &amp;和&amp;&amp;的区别?

    答 xff1a amp 运算符有两种用法 xff1a 1 按位与 xff1b 2 逻辑与 amp amp 运算符是短路与运算 逻辑与跟短路与的差别是非常巨大的 xff0c 虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是t
  • 记InheritedWidget使用思考

    InheritedWidget 是项目中必不可少的组件 xff0c 用户数据共享 老生常谈的Provider框架也是基于InheritedWidget实现的 简介 InheritedWidget组件是功能性组局 xff0c 实现了由上向下共
  • flutter数据共享系列——随记

    Provider InheritedWidget 解决了数据共享问题 迎面也带来数据刷新导致的组件不必要更新问题 Provider基于InheritedWidget实现数据共享 xff0c 数据更新 xff0c 定向通知组件更新等 接下来我
  • Flutter布局——一段代码解释最常见的约束错误

    flutter布局的原理 Constraints go down Sizes go up Parent sets position 父节点向子节点传约束子节点向父节点上传大小最后由父节点决定位置 不是按照直接约束显示 问题代码 xff1a
  • 流媒体压力测试rtmp&hls(含推流和拉流)

    root 64 localhost yum install git unzip patch gcc gcc c 43 43 make root 64 localhost git clone https github com rzrobert
  • Windows开启网络对时方法

    Windows开启网络对时方法 1 启用 NTPServer 为此 xff0c 请按照下列步骤操作 xff1a a 单击 开始 xff0c 单击 运行 xff0c 键入 regedit xff0c 然后单击 确定 进入注册表 b 找到并单击
  • 关于【finder不能完成该操作 因为未能读取或写入"文件名"中的某些数据(错误代码-36)】快速解决办法

    如题 xff1a finder不能完成该操作 因为未能读取或写入 34 文件名 34 中的某些数据 错误代码 36 我们在Mac上操作NTFS格式的硬盘中的文件 xff0c 删除过程中由于某些原因为删除完整 xff0c 直接拔掉硬盘 xff
  • Ubuntu安装指定版本clang-format

    执行以下命令即可 xff1a wget O https apt llvm org llvm snapshot gpg key sudo apt key add sudo vim etc apt sources list 插入从https a
  • Swift中设置tableview的分割线(separator)的样式、颜色、边距

    Swift中设置tableview的分割线 xff08 separator xff09 的样式 颜色 边距 设置分割线样式 三种分割线样式 xff1a case None 无分割线 case SingleLine 单条分割线 case Si

随机推荐

  • React-Native 程序出现闪退原因之一

    React Native 程序出现闪退原因之一 1 RN的iOS端release版本和staging版本出现闪退 原因 xff1a 使用了Number isInteger 该方法在iOS端debug模式下运行不会出现异常 xff0c 一旦生
  • 【Android】【问题分析】G-sensor因数据交互问题导致手机crash

    G sensor因数据交互问题导致手机crash 问题现象 xff1a 测试同事发现 xff0c 手机在使用和待机时 xff0c 低概率发现手机会crash 问题原因 xff1a G sensor在driver和HAL层因交互的参数不匹配
  • 【瓣芽·Banya】React Native 构建的仿豆瓣应用

    今天介绍一个用 React Native 创建的应用 xff0c 集合了豆瓣电影 xff0c 图书等信息展示功能的 app github 地址 瓣芽 Banya 项目使用了react navigation 做路由 redux 做部分状态管理
  • CSS - position

    在 CSS 中 xff0c position 是实现元素定位的一种重要方式 使用定位的元素层叠级别比浮动会更高 xff0c 采用定位来控制元素位置会更加容易 一般我们使用定位 xff0c 是通过使用定位模式和边偏移量来确定元素位置的 定位模
  • React Native 选择器组件 / react-native-slidepicker

    react native slidepicker 一个纯 JavaScript 实现的的 React Native 组件 xff0c 用于如地址 xff0c 时间等分类数据选择的场景 github https github com lexg
  • 函数式组件 ref 的解决方案

    对于 React 中需要强制修改子组件的情况 xff0c React 提供了 Refs 这种解决办法 xff0c 使得我们可以操作底层 DOM 元素或者自定的 class 组件实例 除此之外 xff0c 文档 xff08 v17 0 1 x
  • JavaScript生成指定范围的随机数和随机数序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 xff1a 1 Math random 结果为0 1间的一个随机数 包括0 不包括
  • JavaScript生成指定范围随机数和随机序列

    在JavaScript中我们经常使用Math random 方法生成随机数 xff0c 但是该方法生成的随机数只是0 1之间的随机数 先看如下常用方法的特征 1 Math random 结果为0 1间的一个随机数 包括0 不包括1 2 Ma
  • 【React Native】JavaScript 中 bind 方法

    这个问题其实是一个 JavaScript 中的问题 JavaScript中jQury的bind方法为选定元素添加事件处理程序 xff0c 规定事件发生时运行的函数 语法为 xff1a selector bind event data fun
  • 瑞利信道:从原理到实现

    瑞利信道模型 瑞利信道模型是无线通信信道最重要 最基础的的仿真模型 无线信道中的平坦衰落信道基本上都是在瑞利信道模型的基础上修改而成 xff0c 比如应用同样广泛的莱斯信道就可以通过在瑞利信道的基础上简单的添加直流分量实现 xff0c 而频
  • N个数中的第k个最大值

    确定一组N个数中的第k个最大值 xff0c 这是数据结构和算法分析 java语言描述 中讨论的第一个问题 书中第一章也已给处两种常规思路 xff1a 1 xff0d 先将N个数的数组整体进行递减排序 xff0c 然后返回位置k 数组索引为k
  • 【React Native】app\build\intermediates\res\merged\debug\values-v24\values-v24.xml中错误

    昨天在项目中使用了 react native svg 库 xff0c 配置完成正在正常启动的时候 xff0c 却出现四个错误 xff0c 全部来源于app build intermediates res merged debug value
  • 【React Native】定位获取经纬度,当前城市等地址信息

    2019 8 21 使用内置对象 navigator 来获取经纬度信息 xff0c 参见 定位获取经纬度 xff0c 获取到经纬度等位置信息后需要用到第三方api位置解析 xff08 本文后半段 xff09 2019 7 20更新 xff1
  • 【React Native】定位获取经纬度

    RN 文档上的定位功能需要谷歌框架支持 xff0c 无疑带来了一些麻烦 github 上也有一些开源库 xff0c react native geolocation service等 但是这里还有一个更简便的位置获取 API 使用内置对象n
  • centos7系统下Python2.7升级到Python3.6踩的坑(yum失效,并非简单修改yum文件头)

    centos系统自带的Python2 7用的好好的 xff0c 我非手贱要去升级 xff0c 结果很严重 xff0c 正在运行服务器里面的yum崩了 xff0c 反复尝试了网上提到的几乎完全一致的解决方法 xff1a 将 usr bin y
  • 关于 Android Studio 4.0 创建新的activity和fragment 发现不存在

    1 在 app文件下面的 build gradle里面 注释以下代码
  • RAR文件格式-笔记

    RAR RAR 文件头 52 61 72 21 1A 07 00RAR 文件尾 C4 3D 7B 00 40 07 00 Rar 文件主要由标记块 xff0c 压缩文件头块 xff0c 文件头块 xff0c 结尾块组成 其每一块大致分为以下
  • pptv电话面试

    1 8种基本数据类型 2 String是基本数据类型吗 3 try return 1 catch return 2 finally return3 4 线程池 5 spring实现原理 6 s
  • Linux之systemd服务配置及自动重启

    Linux之systemd服务配置及自动重启 0 背景 在linux上开发时 xff0c 往往需要将自己的程序做成服务 xff0c 并且实现服务开机自动重启 xff0c 以及服务崩溃后自动重启功能 xff0c 本文就对该功能的实现做简单介绍
  • C++中类与对象的关系

    C 43 43 是一门面向对象的编程语言 xff0c 理解C 43 43 xff0c 首先要理解类 xff08 Class xff09 和对象 xff08 Object xff09 这两个概念 C 43 43 中的类 xff08 Class