类与对象 (一)

news2024/11/24 0:18:21

引子

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。

什么是对象?

对象表示的是某一类事物的抽象的名词和概念,是对一类事物的抽象表示。
实例化对象根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同
**类 **对象在计算机中的表示。

类 实例化对象 对象 三者的关系

对象 编程实现成
的实例化成为 实例化对象

  • 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  • 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  • 类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图

class 与 struct

根据上述定义不难发现c++的类与c语言的结构体功能上是相似的
c++是从c语言发展出来的

c++为何不沿用结构体呢?

  • 结构体外可以之间访问结构体中的数据,无法对数据进行保护与权限控制
  • 结构体中的数据与对数据的操作(函数)是分离的,也因此程序的复杂性很难控制,增加了程序的数据处理与维护难度,严重影响生产效率

lass 与 struct存在很高的相似性,c++为何保留struct?

c++要兼容c语言,因此C++中保留了很多C的东西,其中之一便是struct

struct在cpp中的演变

c语言中时(面向过程的编程语言认为,数据与操作分离)
struct是一种数据结构,孤儿不能包括函数

c++中时(面向对象的编程语言认为,数据与操作是一个整体不应该分开)

struct也因此有了新的发展

  1. 可以包括成员函数
  2. 可以实现继承
  3. 可以实现多态

struct 与 class的区别

  1. 默认继承权限不同,classprivate structpublic
  2. 默认访问权限不同,classprivate structpublic

封装

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

访问限定符

在这里插入图片描述
访问限定符说明

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

访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别

类的定义

class为定义类的关键字,ClassName为类的名字,{}中为类的主体。
略。
类体中内容称为类的成员:

  • 类中的变量称为类的属性或成员变量;
  • 类中的函数称为类的方法或者成员函数。
class className
{
 // 类体:由成员函数和成员变量组成
 
}; // 一定要注意后面的分号

类的作用域

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

成员函数的定义

成员函数的定义有两种

声明与定义未分离:
成员函数如果在类中定义,编译器可能会将其当成内联函数处理。

class Person {
    public:
        void print()
        {
            cout << _name << " " << _sex << " " << _age << endl;
        }
    private:
        string _name;
        string _sex;
        int _age;
};

声明与定义分离:
类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::;

//Person.h
void Person::print()
{
    cout << _name << " " << _sex << " " << _age << endl;
}
//Person.cpp
#include"Person.h"
class Person {
    public:
        void print();
    private:
        string _name;
        string _sex;
        int _age;
};

类对象在内存中的存储

在c++编译系统中,数据与函数是分开存放的。
在实例化对象中,只保存成员变量,成员函数存在公共代码段
以代码为例
在这里插入图片描述
成员变量在内存中的存储与 c语言struct在内存中的存储是一致的
可以参考我这篇博客

结构体在内存中的存储

this指针

c++通过this指针来区分同一类的不同实例化对象

  • C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象。
  • 在函数体中所有“成员变量”的操作,都是通过该指针去访问。
  • 只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
  2. 只能在“成员函数”的内部使用
  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。
    所以对象中不存储this指针。
  4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用
    户传递

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

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

相关文章

MYSQL进阶-索引的组合索引

回城传送–》《100天精通MYSQL从入门到就业》 文章目录 一、练习题目二、SQL思路SQL进阶-索引的组合索引初始化数据解法什么是组合索引为什么要使用组合索引如何使用组合索引 答案参考&#xff1a; 一、练习题目 题目链接难度SQL进阶-索引的组合索引★★★☆☆ 二、SQL思路 …

C++初阶之类和对象(中)

类和对象&#xff08;中&#xff09; 1.类的6个默认成员函数2. 构造函数2.1 概念2.2 特性 3.析构函数3.1 概念3.2 特性 4. 拷贝构造函数4.1 概念4.2 特征 5 运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 前置和后置重载 6.日期类的实现7.const成员8.取地址及const取地址操作…

Markdown 进阶语法:Mermaid 绘图 (一) - 流程图 (Flowchart)

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【Linux】手写一个简易命令行解释器

文章目录 1. 了解命令行解释器1.1 命令行解释器是什么&#xff1f;1.2 我们为什么要尝试手写一个命令行解释器&#xff1f; 2. 命令行解释器的实现2.1 打印提示符2.2 获取用户输入2.3 创建子进程并进行进程程序替换2.4 内建命令 1. 了解命令行解释器 1.1 命令行解释器是什么&a…

TiDB-亿级订单数据亚秒响应查询方案

TiDB-亿级订单数据亚秒响应查询方案 TiDB宣传片 1. 什么是TiDB TiDB 是一个分布式 NewSQL 数据库&#xff0c;它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景…

完全背包问题(二维数组 / 一维数组实现)

完全背包 完全背包的一维和二维dp数组 有 N 件物品和容量为 W 的背包&#xff0c;第 i 件物品的重量是 weight[i]&#xff0c;价值是 value[i] 每件物品都有无限个&#xff0c;即同一物品能够放入背包多次&#xff0c;求背包所能装入物品的最大价值总和 完全背包和 0-1 背包不…

小白到运维工程师自学之路 第四十六集 (mongodb复制集)

一、概述 1、 MongoDB复制集&#xff08;MongoDB Replica Set&#xff09;是MongoDB提供的一种高可用性和数据冗余的解决方案。它由多个MongoDB实例组成&#xff0c;其中一个作为主节点&#xff08;Primary&#xff09;&#xff0c;其他节点则扮演从节点&#xff08;Secondary&…

使用finalshell连接Linux服务器出现的问题

第一次使用finalshell远程连接Linux服务器的过程、遇到的问题及解决方案 首先建立连接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d8836dcd8a224bf093ebdac031f763d5.png 然后问题来了 出现以下问题&#xff1a; java.net.ConnectException: Connection refused:…

地下污水厂配电能效管理平台设计

安科瑞电气股份有限公司 上海嘉定 201800 摘要&#xff1a;结合某地下污水厂项目&#xff0c;从结构、系统组成、系统功能、控制要求、场景模 式等方面介绍了地下污水厂智能照明控制系统&#xff0c;探索了一套适用于地下污水厂的智能照明控制策略&#xff0c;以确保地下污水…

这里会告诉你音频转换器推荐有什么

音频转换格式技术是一项重要的技术&#xff0c;可以将音频文件从一种格式转换为另一种格式&#xff0c;以适应不同设备、平台或应用程序的需求。今天的文章会向你科普音频转换格式技术和音频转换器推荐有什么。 音频转换格式技术应用于很多场景&#xff1a; 1、音乐制作与后期…

银河麒麟服务器v10 sp1 部署.Net6.0项目后无法访问静态文件

上一篇&#xff1a;银河麒麟服务器v10 sp1 部署.Net6.0 http https_csdn_aspnet的博客-CSDN博客 由于本人项目直接从.NetCore3.1升级到.Net6.0的&#xff0c;请参考文章&#xff1a;NetCore3.1项目升级到Net6.0_vs2022 没有startup_csdn_aspnet的博客-CSDN博客 虽然部署项目后…

mysql根据逗号将一行数据拆分成多行数据,顺便展示其他列

1、原始数据演示 2.处理结果 SQL展示 SELECTa.id,a. NAME,substring_index(substring_index(a.shareholder,,,b.help_topic_id 1),, ,- 1) AS shareholder FROMcompany a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.shareholder) - length(REPLACE (a.share…

uni-app 从零开始第二章:底部 tabBar

pages.json 页面路由 | uni-app官网 一、新建 home页面 找到pages目录&#xff0c;新增一个home的页面&#xff0c;勾选上同时新建文件夹 新建完成后&#xff0c;pages.json 中 会自动添加上刚刚新建的文件信息 二、新增tabBar数据 在 pages.json中新增以下代码 "tabB…

微信保存到本地的视频文件怎么转存到手机笔记?

微信是人们之间交流的重要工具。我们经常会在微信上收到一些珍贵的视频文件&#xff0c;比如亲友们的生活片段、孩子们的成长瞬间等等。但是&#xff0c;随着时间的推移&#xff0c;这些视频文件会越来越多&#xff0c;也会有人担心它们的保存问题。 现在很多人都在使用手机笔…

磁盘0和磁盘1

磁盘0和磁盘1 查看磁盘情况磁盘0和磁盘1的区别 查看磁盘情况 此电脑&#xff0c;右键&#xff0c;管理&#xff0c;然后就可以看到计算机管理这个页面 计算机管理页面&#xff0c;存储&#xff0c;磁盘管理&#xff0c;就可以看到磁盘情况了 磁盘0和磁盘1的区别 磁盘0和磁…

【前端进阶】什么是AST?什么是ESLint?如何快速发布自定义ESLint插件?

文章目录 什么是ASTAST在线可视化网站代码如何转化ASTacorn基本使用 什么是ESLintESLint解析原理如何制作ESLint插件安装yeoman创建插件创建规则目录结构实现警告console.error()方法 npm发布如何注册如何登录发布应用问题 nrm下载查看可用镜像源切换镜像源 结束参考文章 什么是…

ChatGPT会让软件测试人员失业吗?

首先&#xff0c;正视ChatGPT &#xff0c;它只是一款提升测试效率的工具&#xff0c;并不会让测试失业 ChatGPT 本质上就是一个搜索引擎的二次封装&#xff0c;它更能理解你的输入意图&#xff0c;它更精确的帮你拼接返回结果。但它就是一个辅助工具&#xff0c;用好了可以帮…

传统主从配置

传统主从配置 MySQL通过二进制文件写入和恢复数据 主服务器一定要打开二进制日志 必须两台服务器&#xff08;或者是多个实例&#xff09; 从服务器需要一次数据初始化 如果主从服务器都是新搭建的话&#xff0c;可以不做初始化 如果主服务器已经运行了很长时间了&#xff0c;可…

从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

Bert最近很火,应该是最近最火爆的AI进展,网上的评价很高,那么Bert值得这么高的评价吗?我个人判断是值得。那为什么会有这么高的评价呢?是因为它有重大的理论或者模型创新吗?其实并没有,从模型创新角度看一般,创新不算大。但是架不住效果太好了,基本刷新了很多NLP的任务…

web服务端接收多用户并发上传同一文件,保证文件副本只存在一份(附go语言实现)

背景 对于一个文件服务器来说&#xff0c;对于同一文件&#xff0c;应该只保存一份在服务器上。基于这个原则&#xff0c;引发出本篇内容。 本篇仅阐述文件服务器在同一时间接收同一文件的并发问题&#xff0c;这种对于小体量的服务来说并不常见&#xff0c;但是最好还是要留…