Skip to main content

Command Palette

Search for a command to run...

C++ 结构体 完整笔记

Updated
•4 min read•View as Markdown
C++ 结构体 完整笔记
T
确定性世界里,一个被允许的异常

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++)

  1. 默认访问权限

    • 结构体(struct):默认 public

    • 类(class):默认 private

  2. 其余语法完全互通:都支持成员变量、成员函数、构造/析构、继承、重载等。

十、整体速记总结

  1. 结构体是复合数据类型,C++ 兼容面向对象特性;

  2. 初始化支持列表赋值,可定义构造、拷贝、析构函数;

  3. 成员函数直接访问内部变量,const 函数只读不可改;

  4. 函数参数优先使用 const 引用,高效又安全;

  5. 普通对象用 . 访问成员,指针用 -> 访问成员;

  6. 支持数组、指针、嵌套,可组合复杂业务数据。

3 views

More from this blog

离散数学5.1-二元关系一

一、有序对和笛卡尔积 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

Jun 25, 20261 min read14
离散数学5.1-二元关系一
天

天创域

37 posts

欢迎来到天创的博客