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

【c++面向对象编程】第2篇:类与对象(一):定义第一个类——成员变量与成员函数

目录一、从一个日常需求开始二、定义你的第一个类三、访问修饰符public、private、protected举个例子看看区别四、成员变量怎么声明五、成员函数两种实现方式方式一类内实现隐式内联方式二类外实现推荐六、一个完整的例子时钟类七、常见错误新手必踩的坑1. 忘了在类外实现时写类名::2. 在private函数里访问不到外部变量反过来也是3. 结构体和类的区别面试爱问八、这一篇的收获一、从一个日常需求开始假设你要写一个程序管理图书。每本书有书名、作者、价格。用C的结构体你可能会这样cstruct Book { char title[100]; char author[50]; double price; }; // 然后写一堆函数操作它 void printBook(struct Book* b) { ... } void discount(struct Book* b, double rate) { ... }没什么问题但你要记住哪些函数能改price改的时候要不要校验比如价格不能为负随着代码变多这些“约定”很容易被忘记。C的类把数据和操作绑在一起并且控制谁能访问什么。二、定义你的第一个类下面是一个最简单的Book类cpp#include iostream #include string using namespace std; class Book { public: string title; string author; double price; void print() { cout 书名 title endl; cout 作者 author endl; cout 价格 price 元 endl; } void setPrice(double p) { if (p 0) { price p; } else { cout 价格不能为负数 endl; } } };然后这样使用cppint main() { Book b; b.title C Primer; b.author Lippman; b.setPrice(128.5); b.print(); return 0; }你可能会说“这不就是结构体里塞了几个函数吗”——差不多但多了控制权限。三、访问修饰符public、private、protected上面的代码里出现了public:它的意思是这些东西外面可以直接访问。C提供了三个访问修饰符修饰符谁能访问日常理解public任何人公开的接口像遥控器上的按钮private只有类自己的成员函数内部秘密用户碰不到protected自己 子类可以传给后代但外人不行举个例子看看区别cppclass BankAccount { public: string owner; // 谁都能看账户名 void deposit(double money) { if (money 0) balance money; } double getBalance() { return balance; } private: double balance; // 余额不能直接碰 }; int main() { BankAccount acc; acc.owner 张三; // ✅ 可以owner是public acc.deposit(500); // ✅ 可以通过函数操作 acc.balance 1000; // ❌ 编译错误balance是private cout acc.getBalance(); // ✅ 只能通过函数获取 }为什么要这样balance直接暴露在外面万一有人写acc.balance -10000就出问题了通过deposit()函数我们可以加校验只能存正数通过getBalance()只读不写没有提供setBalance余额就只能看不能改封装的核心不是“藏起来”而是“可控”。四、成员变量怎么声明成员变量可以像普通变量一样声明但一般写在private或protected区域cppclass Student { private: string name; // 字符串类型 int age; // 整型 double score[5]; // 数组 int* pData; // 指针后面讲动态内存时会用 public: // 成员函数... };几条潜规则不是语法强制但建议遵守成员变量放在private下——除非你有特殊理由命名风格保持一致很多人用下划线后缀name_、age_、m_name不要在类内给成员变量赋默认值除非用C11的类内初始化后面会讲五、成员函数两种实现方式成员函数可以在类内直接写也可以在类外写。方式一类内实现隐式内联刚才的Book类就是类内实现cppclass Book { public: void print() { cout title endl; // 直接写在类里 } };优点简单直观缺点函数体暴露在头文件里编译依赖重改动函数实现会重新编译所有包含头文件的代码方式二类外实现推荐把声明和实现分开cpp// Book.h 头文件 class Book { public: void print(); // 只声明 void setPrice(double p); private: string title; string author; double price; }; // Book.cpp 实现文件 #include Book.h #include iostream using namespace std; void Book::print() { // 注意 Book:: 表示这个函数属于Book类 cout 书名 title endl; cout 作者 author endl; cout 价格 price 元 endl; } void Book::setPrice(double p) { if (p 0) price p; }Book::print()的::叫作用域运算符意思是“print这个函数是Book这个类里的”。类外实现的优点头文件只放接口干净整洁修改函数实现时只编译.cpp文件不用重新编译所有依赖多人协作时可以并行开发一个人改.h一个人改.cpp对于只有三五行的简单函数比如getBalance()可以直接写类内复杂的逻辑写类外。六、一个完整的例子时钟类把前面知识点串起来我们来写一个有实际意义的Clock类。cpp// Clock.h #ifndef CLOCK_H // 防止重复包含 #define CLOCK_H class Clock { public: void setTime(int h, int m, int s); void tick(); // 走一秒 void display(); // 显示时间 private: int hour; int minute; int second; void normalize(); // 辅助函数处理进位只内部用所以private }; #endifcpp// Clock.cpp #include Clock.h #include iostream #include iomanip using namespace std; void Clock::setTime(int h, int m, int s) { hour h; minute m; second s; normalize(); // 万一传进来的数值超出范围 } void Clock::tick() { second; normalize(); } void Clock::normalize() { if (second 60) { minute second / 60; second % 60; } if (minute 60) { hour minute / 60; minute % 60; } if (hour 24) { hour % 24; } } void Clock::display() { cout setfill(0); cout setw(2) hour : setw(2) minute : setw(2) second endl; }cpp// main.cpp #include Clock.h int main() { Clock c; c.setTime(23, 59, 55); for (int i 0; i 10; i) { c.display(); c.tick(); } return 0; } // 输出 // 23:59:55 // 23:59:56 // ... // 00:00:04这个例子中hour、minute、second是private——外部不能随意篡改setTime、tick、display是public——用户通过它们操作时钟normalize是private——外部不需要知道“进位”的具体逻辑七、常见错误新手必踩的坑1. 忘了在类外实现时写类名::cppvoid print() { ... } // ❌ 这是全局函数不是Book类的 void Book::print() { ... } // ✅ 正确2. 在private函数里访问不到外部变量反过来也是成员函数可以访问本对象的任何成员不管public还是private但不是直接访问别的对象的私有成员。3. 结构体和类的区别面试爱问struct成员默认是publicclass成员默认是private除此之外在C里几乎没有区别。很多人用struct表示纯数据容器像C语言那样。八、这一篇的收获你现在应该能用class定义一个类区分public、private、protected的访问权限在类内或类外实现成员函数理解封装的第一步把数据藏起来提供接口函数 小作业定义一个Rectangle类有宽度和高度private提供setSize()、getArea()、getPerimeter()public并写一个main函数测试。下一篇预告第3篇《类与对象二构造函数与析构函数》——对象出生时自动执行的代码和对象销毁时做的清理工作。你会发现原来很多“初始化”和“收尾”的活儿根本不用手动调用。

