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

C++类入门:从学生类到立方体类的实践

在C中类class是面向对象编程的核心它允许我们将数据属性和操作方法封装在一起。本文将通过多个代码示例逐步讲解C类的基本概念、权限控制、封装特性以及成员函数与全局函数的区别。所有代码均经过测试你可以直接复制运行观察输出结果。1. 第一个类学生类我们先从一个简单的Student类开始它包含姓名和学号两个属性以及显示信息和设置属性的方法。cpp#include iostream #include string using namespace std; class Student { public: // 成员属性 string m_Name; int m_Id; // 成员方法 void showStudent() { cout 姓名为 m_Name 学号为 m_Id endl; } void setName(string name) { m_Name name; } void setId(int Id) { m_Id Id; } }; int main() { Student s1; // 实例化对象 s1.setName(李一博); // 调用方法设置姓名 s1.setId(33556677); // 调用方法设置学号 s1.showStudent(); // 显示信息 return 0; }讲解class Student { ... };定义了一个名为Student的类。类中包含两个成员属性也叫成员变量string m_Name和int m_Id用于存储学生的姓名和学号。还包含三个成员函数也叫方法showStudent()用于输出信息setName()和setId()用于设置私有属性此处属性是公有的但通常我们会将属性设为私有通过公有方法访问。在main()函数中我们创建了一个Student类型的对象s1并通过点运算符.调用成员函数。注意这里将属性设为public是为了简化示例实际开发中更推荐将属性设为私有后面会讲到。2. 类的访问权限public、protected、privateC中类成员有三种访问权限public类内类外均可访问。protected类内可以访问类外不可访问但派生类可以访问。private类内可以访问类外不可访问派生类也不能访问。下面的代码演示了这三种权限的区别cpp#include iostream #include string using namespace std; class Student { public: string m_Name; // 公有类内外都可访问 protected: string m_Car; // 保护类内可访问类外不行 private: int m_Password; // 私有仅类内可访问 public: void func() { m_Name liyibo; m_Car 法拉利; // 类内可以访问protected成员 m_Password 123456; // 类内可以访问private成员 } }; int main() { Student s1; s1.m_Name LGN; // 正确public成员 // s1.m_Car 兰博基尼; // 错误protected成员类外不可访问 // s1.m_Password 56748; // 错误private成员类外不可访问 return 0; }讲解在类Student中我们分别用public、protected、private标记了三个成员。在func()成员函数内部可以访问所有权限的成员。在main()中只能访问公有成员m_Name尝试访问protected或private成员会导致编译错误。这种权限控制是C实现封装性的基础。3. 结构体与类的区别在C中struct和class非常相似唯一的区别是默认访问权限class默认成员是private。struct默认成员是public。下面通过例子验证cpp#include iostream using namespace std; class C1 { int m_a 100; // 默认private }; struct C2 { int m_C2A 236; // 默认public }; int main() { C1 c1; // c1.m_a 100; // 错误private不可访问 C2 c2; c2.m_C2A 269; // 正确public可访问 cout m_C2A的值为: c2.m_C2A endl; return 0; }讲解class C1中的成员m_a没有显式指定权限因此默认为private在main中无法直接访问。struct C2中的成员m_C2A默认为public可以直接访问。除了默认权限外struct和class在功能上完全等价。通常我们用struct表示简单的数据集合用class表示具有复杂行为的对象。4. 封装与访问控制私有成员的操作将成员属性设为私有并通过公有成员函数来访问是封装的体现。这样做可以控制数据的读写权限甚至进行数据验证。4.1 设置可读可写权限下面的Person类演示了如何控制不同属性的读写cpp#include iostream #include string using namespace std; class Person { public: // 设置名字可写 void SetName(string name) { m_Name name; } // 读取名字可读 string GetName() { return m_Name; } // 读取年龄只读 int GetAge() { return m_Age; } // 设置偶像只写 void SetIdol(string idol) { m_Idol idol; } private: string m_Name; // 可读可写 int m_Age 18; // 只读未提供Set方法 string m_Idol; // 只写未提供Get方法 }; int main() { Person P1; P1.SetName(liyibo); cout Your name is P1.GetName() endl; cout Your age is P1.GetAge() endl; // 只能读 P1.SetIdol(liqiling); // 只能写 // cout P1.GetIdol(); // 错误没有提供Get方法 return 0; }讲解我们将m_Name、m_Age、m_Idol全部设为私有外部无法直接访问。通过公有方法SetName/GetName使m_Name可读可写。m_Age只提供了GetAge因此是只读的注意它在类内被初始化为18。m_Idol只提供了SetIdol因此是只写的。这种设计使得我们可以灵活控制属性的访问同时隐藏内部实现细节。4.2 数据验证封装的好处之一是可以对输入数据进行验证。下面的代码在设置年龄时增加了合法性检查cpp#include iostream #include string using namespace std; class Person { public: void SetName(string name) { m_Name name; } string GetName() { return m_Name; } int GetAge() { return m_Age; } // 设置年龄并进行数据验证 void SetAge(int age) { if (age 0 || age 150) { cout 输入年龄错误请重新输入年龄 endl; return; } m_Age age; } void SetIdol(string idol) { m_Idol idol; } private: string m_Name; int m_Age 18; // 默认18 string m_Idol; }; int main() { Person P1; P1.SetName(liyibo); cout Your name is P1.GetName() endl; cout Your age is P1.GetAge() endl; P1.SetAge(165); // 年龄过大触发错误提示 // 但此时年龄仍然是18因为SetAge中验证失败后直接返回未修改m_Age P1.SetIdol(liqiling); return 0; }讲解SetAge(int age)中判断了年龄范围如果不在0~150之间则输出错误信息并返回不会修改m_Age。这样保证了数据的有效性避免了非法值进入对象内部。这是封装带来的重要优势可以在入口处统一控制数据合法性。5. 综合案例立方体类最后我们通过一个稍复杂的例子——立方体类来巩固所学知识并比较成员函数和全局函数实现相同功能的方式。cpp#include iostream using namespace std; class Cube { public: void setL(int l) { m_L l; } int getL() { return m_L; } void setW(int w) { m_W w; } int getW() { return m_W; } void setH(int h) { m_H h; } int getH() { return m_H; } // 计算表面积 int caculateS() { return 2 * (m_L * m_W m_L * m_H m_W * m_H); } // 计算体积 int caculateV() { return m_L * m_W * m_H; } // 成员函数判断两个立方体是否相等 bool isSameByClass(Cube c2) { return (m_L c2.getL() m_W c2.getW() m_H c2.getH()); } private: int m_L; // 长 int m_W; // 宽 int m_H; // 高 }; // 全局函数判断两个立方体是否相等 bool isSameCube(Cube c1, Cube c2) { return (c1.getL() c2.getL() c1.getW() c2.getW() c1.getH() c2.getH()); } int main() { Cube c1; c1.setL(10); c1.setW(10); c1.setH(10); cout c1的表面积为 c1.caculateS() endl; cout c1的体积为 c1.caculateV() endl; Cube c2; c2.setL(10); c2.setW(10); c2.setH(12); // 使用全局函数判断 bool ret1 isSameCube(c1, c2); if (ret1) cout 使用全局函数判断:c1和c2相等 endl; else cout 使用全局函数判断:c1和c2不相等 endl; // 使用成员函数判断 bool ret2 c1.isSameByClass(c2); if (ret2) cout 使用成员函数判断:c1和c2相等 endl; else cout 使用成员函数判断:c1和c2不相等 endl; return 0; }讲解Cube类封装了长、宽、高三个私有属性并通过公有set/get方法进行访问。提供了caculateS()和caculateV()分别计算表面积和体积。判断两个立方体是否相等有两种方式成员函数isSameByClass(Cube c2)当前对象this与传入的c2进行比较。全局函数isSameCube(Cube c1, Cube c2)接收两个Cube对象的引用进行比较。在main中创建两个立方体c1和c2分别调用两种函数输出结果。通过这个例子可以看到成员函数可以直接访问当前对象的私有成员如m_L而全局函数只能通过公有get方法获取数据体现了封装的统一性。注意成员函数中也可以直接访问c2的私有成员因为同属于一个类但为了代码清晰我们依然通过getL()等方式访问这样即使将来属性名改变也只需修改get函数内部。总结通过以上五个部分的代码示例我们逐步学习了C类的基础知识类的定义与对象实例化成员属性和成员函数。访问权限public、protected、private的区别。struct与class默认访问权限的差异。封装与数据控制通过公有接口操作私有成员并可添加数据验证。成员函数与全局函数实现相同功能时的不同写法。这些内容是C面向对象编程的基石熟练掌握后你就可以设计出结构清晰、易于维护的类了。希望本文对你有所帮助欢迎在评论区留言交流

