c、c++、c# 结构体与类的区别

来源:互联网 发布:淘宝采集软件是什么 编辑:程序博客网 时间:2024/05/17 00:00

 

1. C与C++中结构体的比较

C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数。

C++中的结构体和类的异同:

一、相同之处:结构体中可以包含函数;也可以定义public、private、protected数据成员;定义了结构体之后,可以用结构体名来创建对象。但C中的结构体不允许有函数;

              也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数。

二、不同之处:结构体定义中默认情况下的成员是public,而类定义中的默认情况下的成员是private的。

实际上,C中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算法是分离的,而到C++中一类或者一个结构体可以包含函数(这个函数在C++我们通常中称为成员函数),C++中的结构体和类体现了数据结构和算法的结合。

例如:

struct CHGROUP

{

        unsigned short LOOPNum;

        unsigned short SPKMICNum;

        unsigned short MONITORNum;

        unsigned short TBNum;

        unsigned short AGENTNum;

        unsigned short HBNum;

        unsigned short VOIPNum;

private:

        CH *pLOOP;

        CH *pSPKMIC;

        CH *pMONITOR;

        CH *pTB;

        CH *pAGENT;

        CH *pVOIP;

        CH *pHB;

public:

        CHGROUP()

        {

                LOOPNum = SPKMICNum = MONITORNum = TBNum = AGENTNum = HBNum = VOIPNum = 0;

                pLOOP = pSPKMIC = pMONITOR = pTB = pAGENT = pHB = pVOIP = 0;

        }

 

        virtual ~CHGROUP()

        {

                if(LOOPNum) delete[]pLOOP;

                if(SPKMICNum) delete[]pSPKMIC;

                if(MONITORNum) delete[]pMONITOR;

                if(TBNum) delete[]pTB;

                if(AGENTNum) delete[]pAGENT;

                if(HBNum) delete[]pHB;

                if(VOIPNum) delete[]pVOIP;

        }

        void init(unsigned int type, unsigned int num)

        {

                if(num == 0)

                        return;

 

                CH *p = new CH[num];

 

                if(p==NULL)

                        return;

                switch(type)

                {

                case CHTYPE_LOOP:

                        pLOOP = p;

                        LOOPNum = num;

                        break;

                case CHTYPE_SPKMIC:

                        pSPKMIC = p;

                        SPKMICNum = num;

                        break;

                case CHTYPE_MONITOR:

                        pMONITOR = p;

                        MONITORNum = num;

                        break;

                case CHTYPE_TB:

                        pTB = p;

                        TBNum = num;

                        break;

                case CHTYPE_AGENT:

                        pAGENT = p;

                        AGENTNum = num;

                        break;

                case CHTYPE_HB:

                        pHB = p;

                        HBNum = num;

                        break;

                case CHTYPE_VOIP:

                        pVOIP = p;

                        VOIPNum = num;

                        break;

                default:

                        delete []p;

                        return;

                }

        }

 

上边是一个结构体,然后可以定义了struct CHGROUP chs;

调用函数来初始化

chs.init(CHTYPE_AGENT, num);

 

在C++中只有两点区别:  
  (1)class中默认的成员访问权限是private的,而struct中则是public的。  
  (2)从class继承默认是private继承,而从struct继承默认是public继承。  
  除此这外无任何区别。

 

2.C# 结构体与类的区别

c#中的结构体类型

struct 类型是一种值类型,通常用来封装小型相关变量组,例如,矩形的坐标或库存商品的特征。下面的示例显示了一个简单的结构声明。

public struct PostalAddress
{
// Fields, properties, methods and events go here...
}

结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:

尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。

结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。

结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自 ValueType,后者继承自 Object。

编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

结构具有以下特点:

结构是值类型,而类是引用类型

向方法传递结构时.结构是通过传值方式传递的,不是作为引用方式传递.

与类不同,结构的实例化可以不使用new运算符.

结构可以声明构造函数,但他们必须带参数

一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.ValueType,后者继承自 System.Object。

结构可以实现接口。

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