相关文章:

【c++面向对象编程】第2篇:类与对象(一):定义第一个类——成员变量与成员函数

目录 一、从一个日常需求开始 二、定义你的第一个类 三、访问修饰符:public、private、protected 举个例子,看看区别: 四、成员变量怎么声明? 五、成员函数:两种实现方式 方式一:类内实现&#xff08…...

AI编程智能体评估平台CodingAgentExplorer:从原理到实践的系统评测指南

1. 项目概述:一个探索智能体编码能力的开源工具最近在GitHub上闲逛,发现了一个挺有意思的项目:tndata/CodingAgentExplorer。光看名字,你可能会觉得这又是一个“AI写代码”的工具,市面上这类工具已经多如牛毛了。但当我…...

iPhone 5c中国遇冷复盘:产品定价、市场预期与战略博弈的深度解析

1. 项目概述:一次关于市场预期的“误判”复盘2013年秋天,苹果公司发布了被外界普遍视为“专为新兴市场打造”的iPhone 5c。这款拥有多彩聚碳酸酯外壳的手机,在发布前就被贴上了“廉价iPhone”的标签,尤其是针对像中国这样庞大且正…...

《Java面试85题图解版(二)》进阶深化中篇:Spring核心 + 数据库进阶

📘 《Java面试85题图解版(二)》进阶深化中篇:Spring核心 数据库进阶 阅读提示:这是“图解比喻一句话总结”面试题库第二篇的进阶深化中篇,覆盖Spring核心与Spring Boot(9题)和数据库…...

物联网标准演进与云平台破局:从M2M到IoT的实战路径

1. 从M2M到IoT:一场迟来的标准革命十多年前,当我第一次接触“机器对机器”这个概念时,感觉它就像个被锁在工厂车间里的幽灵——功能强大,但离普通人的生活无比遥远。那时的M2M,谈论的是专用网络、私有协议和封闭的垂直…...

EDA工程师成长与验证技术演进:从算法到芯片的实践闭环

