新闻详情

新闻详情

首页 / 资讯中心 / 详情

【C++】 类与对象(一)(class 类的定义)

发布时间:2026/9/28 3:40:47来源:尧图网络
【C++】 类与对象(一)(class 类的定义)
目录class 类的定义类定义格式类的访问限定符类域实例化实例化概念对象大小this 指针C语言和C代码实现stack 栈的区别class 类的定义类定义格式class 为定义类的关键字像Stack 为类的名字{}中的所有的内容就是类的主体注意类定义结束时不能省略“”类的中的所有内容都成为类的成员变量就是成员变量函数就是成员函数。为了区分成员变量和传参变量一般会给成员变量的前加一个“_”下标注符进行区分或者加 m 进行区分建议第一种当然还是看个人习惯。C 中struct 也可以定义类C兼容C语言的struct 的用法struct 升级class class 会高级更多所以C 更多会使用class 来代替struct 。定义在类的成员成员函数默认为inline 。#include iostream class Stack { private: int _year; int _mount; int _day; };类的访问限定符C有一种实现封装的操作用类将对象的属性的与方法结合在一块对对象的功能上有更加完善通过部分开通权限让用户有选择性的使用。C的类中共有三种访问限定符public公有private私有protected私有public 可以class 类域外直接访问private 就不行protected 暂时记忆成两个都是相同的。区域的分是从该访问限定符到下一个访问限定符或者到 } 的区域都是第一个访问限定符的对应的指定功能默认class类的访问限定符时private struct 默认 public 。类域全局域临时域类定义了一个新的作用域类所有的成员都在类的作用域中在类的外要定义成员的时候就是需要“ :: ”作用域操作符来指明哪个类域的成员和成员函数。声明定义分离问题cpp 源代码文件与 h头文件//test.h #include iostream #include stdlib.h using namespace std; class Stack { public: void Init(int n4); private: int* _array; size_t _capacity; size_t _top; }; //test.cpp #include test.h void Stack::Inti(int n) { _array(int*)malloc(sizeof(int)*n); if(_arrayNULL) { perror(malloc); exit(1); } _capacityn; _top0; } int main() { Stack S; S.Init(); return 0; }实例化实例化概念简单概括就是通过创建出来的类用int 等等的类型那样来声明变量的方式使用类上这种方式叫做实例化对象。类是对象进行一种抽象的描述类是不占运行空间只对实例化对象分配空间。一个类可以实例化很多对象实话对象跟多占的空间就越多。对象大小类实例化对象所占的大小只跟类中的成员变量有关与成员函数无关如果每个类的函数还包含在内的化那么这个类的所占的空间只会非常大所以这些函数只会分配到其他空间上对应的类调用的时候才会有被进行调用计算的方式与结构体 struct 一样也需要符合内存对齐原则。this 指针this 就是在当前实例化对象的地址换言之 *this 就是实力化对象。#include iostream #include stdlib.h using namespace std; class Stack { public: void Init(int n4); private: int* _array; size_t _capacity; size_t _top; };以上面代码为例this-_array[0],this-_capacity,this-_top 等等都是可以充分使用到实例化对象的每一个成员变量但是在类域中无需这么去写无需写入this 正常使用变量名我们还是可以用到对应的变量的this 的最大用处之一是来充当return的返回值注意是之一this 的用处还不止这么有关只要知道this 是实例化对象的地址*this 的实例化对象即可。补充this 指针存在在栈区上题目练习#includeiostream using namespace std; class A { public: void Print() { cout A::Print() endl; } private: int _a; }; int main() { A* p nullptr; p-Print(); return 0; }1.下⾯程序编译运⾏结果是A、编译报错 B、运⾏崩溃 C、正常运⾏#includeiostream using namespace std; class A { public: void Print() { cout A::Print() endl; cout _a endl; } private: int _a; }; int main() { A* p nullptr; p-Print(); return 0; }2.下⾯程序编译运⾏结果是A、编译报错 B、运⾏崩溃 C、正常运⾏C语言和C代码实现stack 栈的区别C语言实现的Stack 栈的代码#include stdio.h #include stdlib.h #define MAXSIZE 100 // 栈最大容量 // 栈结构体 typedef struct { int data[MAXSIZE]; int top; // 栈顶下标-1代表空栈 } Stack; // 初始化栈 void InitStack(Stack *s) { s-top -1; } // 判断栈空 int IsEmpty(Stack *s) { return s-top -1; } // 判断栈满 int IsFull(Stack *s) { return s-top MAXSIZE - 1; } // 入栈 push int Push(Stack *s, int val) { if (IsFull(s)) { printf(栈已满无法入栈\n); return 0; } s-data[s-top] val; return 1; } // 出栈 pop int Pop(Stack *s, int *res) { if (IsEmpty(s)) { printf(栈为空无法出栈\n); return 0; } *res s-data[s-top--]; return 1; } // 获取栈顶元素 int GetTop(Stack *s, int *res) { if (IsEmpty(s)) { printf(栈为空\n); return 0; } *res s-data[s-top]; return 1; } // 遍历打印栈 void PrintStack(Stack *s) { if (IsEmpty(s)) { printf(栈空\n); return; } printf(栈内元素(栈底→栈顶)); for (int i 0; i s-top; i) { printf(%d , s-data[i]); } printf(\n); } int main() { Stack st; InitStack(st); int temp; Push(st, 10); Push(st, 20); Push(st, 30); PrintStack(st); GetTop(st, temp); printf(栈顶%d\n, temp); Pop(st, temp); printf(出栈元素%d\n, temp); PrintStack(st); return 0; }C 实现的Stack栈的代码#include iostream using namespace std; const int MAX 50; // 栈类封装 class MyStack { private: int arr[MAX]; int topIndex; // 栈顶下标-1为空栈 public: // 构造函数初始化栈 MyStack() { topIndex -1; } // 判断栈是否为空 bool isEmpty() { return topIndex -1; } // 判断栈是否满 bool isFull() { return topIndex MAX - 1; } // 入栈 bool push(int num) { if (isFull()) { cout 栈已满无法入栈 endl; return false; } arr[topIndex] num; return true; } // 出栈删除栈顶元素 bool pop() { if (isEmpty()) { cout 栈为空无法出栈 endl; return false; } topIndex--; return true; } // 获取栈顶元素 int getTop() { if (isEmpty()) { cout 栈为空 endl; return -9999; } return arr[topIndex]; } // 获取当前栈中元素个数 int getSize() { return topIndex 1; } // 打印所有栈内元素 void show() { if (isEmpty()) { cout 栈内无元素 endl; return; } cout 栈底 - 栈顶; for (int i 0; i topIndex; i) { cout arr[i] ; } cout endl; } }; // 主函数测试 int main() { MyStack st; st.push(11); st.push(22); st.push(33); st.show(); cout 栈顶元素 st.getTop() endl; cout 当前栈大小 st.getSize() endl; st.pop(); cout 执行出栈后 endl; st.show(); st.pop(); st.pop(); st.pop(); // 空栈出栈测试 return 0; }可以看出在C没有使用在没有使用内置stack的情况下会在C语言中经常性需要st 的操作没有通过st.代理了平常的st 的操作相比C语言更加美观和便捷性提升了很多。练习题答案1C 2 B1地址即使为空指针也还是可以正常的使用对应的类成员函数的2因为this-_a ,this 本身是空指针直接触发崩溃
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RL-赵-(二)-基于模型:贝尔曼/Bellman公式04-1【贝尔曼方程的矩阵-向量形式(Matrix-Vector Form)】【v_π=r_π+γP_π·v_π】 2026/9/28 4:37:03

