c++ struct与class的差别
从语法上,在C++中(仅仅讨论C++中)。class和struct做类型定义时仅仅有两点差别:
(一)默认继承权限。
假设不明白指定,来自class的继承依照private继承处理。来自struct的继承依照public继承处理;
(二)成员的默认訪问权限。
class的成员默认是private权限,struct默认是public权限。
除了这两点。class和struct基本就是一个东西。语法上没有不论什么其他差别。
不能由于学过C就总认为连C++中struct和class都差别非常大,以下列举的说明可能比較无聊,由于struct和class本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于struct和class的错误认识:
(1)都能够有成员函数;包含各类构造函数,析构函数。重载的运算符,友元类。友元结构,友元函数。虚函数,纯虚函数,静态函数;
(2)都能够有一大堆public/private/protected修饰符在里边。
(3)尽管这样的风格不再被提倡。但语法上二者都能够使用大括号的方式初始化:A a = {1, 2, 3};无论A是个struct还是个class,前提是这个类/结构足够简单。比方全部的成员都是public的,全部的成员都是简单类型,没有显式声明的构造函数。
(4)都能够进行复杂的继承甚至多重继承,一个struct能够继承自一个class。反之亦可;一个struct能够同一时候继承5个class和5个struct,尽管这样做不太好。
(5)假设说class的设计须要注意OO的原则和风格,那么没不论什么理由说设计struct就不须要注意。
(6)再次说明。以上全部说法都是指在C++语言中,至于在C里的情况,C里是根本没有“class”,而C的struct从根本上也仅仅是个包装数据的语法机制。
---------------------------------------------------------------
最后,作为语言的两个keyword,除去定义类型时有上述差别之外,另外另一点点:“class”这个keyword还用于定义模板參数。就像“typename”。但keyword“struct”不用于定义模板參数。
假设没有多态和虚拟继承,在C++中,struct和class的存取效率全然同样!简单的说就是。存取class的data member和非virtual function效率和struct全然同样。无论该data member是定义在基类还是派生类的。
假设不是为了和C兼容。C++中就不会有structkeyword。
因此建议是:假设不须要与C兼容或传递參数给C程序,不要在C++中用struct。
注意class的data member在内存中的布局可不一定是data member的申明次序。C++仅仅保证处于同一个access section的data member依照申明次序排列。
struct所体现的是一种数据结构。而class则是体现OOP思想中的"封装"的特性~~~
另一个差别:struct能够用{}赋初值,而class不行
比方声明例如以下:
struct abc{ int m1; float m2; bool m3; }
能够这么构造对象:
abc abcInstance{ 1, 1.0f, false };
struct:属性
class:属性+行为
注意:在VC6里。class能够与模板keywordtypename互换,可是struct好像就不能够,编译好像通只是。对这个问题。我专门查了一些资料,发现网上确实有说 struct不能用于模板keyword而class能够。这似乎应该是他们的一个不同了。然而。我又看了一下 《深度探索C++对象模型》,在书的前几章(好像就是第一章)Lippman说:本来他的编译器是不支持将struct作为模板keyword的,但后来改变了,也就是说struct 和class除了默认的訪问属性外。其它场合下真正的全然一样了。对此,我觉得这个按理说是这种。但不同的编译器可能会有自己的处理,就像VC6那样。
class中有方法,
struct中没有.
class是一个扩展的struct
array(类型一样)->struct(类型能够不一致)->class(加入方法)
尽管两者都能够捆绑行为。
可是,理解不一样。
struct,就是对程序猿全局可见的数据与方法。
简化数据逻辑结构的设计。能够说是一种自己定义的数据结构。
而class,则是将数据与方法封装,即让行为与数据一致。
则是一种编程方法。即客观世界在代码世界中的体现。体现的是一种编程思想。
在C里面:struct不能包括函数,而class能够。
在C++里面:都能够有函数,默认情况下struct中变量是public,而class中是private
有一点不明确,class支持的继承和多态,struct也支持??
class在赋值运算符右边出现须要有定义的拷贝构造函数,而struct是默认的位拷贝.
可是一般从兼容C的角度考虑,struct里面仅仅包括数据成员而不包括成员函数。这仅仅是一个编程习惯问题。
c++ struct与class的差别的更多相关文章
- 搜狗面试的经典题(C++map按值排序,class struct的差别)
一:起因 (1)java Map排序(key,value).请看还有一篇博客 java Map排序 (2)c++ map排序(key,value),能够对c++ map和java Map进行对照:之 ...
- struct、union、enum and sizeof
struct 1.结构体和数组的差别:能够再结构体里声明数组.结构体变量能够相互赋值.而数组不行. 2.struct与class的差别:class的成员訪问权限默认是private,而struct成员 ...
- C++之枚举
1. 声明枚举类型格式 enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6 enumDay1{Mon1,Tue1,Wed1};//Mon1=0;Tue1=1;We ...
- C++面试宝典2011版
1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new相应free仅仅会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,ne ...
- C面试题
1.sizeof()和strlen()使用? 答案: 1.从功能定义,strlen功能,要查找字符串的长度,sizeof功能是用来寻找指定的变量或变量类型的存储器占用 尺寸: 2.sizeof是运算符 ...
- C语言面试题大汇总之华为面试题 Eddy整理
1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...
- Swift学习笔记-1
Apple官方开发手冊地址: https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/La ...
- 怎样在C语言里实现“面向对象编程”
有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样.面向对象作为一种设计方法.是不限制语言的.仅仅能说,用C++/Java这样的语法来实现面向对象会更easy.更自然一些. 在本节中 ...
- CPP-练习
HW: 1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会 ...
随机推荐
- ST3使用
创建新的构建系统 Tools -> Build System -> New Build System... 输入类似的构建指令(首先清除当前的运行程序后再重新运行): { "sh ...
- angular的优化
https://github.com/atian25/blog/issues/5 更快地执行digest: 优化watch $scope.$watch(watchExpression, modelCh ...
- js的弹性运动
弹性: 速度+=(目标点-当前值)/系数://系数大概可以选择6,7,8 速度*=摩擦系数://系数可以选择0.7,0.75,0.8 缓冲: 速度=(目标点-当前值)/系数: 速度取整:
- python--第一类对象,函数名,变量名
一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...
- C语言内存函数
http://see.xidian.edu.cn/cpp/u/hs3/ 函数 说明 calloc() 分配内存空间 free() 释放内存空间 getpagesize() 取得内存分页大小 mallo ...
- 一丶Python模块之getpass模块
Python模块之getpass模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. getpass模块提供了可移 ...
- php官方微信接口大全
微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class ...
- Nginx+Php中限制站点目录防止跨站的配置方案记录
Nginx+Php中限制站点目录防止跨站的配置方案记录(使用open_basedir)-------------------方法1)在Nginx配置文件中加入: 1 fastcgi_param PH ...
- 虚拟机安装centos6.5
最近想搞一下代码覆盖率的jacoco,需要在linux环境下部署一套jenkins.故需要装一个centos的虚拟机. 一.安装虚拟机. 下载后安装一个虚拟机,我选择的是VMware虚拟机 二.安装c ...
- 常州模拟赛d2t1 小X的质数
题目背景 小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的 情感.小 X 认为,质数是一切自然数起源的地方. 题目描述 在小 X 的认知里,质数是除了本身和 1 以外,没有其他因 ...