C++进阶——类与对象

一、基础概念

  1. 什么是类?

定义:类是用户自定义的数据类型,是对象的蓝图或模板。
组成:

成员变量(属性):描述对象的特征(如:汽车的品牌、颜色)
成员函数(方法):定义对象的行为(如:汽车启动、加速)

  1. 什么是对象?

定义:对象是类的实例(Instance),占用内存空间。
类比:

类 → 建筑设计图纸
对象 → 按图纸建造的房子

二、类的定义与使用

  1. 基本语法
class ClassName {
public:     // 访问修饰符(后续详解)// 成员变量DataType member1;DataType member2;// 成员函数ReturnType method1(Parameters) { ... }ReturnType method2(Parameters);
};// 类外定义成员函数
ReturnType ClassName::method2(Parameters) { ... }
  1. 示例:汽车类
#include <iostream>
#include <string>class Car {
public:// 成员变量std::string brand;std::string color;int speed;// 成员函数void accelerate(int increment) {speed += increment;}void displayInfo() {std::cout << brand << " " << color << ", Speed: " << speed << " km/h\n";}
};int main() {// 创建对象Car myCar;myCar.brand = "Toyota";myCar.color = "Red";myCar.speed = 0;// 调用方法myCar.accelerate(20);myCar.displayInfo(); // 输出: Toyota Red, Speed: 20 km/hreturn 0;
}

三、访问控制

  1. 访问修饰符
  • public:类外可直接访问
  • private(默认):仅类内和友元可访问
  • protected:类内、派生类、友元可访问
  1. 封装(Encapsulation)原则
    隐藏内部实现,通过公共接口控制访问
  • 目的:规范访问
  • 示例:
class BankAccount {
private:double balance; // 私有变量public:void deposit(double amount) {if (amount > 0) balance += amount;}double getBalance() {return balance;}
};int main() {BankAccount account;account.deposit(1000);// account.balance = -500; // 错误!无法直接访问私有成员std::cout << account.getBalance(); // 正确
}

四、构造函数(Constructor)与析构函数(Destructor)

  1. 构造函数
  • 作用:初始化对象(自动调用)
  • 特点:
    与类同名
    无返回类型
    可重载(多个构造函数)
  • 示例:
class Student {
private:std::string name;int age;public:// 默认构造函数Student() : name("Unknown"), age(0) {}// 带参数构造函数Student(std::string n, int a) : name(n), age(a) {}void display() {std::cout << name << ", " << age << " years old\n";}
};int main() {Student s1;              // 调用默认构造函数Student s2("Alice", 20); // 调用带参数构造函数s2.display(); // Alice, 20 years old
}
  1. 析构函数
  • 作用:清理资源(如释放内存)
  • 特点:
    名称:~ClassName()
    无参数,不可重载
  • 示例:
class FileHandler {
public:FileHandler() { std::cout << "File opened\n"; }~FileHandler() { std::cout << "File closed\n"; } // 析构函数
};int main() {FileHandler f; // 构造时输出// 析构函数在对象离开作用域时自动调用
}
// 输出:
// File opened
// File closed

五、静态成员

  1. 静态变量
  • 特性:
    属于类而非对象
    所有对象共享同一份拷贝
  • 示例:
class Counter {
public:static int count; // 声明静态变量Counter() { count++; }~Counter() { count--; }
};int Counter::count = 0; // 定义并初始化int main() {Counter c1, c2;//定义c1和c2时都进行了加一操作std::cout << Counter::count; // 输出 2
}
  1. 静态函数
  • 只能访问静态成员
  • 示例:
class MathUtils {
public:static int square(int x) { return x * x; }
};int main() {std::cout << MathUtils::square(5); // 输出 25
}

六、继承(Inheritance)

  1. 基本语法
class BaseClass { /* ... */ };// 公有继承
class DerivedClass : public BaseClass { /* ... */ };
  1. 示例:动物类层次
