当前位置:   article > 正文

C++中的struct与class详解_c++ struct class

c++ struct class

da8f399e27924aa69116601b33456459.webp

在C++中,structclass都是用户定义类型(UDT)的关键字,用于封装数据和函数。尽管它们在许多方面都非常相似,但也存在一些关键差异。

1. 默认访问权限

  • • **struct**:默认的成员访问权限是public
  • • **class**:默认的成员访问权限是private

示例代码

  1. struct StructExample {
  2.     int data; // 默认为public
  3. };
  4. class ClassExample {
  5.     int data; // 默认为private
  6. public:
  7.     int getData() const { return data; }
  8.     void setData(int d) { data = d; }
  9. };

在这个例子中,StructExample中的data成员默认是公开的,而ClassExample中的data成员默认是私有的。

2. 继承默认访问权限

  • • **struct**:继承默认为public
  • • **class**:继承默认为private

示例代码

  1. struct BaseStruct {};
  2. struct DerivedStruct : BaseStruct {}; // 默认为public继承
  3. class BaseClass {};
  4. class DerivedClass : BaseClass {}; // 默认为private继承

这里DerivedStruct公开继承BaseStruct,而DerivedClass私有继承BaseClass

3. 使用场景

  • • **struct**:通常用于只有数据成员的简单数据结构。
  • • **class**:通常用于需要封装数据和函数的复杂数据结构。

示例代码

  1. struct Point {
  2.     int x, y;
  3. };
  4. class Rectangle {
  5.     Point topLeft, bottomRight;
  6. public:
  7.     Rectangle(int x1, int y1, int x2, int y2)
  8.         : topLeft{ x1, y1 }, bottomRight{ x2, y2 } {}
  9.     int area() const {
  10.         return (bottomRight.x - topLeft.x) * (bottomRight.y - topLeft.y);
  11.     }
  12. };

Point结构体仅包含数据成员,而Rectangle类包含数据成员和函数,用于更复杂的操作。

4. 构造函数、析构函数和成员函数

两者都可以包含构造函数、析构函数和其他成员函数。

示例代码

  1. struct StructWithFunctions {
  2.     StructWithFunctions() { /* 构造函数实现 */ }
  3.     ~StructWithFunctions() { /* 析构函数实现 */ }
  4.     void function() { /* 成员函数实现 */ }
  5. };
  6. class ClassWithFunctions {
  7. public:
  8.     ClassWithFunctions() { /* 构造函数实现 */ }
  9.     ~ClassWithFunctions() { /* 析构函数实现 */ }
  10.     void function() { /* 成员函数实现 */ }
  11. };

在这个例子中,StructWithFunctionsClassWithFunctions都包含构造函数、析构函数和成员函数。

5. 兼容性

在C++中,structclass是互换的,除了默认的访问权限和继承权限。你可以将struct用于需要函数的场景,也可以在class中只使用数据成员。

示例代码

  1. class ClassAsStruct {
  2. public:
  3.     int data; // 明确指定为public
  4. };
  5. struct StructAsClass {
  6. private:
  7.     int data; // 明确指定为private
  8. public:
  9.     int getData() const { return data; }
  10.     void setData(int d) { data = d; }
  11. };

在这个例子中,ClassAsStruct被用作只包含数据的结构体,而StructAsClass则像一个类,封装了数据并提供了访问它的公共接口。

总之,structclass在C++中提供了强大的数据封装功能。选择使用哪一个取决于你的设计需求,包括访问权限、继承和代码组织。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/714671
推荐阅读
相关标签
  

闽ICP备14008679号