RL-赵-(二)-基于模型:贝尔曼/Bellman公式04-1【贝尔曼方程的矩阵-向量形式(Matrix-Vector Form)】【v_π=r_π+γP_π·v_π】

RL-赵-(二)-基于模型:贝尔曼/Bellman公式04【贝尔曼方程的矩阵-向量形式(Matrix-Vector Form)】【从Bellman方程求解State Value:①闭式解、②迭代解】 2.6 贝尔曼方程的矩阵-向量形式(Matrix-Vector Form of the Bellman Equation) vπ(s)=E[Rt+1∣St=s]+γE[Gt+1∣S…

阅读更多 →
小龙虾OpenClaw 2026/9/28 4:37:03

小龙虾OpenClaw

主要含义:OpenClaw 的网友昵称- 为什么叫小龙虾:OpenClaw 的图标是一只红色卡通龙虾("Claw"就是虾钳),网友顺口就叫它"小龙虾""AI 龙虾"。- "养龙虾"是什么:因为它…

阅读更多 →
一名员工从招聘、入职、试用、合同、考勤走到转岗离职,OA 的价值就藏在这些连续动作里 2026/9/28 4:37:02

一名员工从招聘、入职、试用、合同、考勤走到转岗离职,OA 的价值就藏在这些连续动作里

制造企业招进一名员工,表面上只是花名册里多了一行。真正发生的事情却远不止这些。用人部门提出招聘需求,人事收集简历、安排面试、确认录用。员工报到以后,要建立档案、签订合同、进入试用期。部门负责人要完成试用评价和转正审批&#xff0…

阅读更多 →
长沙网站制作首页图解步骤:零基础避坑指南 2026/9/28 4:37:02

长沙网站制作首页图解步骤:零基础避坑指南

长沙网站制作首页图解步骤:零基础避坑指南 想做个官网展示公司实力,结果打开浏览器对着空白文档发呆,连 <div> 和 <body>…

阅读更多 →
杂记08 CSRF 跨站请求伪造 2026/9/28 4:37:02

杂记08 CSRF 跨站请求伪造

CSRF 的本质只有一句话&#xff1a;我让你&#xff08;已登录用户&#xff09;的浏览器&#xff0c;替我发一个请求。 本文按「原理 → GET/POST 两种类型 → 三个递进靶场 → XSS 对比 → 防御」组织&#xff0c;靶场难度从 1 级递进到高阶。⚠️ 本文所有测试均在授权靶场中完…

阅读更多 →
STM32驱动W25Q64 Flash的SPI配置避坑指南 2026/9/28 4:36:55

STM32驱动W25Q64 Flash的SPI配置避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