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

相关推荐
初见无风3 分钟前
4.3 Boost 库工具类 optional 的使用
开发语言·c++·boost
_OP_CHEN3 分钟前
算法基础篇:(五)基础算法之差分——以“空间”换“时间”
c++·算法·acm·icpc·算法竞赛·差分算法·差分与前缀和
秋风&萧瑟8 分钟前
【C++】智能指针介绍
java·c++·算法
有梦想的攻城狮13 分钟前
我与C++的一面之缘
开发语言·c++
毕设源码-朱学姐21 分钟前
【开题答辩全过程】以 基于java的民宿管理小程序为例,包含答辩的问题和答案
java·开发语言·小程序
ᐇ95930 分钟前
Java集合框架:深入理解List与Set及其实现类
java·开发语言
啟明起鸣40 分钟前
【Go 与云原生】先从 Go 对与云原生的依赖关系讲起,再讲讲 一个简单的 Go 项目热热身
开发语言·云原生·golang
oioihoii1 小时前
《C语言点滴》——笑着入门,扎实成长
c语言·开发语言
waves浪游1 小时前
基础开发工具(下)
linux·运维·服务器·开发语言·c++
QX_hao1 小时前
【Go】--log模块的使用
开发语言·后端·golang