class Animal {
public:void eat() { std::cout << "Eating...\n"; }
};class Dog : public Animal {
public:void bark() { std::cout << "Woof!\n"; }
};int main() {Dog myDog;myDog.eat();  // 继承自基类myDog.bark(); // 派生类自有方法
}

七、多态(Polymorphism)

  1. 虚函数(Virtual Functions)
class Shape {
public:virtual void draw() { // 虚函数std::cout << "Drawing a shape\n";}
};class Circle : public Shape {
public:void draw() override { // 重写虚函数std::cout << "Drawing a circle\n";}
};int main() {Shape* shape = new Circle();shape->draw(); // 输出: Drawing a circledelete shape;
}

八、练习与巩固

基础练习:

定义一个 Book 类,包含书名、作者、价格属性和显示信息的方法。

  • 简单版本代码示例:
#include <iostream>
#include <string>class Book {
public:// 成员变量std::string book_name;std::string author;float price;// 成员函数void displayInfo() {std::cout << book_name << " " << author << ", price: " << price << "yuan\n";}
};int main() {// 创建对象Book mybook;mybook.book_name = "if give me three days light";mybook.author = "omb";mybook.price = 20.5;// 调用方法mybook.displayInfo(); // 输出: Toyota Red, Speed: 20 km/hreturn 0;
}
  • 改进版:

代码评价与改进建议

  1. 封装性不足

问题:成员变量(book_name, author, price)被声明为 public,外部可以直接修改,破坏了面向对象的封装原则。
改进:将成员变量设为 private,通过公共方法(getter/setter)访问。

  1. 缺少构造函数

问题:对象创建后需要逐个手动赋值,容易遗漏初始化。
改进:添加构造函数,方便对象初始化。

  1. 代码规范性

建议:避免 using namespace std;,改为显式使用 std:: 前缀(防止命名冲突)。

改进后的代码:

#include <iostream>
#include <string>class Book {
private:  // 成员变量设为私有,增强封装性std::string book_name;std::string author;double price;  // 使用 double 提高精度public:// 构造函数(初始化成员变量)Book(const std::string& name, const std::string& author_name, double book_price): book_name(name), author(author_name), price(book_price) {}// 显示书籍信息(const 表示不修改成员变量)void displayInfo() const {std::cout << "Book: " << book_name << "\nAuthor: " << author << "\nPrice: " << price << " yuan\n";}// Getter/Setter 方法(保护数据安全)void setPrice(double new_price) {if (new_price >= 0) {  // 简单的数据校验price = new_price;}}double getPrice() const { return price; }// 可以类似添加其他属性的 getter/setter
};int main() {// 使用构造函数初始化对象Book mybook("If I Had Three Days of Light", "Helen Keller", 20.5);// 调用方法显示信息mybook.displayInfo();  // 输出正确的书籍信息// 修改价格(通过 setter)mybook.setPrice(25.0);std::cout << "Updated price: " << mybook.getPrice() << " yuan\n";return 0;
}

改进点详解

  1. 封装性

为什么重要:封装是面向对象的核心原则,可以防止外部代码意外修改对象内部状态。
实现方式:

成员变量设为 private
通过 getPrice() 和 setPrice() 方法访问和修改价格

  1. 构造函数

优势:

  • 强制在创建对象时提供完整初始化数据
  • 避免对象处于“半初始化”状态
  • 使用成员初始化列表(更高效)
    语法:
Book(const std::string& name, const std::string& author_name, double book_price): book_name(name), author(author_name), price(book_price) {}
  1. 输出格式修正

修正后的输出示例:

Book: If I Had Three Days of LightAuthor: Helen KellerPrice: 20.5 yuan

  1. 其他优化

数据类型:price 改为 double(更精确的浮点数)
const 正确性:displayInfo() 和 getPrice() 标记为 const
数据校验:在 setPrice() 中检查价格非负

