C++入门 之 类和对象(上)

目录

一、类的定义

1.类定义格式

2.访问限定符

3.类域

二、实例化

1.实例化概念

2.对象大小

3.this指针


一、类的定义

1.类定义格式

1、class Stack{};class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束后分号不能省略。类体中内容为类的成员;类中的变量称为 类的属性 或类 成员变量 ;类中的函数称为 类的方法 或者 成员函数

2、为了区分成员变量,成员变量会加一个特殊标识,如成员变量前面或者后面加_或者m开头,注意C++中这个并不是强制的。

3、C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是
struct中可以定义函数,一般情况下我们还是推荐用class定义类。

4、定义在类面的成员函数默认为inline。

2.访问限定符

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

2、public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访
问,protected和private是一样的,继承才能体现出他们的区别。

3、class定义成员没有被访问限定符修饰时默认为private,struct默认为public。

4、一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会放为public。

class Stack
{
public:
    // 成员函数
    void Init(int n = 4)
    {
        array = (int*)malloc(sizeof(int) * n);
        if (nullptr == array)
        {
            perror("malloc申请空间失败");
            return;
        }
        capacity = n;
        top = 0;
    }
    void Push(int x)
    {
        // ...扩容
        array[top++] = x;
    }

        int Top()
    {

        return array[top - 1];
    }
    void Destroy()
    {
        free(array);
        array = nullptr;
        top = capacity = 0;
    }
private:
    // 成员变量
    int* array;
    size_t capacity;
    size_t top;
}; // 分号不能省略
int main()
{
    Stack st;
    st.Init();
    st.Push(1);
    st.Push(2);
    cout << st.Top() << endl;
    st.Destroy();
    return 0;
}

class Data
{
public:
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }


private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    Data d;
    d.Init(2024, 8, 7);
    return 0;
}
 

3.类域

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

2、类域影响的是编译的查找规则,下面程序中func函数如果不指定类域A,那么编译器就把func函数当成全局函数,那么编译时,找不到_a成员的声明/定义在哪里,就会报错。指定类域A,就是知道func是成员函数,当前域找不到的_a等成员,就会到类域中去查找。

注意:C++中升级struct成了类

1、类里面可以定义函数

2、struct名称可以代表类型

二、实例化

1.实例化概念

1、用类类型在物理内存中创建对象的过程,称为类实例化出对象。

2、类是对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,用类实例化出对象时,才会分配空间。

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

class Data
{
public:
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print()
    {
        cout << _year << "\t" << _month << "\t" << _day << endl;
    }

private:
    int _year;
    int _month;
    int _day;
};

int main()
{
    //Data类实例化出对象d1和d2
    Data d1;
    Data d2;

    d1.Init(2024, 8, 7);
    d2.Init(2025, 8, 7);
    
    d1.Print();
    d2.Print();

}
 

2.对象大小

        首先函数被编译后是一段指令,对象中没办法存储,这些指令存储在一个单独的区域(代码段),那么对象中非要存储的话,只能是成员函数的指针。再分析⼀下,对象中是否有存储指针的必要呢?
  Date实例化d1和d2两个对象,d1和d2都有各自独立的成员变量_year/_month/_day存储各自的数据,但是d1和d2的成员函数Init/Print指针却是一样的,存储在对象中就浪费了。其实函数指针是不需要存储的,函数指针是一个地址,调用函数被编译成汇编指令[call 地址],其实编译器在编译链接时,就要找到函数的地址,不是在运行时找,只有动态多态是在运行时找,就需要存储函数地址。

#include<iostream>
using namespace std;

class A
{
public:
    void Print()
    {
        cout << _ch << endl;
    }
private:
    char _ch;
    int _i;
};

class B
{
public:
    void Print()
    {
        //...
    }
};

class C
{};

int main()
{
    A a;
    B b;
    C c;
    cout << sizeof(a) << endl;//8
    cout << sizeof(b) << endl;//1
    cout << sizeof(c) << endl;//1

    return 0;
}
 

        B和C类没有成员变量但它们的大小是1,为什么没有成员变量还要给1个字节呢?这是因为一个字节都不给,怎么表示对象存在过呢!所以这里给1字节,纯粹是为了占位标识对象存在

