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

深圳大学面向对象程序设计(OOP)期末复习

深圳大学面向对象程序设计(OOP)期末复习

所用课本是钱能的《C++程序设计教程》,2025-2026学年春季学期人工智能学院的OOP课程

第十一章 类

类的作用是封装,可以封装多种函数,使得他们不会轻易被外部修改。

一般采用这样的格式:

class Student {
private:// 数据成员public:// 构造函数// getter / setter// 其他成员函数
};

:: 称为作用域解析运算符。

Rectangle::area 表示 area 是 Rectangle 类作用域中的成员

使用类名::函数名,可以明确函数属于哪个类

完整的类外实现

#include <iostream>
using namespace std;class Rectangle {
private:double width;double height;public:// 构造函数声明。Rectangle(double newWidth, double newHeight);// 普通成员函数声明。double area() const;//函数后面的const表面这个成员函数不会修改当前对象double perimeter() const;
};// 构造函数类外实现。
Rectangle::Rectangle(double newWidth, double newHeight): width(newWidth), height(newHeight) {
}// area 类外实现。
double Rectangle::area() const {return width * height;
}// perimeter 类外实现。
double Rectangle::perimeter() const {return 2 * (width + height);
}int main() {Rectangle rect(3.0, 4.0);cout << rect.area() << '\n';cout << rect.perimeter() << '\n';return 0;
}

初始化列表:成员直接被初始化为目标值,比函数体赋值更好,函数体赋值时先完成默认初始化,再被重新赋值。

Student(const string& newName,int newScore):name(newName),score(newScore){}

构造函数重载

同一个类可以有多个构造函数,只要参数列表不同。

class Point {
private:int x;int y;public:// 无参构造函数。Point(): x(0), y(0) {}// 一个参数构造函数。Point(int value): x(value), y(value) {}// 两个参数构造函数。Point(int newX, int newY): x(newX), y(newY) {}
};

使用这样的方式

Point a;
Point b(3);
Point c(3, 4);

就可以分别调用不同构造函数。

这就是构造函数重载

析构函数

在对象生命周期结束时自动调用的特殊成员函数

什么时候运行的位置离开作用域,什么时候执行析构函数。

析构函数不能写返回类型,不能带参数。

动态数组的申请与释放

class IntArray{
private:int* data;int size;
public:IntArray(int n):size(n){//动态申请数组data=new int[size]}~IntArray(){//释放动态数组,由于是多个对象所以是delete[]delete[] data;}
};

静态成员与友元

继承

在已有类的基础上定义一个新类,新类自动拥有原类中的部分成员

比如先定义公共的A类

//基类
class A{
};

再定义出派生类B和C:

//派生类
class B:public A{
};class C:public A{
};

最简单的继承

#include<bits/stdc++.h>
using namespace std;
//定义基类Person
class Person{public:string name;int age;void displayBasicInfo() const{cout<<name<<" "<<age;}
};
//Student公有继承Person
class Student:public Person{public:int score;void display() const{//name和age继承person,score是student中自己定义的成员cout<<name<<" "<<age<<" "<<score<<endl;}
};int main(){Student stu;//Student 对象可以使用继承来的成员。stu.name="Alice";stu.age=19;//score 是 Student 自己新增的成员。stu.score=95;stu.display;return 0;
}

使用继承就不用重复定义很多变量了。

class的默认继承方式

class Student:Person{};

这种方式默认为private继承,即:

class Student:private Person{};

所以不要忘记写public!!!!!

区分三种成员访问权限

  • private: 本类内部可以访问 派生类不能直接访问 类外不能访问

  • protected: 本类内部可以访问 派生类可以访问 类外不能访问

  • public: 本类内部可以访问 派生类可以访问 类外可以访问

多态

指向同一个接口,根据不同对象表现不同。

三个条件:

  1. 有继承

    class Dog::public Animal
    
  2. 父类条件必须virtual

    class Animal{virtual void speak();
    }
    
  3. 子类重写

    void speak() override
    
  4. 用父类指针或引用调用

    Animal* p=&dog;
    p->speak();
    

多继承

一个孩子两个爸爸。

class SmartPhone:public Camera,public Phone
{};

虚继承

用于解决多继承产生重复父类的问题,即菱形继承问题。

看下图中的TA,就会出现两个person,一个来自student,一个来自teacher

