动态内存
动态内存是指程序在运行时通过堆(heap)分配的内存,用于在程序执行过程中动态创建和管理数据。在 C++ 中,动态内存使用 new 和 delete 操作符进行分配和释放。 分配单个对象1234int* ptr = new int; // 分配一个整数*ptr = 42; // 给分配的内存赋值std::cout << *ptr << std::endl;delete ptr; // 释放内存 在 C++ 中,还可以使用动态内存分配为类的对象分配内存。通过 new 操作符可以创建对象,同时调用构造函数进行初始化。使用完对象后,需要用 delete 释放内存以调用析构函数并回收资源。123456789101112131415161718192021222324252627282930313233343536373839#include <iostream>using namespace std;// 基类class Animal {public: Animal() { ...
C++11 新特性
C++的发展 早期的 C++ 被称为 “C with Classes”,引入了类(Class)概念,以及构造函数、析构函数和基本的面向对象编程支持。 1983 年,“C++” 的名字首次出现,代表着比 C 更进一步,同年,第一个正式的 C++ 编译器 Cfront 诞生,这是基于 C 编译器的一个预处理器。 1998 年,C++98,成为第一个 ISO 标准版本。 2003 年,C++03,是对 C++98 的小幅修订,主要修复了细节问题。 2011 年,C++11,C++的崛起,引入了许多革命性特性。如:auto 关键字、Lambda 表达式等。 2014 年,C++14,小幅改进 C++11,增强了 Lambda 表达式和标准库。 2017 年,C++17,新增特性包括结构化绑定(Structured Bindings)、std::optional 和 文件系统支持。更关注现代开发需求,尤其是代码可读性和性能优化。 2020 年,C++20,大规模升级,包括概念(Concepts)、协程(Coroutines)和模块化(Modules),C++20 被认为是现代 C++...
数据封装和数据抽象
数据封装所有的 C++ 程序都有以下两个基本要素: 程序语句(代码):这是程序中执行动作的部分,它们被称为函数。 程序数据:数据是程序的信息,会受到程序函数的影响。 数据封装(Data Encapsulation)是面向对象编程(OOP)的一个基本概念,它通过将数据和操作数据的函数封装在一个类中来实现。这种封装确保了数据的私有性和完整性,防止了外部代码对其直接访问和修改。 实例1234567891011121314151617181920212223242526272829303132333435#include <iostream>using namespace std; class Adder{ public: // 构造函数 Adder(int i = 0) { total = i; } // 对外的接口 void addNum(int number) { total += number; }...
模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。 函数模板所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。模板函数定义的一般形式如下所示:12345template <typename T >返回类型 函数名 (形式参数表){ //函数体} T是一个占位符类型,可以用任何合法的标识符替代。 T在函数体中表示实际类型,会在调用时被推导或显式指定。 返回类型和参数列表可以使用模板类型T。 模板可以有多个参数,用逗号分隔。template<typename T1,typename T2>, 但是定义了就要用,不用会报错。 实例:123456789101112131415161718192021222324252627#include <iostream>#include <string>using...
命名空间
命名空间是一个封装机制,用于将标识符(如变量、函数、类等)组织在一起。这样同名的标识符可以出现在不同的命名空间中,避免名称冲突。本质上,命名空间就是定义了一个范围。 定义命名空间命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:123namespace namespace_name {// 代码声明} 访问命名空间命名空间中的代码可以通过以下两种方式访问: 使用作用域解析运算符::如下所示:1name::code; // code 可以是变量或函数实例1234567891011121314151617181920212223242526#include <iostream>using namespace std; // 第一个命名空间namespace first_space{ void func(){ cout << "Inside first_space" << endl; }}// 第二个命名空间namespace...
多态
多态 (Polymorphism) 是面向对象编程中的一个重要特性,它允许同一个操作或函数在不同的情况下有不同的表现方式。C++中的多态分为静态多态和动态多态。 静态多态静态多态是在编译时决定调用哪个函数或操作,它主要通过函数重载和运算符重载实现。 函数重载函数重载是指在同一作用域内,可以定义多个同名函数,但它们的参数列表(参数类型、参数个数、参数顺序)必须不同。编译器在编译时根据函数调用时的参数列表来确定调用哪个函数。12345678910111213141516171819#include <iostream>using namespace std;class Math {public: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; }};int main() { Math math; cout...
继承和派生
继承和派生是密切相关的两个概念,从不同的视角来看待父类与子类的关系。继承是从父类(基类)角度描述的,它强调的是子类可以复用父类的成员。换句话说,父类为子类提供了功能,并且这种功能可以被扩展或修改;派生是从子类角度描述的,它强调的是子类是从父类生成的,并在父类的基础上扩展或修改功能。 1. 基本语法12345678class 基类名 { // 基类的成员};class 派生类名 : 访问权限 基类名 { // 派生类的成员}; 访问控制符可以是public、protected、private,分别表示公有继承、保护继承、私有继承。 2....
类的成员函数
在C++中,类的成员函数是定义在类内部的函数,用于描述类对象的行为或操作。它们可以通过对象或类的实例来调用。成员函数分为几类,包括普通成员函数、构造函数、析构函数、静态成员函数、常量成员函数等。 1. 成员函数的定义方式 在类内定义:定义直接放在类体内,通常是小型函数 在类外定义:定义放在类体之外,需要使用作用域解析运算符 :: 来指定函数所属的类 2. 成员函数的访问权限根据关键字 public、protected、private,成员函数的访问权限分为以下三种: public:可以从类外通过对象访问。 protected:只能在类内或派生类中访问。 private:仅在类内访问。 3. 普通成员函数普通成员函数是定义在类内部的函数,用于描述类对象的行为或操作。它们可以通过对象或类的实例来调用。 4. 常成员函数 不允许修改成员变量 在函数声明后加 const 关键字。 123456789101112131415class MyClass {private: int value;public: MyClass(int v) : value(v)...
自动控制理论(经典控制)
控制系统的基本要求稳、快、准 稳定性:稳定性是控制系统的基本要求之一,指的是在受到扰动或输入变化时,系统能够回归平衡状态。 快速性:指系统从输入变化到输出稳定所需的时间,通常通过响应速度和过渡时间来衡量。 精确性:...
关于控制器的设计
...