在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