当前位置: 首页 > news >正文

C++ class和struct的区别

  在C++中,classstruct本质上非常相似,它们都可以用来定义用户自定义类型,并且都可以包含数据成员和成员函数。但是,它们之间有一些关键的区别和习惯用法:


1. 默认访问控制

  • class
    • 默认访问控制是**private**。
  • struct
    • 默认访问控制是**public**。
示例:
class MyClass {int a; // 默认是private
};struct MyStruct {int a; // 默认是public
};int main() {MyClass obj1;MyStruct obj2;// obj1.a = 10; // 错误,`a`是privateobj2.a = 10;    // 正确,`a`是publicreturn 0;
}

2. 面向对象编程习惯

  • class
    • 通常用于定义面向对象的复杂类型。
    • 包含封装、继承和多态功能。
  • struct
    • 通常用于定义简单的数据结构,类似于C语言中的struct
    • 常用于数据的存储和传递,而不需要复杂的行为。

3. 继承时的默认访问权限

  • class

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

    • 默认继承方式是**public**。
示例:
class BaseClass {};
struct BaseStruct {};// class 默认是private继承
class DerivedClass : BaseClass {// 等价于 `private`继承
};// struct 默认是public继承
struct DerivedStruct : BaseStruct {// 等价于 `public`继承
};

4. 使用习惯

  • class
    • 习惯用于定义复杂类型,并实现封装性。
    • 数据成员通常是private,通过成员函数访问。
  • struct
    • 习惯用于定义简单的 POD 类型(Plain Old Data)。
    • 数据成员通常是public,直接访问。
示例:
class Person {
private:std::string name;int age;public:Person(const std::string& name, int age) : name(name), age(age) {}void display() {std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};struct Point {int x;int y;
};int main() {Person person("Alice", 25);person.display(); // 使用成员函数Point p = {10, 20};std::cout << "Point: (" << p.x << ", " << p.y << ")" << std::endl; // 直接访问return 0;
}

5. 代码生成与性能

  • 从编译器的角度来看,classstruct在生成的代码上几乎是相同的。区别主要是语法和访问控制的默认设置。

6. 可混用性

  在C++中,可以自由选择使用classstruct来实现某些功能,两者可以混合使用。例如:

struct Data {int value;Data(int v) : value(v) {}
};class Processor {
public:void process(Data& d) {d.value *= 2; // 访问Data的public成员}
};

总结

特性classstruct
默认访问控制privatepublic
继承时的默认访问控制privatepublic
常见用途面向对象编程,封装复杂逻辑和行为定义简单的数据结构(POD类型)
是否支持成员函数支持支持
是否支持继承支持支持
习惯用法数据成员通常是private,通过函数访问数据成员通常是public,直接访问

  虽然从技术上来说两者的功能相近,但在实际开发中,推荐按照惯例使用:

  • class:用于复杂的、面向对象的设计。
  • struct:用于简单的数据结构或 POD 类型,类似于C语言中的struct

相关文章:

  • Linux中的文件描述符
  • SIAM-2010《Making $k$-means even faster》
  • Kubernetes 自动缩放模式:HPA、VPA
  • Laravle 证件照排版
  • AD9268、AD9643调试过程中遇到的问题
  • 转移dp简单数学数论
  • SAR ADC 的DAC 参考的选择逻辑
  • 精益数据分析(82/126):先行指标驱动的增长黑客策略——从相关性到因果性的跨越
  • ollama接入图像识别大模型
  • PINN高阶技术综合应用:复杂问题求解与神经算子进阶
  • C/C++STL---<chrono>
  • redis功能清单
  • 【Unity】使用InputSystem实现UI控件与键盘输入绑定以及如何快速制作虚拟摇杆
  • Pycharm和Flask的学习心得(7)
  • 236.二叉树的最近公共祖先
  • python web开发-Flask模板引擎Jinja2完全指南
  • 进一步学习线程相关知识
  • vue3中使用computed
  • Python 爬虫之requests 模块的应用
  • Vue组件通信的 `$attrs`与`$listeners`的优先级
  • 网站怎么做竞价/黑帽seo培训网
  • 长沙房产网最新楼盘/seo外链购买
  • 镇江网站推广/如何注册一个自己的网站
  • 广州番禺疫情/百度seo按天计费
  • 西宁城东区建设局公租房网站/百度seo快速提升排名
  • 一起做彩票网站的人/百度手机关键词排名工具