FX-C++结构体与类的区别

1. 默认访问控制

这是struct和class最显著的区别:

  • struct:

    • 默认的成员访问权限是public。

    • 默认的继承方式是public继承。

  • class:

    • 默认的成员访问权限是private。

    • 默认的继承方式是private继承。

示例:默认访问控制
cpp 复制代码
struct MyStruct {
    int x;  // 默认是 public
};

class MyClass {
    int x;  // 默认是 private
};

int main() {
    MyStruct s;
    s.x = 10;  // 合法,x 是 public

    MyClass c;
    // c.x = 10;  // 错误,x 是 private
    return 0;
}

2. 设计意图

  • struct:

    • 通常用于表示简单的数据结构,尤其是当数据成员需要直接访问时。

    • 常用于与C语言兼容的场景,或者不需要复杂封装的情况。

  • class:

    • 通常用于表示更复杂的对象,强调封装和数据隐藏。

    • 适合实现面向对象的设计模式(如继承、多态等)。


3. 继承的默认访问控制

  • struct:

    • 默认继承方式是public继承。

    • 例如:struct Derived : Base {},等价于struct Derived : public Base {}。

  • class:

    • 默认继承方式是private继承。

    • 例如:class Derived : Base {},等价于class Derived : private Base {}。

示例:继承的默认访问控制
cpp 复制代码
struct Base {
    int x;
};

struct DerivedStruct : Base {  // 默认是 public 继承
    void print() { std::cout << x; }
};

class DerivedClass : Base {  // 默认是 private 继承
    void print() {
        // std::cout << x;  // 错误,x 在 Base 中是 private(因为默认是 private 继承)
    }
};

4. 使用场景

  • struct:

    • 适合用于简单的数据聚合,例如点(Point)、矩形(Rectangle)等。

    • 适合与C语言代码交互时使用。

  • class:

    • 适合用于复杂的对象模型,例如学生(Student)、车辆(Vehicle)等。

    • 适合需要封装和数据隐藏的场景。

5. 代码示例对比

以下是一个struct和class的对比示例:

使用struct
cpp 复制代码
#include <iostream>
#include <string>

struct Person {
    std::string name;  // 默认是 public
    int age;           // 默认是 public

    void printInfo() {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

int main() {
    Person p;
    p.name = "Alice";  // 可以直接访问
    p.age = 25;        // 可以直接访问
    p.printInfo();     // 输出: Name: Alice, Age: 25
    return 0;
}
使用class
cpp 复制代码
#include <iostream>
#include <string>

class Person {
    std::string name;  // 默认是 private
    int age;           // 默认是 private

public:
    void setName(const std::string& n) { name = n; }
    void setAge(int a) { age = a; }
    void printInfo() {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

int main() {
    Person p;
    p.setName("Alice");  // 必须通过公共方法访问
    p.setAge(25);        // 必须通过公共方法访问
    p.printInfo();       // 输出: Name: Alice, Age: 25
    return 0;
}

6. 总结对比表

特性 struct class
默认访问控制 成员默认是public 成员默认是private
默认继承方式 默认是public继承 默认是private继承
设计意图 简单数据聚合,与C兼容 复杂对象模型,强调封装
常见用途 点、矩形、配置参数等 学生、车辆、银行账户等

7. 选择struct还是class?

  • 如果需要直接访问数据成员,或者与C语言兼容,优先使用struct。

  • 如果需要封装和数据隐藏,或者实现复杂的面向对象设计,优先使用class。

在实际开发中,struct和class的选择更多是基于设计意图和代码风格,而不是严格的规则。

相关推荐
爱吃提升4 分钟前
Dev-C++ 5.11 完整版快捷键大全(信奥/初学适用)
c语言·c++
Soari8 分钟前
交换机转发模式
开发语言·网络·php
deviant-ART18 分钟前
Java 并发编程:深入理解 synchronized 的使用与原理
java·开发语言·后端
kimnoic32 分钟前
Python中使用封装类还是函数以及它们的区别
开发语言·python
代码什么用33 分钟前
Java Web 21-22
java·开发语言·web
青柠之夏cc37 分钟前
Python Java PHP底层对比:内存并发性能全解析
开发语言·python·线程
半亩码田43 分钟前
C#转Python第5.1篇:异步编程:asyncio vs async/await,语法相似但机制不同
开发语言·python·c#
SWAGGY..1 小时前
【C++进阶】:(10)哈希表的原理与实现——从哈希函数到哈希桶
c++·哈希算法·散列表
码匠许师傅1 小时前
【C++三方组件】redis-plus-plus:现代 Redis C++ 客户端
java·c++·redis
LMT_Lanmantech1 小时前
MATLAB合规管理:如何避免侵权赔偿和审计风险
开发语言·matlab·信息可视化