类与结构的差别

本文探讨了C#中值类型(如结构)与引用类型(如类)的区别,包括它们的存储位置、继承特性、构造函数等差异,并提供了如何根据应用场景选择合适类型的指导。

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++ 完全一致,没有额外差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值