【C++初阶】类和对象(上)

【C++初阶】类和对象(上)

🥕个人主页:开敲🍉

🔥所属专栏:C++🥭

🌼文章目录🌼

1. 面向过程和面向对象初步认识

2. 类的引入

3. 类的定义

4. 类的访问限定符及封装

    4.1 访问限定符

    4.2 封装

5. 类的作用域

6. 类的实例化

7. 类对象模型

    7.1 如何计算类对象的大小

    7.2 内存对齐规则

8. this指针

    8.1 this指针的引出

    8.2 this指针的特性

1. 面向过程和面向对象初步认识

  C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。yy用洗衣服比喻的话,C语言就是:拿一个盆子-->放水-->放衣服-->放洗衣粉-->洗-->换水-->洗-->换水-->洗-->拧干-->晾衣服

  C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。C++是:把衣服放进洗衣机-->放洗衣粉-->启动洗衣机-->晾衣服

2. 类的引入

  C语言的结构体中只能够定义变量,而在C++中,结构体不仅能够定义变量,还能够定义函数,而在C++中我们也一般不将其称为结构体,而是称之为。比如,之前我们在用C语言实现栈时,结构体和函数是分开的,函数中调用结构体的成员变量。而在C++中我们可以这样写:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

class Stack
{
public:

//初始化
    void Init(int capacity)
    {
        int* _arr = (int*)malloc(sizeof(int) * capacity);
        if (nullptr == _arr)
        {
            perror("malloc fail");
            exit(-1);
        }
        _capacity = capacity;
        arr = _arr;
    }

//入栈

    void Push(int n)
    {
        if (_size > _capacity)
        {
            int* _arr = (int*)malloc(sizeof(int) * 2 * _capacity);
            if (nullptr == _arr)
            {
                perror("malloc fail");
                exit(-1);
            }
            arr = _arr;
            _capacity *= 2;
        }
        arr[_size++] = n;
    }

//出栈

    void Pop()
    {
        _size--;
    }

//栈顶

    int Top()
    {
        return arr[_size - 1];
    }
private:

//成员变量
    int _capacity = 0;
    int* arr = nullptr;
    int _size = 0;
};


int main()
{
    Stack st;
    st.Init(4);
    st.Push(1);
    st.Push(2);
    st.Push(3);
    st.Push(4);
    cout << st.Top() << endl;
    st.Pop();
    cout << st.Top() << endl;
    st.Pop();
    cout << st.Top() << endl;
    st.Pop();
    cout << st.Top() << endl;
    return 0;
}

  可以看到,原先在C语言中实现的栈中的结构体成员变量也全都和函数一起归进了类中。

3. 类的定义

class ClassName
{

     //类主体

};//分号一定别忘了

  class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意最后的分号不要漏掉了。

  类中的内容称为类的成员:类中的变量类的属性或成员变量类中的函数称为类的方法或者成员函数

  类的两种定义方式:

声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当作内联函数处理:

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

  //test.h

#pragma once

#include <iostream>
using namespace std;


class Class
{
public:
    void Printf();
private:
    const char* name = "张三";
    const char* sex = "男";
    int age = 18;
};

//test.c

#include "test.h"

void Class::Printf()
{
    cout << Class::name << "-" << Class::sex << "-" << Class::age << endl;
}


int main()
{
    Class cl;
    cl.Printf();
    return 0;
}

  一般情况下更加推荐采用方式②。

  成员变量命名规则建议:

  看上面这段代码,很明显可以看到,func函数的参数和类的成员变量同名了,这虽然不会产生上面错误,但是我们在读代码的时候肯定是会一头雾水,分不清两个year哪个是哪个,因此我们最好使用下面的命名:

  类的成员变量前加上一个 _ 符号。

4. 类的访问限定符及封装
    4.1 访问限定符

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

  访问限定符说明:

① public修饰的成员在类外可以直接被访问

 protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)

 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

 如果后面没有访问限定符,作用域就到 } 即类结束

 class的默认访问权限为private,struct为public(因为struct要兼容C)

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

  面试题:

问题:C++中struct和class的区别是什么?

回答:C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private。注意:在继承和模板参数列表位置,struct和class也有区别,后序给大
家介绍。

    4.2 封装

  面向对象的三大特性:封装、继承、多态。

  在类和对象阶段,主要研究的是类的封装,那么什么是封装呢?

  封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来
和对象进行交互。

  封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用
户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日
常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

  对于计算机使用者而言,不用关心内部核心部件,比如主板上线路是如何布局的,CPU内部是如
何设计的等,用户只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。因此计
算机厂商在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机、鼠标以
及键盘插孔等,让用户可以与计算机进行交互即可。

  在C++语言中实现封装,可以通过类将数据以及操作数据的方法进行有机结合,通过访问权限来
