C#与C++中struct和class的小结
在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
C#与C++中struct和class的小结的更多相关文章
- 关于readdir返回值中struct dirent.d_type的取值有关问题(转)
关于readdir返回值中struct dirent.d_type的取值问题 原网页链接 http://www.gnu.org/software/libc/manual/html_node/Direc ...
- 转载--C++中struct与class
转自:http://www.cnblogs.com/york-hust/archive/2012/05/29/2524658.html 1. C++中的struct对C中的struct进行了扩充,它已 ...
- 【zz】C++中struct与class的区别
转载来源:http://blog.sina.com.cn/s/blog_48f587a80100k630.html C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据 ...
- C++中struct和class的区别 [转]
一. C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能. struct能包含成员函数吗? 能! struct能继承吗? ...
- C++ 中 struct和class 的区别
来自:http://hi.baidu.com/pengxiangbobin19890125/blog/item/b05586eee77300212df53411.html C++ prime 中 ...
- C#中struct和class的区别详解
本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...
- C、C++、C#中struct的简单比较
比较这三者是因为C.C++.C#这三者存在着一定的血缘关系,而他们三者都有的struct却有很大的不同. 功能 C中的struct是最简单的.只能有成员变量而不能有成员函数. C++和C#中都支持,而 ...
- 在C和C++中struct与typedef struct的区别详细介绍
c中测试code struct Cmstruct { int c; } Cm; // Cm是一个变量 typedef struct MyStruct //这里的 Mystruct 可以省略 { int ...
- matlab中struct创建方法
MATLAB中struct创建方法可分为:直接创建法和struct()函数创建法 (1)直接创建: 直接定义字段,像使用一般matlab变量一样,不需要事先声明,支持动态扩充.下面创建一个Studen ...
随机推荐
- IE6的那些css常见bug(汇总)
IE6的那些css常见bug(汇总) 我的微博终于在前几天建立了 虽说很早之前就知道博客园这个地方 但怕自己不能坚持去写一些东西一直没有建.这几天 我做了这个决定 把我的博客建起来 每周发一些看到的, ...
- easyui tree 判断是否是叶子节点
<input class="add" id="add" style="display: none" type="submit ...
- iOS 开发之Target-action模式
Target-action:目标-动作模式,它贯穿于iOS开发始终.但是对于初学者来说,还是被这种模式搞得一头雾水. 其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那 ...
- service structure flowchart [mobile to server via HTTP RESTful API and TCP/IP in a map]
mobile to server in RESTful and TCP/IP way
- spring得到实例和new一个实例,哪个快?
spring配置的bean是默认单例,那么在程序中,得到一个实例一定比创建一个实例的速度快,也更加省资源.今天实际测试的时候发现,new 一个对象比spring得到一个对象快多了.后面自己又加了个单例 ...
- HNCU1323:算法2-1:集合union (线性表)
http://hncu.acmclub.com/index.php?app=problem_title&id=111&problem_id=1323 题目描述 假设利用两个线性表LA和 ...
- 三千万数据量下redis2.4的一统计情况
先说一下工作场景,要求做一个服务,满足:处理千万级别数据,单个请求响应时间在20ms以下.由于是存储的数据格式为key:list[],所以很适合使用redis来存放数据,为了测试一下redis存储的效 ...
- AS代码优化和Flex应用程序的性能
1.在局部变量够用时,不要使用全局变量.类静态变量也要少用.全局变量是开发者的恶梦.实在需要全局变量的话,我建议使用singleton设 计模式来进行管理. 2.读取数组中的数据,尽量使用for in ...
- springMVC之数据传递
在前面介绍过从controller中向页面中传数据,可以通过HttpServletRequest进行setAttribute可以将数据放入request中.并且可以在jsp页面使用el表达式获取数据. ...
- js 数组常用的操作函数整理
平时多做企业应用开发,抱着实用为主,对前端技术理解得比较肤浅,下面就是肤浅地对 js 数组的属性和方法及对它操作的 jquery 方法做些记录: js 数组是 js 内建的一个非常强大数据类型,由于 ...