【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 once

class 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 once

class 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;
}

在这里插入图片描述


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】nacos集群搭建Nginx负载均衡

目录 一、mysql安装与基操 1.1 数据准备 1.2 创建mysql与数据表 二、Nacos集群部署 2.1 创建nacos及配置 2.2 创建Nginx容器 一、mysql安装与基操 1.1 数据准备 拉取mysql docker pull mysql:5.7(版本) 定义挂载目录 mkdir -p /mysql/{conf,data,script} 配置my.c…

【排序4】探秘归并排序:提高程序效率的必备技巧

&#x1f60a;归并排序 &#x1f38a;1、基本思想&#x1f38a;2、代码示例&#x1f38a;3、非递归实现&#x1f38a;4、归并排序的性能分析&#x1f38a;5、归并排序的优缺点&#x1f38a;6、归并排序的应用场景&#x1f38a;7、总结 &#x1f38a;1、基本思想 归并排序&…

(笔记总结)C/C++语言的常用库函数(持续记录,积累量变)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【vue3源码】vue源码探索之旅:项目介绍

简言 记录下我眼中的vue源码项目。 gitHubvue3项目仓库 项目要求: vue版本 3.4.15nodeV18.12.0以上使用pnpm包管理器vitest测试框架Vue3 vue3是渐进式JavaScript框架,易学易用,性能出色,适用场景丰富的 Web 前端框架。 Vue 是一个框架,也是一个生态。其功能覆盖了大部分…

Spark运行架构以及容错机制

Spark运行架构以及容错机制 1. Spark的角色区分1.1 Driver1.2 Excuter 2. Spark-Cluster模式的任务提交流程2.1 Spark On Yarn的任务提交流程2.1.1 yarn相关概念2.1.2 任务提交流程 2.2 Spark On K8S的任务提交流程2.2.1 k8s相关概念2.2.2 任务提交流程 3. Spark-Cluster模式的…

HBase入门:运行机制

文章目录 HBase 系统架构客户端ZooKeeper 服务器Master 主服务器Region 服务器 Region 服务器工作原理用户读写数据的过程缓存的刷新StoreFile合并 Store 的工作原理HLog 的工作原理 HBase 系统架构 HBase 的系统架构包括客户端、ZooKeeper 服务器、Master 主服务器、Region服…

Linux文本三剑客---grep

grep&#xff08;从文本或字符串种过滤特定内容。&#xff09; 格式&#xff1a;Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项&#xff1a; -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…

vue2 事件总线

原图下载&#xff1a;https://download.csdn.net/download/weixin_47401101/88788636

如何在Shopee平台上进行宠物类目的选品丨shopee宠物选品

在Shopee平台上进行宠物类目的选品是一个重要的任务&#xff0c;它直接关系到卖家的销售业绩和市场竞争力。为了成功选择适合的宠物用品&#xff0c;在选品过程中&#xff0c;卖家可以遵循以下策略&#xff1a; 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#…

ZYNQ AC7020C的“点LED”实验

一、创建 Vivado 工程 1、启动 Vivado 2、在 Vivado 开发环境里点击“Create New Project”&#xff0c;创建一个新的工程 3、弹出一个建立新工程的向导&#xff0c;点击“Next” 4、在弹出的对话框中输入工程名和工程存放的目录。需要注意工程路径“Project location”不能有…

瑞丽杂志引领潮流,VOSS眼镜概念店开启奢华新纪元!

近日&#xff0c;由《瑞丽》杂志社举办的2023第4届瑞丽轻奢品牌大赛&#xff0c;以“轻奢•悦藏”为主题的大赛已圆满结束&#xff0c;VOSS眼镜荣获&#xff1a;2023瑞丽轻奢品牌大赛「轻奢时尚风格奖」&#xff0c;作为眼镜行业唯一获此奖项的品牌&#xff0c;VOSS眼镜对此表示…

C++初阶入门之命名空间和缺省参数的详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一.前言 二.命名空间 2.1命名冲突的例子 2.2解决方案 2.3命…

QT发生弹出警告窗口

QTC开发程序弹出警告窗口&#xff0c;如上图 实施代码&#xff1a; #include <QMessageBox> int main() {// 在发生错误的地方QMessageBox::critical(nullptr, "错误", "发生了一个错误&#xff0c;请检查您的操作。");}上面的文字可以更改&#x…

(2024,预训练和微调扩散,图编码器,图特征与CLIP特征对齐)场景图到图像合成:集成 CLIP 指导与扩散模型中的场景图条件

Scene Graph to Image Synthesis- Integrating CLIP Guidance with Graph Conditioning in Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 扩…

配置ARP安全综合功能示例

组网图形 ARP安全简介 ARP&#xff08;Address Resolution Protocol&#xff09;安全是针对ARP攻击的一种安全特性&#xff0c;它通过一系列对ARP表项学习和ARP报文处理的限制、检查等措施来保证网络设备的安全性。ARP安全特性不仅能够防范针对ARP协议的攻击&#xff0c;还可以…

Servet的基础学习

Servet的基础学习 servet的简单介绍 Servlet 是运行在 Web 服务器或应用服务器上的程序&#xff0c;它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet&#xff0c;您可以收集来自网页表单的用户输入&#xff0…

插槽(64-67)

文章目录 插槽1.插槽 - 默认插槽(组件内可以定制一处结构)2.插槽 - 后备内容&#xff08;默认值&#xff09;3.插槽 - 具名插槽(组件内可以定制多处结构)4.作用域插槽(插槽的一个传参语法) 插槽 插槽分类:默认插槽和具名插槽 1.插槽 - 默认插槽(组件内可以定制一处结构) 作用…

PyTorch初探:基本函数与案例实践

正文&#xff1a; 在熟悉了PyTorch的安装和环境配置后&#xff0c;接下来让我们深入了解PyTorch的基本函数&#xff0c;并通过一个简单的案例来实践这些知识。 1. 基本函数 PyTorch的核心是张量&#xff08;Tensor&#xff09;&#xff0c;它类似于多维数组&#xff0c;但可以…

2024年最热门的十个AI对话聊天模型网站

1、百度文言一心 文言一心”是一个基于百度自研的ERNIE模型的聊天机器人。 “文心一言”是百度依托飞桨、文心大模型的技术研发的知识增强大语言模型&#xff0c;能够与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感…

Springboot注解@Aspect(二)JoinPoint 使用详解

目录 JoinPoint 的作用 JoinPoint 常用方法 示例 JoinPoint 的子类和关联类 JoinPoint 的作用 在 Spring AOP 中&#xff0c;JoinPoint 接口代表了一个程序执行的点&#xff0c;比如方法执行或异常处理。当使用 AOP 通知&#xff08;Advice&#xff09;时&#xff0c;你可以…