C++回顾录03-C++类和对象

2023-10-27

       类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数。

类是用户自定义的类型,如果程序中要用到类,必须提前说明,或者使用已存在的类(别人写好的类、标准库中的类等),C++语法本身并不提供现成的类的名称、结构和内容。

一个简单的类的定义:

class Student{
public:
    //成员变量
    char *name;
    int age;
    float score;

    //成员函数
    void say(){
        cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
    }
};

class是 C++ 中新增的关键字,专门用来定义类。Student是类的名称;类名的首字母一般大写,以和其他的标识符区分开。{ }内部是类所包含的成员变量和成员函数,它们统称为类的成员(Member);由{ }包围起来的部分有时也称为类体,和函数体的概念类似。public也是 C++ 的新增关键字,它只能用在类的定义中,表示类的成员变量或成员函数具有“公开”的访问权限。

类只是一个模板(Template),编译后不占用内存空间,所以在定义类时不能对成员变量进行初始化,因为没有地方存储数据。只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。

类可以理解为一种新的数据类型,该数据类型的名称是 Student。与 char、int、float 等基本数据类型不同的是,Student 是一种复杂数据类型,可以包含基本类型,而且还有很多基本类型中没有的特性。

访问类的成员

创建对象以后,可以使用点号.来访问成员变量和成员函数,这和通过结构体变量来访问它的成员类似,如下所示:

#include <iostream>
using namespace std;

//类通常定义在函数外面
class Student{
public:
    //类包含的变量
    char *name;
    int age;
    float score;
    //类包含的函数
    void say(){
        cout<<name<<"的年龄是"<<age<<",成绩是"<<score<<endl;
    }
};

int main(){
    //创建对象
    Student stu;
    stu.name = "小明";
    stu.age = 15;
    stu.score = 92.5f;
    stu.say();

    return 0;
}

使用对象指针

上面代码中创建的对象 stu 在栈上分配内存,需要使用&获取它的地址,例如:

pStu 是一个指针,它指向 Student 类型的数据,也就是通过 Student 创建出来的对象。
Student *pStu = new Student;

在栈上创建出来的对象都有一个名字,比如 stu,使用指针指向它不是必须的。但是通过 new 创建出来的对象就不一样了,它在堆上分配内存,没有名字,只能得到一个指向它的指针,所以必须使用一个指针变量来接收这个指针,否则以后再也无法找到这个对象了,更没有办法使用它。也就是说,使用 new 在堆上创建出来的对象是匿名的,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变量或成员函数。

栈内存是程序自动管理的,不能使用 delete 删除在栈上创建的对象;堆内存由程序员管理,对象使用完毕后可以通过 delete 删除。在实际开发中,new 和 delete 往往成对出现,以保证及时删除不再使用的对象,防止无用内存堆积。

有了对象指针后,可以通过箭头->来访问对象的成员变量和成员函数,这和通过结构体指针来访问它的成员类似,请看下面的示例:

pStu -> name = "小明";
pStu -> age = 15;
pStu -> score = 92.5f;
pStu -> say();

但当成员函数定义在类外时,就必须在函数名前面加上类名予以限定。::被称为域解析符(也称作用域运算符或作用域限定符),用来连接类名和函数名,指明当前函数属于哪个类。
成员函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前

类体内部对成员函数作声明,而在类体外部进行定义。

如果你既希望将函数定义在类体外部,又希望它是内联函数,那么可以在定义函数时加 inline 关键字。

C++通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限,它们分别表示公有的、受保护的、私有的,被称为成员访问限定符。所谓访问权限,就是你能不能使用该类中的成员。

在类的内部(定义类的代码内部),无论成员被声明为 public、protected 还是 private,都是可以互相访问的,没有访问权限的限制。

在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问 public 属性的成员,不能访问 private、protected 属性的成员。

成员变量大都以m_开头,这是约定成俗的写法,不是语法规定的内容。以m_开头既可以一眼看出这是成员变量,又可以和成员函数中的形参名字区分开。

