结构体和类具有相同的结构,但是他们还是有很多的区别的:

 1、结构中无限定修饰符的时候,默认为共有成员,但是在类中是私有成员;

 2、结构是值类型,但是类是属于引用类型;

 3、结构不容许继承,但是类可以继承;

 4、结构构造中编译器总是提供一个无参数的构造函数,不容许替换,所以在结构体中直容许提供有参数构造函数,提供字段的初始化值也不能绕过默认构造函数;

 5、结构主要用于小的数据结构(优点:内联或保存在栈中,分配内存快,释放快; 缺点:内容被复制,性能损失。所以把结构作为参数递给方法时,应把他作为ref参数传递,避免性能损失),类使用引用,,则只复制引用;

 6、默认构造函数把数值字段都初始化为0,把引用类型字段初始化为null;

 

举例:

虽然结构体是值类型但是语法上可以将其作为类处理:

struct MyStruct
{
    int length;
    int widgth;
}

MyStruct mystruct = new MyStruct();

mystruct.length = 1;
mystruct.widgth = 2;

  但是此时虽然说使用了new关键字进行内存的分配,但是其实际上还是值类型,调用相应的构造函数去进行内存的分配,分配的空间是在栈上。在使用所有元素之前都必须初始化,在结构上调用new运算符,或者给所有的字段分别赋值,结构就完全初始化了。当然,如果结构体定义为类的成员字段,在初始化包含的对象时,该结构会自动初始化为0;

同时其实例化也可以写为:

MyStruct mystruct;
mystruct.length
= 1; mystruct.widgth = 2;

对于结构,变量声明实际上是为整个结构在栈上分配空间,所以就可以为它赋值了。

类就写写法:

class MyClass
{
    int length;
    int widgth;
}

MyClass myclass = new MyClass();

myclass.length = 1;
myclass.widgth = 2;


此时类分配的内存空间是在堆上,为这个对象分配一块内存去使用,不是在栈上。

但是类不能写为下列类型:

MyClass myclass;

myclass.length = 1;
myclass.widgth = 2;

此种情况下会出编译出错,因为myclass包含一个未初始化的引用,不指向任何地方的一个地址,所以不能给其字段设置值。

在初始化过程中下列类型是错误的:

struct MyStruct
{
    public int length = 1;
    public int widgth = 2;
}

但是如果是一个类,此种写法是正确的。

在C++中只有静态整型常量才可以在类中初始化。

posted on 2013-11-09 20:26  ForeverX  阅读(171)  评论(0编辑  收藏  举报