首页 > 代码库 > C#与C++中struct和class的小结
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 father29 //{30 //}31 32 class Program33 {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:SC10 {11 };12 13 class CA14 {15 void func(){}16 };17 18 class CB:CA19 {20 };21 22 int main()23 {24 // test the default access25 SC sc;26 sc.func();// no error27 CA ca;28 ca.func();// error C2248: “CA::func”: 无法访问 private 成员(在“CA”类中声明)29 // test the inherit30 SB sb;31 sb.func();// no error32 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
C#与C++中struct和class的小结