C++结构体的定义

结构体的介绍

结构体(struct)是C语言中用于封装多种数据类型的重要工具,其定义方式灵活且功能强大。结构体的核心目的是将​​不同类型的数据​​组合成一个整体。






结构体的应用场景

  • 数据封装: 将姓名、学号等不同类型的相关数据组合成一个有意义的“整体”,便于管理和传递(如表示学生、日期、点)。

  • 复杂数据结构基础: 作为构建链表、树、图等高级数据结构的基本单元

  • 函数参数/返回值: 简化函数间多参数或多结果的传递。

  • 硬件/文件映射: 在嵌入式或文件I/O中,精确映射内存或文件的数据布局。

  • C++ 中类的简化版: 在 C++ 中,struct 可包含函数,默认成员为 public,常用于表示纯数据结构。






结构体的基本语法框架

struct [结构体标签] {
	数据类型 成员1;
	数据类型 成员2;
	// ...
} [变量列表];
  • struct​:关键字,标识结构体类型。

  • ​结构体标签​​(可选):用于后续引用该结构体类型(如定义新变量)。

  • ​成员列表​​:包含不同数据类型的变量声明。

  • ​变量列表​​(可选):可直接在此处定义结构体变量。

  • 特性

    1. 成员可以是任意数据类型(如intchar、数组,甚至其他结构体)。
    2. 结构体变量的大小由成员总大小及内存对齐规则决定。






结构体定义的四种典型方式

标准方式(声明与定义分离)

特点

先声明结构体类型,再定义变量,适应于全局或多次使用。

格式

  • 带有标签(tag)或名称的结构体定义格式

    struct 结构体名称{
    	变量类型 变量名;
    	变量类型 变量名;
    	......;
    };
    
  • 结构体声明格式

    结构体名称 变量名;
    
  • 赋值结构体成员

    声明的变量名.结构体中的变量名 = 变量值;
    

