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

1. 默认访问控制

这是structclass最显著的区别:

  • 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. 代码示例对比

以下是一个structclass的对比示例:

使用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

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

相关推荐
仰泳的熊猫2 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
似水明俊德6 小时前
02-C#.Net-反射-面试题
开发语言·面试·职场和发展·c#·.net
Thera7776 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
炘爚7 小时前
C语言(文件操作)
c语言·开发语言
阿蒙Amon7 小时前
C#常用类库-详解SerialPort
开发语言·c#
凸头7 小时前
CompletableFuture 与 Future 对比与实战示例
java·开发语言
wuqingshun3141598 小时前
线程安全需要保证几个基本特征
java·开发语言·jvm
君义_noip8 小时前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
Moksha2628 小时前
5G、VoNR基本概念
开发语言·5g·php
jzlhll1238 小时前
kotlin Flow first() last()总结
开发语言·前端·kotlin