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 ...
随机推荐
- 如何判断一个对象是否为jquery对象
当我们在用jquery的each做循环遍历的时候常常会使用到this 而有时候我们不知道this所指的到底是什么,因为要使用jquery 的方法 前提此对象必须是jquery对象. 另外要判断一个ja ...
- hibernate添加spring 事务管理注意问题记录
今天弄了一天的hibernate添加事务的问题 首先,建立的是一个java工程,把hibernate添加进工程里,很容易就可以写一个增删改查的方法.索性就多加点东西,把接口,抽象类也加到里面,自己看着 ...
- [COM/ATL]浅析COM的思想及原理
COM--Component Object Model,即组件对象模型,它是微软提出的一套开发软件的方法与规范.它也代表了一种软件开发思想,那就是面向组件编程的思想. COM编程思想--面向组件编程思 ...
- python手记(11)
<form method="POST" action="http://host.com/cgi-bin/test.py"> <p>You ...
- 本地通过Eclipse链接Hadoop操作Mysql数据库问题小结
前一段时间,在上一篇博文中描述了自己抽时间在构建的完全分布式Hadoop环境过程中遇到的一些问题以及构建成功后,通过Eclipse操作HDFS的时候遇到的一些问题,最近又想进一步学习学习Hadoop操 ...
- 简单的遮罩层效果,user登陆显示效果
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- MJRefresh框架使用及说明
一. MJRefresh的类解释. 1.MJRefreshComponent 所有刷新控件的基类别.(component: 成分,组件) 2.MJRefreshNormalH ...
- iOS开发-OC语言 (三)字符串
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 24.0px "PingFang SC" } p ...
- PWA - 渐进式网络应用初认识
Progressive Web Apps 简称PWA,是一种接近原生用户体验的渐进增强的web-app.从浏览器演进而来,沉浸式的体验,改进web的性能低下等.是Google 在2015年提出,今年才 ...
- python-微博模拟登陆
微博的的模拟登陆是比较坑的,看了网上很多大神的帖子,自己又看了微博的登陆时的json数据:1.发现登陆时在输入账号时用chrome可以看到会有一个prelogin之类的网址,网址后面会有大串的随机数. ...