示例1

  • 代码
    #include <iostream>
    using namespace std;
    
    struct Book {
        string title;
        string author;
    };
    
    int main() {
        struct Book book1; // C语言需加struct,C++可省略
        Book book2;        // C++中直接使用类型名
    
        book2.title = "三国演义";
        book2.author = "罗贯中";
    
        cout << "书名: " << book2.title << endl;
        cout << "作者: " << book2.author << endl;
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    

声明时直接定义变量

特点

简洁,在结构体声明后直接创建变量,适合一次性使用。

格式

  • 声明结构体类型时直接定义变量的格式

    struct 结构体名称{
    	变量类型 变量名;
    	变量类型 变量名;
    	......;
    }变量名,变量名,......;
    
  • 赋值结构体成员

    声明的变量名.结构体中的变量名 = 变量值;
    

示例1

  • 代码
    #include <iostream>
    using namespace std;
    
    struct Book {
        string title;
        string author;
    }a,b; 
    
    int main() {
        a.title = "三国演义";
        a.author = "罗贯中";
    
        b.title = "水浒传";
        b.author = "施耐庵";
    
        cout << "书名: " << a.title << endl;
        cout << "作者: " << a.author << endl;
    
        cout << endl;
    
        cout << "书名: " << b.title << endl;
        cout << "作者: " << b.author << endl;
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    
    书名: 水浒传
    作者: 施耐庵
    

匿名结构体

特点

无类型名,仅能通过变量访问,适用于局部简单场景

格式

  • 匿名结构体定义并直接声明变量

    struct {
    	变量类型 变量名;
    	变量类型 变量名;
    	......;
    }变量名,变量名,......;
    
  • 赋值结构体成员

    声明的变量名.结构体中的变量名 = 变量值;
    

示例1

  • 代码
    #include <iostream>
    using namespace std;
    
    struct {
        string title;
        string author;
    }a,b; 
    
    int main() {
        a.title = "三国演义";
        a.author = "罗贯中";
    
        b.title = "水浒传";
        b.author = "施耐庵";
    
        cout << "书名: " << a.title << endl;
        cout << "作者: " << a.author << endl;
    
        cout << endl;
    
        cout << "书名: " << b.title << endl;
        cout << "作者: " << b.author << endl;
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    
    书名: 水浒传
    作者: 施耐庵
    

使用typedef别名简化

特点

通过typedef为结构体创建别名,增强代码可读性(C风格)。

格式

  • 普通结构体别名简化

    typedef struct 结构体名称{
    	// 成员
    
    }新的类别名;
    
  • 匿名结构体别名简化

    typedef struct{
    	// 成员
    
    }新的类型别名;
    
  • 结构体声明格式

    结构体名称 变量名;
    
  • 赋值结构体成员

    声明的变量名.结构体中的变量名 = 变量值;
    

示例1

  • 代码
    #include <iostream>
    using namespace std;
    
    typedef struct {
        string title;
        string author;
    }Book; 
    
    int main() {
        Book a;
        Book b;
        
        a.title = "三国演义";
        a.author = "罗贯中";
    
        b.title = "水浒传";
        b.author = "施耐庵";
    
        cout << "书名: " << a.title << endl;
        cout << "作者: " << a.author << endl;
    
        cout << endl;
    
        cout << "书名: " << b.title << endl;
        cout << "作者: " << b.author << endl;
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    
    书名: 水浒传
    作者: 施耐庵
    

示例2

  • 代码
    #include <iostream>
    #include <string>
    using namespace std;
    
    struct Book{
        string title;
        string author;
    };
    
    typedef Book shuji;
    
    int main(){
        shuji book1 = {"三国演义","罗贯中"};
        shuji book2 = {"水浒传","施耐庵"};
        shuji book3 = {"红楼梦","曹雪芹"};
        shuji book4 = {"西游记","吴承恩"};
    
        shuji book[] = {book1, book2, book3, book4};
    
        for(int i = 0 ; i < 4; ++i){
            cout << "书名:" << book[i].title << ' ' << "作者:" << book[i].author << endl;
        }
    
    
        return 0; 
    }
    
  • 运行
    书名:三国演义 作者:罗贯中
    书名:水浒传 作者:施耐庵
    书名:红楼梦 作者:曹雪芹
    书名:西游记 作者:吴承恩
    






C++对结构体的扩展

包含成员函数

特点​​:C++结构体可封装函数,默认访问权限为public,与类(class)相似但权限不同

示例

  • 代码
    #include <iostream>
    using namespace std;
    
    struct Book{
        string title;
        string author;
    
        // 成员函数:用于设置书名和作者
        // 参数是 const string& 类型,避免不必要的复制,提高效率
        void setDetails(const string& newTitle, const string& newAuthor) {
            title = newTitle;  
            author = newAuthor; 
        }
    
        // 成员函数:用于打印图书信息
        void printInfo(){ 
            cout << "书名: " << title << endl;
            cout << "作者: " << author << endl;
        }
    }a,b; 
    
    int main() {
    
        a.setDetails("三国演义","罗贯中");
        b.setDetails("水浒传","施耐庵");
        
    
        a.printInfo();
    
        cout << endl;
    
        b.printInfo();
    
        cout << endl;
    
        b.setDetails("红楼梦","曹雪芹");
        b.printInfo();
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    
    书名: 水浒传
    作者: 施耐庵
    
    书名: 红楼梦
    作者: 曹雪芹
    

初始化与赋值

直接初始化​​:声明变量时赋值

示例

  • 代码
    #include <iostream>
    using namespace std;
    
    struct Book{
        string title;
        string author;
    
        // 成员函数:用于设置书名和作者
        // 参数是 const string& 类型,避免不必要的复制,提高效率
        void setDetails(const string& newTitle, const string& newAuthor) {
            title = newTitle;  
            author = newAuthor; 
        }
    
        // 成员函数:用于打印图书信息
        void printInfo(){ 
            cout << "书名: " << title << endl;
            cout << "作者: " << author << endl;
        }
    }; 
    
    int main() {
    
        Book a  = {"三国演义","罗贯中"}; // C++11 风格的直接初始化 (带=号)
        // 或者不带=号也可以,效果相同
        Book b{"水浒传","施耐庵"}; // C++11 风格的直接初始化 (不带=号)
        
    
        a.printInfo();
    
        cout << endl;
    
        b.printInfo();
    
        cout << endl;
    
        b = {"红楼梦","曹雪芹"};
    
        b.printInfo();
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    
    书名: 水浒传
    作者: 施耐庵
    
    书名: 红楼梦
    作者: 曹雪芹
    

动态分类内存

动态内存分配​​:结合指针操作

示例

  • 代码
    #include <iostream>
    using namespace std;
    
    struct Book{
        string title;
        string author;
    
        // 成员函数:用于设置书名和作者
        // 参数是 const string& 类型,避免不必要的复制,提高效率
        void setDetails(const string& newTitle, const string& newAuthor) {
            title = newTitle;  
            author = newAuthor; 
        }
    
        // 成员函数:用于打印图书信息
        void printInfo(){ 
            cout << "书名: " << title << endl;
            cout << "作者: " << author << endl;
        }
    }; 
    
    int main() {
        // 1. 动态分配单个内存
        Book* a = new Book;
        Book* b = new Book;
    
        a -> setDetails("三国演义","罗贯中");
        b -> setDetails("水浒传","施耐庵");
    
        a -> printInfo();
        cout << endl;
        b -> printInfo();
    
        cout << "--------------------" << endl;
    
        // 2. 动态分配 Book 结构体数组
        Book* bookarray = new Book[3];
        bookarray[0].setDetails("百年孤独","加西亚·马尔克斯");
        bookarray[1].setDetails("傲慢与偏见","简·奥斯汀");
        bookarray[2].setDetails("杀死一只知更鸟","哈珀·李");
    
        for(int i = 0; i < 3; ++i){
            bookarray[i].printInfo();
            cout << endl;
        }
    
        delete a;
        delete b;
        delete[] bookarray;
    
        a = nullptr;
        b = nullptr;
        bookarray = nullptr;
    
        return 0;
    }
    
  • 运行
    书名: 三国演义
    作者: 罗贯中
    
    书名: 水浒传
    作者: 施耐庵
    --------------------
    书名: 百年孤独
    作者: 加西亚·马尔克斯
    
    书名: 傲慢与偏见
    作者: 简·奥斯汀
    
    书名: 杀死一只知更鸟
    作者: 哈珀·李
    
### 定义结构体的语法 在 C++ 中,`struct` 关键字用于定义新的数据类型,该类型可以包含多个不同类型的成员变量。除了基本的数据成员外,结构体还可以包含函数成员(方法)。这使得 `struct` 和类 (`class`) 的区别仅在于默认访问级别:`struct` 默认为公共访问权限 (`public`) 而 `class` 默认为私有访问权限 (`private`)。 #### 基本语法 以下是定义一个简单结构体的方式: ```cpp #include <iostream> using namespace std; // 定义名为 Student 的结构体 struct Student { char name[50]; int age; float marks; }; int main() { // 创建结构体实例并初始化 Student s1 = {"John", 21, 75.5}; // 访问结构体成员 cout << "Name: " << s1.name << endl; cout << "Age: " << s1.age << endl; cout << "Marks: " << s1.marks << endl; return 0; } ``` 此代码展示了如何声明一个新的结构体类型以及创建其对象来存储学生的信息[^1]。 #### 结构体内嵌套其他结构体 可以在另一个结构体内部定义或使用现有的结构体作为成员之一。这种特性允许构建复杂的数据模型。 ```cpp // 定义地址结构体 struct Address { string street; string city; }; // 使用 Address 类型作为 Person 结构的一部分 struct Person { string firstName; string lastName; Address address; // 内部含有 Address 类型的对象 }; int main(){ Person person1 = {"John", "Doe", {"Main St.", "New York"}}; cout << "Full Name: " << person1.firstName << ' ' << person1.lastName << '\n'; cout << "Address: " << person1.add
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

( ̄▽ ̄).

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值