【C++】类与对象(一)

在这里插入图片描述

前言
类与对象(一)


文章目录

  • 一、面向对象和面向过程的对比
  • 二、类的引入
    • 2.1 C++中的结构体
    • 2.2 类
    • 2.3 类定义方法
    • 2.4 修饰限定符
    • 2.5 封装
    • 2.6 类的实例化
    • 2.7 类对象的大小
  • 三、this指针
    • 3.1 this 指针的使用

一、面向对象和面向过程的对比

面向过程编程是将程序看作一系列的步骤或过程,然后逐步完成各个步骤,从而实现一个程序的方法。而面向对象编程是将问题分解为对象,每个对象包含数据(属性)和操作数据的方法(方法)。

以将大象装进冰箱为例:
在这里插入图片描述
面向对象编程(OOP):

  • 大象对象: 有属性(大小、重量)和方法(进入冰箱)。
  • 冰箱对象: 有属性(容量、门的状态)和方法(打开门)。

面向过程编程:

  • 过程: 分解为步骤。打开冰箱的门,把大象放进去,关闭门。

我们知道面向过程的编程语言有C语言,现在我们来认识一下面向对象编程的编程语言的代表之一——C++。


二、类的引入

2.1 C++中的结构体

在C语言中我们可以使用struct(结构体)来自定义类型,同样在C++也有结构体的使用,但有所不同:

C++中的struct的特点:

  1. 默认访问修饰符: 在C++中,struct的成员默认是公有的(public,访问限定修饰符),与C语言中相同。

  2. 支持成员函数: 与C不同,C++中的struct可以包含成员函数。

    // 在C++中的struct示例
    struct Person {// 成员变量char name[50];int age;// 成员函数void displayInfo() {cout << "Name: " << name << "\nAge: " << age << endl;}
    };
    
  3. 继承和访问控制: C++中的struct也可以继承其他结构体或类,并且支持访问控制,包括私有、保护和公有继承。

    // 基类
    class Animal {
    public:void eat() {cout << "动物在吃东西。" << endl;}
    };// 派生类
    struct Dog : public Animal { // 公有继承void bark() {cout << "狗在叫" << endl;}
    };
    

C++中,struct可以更多地用于实现类似于类的结构。


2.2 类

初始版本的 C++ 在设计时候的一个目标是与 C 语言保持高度的兼容性,以便现有的 C 代码可以逐渐迁移到 C++ 中。因此保留了struct,并稍微扩展了其功能,可以包含函数,增加修饰限定符等。但struct的访问权限是默认是公有的,因此,C++中引入了类的概念。

C++中,类是一种用户自定义的数据类型,在语法上与struct非常相像。

类的基本结构包括成员变量(类的属性)成员函数(类的方法):

//class为关键字   Time为类名
class Time {
public:int hours;    //小时int minutes;  //分int seconds;  //秒
private:// 设置时间void setTime(int h, int m, int s);// 显示时间void displayTime();
};

2.3 类定义方法

有两种主要的类定义方式:定义在类外部的方式定义在类内部的方式

1. 定义在类外部的方式:

类的声明通常放在头文件(.h 文件)中,而类的定义则放在源文件(.cpp 文件)中。注意:成员函数定义时名字前需要加类名::,例如 int MyClass::getVar() const

示例:

// MyClass.h
#pragma onceclass MyClass {
private:int myVar;public:MyClass();  // 声明构造函数void setVar(int value);  // 声明成员函数int getVar() const;  // 声明成员函数
};// MyClass.cpp
#include "MyClass.h"MyClass::MyClass() {myVar = 0;
}void MyClass::setVar(int value) {myVar = value;
}int MyClass::getVar() const {return myVar;
}

2. 定义在类内部的方式:

类的声明和定义都放在类的内部。

示例:

// MyClass.h
#pragma onceclass MyClass {
private:int myVar;public:MyClass() {myVar = 0;}void setVar(int value) {myVar = value;}int getVar() const {return myVar;}
};

2.4 修饰限定符

