C++结构体
在 C++ 中,结构体(struct) 是一种用户自定义的数据类型,用于将不同类型的数据(变量、函数等)组合成一个整体,以便更方便地管理和操作相关数据。结构体是 C++ 面向对象编程的基础之一,与类(class)类似,但默认访问权限不同。 一、结构体的基本定义与使用1. 定义结构体使用 struct 关键字定义结构体,语法如下:struct 结构体名 { // 成员变量(可以是不同类型) 类型1 变量名1; 类型2 变量名2; // ... // 成员函数(C++ 特有,C 语言结构体不能包含函数) 返回类型 函数名(参数列表) { // 函数体 }}; 示例:定义一个表示“学生”的结构体struct Student { // 成员变量 int id; // 学号 string name; // 姓名 float score; // 成绩 // 成员函数:打印学生信息 void print() { cout << "ID: "...
C++接口
在 C++ 中,接口(Interface) 是一种特殊的类,它只定义“做什么”(即函数声明),而不提供“怎么做”(即函数实现),其核心作用是规定类的行为规范,强制派生类实现特定功能,同时隐藏具体实现细节。 C++ 中没有专门的 interface 关键字,通常通过纯虚函数和抽象类来模拟接口。 一、接口的定义:纯虚函数与抽象类 纯虚函数:在基类中声明的、没有具体实现的虚函数,语法为 virtual 返回值类型 函数名(参数列表) = 0;。 抽象类:包含纯虚函数的类。抽象类不能实例化对象(无法创建具体实例),只能作为基类被其他类继承。 当一个类继承自抽象类时,必须重写所有纯虚函数(提供具体实现),否则该派生类仍为抽象类(也不能实例化)。 二、接口的示例:定义“可打印”接口假设我们需要一个“可打印”的接口,要求所有实现该接口的类都必须提供“打印自身信息”的功能。 #include <iostream>#include <string>using namespace std;// 接口类(抽象类):定义可打印的规范class Printable...
C++继承
在 C++ 中,继承(Inheritance) 是面向对象编程的三大特性之一(封装、继承、多态),它允许一个类(派生类/子类)继承另一个类(基类/父类)的成员(成员变量和成员函数),并可以在此基础上添加新成员或重写原有成员,实现代码复用和功能扩展。 一、继承的基本概念 基类(Base Class):被继承的类,也称为父类。 派生类(Derived Class):继承基类的类,也称为子类。 继承关系:派生类拥有基类的非私有成员(根据访问修饰符规则),同时可以定义自己的新成员。 二、继承的语法通过 class 派生类名 : 继承方式 基类名 声明继承关系,其中继承方式决定基类成员在派生类中的访问权限。 // 基类(父类)class Animal {public: void eat() { cout << "动物吃东西" << endl; }protected: string name; // 保护成员:派生类可访问private: int age; // 私有成员:派生类不可访问};//...
C++函数
函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。 默认的函数声明和定义总是extern的。 一.函数参数如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。 1.传值调用传值调用 是函数参数传递的一种基本方式,其核心特点是:将实参的 “副本” 传递给函数形参,函数内部对形参的修改不会影响外部实参。 传值调用的执行过程 复制实参:当函数被调用时,编译器会为函数的形参创建一个新的变量,并将实参的值复制到这个新变量中(形参与实参是两个独立的变量,占用不同的内存空间)。 函数内操作形参:函数内部对形参的所有修改(如赋值、运算等),都仅作用于这个副本(形参),与外部的实参无关。 函数返回后:形参的生命周期结束(被销毁),实参的值保持调用前的状态不变。 #include <iostream>// 函数:传值调用,形参是n(实参的副本)void increment(int n) { ...
C++封装
在 C++ 中,封装 是面向对象编程的三大核心特性之一(封装、继承、多态),其核心思想“将数据(成员变量)和操作数据的方法(成员函数)捆绑在一起,并隐藏内部实现细节,仅通过公开的接口与外界交互”**。 一、封装的本质:数据隐藏与接口暴露封装的目的是保护数据的安全性和降低代码的耦合度: 隐藏内部细节:将类的核心数据(成员变量)和实现逻辑设为私有(private),防止外界直接修改或误操作。 暴露安全接口:通过公开的成员函数(public)提供对数据的访问和操作,这些接口可以包含校验逻辑,确保数据的合法性。 二、封装的实现:访问修饰符C++...
C++多态
在 C++ 中,多态 是面向对象编程的三大核心特性之一(封装、继承、多态),其核心思想是:“同一接口,不同实现”——即通过基类的接口(成员函数),调用派生类的具体实现,实现代码的灵活扩展。 一、多态的核心机制:虚函数多态的实现依赖于虚函数:在基类中用 virtual 关键字声明的成员函数,允许派生类重写 该函数(函数名、参数、返回值完全相同)。当通过基类指针或引用调用该函数时,编译器会根据实际指向的对象类型,自动选择对应的派生类实现。 二、多态的实现条件 继承关系:必须存在基类和派生类的继承。 虚函数重写:基类中声明 virtual 函数,派生类重写该函数(函数签名完全一致)。 基类指针/引用:通过基类的指针或引用调用虚函数。 三、多态的示例:动物叫假设我们有一个基类 Animal,派生类 Dog 和 Cat,它们都有“叫”的行为,但叫声不同。通过多态,可以用统一的接口调用不同动物的叫声。 #include <iostream>using namespace std;// 基类:动物class Animal {public: //...
C++存储类
存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。 下面列出 C++ 程序中可用的存储类: auto:这是默认的存储类说明符,通常可以省略不写。auto 指定的变量具有自动存储期,即它们的生命周期仅限于定义它们的块。auto 变量通常在栈上分配。 register:用于建议编译器将变量存储在CPU寄存器中以提高访问速度。在 C++11 及以后的版本中,register 已经是一个废弃的特性,不再具有实际作用。 static:用于定义具有静态存储期的变量或函数,它们的生命周期贯穿整个程序的运行期。在函数内部,static变量的值在函数调用之间保持不变。在文件内部或全局作用域,static变量具有内部链接,只能在定义它们的文件中访问。 extern:用于声明具有外部链接的变量或函数,它们可以在多个文件之间共享。==默认情况下,全局变量和函数具有 extern 存储类。==在一个文件中使用extern声明另一个文件中定义的全局变量或函数,可以实现跨文件共享。 从 C++ 17 开始,auto 关键字不再是 C++...
C++常量
一. 字面值常量字面值常量是直接写在代码中的固定值。 类型 描述 示例 整型 整数值,可以使用不同的后缀来指定类型。 100 (int), 100L (long), 0xFF (十六进制) 浮点型 带有小数点的数值。 3.14 (double), 3.14F (float) 字符型 单个字符,用单引号 ' ' 括起来。 'A', '\n' (换行符) 字符串型 零个或多个字符的序列,用双引号 "" 括起来。 "Hello World", "" (空字符串) 布尔型 只有两个值:true 和 false。 true, false 1.字符常量在 C++ 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码: 转义序列 含义 \ 字符 \’ ‘ 字符 \” “ 字符 \? ?...
C++变量
变量其实只不过是程序可操作的存储区的名称。 C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。 一.C++中的变量定义变量定义是为变量分配存储空间的动作。 作用: 它告诉编译器:“我要创建一个名为 X、类型为 Y 的变量,请在内存中为它留出空间。” 特性: 唯一性: 每个变量在整个程序中只能被定义一次。 内存分配: 定义会伴随着内存的分配。 初始化: 定义时可以同时对变量进行初始化(赋值)。 示例:int a; // 定义:为 int 类型的变量 a 分配内存,并默认初始化double pi = 3.14159; // 定义:为 double 类型的变量 pi 分配内存,并初始化为 3.14159 二.C++ 中的变量声明变量声明是向编译器告知变量的类型和名称,但不分配内存空间。 作用:...
C++ unordered_map
1.unordered_map 定义unordered_map是 C++ 标准库中的一个容器,它是基于哈希表实现的键值对存储结构。与 unordered_set 类似,unordered_map 提供了快速的查找、插入和删除操作,但它存储的是键值对(key-value)。由于基于哈希表实现,unordered_map 的键是无序的,查找和插入的时间复杂度在平均情况下为 O(1)。 2.unordered_map 的特点: 键值对(key-value)结构:每个元素由一个键和一个对应的值组成,键是唯一的,而值可以是相同的。 无序存储:键值对的存储顺序没有特定规律,是无序的。 基于哈希表:通过哈希函数实现键的映射和查找操作,查找、插入和删除的平均时间复杂度为 O(1)。 不允许重复的键:每个键是唯一的,如果插入一个已存在的键,新的值会覆盖旧的值。 3.常用成员函数和操作:构造函数: unordered_map<string, int> my_map;:创建一个空的 unordered_map,键为 string 类型,值为 int...