当前位置: 首页 > article >正文

C++ 类与对象(上)

前言

        本文主要围绕类与对象的概念,对该语法做个简单的解释,给大家留一个大概的印象,内容主要涉及以下几点:

1、如何创建类;

2、如何用类来实例化对象;

3、类的简单底层原理等。

类的概念

        在C语言中,所有整数被划分为整形(整数类型int)、所有小数被划分为浮点型(浮点数类型float),事实上所有具有相同性质特征的事物都可以被归为一类,例如:人类、昆虫类、爬行动物类等等,在C语言阶段我们通过结构体(struct)来定义这些类型,但利用结构体来定义并使用这些类非常麻烦,因为所有与这个类相关的函数都散乱地分布在文件中,缺乏可维护性。

        为了解决C语言出现的这一问题,C++中引入了类(class)的概念,类是一种用户定义的引用数据类型,也称类类型,通过类能更好地将相关属性封装起来管理。

类的定义

        语法

//class_name可随意修改
class class_name
{
//类的属性(变量,类型)
//类的方法(函数)
};
//注意不要丢了分号

         类中一般可以定义变量、函数和类型,在使用时可以直接通过名字来调用对应的对应的方法和属性即可,极大地提高了代码的整洁性和可读性。另外,C++是一种面型对象的语言,这里所说的对象,这里的对象可以理解为用类来实例化的变量,因为类已经将相关的属性和方法都集合在一起了,所以通过对象即可调用所需的方法即可,类这个语法正体现出封装的特性。

类的使用

前面说到类是如何定义的,接下来详细讲讲类是如何使用的

        1.访问限定符

        1.1 访问限定符的概念

        访问限定符是用来限制外部权限的一种方法,通过访问限定符的限制能有效管理类中的内容。例如,在人类中我们可能用到家庭住址、身份证号、银行卡密码等诸如此类的隐私信息,像此类不方便透露的信息便可以用访问限定符统一管理起来。

        public访问限定符:类外成员可直接访问

        private访问限定符:类外不可直接访问

        protected访问限定符:类外不可直接访问

        其中,private与protected虽然都无法被类外成员直接访问,但二者稍有区别,随着继续学习后面继承会讲到二者的差别。

        1.2 访问限定符的使用

 如图所示:使用访问限定符时直接在类中写上相应的名称在加上冒号即可,需要注意的是,访问限定符的有效范围是1 :之后 } 之前2 当 } 之前存在其他访问限定符则截止到该访问限定符之前。

2.类域

        类域是C++中增加的一种独立的域,类域中的变量名、函数名不会与其他域出现冲突。若想要在其他域中使用类域中的内容就需要使用域访问操作符:: 例如在类中定义的成员函数需要到全局域中实现就得在全局域中通过域访问操作符来调用,如下所所示:

3.类的实例化

        通过类来创建对象(变量)这个过程就是类的实例化。

 

 3.1对象的内存大小

         3.1.1 非static修饰的类成员

                        成员变量:实例化对象时占用对象内存空间

                        成员函数:实例化对象时不占用对象空间,所有相同类型对象公用同一份成员函数

         3.1.2 static修饰类成员
                static修饰成员函数

                        静态成员变量:实例化对象时不占用对象空间,属于静态变量

                static修饰成员变量

                        静态成员函数:实例化对象时不占用对象空间

3.1总结:除了非静态成员变量外,其他成员都会占用对象空间,因此编译器为对象开辟的内存大小就等于所有非静态成员变量占用内存的总大小

3.2 类的内存对齐

        在C语言阶段,我们讲过结构体的内存对齐,类的内存对齐规则正是结构体的内存对齐,如果忘记的同学可以点击这个链接移步至结构体内存对齐复习一遍,这里就不多讲了。

this指针

        this指针的概念

        this指针是隐含在每一个非静态成员函数内的一种指针,this指针无需定义,直接使用即可,适用范围仅限该函数内部。this指针指向被调用的成员函数所属的对象

        this指针的使用

1.当形参与成员变量同名时可以用this指针来区分,this指针指向类内部的属性。

2.在类的非静态成员函数中返回对象本身,可以使用return *this。


http://www.kler.cn/news/322663.html

相关文章:

  • 关于Mysql数据库的日常维护,包括配置、优化、备份、故障处理等工作的50道运维面试题
  • 关于使用/bin/sh -c 用于Dockerfile的Entrypoint的问题
  • 【第十五章:Sentosa_DSML社区版-机器学习之关联规则】
  • 高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十)高翔书中的细节:参考链接;卫星导航;ESKF
  • Redis篇(数据类型)
  • 桥接模式
  • 【区块链快速概览】了解区块链的基本原理、共识机制(如PoW, PoS)、加密技术基础。
  • uWsgi找不到新安装的python模块问题【亲测好用】
  • 通过 Xshell 无法连接到 Ubuntu
  • HarmonyOS鸿蒙开发实战( Beta5.0)Web组件预览PDF文件实现案例
  • 简历信息提取系统源码分享
  • Postman如何测试WebSocket接口!
  • 企业内训|大模型/智算行业发展机会深度剖析-某数据中心厂商
  • 设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享
  • keepalived+nginx实现高可用的案例详解(主主模式)
  • 以题为例浅谈反序列化漏洞
  • 点餐小程序实战教程12菜品展示
  • 记一次 RabbitMQ 消费者莫名消失问题的排查
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
  • 摒弃“流量思维”,以精准流量驱动企业发展——基于开源 AI 智能名片、链动 2+1 模式及 O2O 商城小程序的思考
  • 【JavaScript】尾递归优化
  • en造数据结构与算法C# 之 二叉排序树的删除
  • 哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加
  • Spring Task快速入门
  • Autosar学习----AUTOSAR_SWS_BSWGeneral(七)
  • 【GUI设计】基于Matlab的图像特征提取GUI系统(9),matlab实现
  • Win10 QT 配置Android开发环境-jdk/sdk/gradle
  • excel数据常用函数学习记录
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析05-Pandas数分入门
  • overlayscrollbars使用