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的n次方_7 分钟前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
近津薪荼23 分钟前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck25 分钟前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
_F_y30 分钟前
C++重点知识总结
java·jvm·c++
java干货39 分钟前
为什么 “File 10“ 排在 “File 2“ 前面?解决文件名排序的终极算法:自然排序
开发语言·python·算法
_F_y39 分钟前
C语言重点知识总结(含KMP详细讲解)
c语言·开发语言
毕设源码-郭学长40 分钟前
【开题答辩全过程】以 基于python的二手房数据分析与可视化为例,包含答辩的问题和答案
开发语言·python·数据分析
无小道1 小时前
Qt——常用控件
开发语言·qt
aini_lovee1 小时前
MATLAB基于小波技术的图像融合实现
开发语言·人工智能·matlab
R1nG8632 小时前
多线程安全设计 CANN Runtime关键数据结构的锁优化
开发语言·cann