【C++】面向过程与面向对象

文章目录

  • 1. 面向过程与面向对象
  • 2. 类(class)
    • 类的作用域
  • 3. 访问限定符
    • 封装
  • 4. 类的实例化
  • 5. this指针

1. 面向过程与面向对象

C语言是面向过程(procedure-oriented)的语言,分析出求解问题的步骤,通过函数调用逐步解决问题。以洗衣服举例,需要很多个步骤:
在这里插入图片描述

C++是面向对象(object-oriented)的语言,将一件事情拆分成不同的对象,靠对象之间的交互完成。洗衣服这件事可以拆分成三个对象:人、衣服和洗衣粉,可能也有洗衣机,洗衣服这个过程是由这三个或四个对象之间交互完成的。

2. 类(class)

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

struct Person {char name[20];int age;char gender;int height;int weight;char introduction[100];void showInfo() {cout << name << " - " << age << " - " << gender << endl;}void sleep() {}void washCloth() {}void readBook() {}void work() {}void study() {}
};

可以这么做是因为C++需要兼容C,事实上C++更喜欢用class关键字表示一个类:

class Person
{// 类体由变量和函数组成
};

类中的变量称为类的属性或成员变量,类中的函数称为类的方法或成员函数。可以将成员的声明和定义一起放在类中,如果成员函数放在类中定义,编译器可能会将其当成内联函数处理;也可以将类成员的声明和定义分开,类中的成员变量和成员函数的声明放在.h头文件,成员函数的定义放在.cpp文件。

类的作用域

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

class Person {char name[20];int age;char gender;int height;int weight;char introduction[100];void showInfo();void sleep();void washCloth();void readBook();void work();void study();
};void Person::showInfo() {cout << name << " - " << age << " - " << gender << endl;
}

3. 访问限定符

访问限定符用于确定类成员的访问权限

  1. public:被public修饰的成员在类外可以被访问;
  2. protected:被protected修饰的成员在类外不能被访问,但可以在继承的子类中被访问;
  3. private:被private修饰的成员在类外不能被访问。

class关键字定义类的默认访问权限是private,这是因为面向对象三大特性之一的封装。struct关键字定义类的默认访问权限是public,因为需要兼容C。

封装

面向对象的三大特性:封装、继承、多态。封装是将数据和操作数据的方法进行结合,通过访问权限来隐藏对象内部的属性和实现细节,控制哪些函数可以在类外部直接被使用,仅对外公开接口来和对象进行交互。

封装本质上是一种管理,让用户更方便使用类。比如对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互。对于计算机使用者而言,不用关心内部核心部件,主板上线路是如何布局的,CPU内部是如何设计的。

class Person {private:char name[20];int age;char gender;int height;int weight;char introduction[100];public:void showInfo();void sleep();void washCloth();void readBook();void work();void study();
};void Person::showInfo() {cout << name << " - " << age << " - " << gender << endl;
}

4. 类的实例化

用类类型创建对象的过程,称为类的实例化。类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。一个类可以实例化出多个对象,实例化出的对象占用实际的内存空间,存储类成员变量。

int main() {Person p1;Person p2;Person p3;
}

计算对象的内存大小与计算结构体的大小一致,可以看这篇文章计算结构体的大小了解,简单地说就是按计算结构体大小的方式来计算类成员变量的大小。成员函数不会包括在内,因为成员函数是n个对象共用的,存放在公共代码区。另外空类比较特殊,它也有大小,占用1个字节空间。

5. this指针

this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
this形参,因此this指针并不存放在对象中,而是在栈中(可能也在寄存器中,取决于编译器)。
在这里插入图片描述
this指针的类型:类的类型* const,只能在“成员函数”的内部使用。this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要程序员手动传递。

下面两段程序编译运行结果是? A、编译报错 B、运行崩溃 C、正常运行

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

C.正常运行,表面存在空指针问题,但成员函数中并没有使用其它成员,仅仅只是打印一个字符串,不会导致空指针访问。

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

