类与结构的区别

C#中结构与类的区别
本文探讨了C#中结构(struct)与类(class)之间的关键区别,包括它们的类型特性(值类型与引用类型)、继承能力、内部结构特点等,并提供了具体的示例代码帮助理解。同时,还给出了选择使用结构或类的一些建议。
  一.类与结构的示例比较:

  结构示例:

  public struct Person

  {

  string Name;

  int height;

  int weight

  public bool overWeight()

  {

  //implement something

  }

  }

  类示例:

  public class TestTime

  {

  int hours;

  int minutes;

  int seconds;

  

  public void passtime()

  {

  //implementation of behavior

  }

  }

  调用过程:

  public class Test

  {

  public static ovid Main

  {

  Person Myperson=new Person //声明结构

  TestTime Mytime=New TestTime //声明类

  }

  }

  从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?   

  二 .类与结构的差别

  1. 值类型与引用类型

  结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型

  类是引用类型:引用类型在堆上分配地址

  堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑

  因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用

  注:

  1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object

  2.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

  2.继承性

  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .

  类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承

  注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样

  例如:结构实现接口

  interface IImage  

  {

  void Paint();

  }
  

  struct Picture : IImage

  {

  public void Paint()

  {

  // painting code goes here

  }

  private int x, y, z; // other struct members

  }
  

  3.内部结构

  结构:

  没有默认的构造函数,但是可以添加构造函数

  没有析构函数

  没有 abstract 和 sealed(因为不能继承)

  不能有protected 修饰符

  可以不使用new 初始化

  在结构中初始化实例字段是错误的

  类:

  有默认的构造函数

  有析构函数

  可以使用 abstract 和 sealed

  有protected 修饰符

  必须使用new 初始化   

  三.如何选择结构还是类

  讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

  1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些

  2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

  3. 在表现抽象和多级别的对象层次时,类是最好的选择

  4. 大多数情况下该类型只是一些数据时,结构时最佳的选择
<think>嗯,用户问的是VC++中结构区别。首先我得回想一下C++的基础知识。在C++中,结构体(struct)确实有很多相似之处,但关键区别在于默认的访问权限和继承方式。VC++作为微软的C++实现,应该遵循标准C++的规则,不过可能有些编译器特定的行为需要注意。 用户可能已经了解一些C++的基础,但想确认在VC++环境下是否有特别的地方。需要明确的是,VC++在这里主要遵循标准C++,所以答案应该和标准一致。不过,为了确保正确,我得先确认标准中的结构体的区别,然后再考虑VC++是否有扩展或不同之处。 首先,默认访问权限:的成员默认是private,而结构体默认是public。这点很重要,因为这会影响到封装性。用户可能在设计的时候倾向于隐藏数据,而结构体可能用于数据聚合。但现代C++中,结构体也可以有方法、构造函数等,和几乎一样,除了默认访问控制。 另一个区别是继承时的默认访问权限。当从派生时,默认是private继承,而结构体派生结构体默认是public继承。这可能影响派生的成员访问基成员的权限。用户如果是从C转过来的,可能更习惯用结构体,而则是更面向对象的特性。 不过用户可能更想知道实际应用中的区别,比如什么时候用,什么时候用结构体。通常建议是,如果需要所有成员公开,用结构体;如果需要封装,用。但这也是一种风格上的选择,不是绝对的。 另外,模板元编程中有时结构体更常用,因为默认public访问可能方便,但这也是具体情况具体分析。可能用户在实际编码中遇到了困惑,或者在阅读代码时看到两者混用,想了解背后的原因。 需要确保回答清晰,避免混淆。可能还需要提到,VC++没有在这方面引入特殊差异,所以和标准C++一致。另外,可能存在的常见误区,比如认为结构体不能有成员函数或继承,但实际上在C++中结构体可以,这些需要澄清。 总结一下,回答的结构应该是:先说明默认访问权限不同,继承时的默认访问权限不同,然后讨论使用场景和惯例,最后确认VC++中没有额外区别。这样用户能明确两者的区别,并根据情况选择使用结构体。</think>在 **VC++**(即 Microsoft Visual C++)中,**(`class`)**和**结构(`struct`)**的底层实现完全遵循 **C++ 标准**,二者的核心区别主要体现在 **默认访问权限** 和 **继承时的默认访问控制** 上。以下是具体对比: --- ### 1. **默认访问权限** - **(`class`)** 成员(数据或函数)的默认访问权限是 **`private`**。 ```cpp class MyClass { int x; // 默认是 private }; ``` - **结构(`struct`)** 成员(数据或函数)的默认访问权限是 **`public`**。 ```cpp struct MyStruct { int x; // 默认是 public }; ``` --- ### 2. **继承时的默认访问控制** - **(`class`)** 使用 `class` 定义派生时,默认继承方式是 **`private` 继承**。 ```cpp class Derived : Base { // 等价于 class Derived : private Base }; ``` - **结构(`struct`)** 使用 `struct` 定义派生时,默认继承方式是 **`public` 继承**。 ```cpp struct Derived : Base { // 等价于 struct Derived : public Base }; ``` --- ### 3. **使用场景的惯例** - **(`class`)** 通常用于需要 **封装数据和行为** 的场景(例如对象需要隐藏内部状态,通过方法控制访问)。 ```cpp class Student { private: std::string name; public: void setName(const std::string& n) { name = n; } }; ``` - **结构(`struct`)** 通常用于 **纯数据集合** 或简单的数据容器(例如 POD 型,或需要直接访问成员的场景)。 ```cpp struct Point { int x; int y; }; ``` --- ### 4. **其他注意事项** - **成员函数继承** 结构体均支持成员函数、构造函数、析构函数、继承、多态等特性,功能上完全等价,仅默认行为不同。 - **模板元编程** 由于结构体的默认 `public` 访问,有时在模板元编程中会更方便(例如特性萃取)。 --- ### 总结(何时选择?) - 如果需要一个数据聚合体(例如坐标点、配置项),且成员需要直接访问,优先用 **`struct`**。 - 如果需要封装数据、定义复杂行为,或使用面向对象设计,优先用 **`class`**。 在 **VC++** 中,这些规则标准 C++ 完全一致,没有额外差异。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值