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

【C++ 从基础到项目实战】C++(五):类与对象基础——构造、析构与访问控制

📌 阅读时长:25分钟 | 关键词:C++、类、对象、构造函数、析构函数、this指针、静态成员、const成员

引言

前几篇文章我们一直在和"过程式"的代码打交道——函数、指针、数组。但从这一篇开始,我们要换一种思维:面向对象。面向对象不是一种语法,而是一种组织代码的哲学——把数据和操作数据的方法打包在一起,形成一个"类",就像现实世界中的"车"有颜色、速度这些属性,也有加速、刹车这些行为。

一、什么是类?什么是对象?

是自定义的数据类型,描述了"有一类事物是什么样的"。对象是类的实例,是"具体的某一个"。

classDog{// 这是类:定义了狗是什么样的public:std::string name;intage;voidbark(){std::cout<<name<<":汪汪!"<<std::endl;}};intmain(){Dog myDog;// 这是对象:一只具体的狗myDog.name="旺财";myDog.age=3;myDog.bark();// 输出:旺财:汪汪!}
概念类比C++ 关键词
蓝图/设计图纸class
对象根据蓝图造出的具体实物类的变量

二、访问控制:public 和 private

类的成员可以设置不同的访问权限,这是面向对象封装性的核心:

classBankAccount{public:// 外部可以访问voiddeposit(doubleamount){balance+=amount;}doublegetBalance()const{returnbalance;}private:// 只有类内部可以访问doublebalance=0.0;};intmain(){BankAccount acc;acc.deposit(1000);std::cout<<acc.getBalance()<<std::endl;// 1000 ✅// acc.balance = -100; // ❌ 编译错误!private 成员无法直接访问}
访问修饰符类内部派生类外部
public
private
protected

💡 默认规则:class默认是privatestruct默认是public

三、构造函数:对象的"出生证明"

构造函数在对象创建时自动调用,负责初始化。名称与类名相同,没有返回值。

3.1 默认构造函数 vs 有参构造函数

classCat{public:std::string name;intage;// 默认构造函数(无参)Cat():name("未知"),age(0){std::cout<<"一只猫诞生了"<<std::endl;}// 有参构造函数Cat(conststd::string&n,inta):name(n),age(a){std::cout<<name<<" 诞生了!"<<std::endl;}voidmeow()const{std::cout<<"喵!我是 "<<name<<","<<age<<" 岁"<<std::endl;}};intmain(){Cat c1;// 调用默认构造函数Catc2("Tom",2);// 调用有参构造函数c1.meow();// 喵!我是 未知,0 岁c2.meow();// 喵!我是 Tom,2 岁}

3.2 构造函数初始化列表

初始化列表在:后面直接初始化成员,比在函数体内赋值更高效——特别是对于 const 成员和引用成员,必须使用初始化列表:

classMyClass{public:constintid;// const 成员必须用初始化列表int&ref;// 引用成员也必须用初始化列表intvalue;MyClass(inti,int&r,intv):id(i),ref(r),value(v){// 主体可以留空}};

3.3 析构函数:对象消亡时的"告别"

名称在类名前加~,无参无返回值,对象销毁时自动调用。常用于释放动态分配的资源:

classResourceHolder{private:int*data;public:ResourceHolder(){data=newint[10];std::cout<<"资源已分配"<<std::endl;}~ResourceHolder(){// 析构函数delete[]data;std::cout<<"资源已释放"<<std::endl;}};
构造函数 vs 析构函数构造析构
调用时机对象创建时对象销毁时
名称ClassName(...)~ClassName()
参数可有参可无参不能有参数
数量可多个(重载)只能有一个

四、隐藏的 this 指针

每个非静态成员函数都有一个隐含的this指针,指向调用该函数的当前对象

classMyClass{public:intvalue;voidsetValue(intvalue){this->value=value;// this->value 是成员变量,value 是参数}voidprint()const{// this 在 const 函数中类型为 const MyClass* conststd::cout<<this->value<<std::endl;}};

五、静态成员:属于类本身,不属于任何一个对象

classMyClass{public:staticintcount;// 静态成员变量声明MyClass(){count++;}// 每创建一个对象,计数+1staticvoidprintCount(){// 静态成员函数std::cout<<"当前对象数:"<<count<<std::endl;// std::cout << value; // ❌ 静态函数不能访问非静态成员!(没有 this)}};intMyClass::count=0;// ⚠️ 静态成员变量必须在类外部定义(初始化)intmain(){MyClass::printCount();// 0 — 通过类名直接调用MyClass a,b,c;MyClass::printCount();// 3}
静态成员访问方式有无 this 指针可否访问非静态成员
静态变量类名::变量名对象.变量名无关
静态函数类名::函数名()对象.函数名()

六、const 成员:不可修改的承诺

classMyClass{public:constintid;// const 成员变量MyClass(inti):id(i){}// 只能用初始化列表赋值intgetValue()const{// const 成员函数// value = 10; // ❌ 不能修改任何成员变量returnvalue;}private:intvalue=0;};
const 用于语法含义
成员变量const int id;初始化后不能修改
成员函数int get() const;承诺不修改对象状态
对象const MyClass obj;只能调用 const 成员函数

小结

序号知识点一句话总结
1类与对象类是蓝图,对象是实物;成员变量=属性,成员函数=行为
2访问控制public 对外开放,private 内部使用,protected 子类可见
3构造函数对象创建时自动调用,初始化列表优于函数体赋值
4析构函数对象销毁时自动调用,释放资源
5this 指针指向当前对象的隐含指针,区分同名成员与参数
6静态成员属于类本身,所有对象共享,无 this 指针
7const 成员变量不可改(初始化列表赋值),函数承诺不改状态

下一篇文章,我们将深入拷贝控制——浅拷贝的陷阱、深拷贝的实现、以及 C++11 的智能指针初探。


本文是「C++ 从基础到项目实战」系列的第 5 篇。关注我,不错过后续更新。

http://www.zskr.cn/news/1452108.html

相关文章:

  • 14-5 TCP网络编程
  • FANUC机器人Socket通讯避坑指南:从KAREL代码到稳定连接,我踩过的几个雷
  • 从医疗分割到图像去模糊:一个UNet的“跨界”实战指南
  • 构建个人知识复利系统:从信息处理到可复用资产的技术实践
  • 别再乱用GitHub上的DDoS脚本了!用Kali Linux的hping3和slowloris做一次更‘专业’的负载测试
  • 保姆级教程:手把手教你搞定OKB X1测试网水龙头,5分钟领到测试币
  • 2026年荆州市黄金回收白银回收铂金回收门店哪家好 五家诚信店铺排行榜+联系方式电话推荐 - 盛世金银回收
  • 事件相机视觉运动策略:从数据表征到机器人控制实战
  • MATLAB小波图像去噪工具包:含BaysShrink、Chang等自适应阈值算法及测试图与评估脚本
  • 2026年想在赣州做全屋定制?一文理清各品牌核心技术实力差异
  • 2026年景德镇市黄金回收白银回收铂金回收门店哪家好 五家诚信店铺排行榜+联系方式电话推荐 - 盛世金银回收
  • 湖州市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 贵港市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 图像结构因子分解:从重复内容检测到高效压缩与渲染
  • 贵阳市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 你的高速USB信号总丢包?可能是差分对走线宽度和间距没设对(以90Ω阻抗为例的AD/Altium实战配置)
  • 宁德市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • RASCAL机器人集群:分布式协同如何重塑自动化仓储系统设计
  • 淮安市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 保姆级避坑指南:手把手教你用mmWave Studio 2.0搞定AWR1843雷达数据采集(从接线到.bin文件生成)
  • 魔兽争霸3终极优化指南:从卡顿到流畅的完整解决方案
  • 海口市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 《Neo4j之Cypher语言实战指南》第1篇:揭开图数据库与Cypher的神秘面纱
  • 课优-华哥 OpenClaw AI Agent 实战训练营
  • 平顶山市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 邯郸市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • PIKE-RAG:多模态工业知识问答系统如何提升12%准确率
  • 2026年来宾市黄金回收白银回收铂金回收门店哪家好 五家诚信店铺排行榜+联系方式电话推荐 - 盛世金银回收
  • Simulink封装(mask)的“隐藏关卡”:从参数约束到多层封装,避开这些坑让你的模块更健壮
  • 51单片机开发环境搭建:从下载到编译第一个程序,Keil C51 V9.61保姆级指南