B.运行崩溃,成员函数中使用了成员变量,实际上是this指针访问的成员,造成了空指针。

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

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

相关文章

mmdetection如何计算准确率、召回率、F1值

1、训练 python tools/train.py configs/fcos/fcosrdweed3.py 2、测试 这一步要加–outresult.pkl&#xff0c;才能计算准确率和召回率 python tools/test.py configs/fcos/fcosrddweed3.py work_dirs/fcosrddweed3/epoch_300.pth --outresultfcos.pkl3、计算准确率和召回率…

LDA 关键词提取

目录 介绍 主题数确认 代码实现 普通关键词提取 TF-IDF&#xff0c;textRank 实现链接&#xff1a;gensim 实现 TF-IDF&#xff1b;textRank 关键词提取_gensim tfidf关键词-CSDN博客 它们是直接从文本中提取关键词&#xff0c;如果想基于一些潜在语义&#xff0c;可以用 L…

【MySQL】巧用 Max 函数将字段值作为字段输出

力扣题 1、题目地址 学生地理信息报告 2、模拟表 表&#xff1a;student Column NameTypenamevarcharcontinentvarchar 该表可能包含重复的行。该表的每一行表示学生的名字和他们来自的大陆。 3、要求 一所学校有来自亚洲、欧洲和美洲的学生。 编写解决方案实现对大洲…

表的连接【MySQL】

文章目录 什么是连接测试表内连接外连接左外连接右外连接全外连接 自然连接交叉连接参考资料 什么是连接 数据库的连接是指在数据库系统中&#xff0c;两个或多个数据表之间建立的关联关系&#xff0c;使它们可以进行数据的交互和操作。连接通常基于某种共同的字段或条件&…

力扣每日一题 猜数字游戏 阅读理解

Problem: 299. 猜数字游戏 思路 &#x1f468;‍&#x1f3eb; 灵神 复杂度 Code class Solution {public String getHint(String secret, String guess) {int a 0;int[] cntS new int[10];int[] cntG new int[10];for(int i 0; i < secret.length(); i){if(secre…

leetcode 226. 翻转二叉树 java解法

题目描述 给你一棵二叉树的根节点 root&#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 解题思路 翻转一棵二叉树意味着交换每个节点的左右子树。我们可以使用递归的方法&#xff0c;从根节点开始&#xff0c;对每个节点进行如下操作&#xff1a; 交换当前节点的左…

Vscode连接外部虚拟环境

如果vscode工程目录里面有一个超级大的虚拟环境文件夹&#xff0c;怎么说都不是一件优雅的事&#xff0c;因此我们希望这个虚拟环境在工程目录外部&#xff0c;我们开始&#xff1a; 1. 复制虚拟环境目录路径&#xff1a;E:\envs\test 2. 在vscode中打开文件夹&#xff0c;CT…

Python教程:一文弄懂Python字符串(很详细)

字符串是计算机编程中表示文本数据的一种数据类型。在Python和许多其他编程语言中&#xff0c;字符串是由字符序列组成的不可变序列&#xff0c;可以包含字母、数字、符号以及空格等字符。字符串通常用引号括起来表示&#xff0c;可以使用单引号&#xff08;&#xff09;、双引…

一文详解WebView,不好理解就想想iframe,类比后秒懂了。

Hi&#xff0c;我是贝格前端工场&#xff0c;又到了给大家做技术扫盲的时候&#xff0c;本文讲一讲webview&#xff0c;有些老铁觉得很难懂&#xff0c;其实借助iframe来中转一下&#xff0c;就好理解了。 WebView是一种用于在应用程序中显示Web内容的组件。它可以嵌入到应用程…

【C++】关键字:auto

文章目录 1. 介绍2. 如何使用 1. 介绍 从C11开始&#xff0c;auto变成了类型指示符&#xff08;之前auto并不是这个作用&#xff09;。使用auto定义变量时必须对其进行初始化&#xff0c;在编译阶段编译器自动推导auto变量的实际类型。因此auto并非是一种“类型”的声明&#…