Student stu;
//m_name、m_age、m_score 是私有成员变量,不能在类外部通过对象访问
stu.m_name = "小明";
stu.m_age = 15;
stu.m_score = 92.5f;
stu.show();

只在类内部使用的成员函数(只被成员函数调用的成员函数)都建议声明为 private,而只将允许通过对象调用的成员函数声明为 public。

给成员变量赋值的函数通常称为 set 函数,它们的名字通常以set开头,后跟成员变量的名字;读取成员变量的值的函数通常称为 get 函数,它们的名字通常以get开头,后跟成员变量的名字。

封装,是指尽量隐藏类的内部实现,只向用户提供有用的成员函数。

将成员变量设置为 private 是一种软件设计规范,尤其是在大中型项目中,还是请大家尽量遵守这一原则。

声明为 private 的成员和声明为 public 的成员的次序任意,既可以先出现 private 部分,也可以先出现 public 部分。如果既不写 private 也不写 public,就默认为 private。

class Student{
private:
    char *m_name;
private:
    int m_age;
    float m_score;
public:
    void setname(char *name);
    void setage(int age);
public:
    void setscore(float score);
    void show();
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++回顾录03-C++类和对象 的相关文章

随机推荐

  • Warning: JAVA_HOME is not set! Error: Unable to find java executable. Is it in your PATH?

    报错 Warning JAVA HOME is not set Error Unable to find java executable Is it in your PATH 问题描述 启动flume的时候报错 解决方案 1 修改linux
  • PCL系列笔记——(滤波)Filter

    目录 直通滤波 PassThrough filter 体素滤波 VoxelGrid filter 离群点滤波器 StatisticalOutlierRemoval filter 直通滤波 PassThrough filter 这个滤波很直接
  • SpringBoot_第六章(知识点总结)

    目录 目录 1 拦截器 Interceptor 1 1 拦截器代码实现 1 2 拦截器源码分析和流程总结 2 过滤器 Filter 自定义 Servlet 监听器 Listener 3 文件上传 3 1 文件上传代码实现 3 2 文件上传源
  • Aix 压缩、打包、解压、解包 tar zip gz

    tar是打包 zip和gz是压缩 打包 tar cf all tar 解包 tar xvf tar 解压zip文件 jar xvf DB29 5 AIX zip 解压gz文件 usr bin gzip d tar gz
  • highcharts使用韦恩图报错解决Error in mounted hook: “Error: Highcharts error #17:missingModuleFor: venn(详细步骤)

    我由于在vue项目中刚好要使用韦恩图想用highcharts然后按照步骤 1 npm install highcharts save 2 创建组件
  • Mac使用技巧:轻松自定义设置系统键盘

    为你带来Mac OS系统和windows系统如何键盘自定义设置教程 感兴趣可以看看哦 一 mac系统下如何将外接键盘设置成和苹果键盘一样 首先打开mac系统设置里的 键盘 点击 修饰键 选择 usb键盘 然后 option 和 comman
  • 瓦片地图-坐标转换

    先明确三点 1 屏幕坐标是以左上角为原点 而cocos2dx坐标即opengl坐标体系 是以左下角为原点 2 tile地图坐标是以左上角或上方 45 为原点 tile瓦片的默认锚点是左下角 一 地图坐标 Tiled地图一般常见的有3种不同的
  • 【STC15单片机】独立按键显示二进制

    目录 按键选择 按键抖动 独立按键控制8个LED实现二进制显示 显示二进制的程序 单片机型号说明 IAP15F2K61S2 新建工程时单片机型号选择STC15F2K60S2 键盘的分类 键盘分编码键盘和非编码键盘 键盘上闭合件的识别由专用的
  • Python 中的八大关键要素

