C++ 结构体 完整笔记

Search for a command to run...

No comments yet. Be the first to comment.
一、有序对和笛卡尔积 1、有序对(序偶):由两个元素 x 和 y 按照确定顺序排列组成的二元组,记作⟨x, y⟩ 2、笛卡尔积:以 A 中元素为第一元、B 中元素为第二元,构造所有有序对⟨x,y⟩; 由全部这类有序对构成的集合,称为 A 与 B 的笛卡尔积,记作 AXB 例题: 已知 A={a,b}, B={0,1,2},求笛卡尔积 A × B、B × A A × B(前元取自 A,后元取自 B

1、集合的概念 N元子集:含有n个元素的子集叫做N元子集. 例题:已知集合 A={1,2,3},按元素个数对 A 的所有子集分类 0元子集:∅ 1元子集:{1}, {2}, {3} 2 元子集:{1,2}, {1,3}, {2,3} 3 元子集:{1,2,3} 幂集:设 A 为集合,由 A 的全部子集构成的集合称为 A 的幂集,记作P(A). 例题:A={1,2,3},求A的幂集 答案:P

一、基本元件 元件 符号 说明 例子 个体词 a, b, c... 代表具体对象(常元) a:小明 个体变元 x, y, z... 代表任意对象 x 表示论域中任一元素 谓词 P(x), Q(x,y)... 表示性质或关系 P(x):x是学生; L(x,y):x喜欢y 量词 ∀, ∃ 修饰个体范围 ∀x(所有x); ∃x(存在x) 连接词 ¬, ∧, ∨, →, ↔ 命

本质是"逻辑推导游戏",给定几个前提,用固定规则一步步推出结论。套路固定,背下规则就能拿分。 一、核心推理规则公式: 假言推理(MP)A→B, A ⇒ B肯定前件→肯定后件拒取式(MT)A→B, ¬B ⇒ ¬A否定后件→否定前件假言三段论(HS)A→B, B→C ⇒ A→C蕴含传递析取三段论(DS)A∨B, ¬A ⇒ B否定一边得另一边附加律A ⇒ A∨B或上一个随便什么化简律A∧B ⇒ A (或

定义:S是一个联结词集合,若任一个命题公式都可以由s中的联结词表示出来命题公式与之等价,则称S是一个联结词完备集。 也就是说一个连接词集合,能表达出所有真值函数,称为完备集 以下是完备集: S1={¬,∧,∨} —— 否定、合取、析取 S2={¬,∧,∨,→} —— 否定、合取、析取、蕴涵 S3={¬,∧,∨,→,↔} —— 否定、合取、析取、蕴涵、等价 S4={¬,∧} —— 否定、

结构体是自定义复合数据类型,可存放多个不同类型的成员变量,C++ 中结构体和类用法高度相似,默认访问权限为 public(类默认 private)。
// 标准定义格式
struct 结构体名
{
// 成员变量
数据类型 成员名1;
数据类型 成员名2;
// 成员函数(C++ 支持)
函数返回值 函数名(参数列表);
}; // 末尾分号不能省略
#include <iostream>
#include <string>
using namespace std;
// 定义学生结构体
struct Student
{
int id;
string name;
int age;
};
// 方式1:先定义结构体,再创建变量(最常用)
struct Student s1;
Student s2; // C++ 可省略 struct 关键字
// 方式2:定义结构体同时创建变量
struct Student
{
int id;
string name;
} s3, s4; // 末尾直接定义变量
// 方式3:匿名结构体(无结构体名,只能当场定义变量)
struct
{
int a;
int b;
} num;
// 逐个赋值
Student s1;
s1.id = 1001;
s1.name = "张三";
s1.age = 18;
// 整体初始化列表
Student s2 = {1002, "李四", 19};
Student s3{1003, "王五", 20};
// 部分初始化,未赋值成员默认置0/空
Student s4{1004};
C++ 结构体完全支持构造函数、析构函数,规则和类一致。
作用:创建结构体对象时,自动初始化成员变量。 规则:
函数名和结构体名相同,无返回值;
可重载(多个构造函数);
创建对象时自动调用。
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
int age;
// 1. 默认构造函数(无参)
Student()
{
id = 0;
name = "未知";
age = 0;
cout << "默认构造函数调用" << endl;
}
// 2. 有参构造函数(重载)
Student(int i, string n, int a)
{
id = i;
name = n;
age = a;
cout << "有参构造函数调用" << endl;
}
// 3. 拷贝构造函数
Student(const Student& s)
{
id = s.id;
name = s.name;
age = s.age;
cout << "拷贝构造函数调用" << endl;
}
};
int main()
{
Student s1; // 调用 默认构造
Student s2{1001, "小明", 18}; // 调用 有参构造
Student s3 = s2; // 调用 拷贝构造
return 0;
}
作用:对象销毁时自动调用,常用于释放资源。 规则:
函数名:~结构体名,无返回值、无参数;
只能有一个析构函数,不能重载;
对象生命周期结束时自动执行。
struct Student
{
int id;
// 析构函数
~Student()
{
cout << "析构函数调用,对象销毁" << endl;
}
};
int main()
{
Student s;
return 0; // 函数结束,s 销毁,自动调用析构
}
结构体内部可以定义普通成员函数、常成员函数,用法和类一致。
#include <iostream>
using namespace std;
struct Point
{
int x, y;
// 成员函数:打印坐标
void print()
{
cout << "坐标:(" << x << "," << y << ")" << endl;
}
};
int main()
{
Point p{10, 20};
p.print(); // 调用格式:对象.成员函数()
return 0;
}
关键字 const 修饰函数,禁止修改成员变量,只读使用,建议查询类函数都加上。
struct Point
{
int x, y;
// 常成员函数
void show() const
{
// x = 100; // 报错,const 函数不能修改成员
cout << "坐标:(" << x << "," << y << ")" << endl;
}
};
共 3 种传递方式,区别在是否拷贝、能否修改原数据、执行效率。
#include <iostream>
#include <string>
using namespace std;
struct MyStruct
{
int id;
string name;
};
// 值传递:创建结构体副本
void funcByValue(MyStruct s)
{
s.id = 999; // 仅修改副本,原数据不变
}
特点:生成独立副本,修改不影响原对象;
缺点:大数据结构体拷贝耗时,效率低;
适用:小型结构体、需要保护原数据。
// 引用传递:不创建副本,直接操作原对象
void funcByRef(MyStruct &s)
{
s.id = 999; // 直接修改原始数据
}
特点:无副本,效率高;
缺点:函数内修改会同步到原对象;
适用:需要主动修改结构体数据。
// const 引用:只读、无副本、安全高效
void funcByConstRef(const MyStruct &s)
{
// s.id = 999; // 报错,禁止修改
cout << s.id << endl; // 正常读取
}
特点:兼顾高效率 + 数据保护;
适用:仅读取数据、不做修改的场景。
多个结构体对象可以组成数组,批量管理数据。
#include <iostream>
#include <string>
using namespace std;
struct Student
{
int id;
string name;
};
int main()
{
// 定义结构体数组并初始化
Student stuArr[2] = {
{1001, "张三"},
{1002, "李四"}
};
// 遍历数组
for (int i = 0; i < 2; i++)
{
cout << stuArr[i].id << " " << stuArr[i].name << endl;
}
return 0;
}
指针访问成员:使用 -> 符号;
普通对象访问成员:使用 . 符号。
struct Student
{
int id;
};
int main()
{
Student s{1001};
Student *p = &s; // 结构体指针指向对象
cout << p->id; // 指针访问成员:->
return 0;
}
// 堆区创建结构体对象
Student *p = new Student;
p->id = 1001;
delete p; // 手动释放内存
结构体内部可以包含另一个结构体,实现复杂数据组合。
#include <iostream>
#include <string>
using namespace std;
// 嵌套结构体
struct Birthday
{
int year;
int month;
int day;
};
struct Person
{
string name;
int age;
Birthday birth; // 嵌套结构体成员
};
int main()
{
Person p{"小红", 18, {2008, 6, 1}};
// 多层访问成员:. 逐级调用
cout << p.birth.year << endl;
return 0;
}
默认访问权限
结构体(struct):默认 public
类(class):默认 private
其余语法完全互通:都支持成员变量、成员函数、构造/析构、继承、重载等。
结构体是复合数据类型,C++ 兼容面向对象特性;
初始化支持列表赋值,可定义构造、拷贝、析构函数;
成员函数直接访问内部变量,const 函数只读不可改;
函数参数优先使用 const 引用,高效又安全;
普通对象用 . 访问成员,指针用 -> 访问成员;
支持数组、指针、嵌套,可组合复杂业务数据。