爬取某乎专栏文章html格式,并转到pdf保存

import os import re import requests import pdfkit import parsel 1.先获取html文章内容获取小赖 2.把html文件转成pdffilename html\\ if not os.path.exists(filename):os.mkdir(filename)filename2 pdf\\ if not os.path.exists(filename2):os.mkdir(filename2)url htt…

柚见第十期(后端队伍接口详细设计)

创建队伍 用户可以 创建 一个队伍&#xff0c;设置队伍的人数、队伍名称&#xff08;标题&#xff09;、描述、超时时间 P0 队长、剩余的人数 聊天&#xff1f; 公开 或 private 或加密 信息流中不展示已过期的队伍 请求参数是否为空&#xff1f;是否登录&#xff0c;未登录不…

DockerCompose的介绍、安装与常用命令

Docker Compose 是一个用于定义和运行多容器Docker应用程序的工具&#xff0c;通过一个docker-compose.yml配置文件来管理多个容器服务及其依赖关系 一 安装DockerCompose 1、下载 网盘下载 wget https://github.com/docker/compose/releases/download/v2.18.0/docker-comp…

事业单位计算机专业知识 考试范围

《专业知识》考试范围 目录 一、计算机类 &#xff08;一&#xff09;计算机科学技术基础 1、计算机基础知识 2、多媒体技术 3、计算机信息安全技术 4、Internet知识 &#xff08;二&#xff09;计算机软件及使用 1、Windows2000/xp操作系统 2、文字处理软件Word20…

FX110网:在CP Markets申请出金四个多月了,没任何消息!

近期&#xff0c;本站收到一中国汇友投诉&#xff0c;称其CP Markets平台已数月无法出金&#xff0c;平台方也没有任何回应。在货币市场闯荡久了的“老鸟”就会知道&#xff0c;平台无故不给出金必定有妖&#xff0c;更何况还是长达数月&#xff01; 在CP Markets申请出金四个多…

Anaconda下载安装及配置pytorch环境

先解释一下Python、Anaconda、Pytorch是啥 Python是一种广泛使用的编程语言&#xff0c;在许多领域都有应用。它具有简洁的语法&#xff0c;易于学习&#xff0c;并且有大量的第三方库可以使用。 Anaconda是一个Python的包和环境管理软件&#xff0c;提供了许多用于数据科学&a…

如何像专家一样维护服务器硬件?

大家好&#xff01;今天&#xff0c;我们要一起来探索一个神秘的世界——服务器硬件。可能你会有点困惑&#xff0c;服务器硬件是什么&#xff1f;别急&#xff0c;让我一一为你解答。 1. 服务器硬件是什么&#xff1f; 想象一下&#xff0c;如果你的家里有一个巨大的衣柜&am…

Flink SQL示例

1. 简单订单统计 假设有以下两个订单流数据&#xff0c;数据字段分别为用户ID、购买的商品名称、商品数量。 数据流A&#xff1a; 1L,"尺子",3 1L,"铅笔",4 3L,"橡皮",2 数据流B&#xff1a; 2L,"手表",3 2L,"笔记本",3 4…

51、WEB攻防——通用漏洞验证码识别复用调用找回密码重定向状态值

文章目录 回显状态判断用户名重定向验证码回显显示验证码简单机制验证码复用验证码智能识别验证码接口调用安全修复建议 回显状态判断 request前端判断不安全&#xff08;前端接收验证的返回值来进行判断)&#xff0c;使用burp的Response to this request可以抓取返回包~ 这种…

【JS】APIs:事件流、事件委托、其他事件、页面尺寸、日期对象与节点操作

1 事件流 捕获阶段&#xff1a;从父到子 冒泡阶段&#xff1a;从子到父 1.1 事件捕获 <body> <div class"fa"><div class"son"></div> </div> <script>const fadocument.querySelector(.fa);const sondocument.qu…