隐藏对象内部实现细节,控制哪些方法可以在类外部直接被使用。

5. 类的作用域

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

6. 类的实例化

  用类类型创建对象的过程,称为类的实例化:

① 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没
有分配实际的内存空间来存储它
;比如:入学时填写的学生信息表,表格就可以看成是一个
类,来描述具体学生信息。
  类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。
  谜语:"年纪不大,胡子一把,主人来了,就喊妈妈" 谜底:山羊

② 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

  打个比方:类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
才能实际存储数据,占用物理空间

7. 类对象模型
    7.1 如何计算类对象的大小

  类对象的大小计算方式与C语言中结构体的计算方式相同,具体计算可以看看:【C语言进阶篇】自定义类型:结构体(上)-CSDN博客

    7.2 内存对齐规则

 第一个成员在与结构体偏移量为0的地址处

 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
                       (VS中默认的对齐数为8)

 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍

 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

8. this指针
    8.1 this指针的引出

  先来看下面一段代码:

  现在抛出一个问题:这里我们实例化了两个对象并且调用了两次Init函数,那么按理说类中的year、month、day应该会变为第二次调用的值,也就是最终调用值,那么最后输出应该会输出两个2024-7-12的日期,但是为什么最后输出能够将两个日期都输出呢?

  这就是因为this指针。

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

    8.2 this指针的特性

 this指针的类型:类类型* const,即成员函数中,不能给this指针赋值

 只能在“成员函数”的内部使用

 this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给
this形参。所以对象中不存储this指针

 this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传
递,不需要用户传递

                                                创作不易,点个赞呗,蟹蟹啦~

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

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

相关文章

python 实验八 数据分析与展示

一、实验目的 掌握掌握matplotlib库中pyplot模块的使用。 二、实验环境 Window10&#xff08;x64&#xff09;&#xff0c;Python 3.8&#xff08;x64&#xff09;&#xff0c;PyCharm Community Edition 2020.3.2&#xff08;x64&#xff09; 三、实验内容 现有列表hight…

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示&#xff1a;如何做混合场景的脚本&#xff1f; 用211的业务比例 ①启动数据库服务 数据库服务&#xff1a;包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…

[迫真保姆级教程]在Windows上编译可用的Tesseract OCR in C++ 并部署在Visual Studio与Qt6上

目录 前言 阅前提示 导言 使用基于vcpkg的&#xff0c;于msvc19编译器编译的Tessereact OCR动态库 使用vcpkg辅助我们的编译 正文 使用msys2环境下的&#xff0c;使用mingw64编译器编译的Tessereact OCR动态库 什么是msys2 安装前&#xff0c;我们也许。。。 [Option]…

python作业二

# 二进制转化为十进制 num input("num:")def binaryToDecimal(binaryString):he 0length len(binaryString)for i in range(length):he int(binaryString[i]) * 2 ** (length - i - 1)return heprint(binaryToDecimal(num))代码运行如下&#xff1a; import math…

基于YOLOV8的数粒机-农业应用辣椒种子计数计重双标质量解决方案

一:辣椒种子行业背景调查 中国辣椒年产量稳居世界第一,食辣人口超5亿。中国辣椒全球闻名,小辣椒长成大产业,带动全球食品行业腾飞。 在中国,“辣”是不少地方餐桌上的一大特色。从四川的麻辣火锅到湖南的剁椒鱼头再到陕西的油泼辣子面,由南到北,总有食客对辣有着独一份偏…

【RHCE】系统服务综合实验

一、实验内容 现有主机 node01 和 node02&#xff0c;完成如下需求&#xff1a; 1、在 node01 主机上提供 DNS 和 WEB 服务 2、dns 服务提供本实验所有主机名解析 3、web服务提供 www.rhce.com 虚拟主机 4、该虚拟主机的documentroot目录在 /nfs/rhce 目录 5、该目录由 node02…

牛顿力学和拉格朗日力学求解atwood machine问题对比

一个半径为 R R R、转动惯量为 I I I 的圆盘。绳子与圆盘无滑动&#xff0c;质量 m 2 m_2 m2​ 的物体在重力 g g g 作用下下坠&#xff0c;带动质量 m 1 m_1 m1​ 的物体上升。求 m 1 m_1 m1​和 m 2 m_2 m2​ 的加速度 a a a。 牛顿力学方法 对质量 m 1 m_1 m1​ 和 …

物业系统自主研发接口测试框架

1、自主研发框架整体设计 1.1、什么是测试框架? 在了解什么是自动化测试框架之前&#xff0c;先了解一下什么叫框架?框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架…

【趣味数学】求阴影部分面积