1. 从算法到芯片:一位EDA工程师的成长路径解析在半导体这个行当里待久了,你会发现,那些真正能把工具做“透”、把流程理“顺”的人,往往自己就亲手“焊”过板子、调过RTL、追过时序违例。Prakash Narain的故事,就是一个…...

ClawMorph:为OpenClaw AI智能体实现安全可逆的“一键换装”

1. 项目概述:一个为AI智能体“一键换装”的开发者工具如果你正在使用OpenClaw这类AI智能体框架,并且厌倦了每次想让智能体扮演不同角色(比如从产品经理切换到设计师)时,都需要手动去修改一堆配置文件、提示词文件&…...

番茄小说下载器:打造个人专属离线小说图书馆的完整指南

番茄小说下载器:打造个人专属离线小说图书馆的完整指南 【免费下载链接】fanqienovel-downloader 下载番茄小说 项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader 你是否曾在通勤路上突然想读小说,却因为网络信号不佳而无法加…...

从CEO到营销技术专家:创业者退休后的身份重构与价值延续

1. 从创业者到“退休者”:身份的骤然转变卖掉自己一手创办并经营了近四十年的公司,这种感觉,远非“退休”二字可以概括。它不是一次计划已久的悠闲旅行,更像是一场毫无预兆的急刹车。前一天,你还在会议室里为下一代产品…...

DevSquad:基于Docker Compose的一站式开发环境解决方案

1. 项目概述:一个为开发者量身定制的“特种作战小队”如果你是一名开发者,无论是独立作战还是身处团队,一定都经历过这样的场景:为了搭建一个项目,你需要反复安装和配置各种开发工具、运行环境、依赖包。从代码编辑器、…...

AI心智理论评估:VLM意图理解接近人类,但视角采样能力存在瓶颈

1. 项目概述:当AI“读懂”人心时,它在想什么?在人工智能领域,有一个听起来颇具哲学意味的挑战:如何让机器理解“心智”?这不仅仅是让AI识别图像中的物体或生成流畅的文本,而是让它能够像人类一样…...

5分钟快速上手:Blender 3MF插件让你轻松实现3D打印模型转换

5分钟快速上手:Blender 3MF插件让你轻松实现3D打印模型转换 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经在Blender中精心设计了色彩丰富的3D模型…...

2012年Accellera标准演进:SystemC、UCIS与AMS如何重塑EDA设计流程

1. 回顾2012:Accellera在电子设计自动化标准演进中的关键一年对于从事半导体设计,特别是系统级设计、验证和IP集成的工程师来说,2012年是一个值得标记的年份。那一年,行业正从2008年金融危机后的缓慢复苏中走出,移动计…...

联发科2012年崛起:从功能机到智能机的转型与挑战

1. 从功能机到智能机的惊险一跃:联发科的2012年2012年,对于全球移动芯片行业来说,是几家欢喜几家愁的一年。诺基亚和黑莓的持续衰落,直接拖垮了像ST-Ericsson这样深度绑定的芯片供应商;即便是巨头如高通,也…...

西安石油大学仪光实践协会4月活动机械蝴蝶台灯

项目简介该项目使用stm32芯片设计了一个灯光,300减速,可灯光颜色变化,和电机转向控制。制作了一个简单有趣的动态可控台灯。使用电源控制ic芯片,可与连接电池,对电池进行充电,并且显示电池剩余电量。实现制…...

AMD Ryzen终极性能调优秘籍:5个高效调试技巧让你完全掌控处理器性能

AMD Ryzen终极性能调优秘籍:5个高效调试技巧让你完全掌控处理器性能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址…...

从零部署私有化AI对话框架:igogpt架构解析与实战指南

1. 项目概述与核心价值最近在折腾AI应用部署的朋友,可能都听说过一个词叫“套壳ChatGPT”。这类项目通常是把OpenAI的API接口包装一下,做个Web界面,让用户能更方便地使用。但今天要聊的这个项目——igolaizola/igogpt,它给我的感觉…...

从AMD Ryzen数据误读看硬件市场分析:如何辨别数据信号与噪声

1. 从一则旧闻谈起:数据解读的陷阱与行业洞察2017年7月,一则关于AMD Ryzen处理器市场份额的新闻在科技圈引发了不小的讨论。当时,多家媒体援引第三方基准测试软件Passmark的数据,宣称AMD凭借新发布的Ryzen架构,正在从英…...

