类和对象---初步认识类

简介: 类和对象---初步认识类

@[toc]

面向过程和面向对象

C语言是一门面向过程的语言关注的是过程,确认一个问题求解的步骤,再一步一步对它进行解决

C++是一门基于面向对象的语言,它更关注的是对象,将一个事情分成不同的对象,再用对象完成问题的解决

类的引入

在C语言中有结构体,但结构体中只能定义变量,而在C++中还可以定义函数,例如,数据结构中的链表栈队列等函数都需要定义成员,在外部定义函数,通过函数改变具体数据结构的内容,而在C++中,结构体中也是可以定义函数的,这是C++对C的提升

类的定义

class className
{
// 类体:由成员函数和成员变量组成
};  // 一定要注意后面的分号
  1. class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。

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

类定义的方式

  1. 声明和定义都放在类体中,其中需要注意的是,如果成员函数在类内定义,那么编译器可能会把成员函数当作内联函数来处理

具体定义形式如下:

#include <iostream>
using namespace std;

class Time
{
   
   
public:

    void settime()
    {
   
   
        cin >> hour >> minute >> second;
    }

    void show()
    {
   
   
        cout << hour << endl;
        cout << minute << endl;
        cout << second << endl;
    }

private:
    int hour;
    int minute;
    int second;
};

int main()
{
   
   
    Time t1;
    t1.settime();
    t1.show();
    return 0;
}
  1. 类声明放在.h文件中,定义放在.cpp文件中,一般来说更希望使用这种写法

在这里插入图片描述

类的访问限定符

==关于访问限定符:==

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

类的实例化

通常来说,用类的类型创建出对象的过程就是类的实例化

我们可以这样理解,类就是一张设计图纸,而把设计图纸变现才能有实际空间,占用内存空间,因此,类本身是没有空间的,只有把类实例化出一个对象才有实际的空间

类对象模型

类对象的大小

既然创建出了一个类,那么这个类的对象中包含了什么,一个类的大小又如何计算

假设我们有下面的代码

#include <iostream>
using namespace std;

class date
{
   
   
public:
    void print()
    {
   
   
        cout << "void print()" << a << endl;
    }
private:
    int a;
};

int main()
{
   
   
    date d1;
    cout << sizeof(date) << endl;
    cout << sizeof(d1) << endl;
    cout << &d1 << endl;
}

在这里插入图片描述
那么类的大小究竟是如何计算的?下面就进行类的存储方式的介绍

在C++中,对象的存储方式是这样的:

在这里插入图片描述

因此,类中的成员是独立存在的,而类的成员函数是放在公共代码区的

类的成员是可以独立相加的,它的规则其实和结构体的计算相同,都是遵循内存对齐规则进行相加

而公共代码区的证明也可以通过汇编来看

在这里插入图片描述
从中可以看出,类的成员函数在调用的时候确实是在一块固定的公共代码区进行的调用,因此就理解了类在计算机内部是如何存储的

但依旧有两个特例:

// 类中仅有成员函数
class A 
{
   
   
public:
    void f2() {
   
   }
};

// 类中什么都没有---空类
class B
{
   
   };

int main()
{
   
   
    cout << sizeof(A) << endl;
    cout << sizeof(B) << endl;
}

当类中没有成员或直接就是空类的时候,它们的大小均为1,这个1没有实际意义,只是用来占位,证明这里曾经存在过A和B

相关文章
|
存储 自然语言处理 Java
09. 【Java教程】Java 变量
09. 【Java教程】Java 变量
76 1
|
8天前
|
人工智能 运维 安全
|
6天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
631 22
|
6天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
13天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
1027 110
人工智能 数据可视化 数据挖掘
226 0