当前位置: 首页 > 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.jsqmd.com/news/940675/

相关文章:

  • 告别复制粘贴:用STM32CubeMX快速初始化KEIL5工程,再无缝移植标准库代码(F103实战)
  • 众包研究颠覆平台设计:流程导向为何优于功能导向?
  • 构建个人知识复利系统:从信息处理到可复用资产的技术实践
  • 从医疗分割到图像去模糊:一个UNet的“跨界”实战指南
  • Spring AI 实战:从零实现 AI 对话的记忆与历史记录管理(附源码级解析)
  • 南宁市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 微软Translator定制化NMT实战:用领域数据微调模型,解决专业术语翻译难题
  • 独立研究者设计的AI“调度大脑“:让多智能体系统学会自己安排工作
  • 2026年晋中市黄金回收白银回收铂金回收门店哪家好 五家诚信店铺排行榜+联系方式电话推荐 - 盛世金银回收
  • 千方科技干线物流自动驾驶业务
  • 从音频到交互:基于多传感器融合的智能耳机交互设计
  • 如何查询网站是否被谷歌收录?解决已抓取报错只要5分钟
  • Windows 11下用SuperYOLO训练自己的数据集,我踩过的那些坑都帮你填平了(RTX 3050实测)
  • 2026年荆门市黄金回收白银回收铂金回收门店哪家好 五家诚信店铺排行榜+联系方式电话推荐 - 盛世金银回收
  • 南平市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 微软用Rust重写核心密码库:内存安全与形式化验证的工程实践
  • 别只知道UDP Flood了:2026年黑客最爱用的4种新型DDoS手法
  • 别再乱用GitHub上的DDoS脚本了!用Kali Linux的hping3和slowloris做一次更‘专业’的负载测试
  • ST-LINK V2-1 DIY烧录器全栈资源:从PCB到驱动、固件升级与Windows多版本兼容支持
  • 构建个人研究知识体系:从信息过载到系统化输出的高效工作流
  • ENVI 5.6.1 保姆级教程:搞定高分二号(GF2)影像融合,从插件安装到出图避坑全流程
  • 保姆级教程:手把手教你搞定OKB X1测试网水龙头,5分钟领到测试币
  • OpenClaw 连接企业微信图文教程
  • 南通市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • 2026年荆州市黄金回收白银回收铂金回收门店哪家好 五家诚信店铺排行榜+联系方式电话推荐 - 盛世金银回收
  • DamaiHelper:告别黄牛票!Python自动化大麦网抢票脚本终极指南
  • 呼伦贝尔市2026年黄金回收白银回收铂金回收门店指南 五家诚信店铺排行榜+联系方式电话推荐 - 大熊猫898989
  • UE5 VR开发避坑指南:Interaction组件里的Component Identification到底怎么用?
  • 事件相机视觉运动策略:从数据表征到机器人控制实战
  • MATLAB小波图像去噪工具包:含BaysShrink、Chang等自适应阈值算法及测试图与评估脚本