Obsidian Quiz Generator:用AI从笔记生成交互测验,打造学习闭环

1. 项目概述:用AI将笔记变成互动测验 如果你和我一样,是个重度Obsidian用户,同时又经常需要备考、复习或者制作教学材料,那你肯定体会过那种痛苦:面对几十上百页的笔记,想要生成一些高质量的练习题来检验学…...

TTS听觉校对法:技术写作质量提升的工程实践指南

1. 为什么我们需要“听”自己的文字:一个被忽视的校对革命作为一名写了十几年技术文档和博客的老兵,我敢说,最让我头疼的不是构思,也不是码字,而是最后那一步——校对。你肯定也经历过:一封精心撰写的邮件发…...

ATE PCB组装:半导体测试中的精密工艺与挑战解析

1. ATE PCB组装:半导体测试的基石与挑战 在半导体行业,一颗芯片从设计到最终封装出厂,其性能与可靠性的验证是决定产品成败的最后一环。随着芯片工艺节点不断微缩,集成度呈指数级增长,对测试环节的要求也达到了前所未有…...

无线充电技术:从手机标配到多场景应用的挑战与机遇

1. 无线充电市场现状:繁荣表象下的应用困境手机无线充电,现在几乎成了旗舰机的标配。从咖啡馆、机场到汽车中控台,充电垫的身影随处可见。作为一名在电源管理和消费电子领域摸爬滚打了十几年的工程师,我亲眼见证了Qi标准从实验室走…...

Blender 3MF插件:5分钟掌握3D打印文件格式转换的完整方案

Blender 3MF插件:5分钟掌握3D打印文件格式转换的完整方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否曾经在Blender中精心设计了完美的3D模型&…...

从1991年Wescon展会看测试测量技术演进:DSP、GPIB与经典仪器解析

1. 从一份老杂志的周五测验说起:重温1991年Wescon展会的测试测量世界最近在整理资料时,翻到一篇2016年《EE Times》上的老文章,标题叫“周五测验:Wescon测试产品”。文章的核心是带读者回顾1991年EDN杂志为Wescon展会出版的一份厚…...

从专利数量到创新质量:解读中国专利申请背后的产业逻辑与价值评估

1. 从“专利数量”到“创新质量”:一个从业者的深度观察最近和几位在半导体和物联网领域做研发的朋友聊天,话题不约而同地转到了知识产权上。大家普遍的感觉是,现在无论是产品立项、技术合作还是出海竞争,专利已经从一个“锦上添花…...

【领域驱动设计 开篇】零 来源及学习路径

DDD是什么 2003 年,Eric Evans 写了《领域驱动设计:软件核心复杂性应对之道》一书,正式提出了这种方法。领域驱动设计的英文是 Domain-Driven Design,简称 DDD。 按照作者自己的说法,“DDD 是一种开发复杂软件的方法”…...

芯片设计中的工程迷信与理性实践:从经验法则到数据驱动

1. 项目概述:从“黑色星期五”迷信到工程设计的理性思考作为一名在电子设计自动化(EDA)和半导体行业摸爬滚打了十几年的工程师,我每天打交道的是精确到纳秒的时序分析、纳米级的物理规则和数以亿计的晶体管布局。在这个世界里&…...

虚拟原型技术:软硬件协同开发与多核处理器调试新范式

1. 虚拟原型平台:从芯片设计到软件集成的范式转变在嵌入式系统开发领域,尤其是涉及复杂多核处理器的项目里,一个长期存在的“鸡生蛋还是蛋生鸡”的困境一直困扰着工程师们:硬件原型板(EVB)尚未就绪&#xf…...

CES 2016行业转向:从酷炫到实用,安全与服务成核心

1. 从“酷炫”到“实用”:CES 2016的行业转向解析每年一月的拉斯维加斯,对于科技行业而言,都像是一场盛大的朝圣。CES(国际消费电子展)不仅是新品发布的舞台,更是行业风向的晴雨表。2016年的CES&#xff0c…...

芯粒技术:从封装协同到UCIe标准,破解芯片设计新范式

1. 芯片设计范式的演进:从单片到芯粒在半导体行业摸爬滚打了十几年,亲眼见证了芯片设计从追求单一巨无霸的“单片系统”(SoC)时代,逐渐转向一个更灵活、也更复杂的“乐高积木”时代。这个转变的核心,就是芯…...