3.this指针

1、Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调用Init和
Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这里就要看到C++给了一个隐含的this指针解决这里的问题。

2、编译器编译后,类的成员函数默认都会在形参第一个位置,增加一个当前类类型的指针,叫做this指针。比如Date类的Init的真实原型为, void Init(Date* const this, int year, int month, int day)

3、类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给_year赋值, this->_year = year;

4、C++规定不能在实参和形参的位置显示的写this指针(编译时编译器会处理),但是可以在函数体内显示使用this指针。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3.0组合式API:computed计算属性、watch监听器、watchEffect高级监听器

1、computed() 计算属性 在模板中绑定表达式只能用于简单的运算。如果运算比较复杂&#xff0c;可以使用 Vue.js 提供的计算属性&#xff0c;通过计算属性可以处理比较复杂的逻辑。 1.1 计算属性的应用 通过计算属性可以实现各种复杂的逻辑&#xff0c;包括运算、函数调用等…

【自然语言处理】实验三:新冠病毒的FAQ问答系统

目录 前言 1.新建data_process.py 1.1导入包并定义功能模块1用来读取问题和答案FAQ的文件 1.2功能模块2&#xff1a;进行问题/问题列表处理&#xff08;正则化&#xff0c;分词&#xff09; 1.3功能模块3&#xff1a;处理输入的问题 1.4功能模块4&#xff1a;计算输入问题与问题…

Python | Leetcode Python题解之第405题数字转换为十六进制数

题目&#xff1a; 题解&#xff1a; CONV "0123456789abcdef" class Solution:def toHex(self, num: int) -> str:ans []# 32位2进制数&#xff0c;转换成16进制 -> 4个一组&#xff0c;一共八组for _ in range(8):ans.append(num%16)num // 16if not num:b…

Python实用的27个实例,涵盖从基础到进阶的所有领域!

Python 是一种广泛使用的高级编程语言&#xff0c;以其简洁的语法和丰富的库支持而受到开发者们的喜爱。以下列出了 27 个实用的 Python 实例&#xff0c;涵盖从基础到进阶的不同领域&#xff0c;帮助你提升编程技能。 1. 打印 "Hello, World!" print("Hello,…

预训练发展

预训练发展 1.ELMo2.GPT3.Bert3.1Ernie-baidu3.2Ernie- Tsinghua 4.GPT25.UNILM6.Transformer-XL & XLNet6.1方案一6.2方案三 7.Roberta8.SpanBert8.1SBO简介&#xff1a; 9.ALBERT9.1方案一9.2方案二9.3方案三 10.T511.GPT312.从"续写"到"回答"12.1SF…

可解释性机器学习中的局部解释

可解释性机器学习可以被分成两大类&#xff0c;第一大类叫做局部的解释&#xff0c;第二大类叫做全局的 解释&#xff0c;如图 1 所示。局部的解释是&#xff0c;比如有一个图像分类器&#xff0c;输入一张图片&#xff0c;它会判断出 是一只猫&#xff0c;机器要回答问题是为什…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#xff0c;拆分的也越来越细&#xff0c;此时就会出现一个服务集…

速通GPT:《Improving Language Understanding by Generative Pre-Training》全文解读

文章目录 速通GPT系列几个重要概念1、微调的具体做法2、任务感知输入变换3、判别式训练模型 Abstract概括分析和观点1. 自然语言理解中的数据问题2. 生成预训练和监督微调的结合3. 任务感知输入变换4. 模型的强大性能 Introduction概括分析和观点1. 自然语言理解的挑战在于对标…

Android源码导入Android Studio

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 需要先把 Android 源码编译一遍 然后执行下面指令就可以导入android源码了 关于 Android 源码编译可以参考这篇文章【LineageOS源码下载和编译&#xf…

【检索快,IEEE独立出版】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024)

大会简介&#xff1a; 2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机科学技术学院、长春理工大学…

蛋白质原子坐标平移、旋转、缩放示例代码

