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的选择更多是基于设计意图和代码风格,而不是严格的规则。

相关推荐
PAK向日葵34 分钟前
【算法导论】如何攻克一道Hard难度的LeetCode题?以「寻找两个正序数组的中位数」为例
c++·算法·面试
爱装代码的小瓶子2 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
Maybe_ch3 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨3 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王3 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
Edingbrugh.南空4 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
CodeCraft Studio5 小时前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_4376643145 小时前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
aramae5 小时前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
封奚泽优5 小时前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui