C++结构体(Struct)详解

C++ 中的结构体(struct)是一种复合数据类型,用于将多个不同类型的变量组合成一个逻辑单元。它和 class非常相似,但有一些关键区别(主要是默认访问权限)。


一、核心概念与用法

1. ​定义结构体

struct Person {
    std::string name;  // 成员变量(字段)
    int age;
    double height;
}; // 注意分号!

2. ​初始化结构体

// 列表初始化(按成员声明顺序)
Person p1 = {"Alice", 25, 1.65};

// C++20 指定成员初始化(顺序无关)
Person p2 { .name="Bob", .height=1.80, .age=30 };

// 构造函数初始化(自定义构造逻辑)
struct Point {
    int x, y;
    Point(int a, int b) : x(a), y(b) {}
};
Point p3(10, 20);

3. ​访问成员

// 点运算符(对象)
p1.name = "Carol";
cout << p1.age;

// 箭头运算符(指针)
Person* ptr = &p1;
cout << ptr->height;

二、 结构体 vs 类(class)

特性

struct

class

默认访问

public

private

继承

默认 public继承

默认 private继承

典型用途

数据聚合(无复杂行为)

封装数据+行为(OOP)

💡 实际开发中:

  • 若只需打包数据 → 用 struct
  • 若需封装、继承、多态 → 用 class

三、 高级用法

1. ​嵌套结构体

struct Address {
    string city;
    string street;
};

struct Employee {
    string name;
    Address homeAddr; // 嵌套结构体
};

2. ​成员函数

struct Rectangle {
    int width, height;
    
    // 成员函数
    int area() const { 
        return width * height; 
    }
};

3. ​作为函数参数/返回值

// 传引用避免拷贝(加 const 防修改)
void printPerson(const Person& p) {
    cout << p.name << " is " << p.age << " years old.";
}

// 返回结构体(可直接构造返回)
Person createPerson() {
    return {"Dave", 40, 1.75};
}

四、关键注意事项

  1. 内存对齐

    结构体大小可能大于成员总和(编译器填充字节对齐):

    struct Example { 
        char c;   // 1字节
        int i;    // 4字节
    }; 
    // 大小可能是 8 字节(而非 5 字节)
  2. 传递开销

    大型结构体传值时拷贝代价高 → ​始终用引用传递​:

    // 推荐做法 ✅
    void process(const BigStruct& data);
    
    // 避免做法 ❌
    void process(BigStruct data);

五、实际应用场景

  • 数据记录​:存储数据库条目、配置文件
  • 图形处理​:Point(x,y), Color(r,g,b)
  • 硬件交互​:寄存器映射、协议数据包
  • 轻量对象​:不需要复杂行为的简单对象

六、完整示例

#include <iostream>
#include <string>

struct Book {
    std::string title;
    std::string author;
    int pages;

    void print() const {
        std::cout << title << " by " << author 
                  << " (" << pages << " pages)\n";
    }
};

int main() {
    Book myBook = {"The C++ Programming Language", "Bjarne Stroustrup", 1360};
    myBook.print();

    // 修改成员
    myBook.pages = 1400; 
    std::cout << "Updated pages: " << myBook.pages;
    return 0;
}

输出​:

The C++ Programming Language by Bjarne Stroustrup (1360 pages)
Updated pages: 1400

七、最佳实践建议

  1. 优先用 struct组织纯数据集合
  2. 超过 16 字节的结构体用引用传递
  3. 对不修改成员的函数使用 const(如 print()
  4. C++20 起使用指定初始化增强可读性

结构体是 C++ 中构建复杂数据模型的基石,合理使用能让代码更清晰高效!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浩瀚之水_csdn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值