进阶挑战:

  • 实现一个 Stack 类,包含压栈(push)、弹栈(pop)、查看栈顶元素的方法
  • 使用私有数组存储数据,确保封装性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38319.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L2TP实验

一、拓朴图 二、实验配置 1.基础配置 1.1接口IP及服务配置 [PPPoE Client]interface GigabitEthernet 0/0/0 [PPPoE Client-GigabitEthernet0/0/0]service-manage all permit [NAS]interface GigabitEthernet 0/0/0 [NAS-GigabitEthernet0/0/0]ip add 192.168.0.2 24 [NAS-Gi…

简单实用!百度AI + Raphael AI = 免费生图

简单实用&#xff01;百度AI Raphael AI 免费生图 -- ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b55eda9141d34697b05db0cd60f62b75.png#pic_center) 第一步&#xff1a;下载或截取一些好看的图片当参考图片 第二步&#xff1a;用百度AI描述你想要的图片&…

aws(学习笔记第三十四课) dockerized-app with asg-alb

文章目录 aws(学习笔记第三十四课) dockerized-app with asg-alb学习内容&#xff1a;1. 整体架构1.1 代码链接1.2 代码手动修改部分1.2.1 rds_stack.py1.2.2 efs_stack.py1.2.3 asg_stack.py1.2.4 userdata.sh 1.2 整体架构 2.代码解析2.1 全体app.py2.2 NetworkStatck网络2.3…

面试总结之 Glide自定义的三级缓存策略

一、为什么需要三级缓存&#xff1f; 在移动应用开发中&#xff0c;图片加载性能直接影响用户体验。根据 Google 统计&#xff0c;图片加载延迟超过 1 秒会导致 32% 的用户流失。传统图片加载方案存在以下痛点&#xff1a; 内存占用高&#xff1a;未压缩的大图直接占用大量内…

用Python实现交互式数据可视化:从基础图表到动态仪表板

用Python实现交互式数据可视化&#xff1a;从基础图表到动态仪表板 一、项目背景 本文将通过一个完整的Python项目&#xff0c;展示如何使用Plotly和ipywidgets构建从基础统计到动态交互的全栈数据可视化方案。 二、核心功能模块 1. 数据生成与预处理 np.random.seed(100)…

Linux进程信号

1.信号的认识 生活中例如闹钟&#xff0c;红绿灯&#xff0c;电话铃声等都属于信号&#xff0c;所白了信号就是中断我们正在做的事情&#xff0c;属于进行事件异步通知机制。 在Linux中信号是发给进程的&#xff0c;信号的产生相较于进程是异步的。 信号的相关知识点&#xff…

Java使用FFmpegFrameGrabber进行视频拆帧,结合Thumbnails压缩图片保存到文件夹

引入依赖 <dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.17</version></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ja…

c++项目-KV存储-模仿redis实现kv键值对存储的基本功能。

KV存储引擎的技术解析&#xff1a;数组、哈希与红黑树实现及其在网络I/O中的应用。 内容概要&#xff1a;本文档深入介绍了基于数组、哈希表和红黑树的键值存储引擎的设计与实现。文档首先阐述了系统的总体架构与类图关系&#xff0c;之后分别对底层存储结构进行了详细解释&am…

vue3:十一、主页面布局(优化页面跳转方式)

:router"true" 一、参考文章 vue3:十一、主页面布局(实现基本左侧菜单右侧内容效果)-CSDN博客 参考上述文章可知&#xff0c;页面跳转是通过在js中定义的菜单中携带的path&#xff0c;然后通过菜单的点击事件完成的跳转&#xff0c;现在可以进行优化&#xff0c;直…

深入解析 Java Stream API:筛选子节点的优雅实现!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;筛选子节点的优雅实现 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我们来聊聊 Java 8 中一个非常常见的操作&#xff1a;使用 Stream API 从 Map 中筛选出特定条件的元素。&#x1f389; 具体来说&#xff0c;我们…

统计学重要概念:自由度

在统计学中&#xff0c;自由度&#xff08;degrees of freedom&#xff0c;简称df&#xff09;是一个重要的概念&#xff0c;它表示在计算某个统计量时可以自由变化的值的数量。对于一个样本量为n的样本&#xff0c;自由度通常为n-1&#xff0c;这是因为我们需要用样本数据来估…

数据结构-排序

文章目录 1. 排序的概念2. 常见排序算法的实现2.1 插入排序1&#xff09;插入排序一&#xff09;基本思想二&#xff09;特性及时间复杂度三&#xff09;代码实现 2&#xff09;希尔排序&#xff08;缩小增量排序&#xff09;一&#xff09;基本思想二&#xff09;特性及时间复…

压缩壳学习

壳是什么 壳就是软件的一个保护套&#xff0c;防止软件被进行反编译或被轻易地修改。 其作用就是为了保护软件。 常见的大类壳有压缩壳、加密壳、VM 壳的分类。 压缩壳顾名思义就是用来减小软件的文件大小的&#xff1b;加密壳&#xff0c;通过加密软件来保护软件&#xff…

《AI大模型趣味实战》第6集:基于大模型和RSS聚合打造个人新闻电台

《AI大模型趣味实战》第6集&#xff1a;基于大模型和RSS聚合打造个人新闻电台 摘要 本文将带您探索如何结合AI大模型和RSS聚合技术&#xff0c;打造一个功能丰富的个人新闻电台系统。我们将使用Python和PyQt5构建一个桌面应用程序&#xff0c;该应用可以从多个RSS源抓取新闻&…

(学习总结29)Linux 进程概念和进程状态

Linux 进程概念 冯诺依曼体系结构软件运行与存储分级数据流动的理论过程 操作系统操作系统(Operator System) 概念操作系统的功能与作用系统调用和库函数概念 进程概念描述进程 - PCBtask_struct查看进程通过系统调用获取进程标示符 PID通过系统调用 fork 函数创建进程简单使用…

LLM - CentOS上离线部署Ollama+Qwen2.5-coder模型完全指南

文章目录 离线安装OllamaOllama下载Ollama硬件需求Ollama 常用命令参考Ollama安装Ollama 服务管理&开机启动开启局域网访问 Ollama 服务 离线安装模型gguf 文件格式下载Qwen2.5-Coder-7B-Instruct-GGUF格式选择 ( gguf 版本 )构建Modelfile文件加载并运行离线模型测试 集成…

Linux——信号

目录 Linux——信号1.信号的基础了解2.技术应用角度的信号3.产生信号3.1按键组合3.2系统调用产生信号3.2.1 kill()3.2.2 raise()3.2.3 abort() 3.3**.** 软件条件产生信号3.4硬件异常产生信号3.4.1 /0异常3.4.2 内存越界异常 4.理解信号的存在5.总结一下6.核心转储7.全部信号都…

向量叉积的应用——正反画画

1 解题思路 解题思路涉及的向量积相关知识 c实现 #include<iostream> #include<vector>using namespace std;struct TrianglePoint {int x;int y; };int momentForce(TrianglePoint A, TrianglePoint B, TrianglePoint C) {//AB向量&#xff1a;(B.x-A.x, B.y-A.…

构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据

构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据 概述 本文将指导开发者构建一个MCP(Model Control Protocol)天气服务器,通过暴露get-alerts和get-forecast工具,为Claude for Desktop等客户端提供实时天气数据支持。该方案解决了传统LLM无法直接获取天气…

Web安全策略CSP详解与实践

引言 &#xff1a;在黑客攻击频发的今天&#xff0c;你的网站是否像“裸奔”一样毫无防护&#xff1f;跨站脚本&#xff08;XSS&#xff09;、数据注入等攻击随时可能让用户数据泄露。今天我们将揭秘一个网站的隐形保镖——内容安全策略&#xff08;CSP&#xff09;&#xff0c…