可以做外链网站,登录入口,博创网站建设团队,金山集团网站建设从零到一学习C#xff08;基础篇#xff09; 作者#xff1a;羡鱼肘子 温馨提示1#xff1a;本篇是记录我的学习经历#xff0c;会有不少片面的认知#xff0c;万分期待您的指正。 温馨提示2#xff1a;本篇会尽量用更加通俗的语言介绍c的基础#xff0c;用通俗的语言去… 从零到一学习C基础篇 作者羡鱼肘子 温馨提示1本篇是记录我的学习经历会有不少片面的认知万分期待您的指正。 温馨提示2本篇会尽量用更加通俗的语言介绍c的基础用通俗的语言去解释术语但不会再大白话了哦。常见常看常想渐渐的就会发现术语也是很简单滴。 温馨提示3看本篇前可以先了解前篇的内容知识体系会更加完整哦。 从零到一学习c基础篇--筑基期十-函数-CSDN博客 温馨提示4这部分内容只是入门c类的一个预览就基础阶段而言应该是够用的学习的重心在于了解 类 Class 类Class是C面向对象编程OOP的核心相当于设计图纸用来创建具有特定属性和行为的对象。 那么什么是面向对象编程OOP呢 在这我们抛开传统的术语从日常生活的角度重新解读面向对象编程OOP 1. 角色扮演游戏把代码变成「游戏角色」 想象我们在开发一款 RPG 游戏每个角色都有自己的属性和技能 类Class 角色模板 比如「战士」「法师」的职业模板定义了他们默认的血量、攻击方式。 对象Object 具体的游戏角色 比如你创建了一个叫「亚瑟」的战士他的等级、装备都是独特的。 封装Encapsulation 角色的隐私保护 角色的背包里有什么装备其他角色不能直接翻看必须通过「交易」或「查看」方法交互。 继承Inheritance 职业继承通用能力 「战士」和「法师」都继承了「玩家角色」的基础属性比如移动、说话但各自扩展了专属技能。 多态Polymorphism 同一技能的不同效果 所有角色都有「攻击」技能但战士用剑砍法师放火球效果完全不同。 2. 乐高积木模块化拼装代码 把编程想象成拼乐高 类Class 积木的模具 比如一个「轮子模具」可以生产无数个轮子对象。 对象Object 具体的积木块 用轮子模具造出 4 个轮子装到一辆车上。 组合Composition 用积木拼装复杂结构 车 轮子 车身 引擎每个部分独立开发最后组合成整体。 接口Interface 积木的拼接规则 所有能连接到车身的积木必须有一个「卡扣接口」不管它是轮子还是翅膀。 3. 自然界生物学中的 OOP 思维 用生物进化理解 OOP 类Class 物种分类 比如「猫科动物」的定义有爪子、会捕猎。 对象Object 个体生物 你家的橘猫「大胖」是「猫科动物」类的一个实例。 继承Inheritance 遗传与变异 老虎继承了猫科动物的基础特征但变异出了条纹皮毛。 多态Polymorphism 生存策略的多样性 所有动物都要「觅食」但老鹰抓鱼羚羊吃草行为完全不同。 那到底为什么要用 OOP呢 现实映射代码结构和现实世界一致人类更容易理解比如游戏角色、公司员工。 分工合作像流水线一样不同程序员负责不同类最后组装成大系统。 减少重复公共功能写在父类子类直接复用比如所有员工都要打卡。 灵活扩展新增功能像「打补丁」不影响原有代码比如给游戏角色加一个新技能。 一句话总结 OOP 是把复杂问题拆解成一个个「活的对象」让代码像现实世界一样通过分工、协作、进化来解决问题。 一、类的基础封装与抽象抽象会放到下一个阶段介绍
1. 类是什么 类的定义通常包括以下部分 数据成员类的属性用于存储对象的状态。 成员函数类的行为用于操作数据成员或执行其他任务。 访问控制通过public、private和protected关键字控制成员的访问权限。 详细解释--访问控制 public公有成员可以在类的外部访问。 private私有成员只能在类的内部访问。 protected保护成员可以在类的内部和派生类中访问。 类就像汽车的设计图纸定义了汽车的组成部分属性和功能方法。 代码示例 class Car {
public:// 属性成员变量string brand;int speed;// 方法成员函数void accelerate() { speed 10; }void brake() { speed 0; }
};
2. 封装隐藏细节暴露接口 驾驶员不需要知道发动机如何工作只需踩油门调用方法。 访问控制 public对外公开如油门、刹车。 private内部细节如发动机、电路。 class BankAccount {
private:double balance; // 私有属性外部无法直接访问
public:void deposit(double amount) { balance amount; } // 公开方法
};
3.类与结构体struct class默认成员为privatestruct默认成员为public。 现代C中struct常用于仅包含数据的简单类型POD类型。 二、构造函数与析构函数
1. 构造函数对象的“出生证明” 作用初始化对象属性。 默认构造函数无参数或参数有默认值。 委托构造函数C11复用其他构造函数的代码。 class Student {
public:Student() : Student(匿名, 18) {} // 委托构造函数Student(string name, int age) : name(name), age(age) {}
private:string name;int age;
};
2. 析构函数对象的“临终清理” 作用释放对象占用的资源如内存、文件句柄。 现代C技巧用智能指针unique_ptr/shared_ptr替代手动资源管理。 class FileHandler {
public:FileHandler(const string filename) {file fopen(filename.c_str(), r);}~FileHandler() { if (file) fclose(file); } // 析构时关闭文件
private:FILE* file;
}; 三、类的进阶特性
1. 移动语义C11 问题传统拷贝构造效率低深拷贝大对象。 解决“偷”临时对象右值的资源避免拷贝。 class DynamicArray {
public:// 移动构造函数DynamicArray(DynamicArray other) noexcept : data_(other.data_), size_(other.size_) {other.data_ nullptr; // 原对象置空other.size_ 0;}
private:int* data_;size_t size_;
};
2. constexpr 成员函数C11 作用编译期求值的函数用于常量表达式。 class Circle {
public:constexpr Circle(double r) : radius(r) {}constexpr double area() const { return 3.14 * radius * radius; }
private:double radius;
};constexpr Circle c(5.0);
constexpr double a c.area(); // 编译期计算面积
3. 类成员的默认和删除C11 默认函数显式要求编译器生成默认实现。 删除函数禁用某些函数如拷贝构造。 class NonCopyable {
public:NonCopyable() default;NonCopyable(const NonCopyable) delete; // 禁止拷贝
};
四、继承与多态
1. 继承从基类“遗传”特性 电动汽车子类继承汽车基类的基本属性并增加电池特性。 class ElectricCar : public Car {
public:void charge() { battery 100; }
private:int battery;
};
2. 多态同一接口不同实现 虚函数基类声明 virtual子类用 override 重写C11。 class Shape {
public:virtual double area() const 0; // 纯虚函数抽象类
};class Circle : public Shape {
public:double area() const override { return 3.14 * r * r; } // 重写
private:double r;
};
五、现代C最佳实践
1. 用 override 和 final 明确意图C11 override显式标记重写虚函数避免拼写错误。 final禁止子类进一步重写。 class Base {
public:virtual void func() {}
};class Derived : public Base {
public:void func() override final {} // 正确重写且禁止子类重写
};
2. 委托构造与继承构造C11 继承构造函数复用基类构造函数。 class Base {
public:Base(int x) { /*...*/ }
};class Derived : public Base {
public:using Base::Base; // 继承基类构造函数
};
3. 智能指针管理资源 unique_ptr独占资源所有权。 shared_ptr共享资源所有权。 class Project {
public:void addMember(const shared_ptrMember m) {members.push_back(m);}
private:vectorshared_ptrMember members;
};
六、综合示例现代C类的设计体会一下这种风格就好目前这是了解的内容
#include iostream
#include memory
#include vector// 基类图形
class Shape {
public:virtual double area() const 0; // 纯虚函数virtual ~Shape() default; // 虚析构函数C11
};// 派生类圆形
class Circle : public Shape {
public:constexpr Circle(double r) noexcept : radius(r) {}double area() const override { return 3.14 * radius * radius; }
private:double radius;
};// 图形管理器RAII管理资源
class ShapeManager {
public:void addShape(std::unique_ptrShape shape) {shapes.push_back(std::move(shape));}void printAreas() const {for (const auto s : shapes) {std::cout 面积: s-area() std::endl;}}
private:std::vectorstd::unique_ptrShape shapes;
};int main() {ShapeManager manager;manager.addShape(std::make_uniqueCircle(5.0)); // C14的make_uniquemanager.printAreas();return 0;
}
七、总结类的设计原则建议熟悉哦以后会经常用到的 高内聚低耦合每个类专注单一职责减少依赖。 优先使用组合通过组合其他类构建功能而非过度继承。 资源管理用RAII如智能指针替代手动new/delete。 拥抱现代特性移动语义、override、constexpr等提升代码质量。
小贴士类就是自己的“代码乐高积木”设计得越清晰、模块化程序越容易维护和扩展 从零到一学习c基础篇--筑基期结语 自此我们c的基础篇--筑基期部分就结束了通过筑基期的学习我们对c的一些基础知识有了概要性的了解但是让我们独自去开发某一个项目的话是不是感觉还是比较困难的呢 不要灰心因为我们还没有真正入门。欧克趁热打铁开始从零到一学习c基础篇--入门期的学习吧通过从零到一学习c基础篇--入门期的学习我们就可以比较轻松的实现一些小的项目和小部分大型工程啦。