在C++中,修饰限定符用于控制类中成员的访问权限。C++有三个主要的修饰限定符:publicprotectedprivate

  1. public: 成员被声明为公有,可以在类的外部和内部访问。
  2. protected: 成员被声明为受保护的,可以在类的内部和派生类中访问,但在类的外部不能直接访问。
  3. private: 成员被声明为私有,只能在类的内部访问,不能在类的外部或派生类中直接访问。

修饰限定符通常出现在类的定义中,用于指定类成员的访问权限。以下是一个简单的示例:

class MyClass {
public:// 公有成员int publicVar;// 公有成员函数void publicFunction() {// 可以访问公有、受保护、私有成员publicVar = 1;protectedVar = 2;privateVar = 3;}protected:// 受保护成员int protectedVar;private:// 私有成员int privateVar;
};

在上面的示例中,publicVar 是公有成员,可以在类的外部直接访问。protectedVar 是受保护成员,只能在类的内部和派生类中访问。privateVar 是私有成员,只能在类的内部访问。

需要注意的是:class的默认访问权限为private,struct为public(因为struct要兼容C,这也是为什么要引入类的原因)


2.5 封装

封装是面向对象编程(OOP)的一个核心概念,它指的是将数据和操作数据的方法封装在一个单一的实体(类)中,并对外部隐藏对象的内部实现细节。封装通过将数据成员私有化,并提供公有的成员函数来实现,使得外部代码无法直接访问对象的内部数据,而是通过类的接口进行交互。

封装的主要目的有以下几点:

  1. 隐藏实现细节: 封装允许将实现细节隐藏在类的内部,使得外部代码无法直接了解或修改类的内部数据结构和实现。

  2. 简化接口: 封装通过提供公有的接口(成员函数)来与对象进行交互,使得外部代码只需关心如何使用对象,而不需关心对象的内部工作方式。

  3. 提高代码的模块性: 封装将对象的实现细节封装在一个单一的单元中,使得代码模块化,易于维护和重用。

简单点说,封装就像是你有一辆车,但你不需要知道引擎是怎么工作的,也不需要了解车轮是如何旋转的。你只需要知道一些关于这辆车的基本信息,比如怎么加速、怎么刹车,这就是车的接口。引擎和其他细节都被封装在车的内部,对你来说是不可见的。


2.6 类的实例化

类就像建筑设计图,对象是按照设计图实际要建造的房子。而实例化就像是在建造房子的过程。
举例:

#include <iostream>
using namespace std;// 定义一个简单的类
class Car {
public:// 成员变量string brand;int year;// 构造函数Car(string b, int y) : brand(b), year(y) {}// 成员函数void displayInfo() {cout << "Brand: " << brand << ", Year: " << year << endl;}
};int main() {// 声明并实例化 Car 类的对象Car myCar("Toyota", 2022);// 使用对象的成员函数myCar.displayInfo();return 0;
}

2.7 类对象的大小

类的大小由其成员变量的大小总和决定,不包括成员函数的大小。成员函数在每个对象中共享相同的代码,因此它们不会增加对象的大小。

成员变量的大小由它们的类型和数量决定。每个基本数据类型(如int、double等)在内存中占用的空间是确定的,而类类型的大小取决于其成员变量的大小。

考虑一个简单的示例:

class MyClass {
public:int integerVar;double doubleVar;char charVar;void func1();void func2();
};int main() {MyClass c1;cout << "c1的大小为" << sizeof(c1) << endl;return 0;
}

在这里插入图片描述
那么MyClass 类的对象大小将是24字节,当然这是在默认对齐数为8时的大小。

对象的大小也受到内存对齐的影响,可以参考这篇博文【C语言】自定义类型:结构体。


三、this指针

this 指针是一个特殊的指针,它指向当前对象的地址。

this 指针并不是一个明确存在于内存中的变量,而是编译器在代码生成阶段处理的一种机制,用于传递当前对象的地址给成员函数。

this 指针的存在是因为成员函数需要知道它们是在哪个对象上调用的,以便正确地访问该对象的成员变量和成员函数。