    阅读本文需要 10 分钟 前言 学习任何一门语言之前 你得先了解它的整体架构 知道它的思想 了解它的关键要素 一门语言学到后来你会发现 就像是在剥茧抽丝一般 越是深入越是发现其奥妙之处 Python 中的八大关键要素 Python 是一种D
  • 云服务器中如何创建共享文件夹,云服务器中如何创建共享文件夹

    云服务器中如何创建共享文件夹 内容精选 换一换 当您有如下需求时 可以考虑使用文件注入功能将文件注入到弹性云服务器 需要通过脚本简化弹性云服务器配置通过脚本初始化系统已有脚本 在创建弹性云服务器的时候一并上传到服务器其他可以使用脚本完成的事
  • css-滚动条样式设置

    滚动条产生原因 给能设置宽高的元素添加 overflow scroll 样式 会让该元素区域产生滚动条 滚动条默认样式 以下行文案例皆是在 Edge 浏览器环境下测试 设置滚动条样式 通过设置 webkit scrollbar 伪元素影响滚
  • java设计模式——原型模式(Prototype Pattern)

    概述 在使用原型模式时 我们需要首先创建一个原型对象 再通过复制这个原型对象来创建更多同类型的对象 需要注意的是通过克隆方法所创建的对象是全新的对象 它们在内存中拥有新的地址 通常对克隆所产生的对象进行修改对原型对象不会造成任何影响 每一个
  • 项目管理和产品管理

    本文翻译至 http www tenstep jp cms project management value html start 8 A5 3 项目管理和产品管理 项目和产品 A5 3 P1 项目 是为了执行新工作的交付手段 所有的组织里
  • 【论文精读】Is Synthetic data from generative models ready for image recognition? 生成数据对图像识别的影响

    标题 扩散模型生成数据对图像识别的影响 1 总体介绍 发展现状 扩散模型已经可以生成高质量的样本 之前有人研究过生成数据对cv的作用 但是局限于小领域和小规模 研究目的 扩散样本对视觉领域的作用 手工标注的样本昂贵 有隐私和安全风险 探讨方
  • 凹凸世界服务器维护到几点,凹凸世界6月10日版本更新停服维护公告_凹凸世界6月10日版本更新了什么_玩游戏网...

    在凹凸世界手游中6月10日版本究竟更新了什么呢 更新的内容又有哪些呢 不清楚的话 接下来就让我们一起来看一下吧 亲爱的天使 感谢您对 凹凸世界 手游的关注与支持 为了给各位天使带来更好的游戏体验 不断地丰富游戏内容 凹凸世界 手游将于6月1
  • VLAN基础知识和配置

    分割广播的方式 物理分割 子网划分 逻辑分割 VLAN VLANy优势 1 控制广播 每一个vlan都是一个独立的广播域 这样就减少了广播对网络宽带的占用 提高了网络传输效率 并且一个VLAN出现了广播风暴不会影响其他的VLAN 2 增强网
  • 分布式应用:Zabbix监控MariaDB

    目录 一 理论 1 Zabbix监控MariaDB 二 实验 1 Zabbix监控MariaDB 一 理论 1 Zabbix监控MariaDB 1 环境 zabbix服务端 192 168 204 214 zabbix客户端 192 168
  • MatLab中的fft变换(快速傅里叶变换)

    本文章内容只作为个人学习总结使用 目录 说明 基本的FFT使用方法 1 简单的FFT功能介绍 2 恢复幅度轴 创建频率轴 说明 本文章主要进行MATLAB中fft函数基本使用方法的讨论 关于fft的概念以及为什么要进行fft等信号处理方面的
  • bugku 奇怪的密码

    a gndk rlqhmtkwwp z key 1 b for i in a b chr ord i key key key 1 print b
  • C++回顾录03-C++类和对象

    类是创建对象的模板 一个类可以创建多个对象 每个对象都是类类型的一个变量 创建对象的过程也叫类的实例化 每个对象都是类的一个具体实例 Instance 拥有类的成员变量和成员函数 类是用户自定义的类型 如果程序中要用到类 必须提前说明 或者