C++ 结构体 完整笔记

C++ 结构体 完整笔记
一、结构体基础概念
1. 定义语法
结构体是自定义复合数据类型,可存放多个不同类型的成员变量,C++ 中结构体和类用法高度相似,默认访问权限为 public(类默认 private)。
// 标准定义格式
struct 结构体名
{
// 成员变量
数据类型 成员名1;
数据类型 成员名2;
// 成员函数(C++ 支持)
函数返回值 函数名(参数列表);
}; // 末尾分号不能省略
2. 简单示例
#include <iostream>
#include <string>
using namespace std;
// 定义学生结构体
struct Student
{
int id;
string name;
int age;
};
二、结构体变量创建与初始化
1. 定义变量的三种方式
// 方式1:先定义结构体,再创建变量(最常用)
struct Student s1;
Student s2; // C++ 可省略 struct 关键字
// 方式2:定义结构体同时创建变量
struct Student
{
int id;
string name;
} s3, s4; // 末尾直接定义变量
// 方式3:匿名结构体(无结构体名,只能当场定义变量)
struct
{
int a;
int b;
} num;
2. 初始化方式
(1)顺序初始化(C++11 前通用)
// 逐个赋值
Student s1;
s1.id = 1001;
s1.name = "张三";
s1.age = 18;
// 整体初始化列表
Student s2 = {1002, "李四", 19};
(2)C++11 列表初始化(推荐)
Student s3{1003, "王五", 20};
// 部分初始化,未赋值成员默认置0/空
Student s4{1004};
三、结构体构造函数 & 析构函数
C++ 结构体完全支持构造函数、析构函数,规则和类一致。
1. 构造函数
作用:创建结构体对象时,自动初始化成员变量。 规则:
函数名和结构体名相同,无返回值;
可重载(多个构造函数);
创建对象时自动调用。
示例代码
#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;
}
2. 析构函数
作用:对象销毁时自动调用,常用于释放资源。 规则:
函数名:
~结构体名,无返回值、无参数;只能有一个析构函数,不能重载;
对象生命周期结束时自动执行。
struct Student
{
int id;
// 析构函数
~Student()
{
cout << "析构函数调用,对象销毁" << endl;
}
};
int main()
{
Student s;
return 0; // 函数结束,s 销毁,自动调用析构
}
四、结构体成员函数
结构体内部可以定义普通成员函数、常成员函数,用法和类一致。
1. 基础成员函数
#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;
}
2. const 常成员函数
关键字 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;
};
1. 值传递
// 值传递:创建结构体副本
void funcByValue(MyStruct s)
{
s.id = 999; // 仅修改副本,原数据不变
}
特点:生成独立副本,修改不影响原对象;
缺点:大数据结构体拷贝耗时,效率低;
适用:小型结构体、需要保护原数据。
2. 普通引用传递
// 引用传递:不创建副本,直接操作原对象
void funcByRef(MyStruct &s)
{
s.id = 999; // 直接修改原始数据
}
特点:无副本,效率高;
缺点:函数内修改会同步到原对象;
适用:需要主动修改结构体数据。
3. const 引用传递(开发最常用)
// 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;
}
七、结构体指针
1. 基础用法
指针访问成员:使用
->符号;普通对象访问成员:使用
.符号。
struct Student
{
int id;
};
int main()
{
Student s{1001};
Student *p = &s; // 结构体指针指向对象
cout << p->id; // 指针访问成员:->
return 0;
}
2. 动态开辟内存
// 堆区创建结构体对象
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;
}
九、结构体与类的核心区别(C++)
默认访问权限
结构体(struct):默认
public类(class):默认
private
其余语法完全互通:都支持成员变量、成员函数、构造/析构、继承、重载等。
十、整体速记总结
结构体是复合数据类型,C++ 兼容面向对象特性;
初始化支持列表赋值,可定义构造、拷贝、析构函数;
成员函数直接访问内部变量,
const函数只读不可改;函数参数优先使用 const 引用,高效又安全;
普通对象用
.访问成员,指针用->访问成员;支持数组、指针、嵌套,可组合复杂业务数据。





