在C#中,struct其实也是可以像class一样封装方法和数据的。请参考如下代码。

 using System;

 namespace testDiffInStructClass
{
public struct father
{
//private string _name = "father";
//private int _age = 100;
private string _name;
private int _age; //public father()
//{
// Console.WriteLine("default ctor is called");
//}
public father(string name, int age)
{
_name = name;
_age = age;
Console.WriteLine("ctor with param is called");
}
public override string ToString()
{
return string.Format("father's name is: " + _name + " and of age: " + _age);
}
} //public struct son: public father
//{
//} class Program
{
static void Main(string[] args)
{
father f = new father("Neo", );
Console.WriteLine(f.ToString());
}
}
}

但是有几点需要注意,即是上面注释的内容:

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中的特性,来表示一些复杂的数据而不进行方法的封装,这样还可以提高软件的可读性。

以下的区别的介绍,请对照参考代码。

 #include <iostream>
using namespace std; struct SC
{
void func(){}
}; struct SB:SC
{
}; class CA
{
void func(){}
}; class CB:CA
{
}; int main()
{
// test the default access
SC sc;
sc.func();// no error
CA ca;
ca.func();// error C2248: “CA::func”: 无法访问 private 成员(在“CA”类中声明)
// test the inherit
SB sb;
sb.func();// no error
CB cb;
cb.func(); // error C2248: “CA::func”: 无法访问 private 成员(在“CA”类中声明)
}

2.默认成员权限区别

struct的成员默认权限是public,而class的成员默认权限是private。

3. 默认继承方式

struct的默认继承方式为public,而class的默认继承为private。

4. 用于定义模板参数

模板为C++语言新增特性,C语言没有,只有class可用于定义参数,而struct不可以,例如:

 template
class TValue {
private:
T _v;
public:
TValue(T v) : _v(v){}
T Get( void )
{
return _v;
}
};

此处只能使用class,不能使用struct。当然,此处还可以使用typename代替class,class与typename也仅在定义模板参数时可以互换,而且建议此时使用typename,因为这样读起来更接近人类语言,更具有可读性。

参考文章:

http://blog.csdn.net/nocky/article/details/6195556

http://wenwen.sogou.com/z/q363064420.htm

最新文章

  1. Entity Framework 6 Recipes 2nd Edition 译 -&gt; 目录 -持续更新
  2. PostgreSQL 锁监控
  3. Bar codes in NetSuite Saved Searches(transport/reprint)
  4. Css常用收集
  5. &lt;&lt;有效软件测试&gt;&gt; 读书笔记和自己的一些思考
  6. hdu 5407 CRB and Candies(组合数+最小公倍数+素数表+逆元)2015 Multi-University Training Contest 10
  7. Java_Activiti5_菜鸟也来学Activiti5工作流_之入门简单例子(一)
  8. PHP本地域名解析教程
  9. dispatch_async 与 dispatch_get_global_queue 的使用方法
  10. 配置elasticsearch 以及ik分词
  11. Sublime Text3自定义代码片段
  12. Ubuntu部署可视化爬虫Portia2.0环境
  13. Linux 系统应用编程——标准I/O
  14. 03-三层交换机的OSPF实验
  15. jenkins 邮箱配置---腾讯企业邮箱
  16. 【java编程】ServiceLoader使用看这一篇就够了
  17. POJ-1321.棋盘问题.(回溯)
  18. java SynchronousQueue
  19. DC-DC Controllers Use Average-Current-Mode Control for Infotainment Applications-3939
  20. emouse思&middot;睿&mdash;评论与观点整理之三

热门文章

  1. html5 “拖放”
  2. 成都传智播客JDBC视频及讲师介绍
  3. linux命令——iotop
  4. Android学习-应用程序管理
  5. dm3730和dm6437,dm6446,AM335x启动过程的不同
  6. 你可能把A/B测试做错了
  7. js操作
  8. 菜鸟互啄:WINFORM如何实现无聚焦框的Button按钮
  9. Mac OS 上 CRT 的终端设置
  10. MFC中CListCtrl说明