相关文章:

C++类入门:从学生类到立方体类的实践

在C中,类(class)是面向对象编程的核心,它允许我们将数据(属性)和操作(方法)封装在一起。本文将通过多个代码示例,逐步讲解C类的基本概念、权限控制、封装特性以及成员函数…...

C语言的由来、发展、应用及特点全介绍,快来学习

关于C语言的介绍 C语言是基于一种被称作B语言的基础之上,克服了因B语言依赖机器且不存在数据类型等方面局限性而开发的语言。以下包含关于C语言的由来,关于C语言的发展,关于C语言的应用,关于C语言的特点等方面的知识,欢…...

28天每天2小时速通蓝桥杯国赛(1/28)

今天学习了滤波,串口,ds1302,数码管,按键,ne555,内存管理,并学习了keil中的基本调试方法第一周按照计划学习考点和理解模板,明天应该就差不多可以把所有考点资料学完,然后…...

对抗Facebook审核机制:如何钻系统空子

大家好!我是天工开户。刚开始跑的时候,我的素材总是被禁,搞得人又烦又浪费时间。我试了好多规避审核的方法,最后就固定下来两种:一个是商品目录法,另一个是语言切换法(通过改语言上传&#xff0…...

公司终于下手了:去 Qt 化第一刀,先砍 Modbus

这两年,很多公司嘴上还没喊“彻底放弃 Qt”, 但动作已经很诚实了。 新项目不想再上 Qt。 老项目能不扩就不扩。 只要一提新增功能,很多领导第一反应已经变成: 这次能不能别再继续绑 Qt 了? 说白了,Qt 现在…...

奇兵到家闪耀东莞名家具展:攻克“最后一公里”,别让售后熄灭品牌的光

三月的东莞厚街,春意盎然,人流如织。第55届国际名家具(东莞)展览会正如火如荼进行中,“聚光”之下,是东莞家具从“制造”向“品牌”跃升的雄心。但有一个尴尬的现实,许多东莞家具老板心知肚明&a…...

VHM:多功能且诚实的遥感视觉语言模型

图解VHM:多功能且诚实的遥感视觉语言模型 开篇导读 在遥感图像分析领域,一个令人兴奋的突破正在发生:视觉语言模型(VLMs)正在学习"看懂"卫星图像。但问题也随之而来——现有的模型要么"看"得不够全…...

mysql转postgres 字段定义备忘

create or replace function bool_to_int(boolean) returns int2 as $$ select CAST($1::int as int2); $$ language sql strict; create cast (bool as int2) with function bool_to_int(boolean) as implicit;...

字符串!!!!

1.在字符串中赋整数值 一定要注意是赋字符还是数字 &#xff01;&#xff01;数字也要加单引号变成字符2.很容易看错 tolower的头文件是#include<cctype>3.今天有好几次 把小写l看成数字1 以及大小写看错 这是字符串里面一出现就要避雷的&#xff01;&#xff01;&#x…...

GD60920你一定很少听说,但它可能就在你身边:智能照明应用解决方案分享(全文干货)

GD60920红外传感器 照明场景人体感应应用解决方案 精准感知 智能照明 一、项目背景 当前照明智能化已成为家居、工业、商业领域的主流趋势&#xff0c;人体感应照明作为节能化、便捷化的核心方案&#xff0c;可有效解决传统照明长亮耗电、手动控制繁琐等问题。 但传统红外…...

HTB - VariaType

10.129.8.159nmap扫描 sudo nmap --top-ports 10000 10.129.8.159 --min-rate1000 -oA ips_quick_TCP_nmapscan && sudo nmap --top-ports 10000 10.129.8.159 --min-rate1000 -sU -oA ips_quick_UDP_nmapscan && nmap -p- 10.129.8.159 -oA ips_full_TCP_nmap…...

Nginx 安全防护与 HTTPS 部署实战全解析

在互联网技术高速发展的当下&#xff0c;Web 服务的安全性和可靠性成为企业与开发者的核心关注重点。Nginx 作为高性能 Web 服务器和反向代理工具&#xff0c;凭借轻量级、高并发处理能力和灵活模块化设计&#xff0c;占据全球近三分之一的 Web 服务器市场份额。但随着 DDoS、S…...

10分钟搞定SCI插图的秘密武器

对于每一位奋斗在一线的科研人员来说&#xff0c;做实验、跑数据或许是家常便饭&#xff0c;但每当论文撰写进入尾声&#xff0c;明明有着惊艳的实验数据和扎实的创新观点&#xff0c;却因为一张“惨不忍睹”的配图&#xff0c;让整篇论文的档次大打折扣。这恐怕是许多科研人心…...

AI智能应用开发(Java)起点-终点 -1、java的前世今生andJava环境配置、jdk下载,以及Idea下载和基本应用

一、JAVA的诞生与成长 起源&#xff1a;Green Team与Java的诞生 Java的起源可以追溯到1990年代&#xff0c;当时Sun Microsystems成立了一个名为Green Team的特别小组&#xff0c;旨在开发一种新型软件以驱动消费电子设备。这个项目的核心成员包括后来被称为“Java之父”的Ja…...

从后台管理到 IoT 远程控表,这个 Spring Boot 3 开源项目把能耗管理链路做完整了

最近看了不少 Java 开源项目&#xff0c;有一个很明显的感受&#xff1a;很多项目页面做得不少&#xff0c;接口也挺全&#xff0c;但真往下看&#xff0c;要么偏后台 CRUD&#xff0c;要么只覆盖某个局 部能力&#xff0c;很难看到一条完整业务链路。 ems4j 给我的感觉不太一样…...

RWKV-7 G1e 系列模型开源,性能表现亮眼

2026 年 3 月&#xff0c;RWKV-7 G1e 系列推理模型开源发布&#xff0c;涵盖 13.3B/7.2B/2.9B/1.5B 等不同规格。该模型在评测和实战中表现出色&#xff0c;且具备高并发推理能力。模型发布情况2026 年 3 月&#xff0c;RWKV-7 G1e 系列推理模型正式开源&#xff0c;目前已发布…...

大晓机器人开源Kairos 3.0-4B:具身世界模型性能全面领跑

【导语&#xff1a;近日&#xff0c;大晓机器人重磅开源开悟世界模型3.0&#xff08;Kairos 3.0&#xff09;-4B系列具身原生世界模型&#xff0c;它是业内首个实现“多模态理解 -- 生成 -- 预测”一体化的开源具身原生世界模型&#xff0c;性能领先国内外主流具身世界模型。】…...

Java环境搭建 day1

jdk:21idea:2024.1一:1.配置环境变量:搜索2.高级--》环境变量--》系统变量3.新建 配置4.双击Path 编辑文本前面添加&#xff1a;%JAVA_HOME%\jre\bin;D:\Java\JDK\jdk21\bin;二&#xff1a;cmd--> java -versioncmd-->javac三&#xff1a;java为什么能跨平台答&#xff1…...

gcc/g++编译简单 C/C++ 项目的实用指南

编译 C/C 项目其实可以非常直观。无论你是刚接触编程的学生&#xff0c;还是想脱离 IDE&#xff08;如 VS Code 插件或 Visual Studio&#xff09;手动控制构建过程的开发者&#xff0c;掌握 gcc (针对 C) 和 g (针对 C) 的基本命令都是一项必备技能。 1. 基础编译&#xff1a;…...

WiFi的应用

1.WIFI获取当前时间移植WIFI文件当前使用的ESP32S3就是WIFI模块&#xff0c;可以直接用于联网。将WIFI的代码移植到当前工程中。创建一个WIFI文件夹&#xff0c;将wifi.c和wifi.h放入其中。加载WIFI文件添加头文件访问路径WIFI&#xff0c;源文件已经通过通用符说明了&#xff…...

欧意下载地址okxz.run复制进去-2026年最新版V5.6.12.5.31安卓/苹果版

欧意下载地址okxz.run复制进去-2026年最新版V5.6.12.5.31安卓/苹果版1975年9月18日下午15 - 17点出生的人&#xff0c;其性格、运势与命运交织出独特的人生轨迹。性格上&#xff0c;他们往往兼具热情与沉稳&#xff0c;对生活充满积极向上的态度&#xff0c;同时又有着细腻的情…...

7-Zip 21.04(x64)安装教程 Windows版:管理员运行+自定义安装路径指南

7z是一款简洁的解压软件&#xff0c;比传统解压缩软件更快更轻巧&#xff0c;支持解压主流的rar、zip、7z、iso等多达37种压缩文件 一、准备工作​ 安装包下载&#xff1a; https://pan.quark.cn/s/a246d6f3163c &#xff0c;先下载好 7-Zip 21.04 (x64) 安装包&#xff08;文…...

创维电视刷机通用教程

刷机可解决电视卡顿、系统崩溃、无法开机等问题&#xff0c;甚至能解锁更多功能。但刷机有风险&#xff0c;操作前请务必仔细阅读本教程&#xff0c;确保每一步都正确无误。一、刷机前准备确认机型与机芯查看标签&#xff1a;电视背面或电池仓内的条形码标签&#xff0c;记录“…...

由二叉树的前序结果来生成二叉树

1.思想&#xff1a;递归(分治)arr&#xff1a;存放前序结果。pi&#xff1a;用来遍历arr数组的下标的指针。2.递归与回溯图...

多项目并行计时与灵活计费:拼豆店计时计费、电玩店计时计费、PS5计时计费多项目同时并行计算时间的技术实现路径

在复合式休闲娱乐业态中&#xff0c;单一店铺同时经营多种计时项目的现象越来越普遍。一家店铺可能既提供拼豆DIY手工体验&#xff0c;又设有PS5游戏区、桌球室或棋牌包间。不同项目的单价规则各不相同&#xff0c;同一项目在不同时段、不同客群中又存在多种计费方式&#xff0…...

weixin233微信小程序研学自习室选座与门禁系统的实现与开发springboot(文档+源码)_kaic

第5章 系统实现编程人员在搭建的开发环境中&#xff0c;会让各种编程技术一起呈现出最终效果。本节就展示关键部分的页面效果。5.1 座位信息图5.1 即为编码实现的座位信息界面&#xff0c;用户在座位信息界面中先了解座位价格&#xff0c;座位简介信息&#xff0c;然后对可以预…...

C++编译期字符串加密

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第一个满…...

C语言100篇:从入门到天花板 第19篇 静态变量static:修饰变量与函数的核心作用

【独家】C语言100篇:从入门到天花板 第19篇 静态变量static:修饰变量与函数的核心作用 作者:华夏之光永存 前言 大家好,我是华夏之光永存,欢迎继续阅读 CSDN独家高质量专栏《C语言100篇:从入门到天花板》。 在C语言所有关键字里,static 是最具工程价值、最容易被新手…...

数据结构和算法之【递归】

目录 认识递归 递归的定义 利用递归实现几个小案例 链表的遍历 反转字符串 求N的阶乘 思路总结 多路递归 single recursion和multi recursion 斐波那契数列 递推公式 编码实现 代码优化 LeetCode-70题 题解 测试 认识递归 递归的定义 计算机科学中&#xff0…...

高考数学97分,我的“数学直觉“比140分更好用:指针:内存的门牌号系统

目录 一.序言 二.数学直觉 三.核心概念 1.基础核心概念 1. 1.指针的本质 1.2. 指针的两大核心操作 1.3. 指针的类型 2.进阶核心概念 2.1. 指针与数组的关系 2.2. 指针的运算 2. 3. 多级指针 3.应用核心概念 3.1. 指针作为函数参数 3.2. 动态内存分配 3.3. 函数指针 4.安…...