题 解法1: 中位线法 既然是中点&#xff0c;就可以用起来&#xff0c;横着不行&#xff0c;竖着来&#xff0c;扩展做辅助线 E是中点S&#xff08;AED) 1/4 S(ABCD) 6 做图中辅助延长线&#xff0c;因为E中点&#xff0c;所以S&#xff08;MEB&#xff09;S(AED) 6 同理E也是…

css预编译器--sass

Sass Sass 提供了 变量&#xff08;variables&#xff09;、嵌套规则&#xff08;nested rules&#xff09;、 混合&#xff08;mixins&#xff09;、 函数&#xff08;functions&#xff09;&#xff0c;目前我使用最多的还是变量和嵌套规则&#xff0c;貌似目前css也支持嵌套…

Jenkins设置开机自启(以war包方式启动jenkins)

配置环境&#xff1a;Centos7.6/Jenkins 2.452.2/jdk-21.0.3 jenkins启动命令&#xff1a; nohup java -jar jenkins.war > /dev/null 2>&1 & 1、创建sh脚本文件 # jenkins.war包&#xff0c;放在了/root/software目录 cd /root/software vim jenkins-start.sh …

若依 ruoyi-vue SpringBoot highlight-textarea 输入框敏感词关键词高亮标红(二)

参考文章&#xff0c;非常感谢大佬的分享 实现可高亮的输入框 — HighlightTextarea GitHub:highlight-textarea 可看作者上一篇文章 若依 ruoyi-vue SpringBoot聊天敏感词过滤sensitive-word&#xff08;一&#xff09; 效果图 审核时&#xff0c;输入框高亮敏感词&#xff…

暑假第一次作业

第一步&#xff1a;给R1,R2,R3,R4配IP [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1-Serial4/0/0]ip address 15.0.0.1 24 [R2-GigabitEthernet0/0/0]ip address 192.168.2.1 24 [R2-Serial4/0/0]ip address 25.0.0.1 24 [R3-GigabitEthernet0/0/0]ip address 192.…

【爬虫】解析爬取的数据

目录 一、正则表达式1、常用元字符2、量词3、Re模块4、爬取豆瓣电影 二、Xpath1、Xpath解析Ⅰ、节点选择Ⅱ、路径表达式Ⅲ、常用函数 2、爬取豆瓣电影 解析数据&#xff0c;除了前面的BeautifulSoup库&#xff0c;还有正则表达式和Xpath两种方法。 一、正则表达式 正则表达式…

Gitlab CI/CD介绍

基本概念 GitLab CI/CD&#xff08;持续集成/持续部署&#xff09;流水线是GitLab平台提供的一项强大功能&#xff0c;旨在通过自动化构建、测试和部署过程&#xff0c;提高开发团队的效率和软件发布的质量。 CI&#xff08;Continuous Integration&#xff09;&#xff1a;持续…

starRocks搭建

公司要使用新的大数据架构&#xff0c;打算用国产代替国外的大数据平台。所以这里我就纠结用doris还是starrocks&#xff0c;如果用doris&#xff0c;因为是开源的&#xff0c;以后就可以直接用云厂商的。如果用starrocks就得自己搭建&#xff0c;但是以后肯定会商业化&#xf…

初学51单片机之UART串口通信

CSDN其他博主的博文&#xff08;自用&#xff09;嵌入式学习笔记9-51单片机UART串口通信_51uart串口通讯-CSDN博客 CSDN其他博主的博文写的蛮好&#xff0c;如果你想了解51单片机UART串口可以点进去看看&#xff1a; UART全称Universal Asynchronous Receiver/Transmitter即通…

Codeforces Round 957 (Div. 3)(A~E题解)

这次比赛只能用抽象来形容&#xff0c;前五道题都没有什么算法&#xff0c;都是思维加模拟都能过&#xff0c;然后第四题卡住了&#xff0c;第五题不知道为什么做出来的人那么少&#xff0c;就是纯暴力就能过&#xff0c;但是没抓住上分的机会&#xff0c;有些可惜&#xff0c;…

Python编写的俄罗斯方块小游戏

文章目录 游戏页面实现代码 游戏页面 左右键移动方块位置&#xff0c;上键切换方块形态。 实现代码 import pygame import random# 初始化 Pygame pygame.init()# 定义颜色 colors [(0, 0, 0), # 黑色(255, 0, 0), # 红色(0, 255, 0), # 绿色(0, 0, 255), # 蓝色(255,…

差分约束——AcWing 362. 区间

差分约束 定义 差分约束系统是一种在计算机科学和运筹学中用于解决特定类型优化问题的工具。它主要用于处理一类线性不等式组&#xff0c;这些不等式描述了变量之间的相对大小关系&#xff0c;而不是直接的绝对值大小。差分约束系统通常用于路径寻找、调度、资源分配等问题。…