结构体和类具有相同的结构,但是他们还是有很多的区别的:
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++中只有静态整型常量才可以在类中初始化。