C#与C++中struct和class的小结

在C#中,struct其实也是可以像class一样封装方法和数据的。请参考如下代码。

 1 using System;
 2
 3 namespace testDiffInStructClass
 4 {
 5     public struct father
 6     {
 7         //private string _name = "father";
 8         //private int _age = 100;
 9         private string _name;
10         private int _age;
11
12         //public father()
13         //{
14         //    Console.WriteLine("default ctor is called");
15         //}
16         public father(string name, int age)
17         {
18             _name = name;
19             _age = age;
20             Console.WriteLine("ctor with param is called");
21         }
22         public override string ToString()
23         {
24             return string.Format("father‘s name is: " + _name + " and of age: " + _age);
25         }
26     }
27
28     //public struct son: public father
29     //{
30     //}
31
32     class Program
33     {
34         static void Main(string[] args)
35         {
36             father f = new father("Neo", 25);
37             Console.WriteLine(f.ToString());
38         }
39     }
40 }

但是有几点需要注意,即是上面注释的内容:

1.结构中不能有实例字段初始值;

2.结构不能包含显式的无参数构造函数;

3.结构不能继承。

但是在C++中则表现出不一样的性质。C++中,struct和class其实并没有太大差别。在大多数情况下,是可以换用的;但是存在一些区别,具体介绍如下。

1.字面上的区别

在字面上struct是structure的缩写,通常叫做“结构体”,在C语言里用于将多种数据、多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该关键字,并且保留了C语言中的所有功能。

而class,则称作“类”,是C++新增来支持面向对象思想概念中“类”的概念的一个关键词,并且比struct具有了更强大的功能,不仅可以像C语言中的struct一样把数据组织在一起,还可以将与数据相关的方法组织在一起,并增加了如虚函数、继承等特性来支持面向对象编程。

虽然在字面上struct与class的含义不一样,但在C++中其功能基本是相同的,C++中的struct不仅可以包含数据成员,而且与class一样支持新增的面向对象特性,仅在以下细节上有略微差别。

既然两者在字面上不一样,为了更好地利用这一点,建议在C++中使用struct时仍然只使用C中的特性,来表示一些复杂的数据而不进行方法的封装,这样还可以提高软件的可读性。

以下的区别的介绍,请对照参考代码。

 1 #include <iostream>
 2 using namespace std;
 3
 4 struct SC
 5 {
 6     void func(){}
 7 };
 8
 9 struct SB:SC
10 {
11 };
12
13 class CA
14 {
15     void func(){}
16 };
17
18 class CB:CA
19 {
20 };
21
22 int main()
23 {
24     // test the default access
25     SC sc;
26     sc.func();// no error
27     CA ca;
28     ca.func();// error C2248: “CA::func”: 无法访问 private 成员(在“CA”类中声明)
29     // test the inherit
30     SB sb;
31     sb.func();// no error
32     CB cb;
33     cb.func(); // error C2248: “CA::func”: 无法访问 private 成员(在“CA”类中声明)
34 }

2.默认成员权限区别

struct的成员默认权限是public,而class的成员默认权限是private。

3. 默认继承方式

struct的默认继承方式为public,而class的默认继承为private。

4. 用于定义模板参数

模板为C++语言新增特性,C语言没有,只有class可用于定义参数,而struct不可以,例如:

 1 template
 2 class TValue {
 3 private:
 4     T _v;
 5 public:
 6     TValue(T v) : _v(v){}
 7     T Get( void )
 8     {
 9         return _v;
10     }
11 };

此处只能使用class,不能使用struct。当然,此处还可以使用typename代替class,class与typename也仅在定义模板参数时可以互换,而且建议此时使用typename,因为这样读起来更接近人类语言,更具有可读性。

参考文章:

http://blog.csdn.net/nocky/article/details/6195556

http://wenwen.sogou.com/z/q363064420.htm

时间: 2024-10-20 10:05:54

C#与C++中struct和class的小结的相关文章

.NET中struct与class的区别

在.net中的struct与class有很多相似之处,比如可以直接new,对于成员可以直接XX.field,以至于有不少程序员在用时,将其混在一起,分不清有何区别.这两者有何区别呢? 1.类型不同 我们先来看一段代码 static void Main(string[] args) { TypeDemo(); Console.ReadLine(); } // Reference type (because of 'class') class SomeClassRef { public Int32

c#中struct和class的区别

简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单.本篇主要包括: ■ 概括来讲■ 从赋值的角度体验struct和class的不同■ 从参数传值角度体验struct和class的不同■ 从struct类型的struct类型属性和struct引用类型属性体验struct和class的不同■ 从构造函数体验struct和class的不同■ 从给类型成员赋初值体验s

C++中struct与class的区别(转载)

很多初学者或者是想当然,或者是被网上的一些错误信息给误导,面试中问到class和struct区别时经常会说class可以继承而struct不可以继承,这是完全错误的.但在C#中,class与struct确实有这点区别(当然不止这一点).其实,在C++中,这两个关键词并没有大的区别,仅在细节上有些不同. 1. 字面上的区别 在字面上struct是structure的缩写,通常叫做“结构体”,在C语言里用于将多种数据.多个变量组织在一起,便于表达比较复杂的数据类型,在C++中为了兼容C语言保留了该关

在C和C++中struct与typedef struct的区别详细介绍

c中测试code struct Cmstruct { int c; } Cm; // Cm是一个变量 typedef struct MyStruct //这里的 Mystruct 可以省略 { int m; } My; // My 是struct MyStruct 别名 My st; struct Cmstruct cm1; // 只能使用struct Cmstruct来定义 不能使用Cmstruct st.m = 1; printf("%d\n", st.m); // 1 // st

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——8.1.1 Android中的13种Drawable小结 Part 1

Android基础入门教程--8.1.1 Android中的13种Drawable小结 Part 1 标签(空格分隔): Android基础入门教程 本节引言: 从本节开始我们来学习Android中绘图与动画中的一些基础知识,为我们进阶部分的自定义 打下基础!而第一节我们来扣下Android中的Drawable!Android中给我们提供了多达13种的 Drawable,本节我们就来一个个撸一遍! Drawable资源使用注意事项 Drawable分为两种: 一种是我们普通的图片资源,在Andr

JavaScript中对象类型的转换小结

对象到字符串和对象到数字类型的转换涉及到两个重要的方法,最终的转换结果会受到这两个方法返回结果的影响,这两个方法就是toString和valueOf.所有的对象都会从Object对象中继承到这两个方法.toString方法 用于返回对象的字符串表示(但是其实也可以不返回字符串).对于默认从Object继承而来的toString方法并不会返回太多有意义的内容.而valueOf方法目的是返回一个可以表示对象的原始类型值,但是由于对象的复杂性,大多数情况下根本不可能用一个原始类型值来表示,所以默认的v

Storm中Spout使用注意事项小结

Storm中Spout用于读取并向计算拓扑中发送数据源,最近在调试一个topology时遇到了系统qps低,处理速度达不到要求的问题,经过排查后发现是由于对Spout的使用模式不当导致的多线程同步等待.这里罗列几点个人觉得编写Spout代码时需要特别注意的地方: 1. 最常用的模式是使用一个线程安全的queue,如BlockingQueue,spout主线程从queue中读取数据:另外的一个或多个线程负责从数据源(如各种消息中间件.db等)读取数据并放入queue中. 2. 如果不关心数据是否丢