当你在类的成员函数中使用成员变量或调用成员函数时,编译器会隐式地将 this 指针传递给该函数,使得函数内部可以通过 this 指针来引用当前对象。

3.1 this 指针的使用

在类的成员函数中,可以使用 this 指针来引用当前对象的成员变量和成员函数。它允许在成员函数中访问当前对象的成员,即使成员的名称与参数名称相同也能够正确引用

在传参及接收参数时不能显式地标出this。

class MyClass {
private:int _x;public:void setX(int x) {this->_x = x;  // 使用this指针引用成员变量//在 C++ 中,如果成员函数中使用的变量名与成员变量名相同,编译器会默认使用成员变量,这是一种默认约定// _x = x;    //或者直接使用成员变量名_x}int getX() const {return this->_x;  // 使用this指针引用成员变量//return _x;}
};int main() {MyClass obj;obj.setX(42);   // 必须隐式地传递this指针给setX函数,即在实参不标出this,也不在形参标出int value = obj.getX();  // 隐式地传递this指针给getX函数cout << "value=" << value << endl;
}

在这里插入图片描述


在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

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

相关文章

GoJS—交互式图表开发的神器(海量案例)

一、GoJS是什么&#xff1a; GoJS是一个用于创建交互式可视化图表和图形的JavaScript库。它提供了丰富的功能和工具&#xff0c;使开发人员能够轻松地构建各种类型的图表&#xff0c;包括流程图、组织结构图、网络拓扑图等。GoJS具有灵活的布局和样式设置&#xff0c;可以通过简…

Python中Numba库装饰器

一、运行速度是Python天生的短板 1.1 编译型语言&#xff1a;C 对于编译型语言&#xff0c;开发完成以后需要将所有的源代码都转换成可执行程序&#xff0c;比如 Windows 下的.exe文件&#xff0c;可执行程序里面包含的就是机器码。只要我们拥有可执行程序&#xff0c;就可以随…

基于STM32的智能手环设计与实现

需要原理图工程&#xff0c;源码&#xff0c;PCB工程的朋友收藏&#xff0c;这篇文章关注我&#xff0c;私我吧&#xff01;&#xff01;&#xff01; 基于STM32的智能手环设计与实现 摘要一、研究背景及意义二、实现功能三、系统方案设计系统方案设计框图3.1 单片机芯片选择3…

[HGAME 2023 week1]easyenc

查壳 IDA打开 字符串打开就发现了明显的标志 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // raxchar v5; // alchar *v6; // rcxint v8[10]; // [rsp20h] [rbp-19h]char v9; // [rsp48h] [rbpFh]__int128 v10[3]; //…

【Java】SpringMVC参数接收(一)

1、接收单个参数 &#xff08;1&#xff09;直接接收参数 RequestMapping("/hello") RestController public class HelloSpring {RequestMapping("/t2")public String t2(String name){return "name" name;} } 当没有传入参数时&#xff0c;返…

《汇编语言:基于linux环境》eatsyscall汇编程序

当阅读此书&#xff0c;作者编写了一个这样的程序&#xff0c;我也想试一下。照着书中的代码写了下&#xff0c;可以使用nasm正常编译&#xff0c;ld也可以正常链接&#xff0c;但是无法正常执行。总是报错。 ; nasm -f elf64 -g -F stabs eatsyscall.asm ; ld -o eatsysca…

sqli-labs靶场第七关

7、第七关 id1 --单引号报错,id1" --双引号不报错,可以判断是单引号闭合 id1) --也报错&#xff0c;尝试两个括号闭合&#xff0c;id1)) --不报错 接下来用脚本爆库 import stringimport requestsnumbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] letters2 list(string.ascii_…

【销售数据分析】客户画像分析之总体画像

前一段时间把财务分析的一些报表及分析场景讲得差不多了&#xff0c;接下来想和大家讲一下销售分析中的一些场景。今年看了许多企业的数据&#xff0c;发现大家2023年比疫情三年更难&#xff01;从财务的几张报表就会发现净利润亏损的居多&#xff0c;而亏损的主要原因基本上都…

Easysearch:语义搜索、知识图和向量数据库概述

什么是语义搜索&#xff1f; 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。旨在更好地理解用户的意图和查询内容&#xff0c;而不仅仅是根据关键词匹配&#xff0c;还通过分析查询的语义和上下文来提供更准确和相关的…

什么是DevOps?DevOps是如何提效的?

文章目录 前言一、DevOps是什么&#xff1f;二、DevOps是如何提效的&#xff1f;总结 前言 随着软件行业的不断发展&#xff0c;如何打破开发、运维、测试之间的边界&#xff0c;使工作更加高效成为了企业的新一个难题&#xff0c;本文将向大家介绍DevOps文化&#xff0c;以及…

巨杉数据库携手广发证券入选2023大数据“星河”案例

近期&#xff0c;中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)连续七年共同组织的大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动发布公示。本次征集活动&#xff0c;旨在通过总结和推广大数据产业发展的优秀成果&#xff0c;推动…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

被鹅厂最新开源AI绘画工具PhotoMaker圈粉了,多风格头像生成器就靠它了!

要说本周AIGC开源爆火项目&#xff0c;腾讯的PhotoMaker 可以入选其一。而 PhotoMaker 是腾讯Arc于4天前开源上线到GitHub的&#xff0c;更有一众互联网科技领域大V体验推荐&#xff0c;当前Star已经有4.7k了&#xff01; 相信小编这篇文章发布时star预测可能达到5k了。而 Pho…

js打地鼠

文章目录 1实现效果2代码实现 1实现效果 游戏难度&#xff1a;简单&#xff0c;一般&#xff0c;困难&#xff0c;噩梦&#xff08;控制setInterval的time参数&#xff09; 按钮功能&#xff1a;结束&#xff08;可以通过修改gameScore的值来修改判定结束的分数&#xff09;&am…

3个精美的wordpress律师网站模板

暗红色WordPress律师事务所网站模板 演示 https://www.zhanyes.com/qiye/23.html 暗橙色WordPress律师网站模板 演示 https://www.zhanyes.com/qiye/18.html 红色WordPress律所网站模板 演示 https://www.zhanyes.com/qiye/22.html

2023 IoTDB Summit:Dr. Feinauer《Apache IoTDB在德国工业和关键基础设施中的应用》

12 月 3 日&#xff0c;2023 IoTDB 用户大会在北京成功举行&#xff0c;收获强烈反响。本次峰会汇集了超 20 位大咖嘉宾带来工业互联网行业、技术、应用方向的精彩议题&#xff0c;多位学术泰斗、企业代表、开发者&#xff0c;深度分享了工业物联网时序数据库 IoTDB 的技术创新…

Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Biotin-PEG4-Tyramide&#xff0c;Biotin-PEG4-TSA&#xff0c;生物素-PEG4-酪胺&#xff0c;Biotin PEG4 Tyramide&#xff0c;Biotin PEG4 TSA 一、基本信息 产品简介&#xff1a;Biotin PEG4 Tyramide is compos…

React 中条件渲染的 N 种方法

本文作者系360奇舞团前端开发工程师 条件渲染在React开发中非常重要的功能&#xff0c;它允许开发人员根据条件控制渲染的内容&#xff0c;在创建动态和交互式用户界面方面发挥着至关重要的作用&#xff0c;本文总结了常用的的条件渲染方法。 1.If-else if-else是一种控制流程…

基于Micropython利用ESP32-C3驱动墨水屏显示图片

从咸鱼上淘了两块2.9寸的墨水屏价签&#xff0c;可以结合ESP32-C3做个低功耗的时钟温湿度计。 1、所需硬件 合宙的ESP32-C3&#xff1a; 电子价签拆出来的2.9寸墨水屏&#xff1a; ——电子价签型号为&#xff1a;Stellar-L&#xff0c;墨水屏型号为&#xff1a;E029A01。电子…

vue3之echarts3D环柱图

vue3之echarts3D环柱图 效果&#xff1a; 核心代码&#xff1a; <template><div class"container"><div ref"chartRef" class"charts"></div></div> </template><script lang"ts" setup&g…