在处理蛋白质结构时,常常需要对原子的坐标进行几何变换,如平移、旋转和缩放。这些变换在模拟、可视化和结构比较中非常有用。 以下是对这些操作的介绍以及示例代码。 1. 平移 (Translation) 平移就是将所有原子的坐标沿着某个方向进行移动。平移可以通过向每个原子的坐标加…

解锁4款专业的中英翻译工具,让你畅行双语世界。

中英翻译工具在国际化交流越来越频繁的今天还是起着巨大的作用的&#xff0c;它能够促进很多知识的传播和共享&#xff0c;也能够便利大家的工作&#xff0c;学习和生活。今天我就要跟大家分享4个我一直都在用的中英翻译工具。 1、福昕中英翻译网站 直达&#xff1a;https://f…

LeetCode 第415场周赛个人题解

目录 Q1. 数字小镇中的捣蛋鬼 原题链接 思路分析 AC代码 Q2. 最高乘法得分 原题链接 思路分析 AC代码 Q3. 形成目标字符串需要的最少字符串数 I 原题链接 思路分析 AC代码 Q4. 形成目标字符串需要的最少字符串数 II 原题链接 思路分析 AC代码 Q1. 数字小镇中的捣…

数据库全攻略:从类型到安全与优化

数据库全攻略&#xff1a;从类型到安全与优化 一、数据库类型大观 &#xff08;一&#xff09;关系型数据库 关系型数据库以表格形式存储数据&#xff0c;通过 SQL 语言进行操作&#xff0c;数据之间存在关联关系&#xff0c;适合复杂查询和事务处理。常见的关系型数据库有 …

springboot瑜伽课约课小程序-计算机毕业设计源码87936

摘要 本文详细阐述了一个基于SpringBoot框架的瑜伽课约课小程序的设计与实现过程。随着现代生活节奏的加快&#xff0c;越来越多的人开始关注身心健康&#xff0c;瑜伽作为一种集健身、放松、减压于一体的运动方式&#xff0c;受到了广泛的欢迎。为满足瑜伽爱好者的课程预约和学…

Ubuntu 22.04.5 LTS 发布下载 - 现代化的企业与开源 Linux

Ubuntu 22.04.5 LTS (Jammy Jellyfish) - 现代化的企业与开源 Linux Ubuntu 22.04.5 发布&#xff0c;配备 Linux 内核 6.8 请访问原文链接&#xff1a;https://sysin.org/blog/ubuntu-2204/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xf…

Recyclerview实现滑动居中缩放菜单

最近项目中需要的一个滑动菜单效果:要求当前居中选项放大、滑动时有缩放效果、点击两边的选项滑动到屏幕中央、停止滑动选项停留在屏幕中间(类似viewPager的效果),为了直观,先上最终实现效果图: 大体思路: Recyclerview item头尾添加空数据,让第一个和最后一个item也能…

c++题目_【模板】最小生成树Prim

题目描述 这是一道最小生成树Prim的模板题&#xff0c;本题与【模板】最小生成树Kruskal&#xff0c;仅仅只有nn和mm的大小不同 给出一个无向图&#xff0c;求出最小生成树&#xff0c;如果该图不连通&#xff0c;则输出orz 输入 第一行输入2个正整数n,mn,m&#xff0c;代表…

数据可视化pyecharts——数据分析(柱状图、折线图、饼图)

安装 首先确保已经安装了pyecharts库&#xff0c;如果没有&#xff0c;可以通过pip install pyecharts进行安装。 柱状图 从pyecharts.charts导入Bar&#xff0c;从pyecharts导入options。准备数据&#xff08;如类别数据x_data和对应的数值数据y_data&#xff09;。创建Bar对…

解决win11 使用wsl工具,不能使用systemctl

使用systemctl命令出现报错&#xff1a; System has not been booted with systemd as init system (PID 1). Can‘t operate. 默认情况下并不启用 systemd&#xff0c;而是使用了其他轻量级的初始化系统&#xff08;SysV init初始化系统&#xff09;。这导致一些需要 system…