        Person/     \Student   Teacher\     /TA

解决方法:

class Student
:
virtual public Person
{};class Teacher
:
virtual public Person
{};

这样TA只有一个Person

再总结一下代码模板框架:

  1. 普通继承

    class child
    :
    public Parent{};
    
  2. 派生构造

    Child()
    :
    Parent(){}
    
  3. 虚函数

    父类(virtual)

    class Animal{public:virtual void speak(){}
    };
    

    子类(override)

    class Dog::public Animal
    {public:void speak() override{}
    };
    

    调用

    Animal* p=new Dog;
    p->speak();
    
  4. 多继承

    class C
    :
    public A,
    public B
    {
    };
    

运算符重载

Metal operator+
(const Metal& other
)
{return Metal(hardness+other.hardness,weight+other.weight,volume+other.volume);}

友元

允许非成员函数访问private元素

class Metal
{private:int hardness;int weight;int volume;public:Metal(int h,int w,int v);friend Metal operator+(const Metal& a,const Metal& b);};
http://www.jsqmd.com/news/1176851/

相关文章:

  • AI Scaffold 和 LangChain、LangGraph 是什么关系?
  • ReactPrimer新手入门:10分钟学会创建你的第一个组件原型
  • Awesome Wails精选:10个最佳开源桌面应用开发模板推荐
  • 2026 苏州防水补漏实用指南 1 小时上门全场景服务 本地漏水痛点根治方案 - 徽顺虹
  • 开源可见光光谱仪DIY实战指南:从硬件构建到光谱分析
  • huihui-Qwen3-VL-2B-Instruct-ab-4bit:终极视觉语言AI模型MLX版完全指南
  • 北影节「着迷」电影时尚之夜播出 电影跨界盛典打造“破圈”新内容
  • 95coder 2周免Token开发一个企业建站系统(CMS+官网设计器+工作流)
  • Windows Terminal完全指南:从零开始构建现代化终端环境
  • java入门(起始于string截至到内部类)
  • HarmonyKit | 鸿蒙开发展望:HarmonyKit 未来路线图与社区共建
  • AI Agent记忆系统设计:从RAG到Memory Graph的演进路径(附2024最新Benchmark对比数据)
  • ChartDB:企业级多数据库可视化设计的终极解决方案
  • 2026年7月最新苏州泰格豪雅官方售后客服中心地址电话及服务网点分布 - 亨得利官方服务中心
  • ChatGPT给出的代码怎么生成图片?用「AI 导出鸭」一键解决导出乱码痛点
  • 实测优选 AI 导出鸭,从技术层面根治 Kimi 生成的文本到 word 中格式混乱行业通病
  • 2026 福建龙岩市全区域彩钢瓦修缮公司 TOP4 权威推荐|彩钢瓦翻新 / 防水补漏 / 除锈喷漆优选指南 + 避坑攻略 - 本地便民网
  • 如何通过Serverless Application Repository示例构建第一个Lambda函数:Hello World实战指南
  • The Collective Turing Test: Large Language Models Can Generate Realistic Multi-User Discussions
  • IPXWrapper终极指南:5分钟让经典游戏在Windows 10/11完美联机
  • FastAsyncWorldEdit 快速入门:5分钟教你搭建高性能 Minecraft 世界编辑环境
  • 为什么你的 Agent 测试总卡在“幻觉”?从 Demo 到生产环境的权限与可观测…
  • AMD-Quark量化工具实战:从零开始量化MiniMax-M2.1模型
  • Perfsee插件开发:扩展性能分析能力的实用教程
  • Dotto源代码解析:从零构建跨平台像素编辑引擎的技术揭秘
  • 【PythonAI】2.2.3 技能实训:处理缺失值、重复值,进行数据筛选与排序
  • Rufus终极指南:彻底告别系统安装烦恼的免费USB启动盘制作神器
  • ER-Save-Editor终极指南:3分钟学会艾尔登法环存档编辑的完整方法
  • 如何用KLayout免费开源版图设计工具实现芯片设计全流程:从入门到验证的完整指南
  • 性能调优指南:Gemma-4-31B-it 8位量化版内存优化与推理加速技巧