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

C++学习之类与对象

        经过C++入门的学习后,可能各位读者大大对于C++语法部分的内容仍然有一些困惑,但是没关系,经过后面的学习我们会对前面的内容有更好的了解。

        在本篇文章中,我们会学习C++的另一个重要的部分——类与对象。

类的定义

        类定义的格式

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

        为了区分成员变量,一般习惯上成员变量会加上一个特殊标识,比如成员变量前面或后面加_或者_m等。这并不是C++的规定,具体看项目组和公司的要求。

        C++中struct也可以定义为类。C++兼容struct的用法,同时struct也升级为了类,很明显的变化是struct也可以定义函数。(不过我们推荐用class定义类)

        定义在类中的成员函数默认为inline

        下面就是一个定义类的结构示例

class stack 
{//成员变量int x;int arr[100];//成员函数void init(){//code}
};

        访问限定符

        C++一种实现封装的方式就是用类将对象的属性和方法结合到一起,让对象更加完善,通过访问权限接口选择性的将其接口提供给外部函数使用。

        

        public修饰的成员在类外可以直接访问;protected和private修饰的成员在类外不能直接被访问。在目前的章节我们认为protected和private,后续的学习才能体现出它们的区别。

        访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现位置,如果后面没有访问限定符,作用域就到},即类结束。

下图中两段代码是等效的。

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

        举例说明:下图两段代码等效

且结果相同

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

        定义在类里面的函数就是内联函数。

类域

        在C++入门C++学习记录:C++入门-CSDN博客的命名空间片段中我们知道类域属于命名空间的一部分,接下来我们将就类域进行详细地叙述。

        目前我们知道的有四个域:局部域全局域、类域和命名空间域。命名空间域和类域不影响声明周期,只解决各自命名冲突(类域解决互相之间的命名冲突,命名空间域解决全局的命名冲突)

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

        如果声明与定义分离,可以按如下方式去指定的类域寻找init函数,在预处理处包含<stack.h>(举例说明的)
            如果声明与定义分离,可以按如下方式去指定的类域寻找init函数,在预处理处包含<stack.h>(举例说明的)

void stack::init();//去指定的类域中寻找init函数

       类域解决了类与类之间的命名冲突。命名空间域是解决全局空间的函数/变量/类型的命名冲突。

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

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
class stack
{
public://成员函数void init(int n = 4);
private://成员变量int* array;size_t capacity;size_t top;
};
void stack::init(int n)
{array = (int*)malloc(sizeof(int) * n);if(nullptr == array){perror("malloc申请空间失败");return;}capacity = n;top = 0;
}int main()
{stack st;st.init();return 0;
}

相关文章:

  • 一款丰富的工作流自动化平台 | N8N 83.6K ⭐
  • C++23 中 static_assert 和 if constexpr 的窄化布尔转换
  • 【锂电池剩余寿命预测】BiLSTM双向长短期记忆神经网络锂电池剩余寿命预测(Matlab源码)
  • Python基于语音识别的智能垃圾分类系统【附源码、文档说明】
  • 前端之勇闯DOM关
  • Nginx常用命令,及常见错误
  • PR网表出现assign该如何解决
  • 音视频小白系统入门课-3
  • 第十五讲、Isaaclab中在机器人上添加传感器
  • # 利用迁移学习优化食物分类模型:基于ResNet18的实践
  • 【Java面试笔记:基础】6.动态代理是基于什么原理?
  • pip的源管理和包管理
  • 黑马点评之Feed流技术实现关注推送与滚动分页查询
  • 光谱相机在肤质检测中的应用
  • strings.ToUpperSpecial 使用详解
  • Java中链表的深入了解及实现
  • Linux信号的产生
  • 安卓投屏软件QtScrcpy
  • 基于nlohmann/json 实现 从C++对象转换成JSON数据格式
  • 麒麟V10安装MySQL8.4
  • 全球84%的珊瑚礁已遭受白化事件影响
  • 山西省援疆前方指挥部总指挥刘鹓已任忻州市委副书记
  • 沂水县委书记陈士贤,跨市履新泰安市委常委、组织部部长
  • 上海楼市明显复苏:一季度房地产开发投资增长5.1%,土地市场重燃战火
  • 远香湖畔“戏”味浓,“吾嘉有戏”探索戏剧与图书跨界融合
  • 上海小朋友喜欢读什么书?来看这份“少年儿童阅读报告”