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.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会 ...
随机推荐
- Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)
摘要: 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 伪静态网页.虚拟环境 视图层 JsonResponse FBV 与 CBV(function base views与class bas ...
- (转)在Xcode 7上直接使用Clang Address Sanitizer
原文地址: http://www.cocoachina.com/ios/20150730/12830.html WWDC 2015上,除了Swift 2.0外,还有一个令人激动的消息:可以直接在Xco ...
- Atrenta电话面试(C++研发工程师)
1.代码量是多少,你负责哪一块,工作量占%几,改进了什么 2.c++ 和 c 的 区别 3.list 和 vector 的 适用条件 4.hash_map 和 map 的 区别 , 使用h ...
- grunt与seajs结合应用
9.seajs构建的问题 01.png和02.jpg 10.seajs与grunt如何结合开发.两个插件:grunt-cmd-transport grunt-cmd-contact ,去grunt官网 ...
- Python Jquery学习
jquery调用方法: $(css的选择器).操作函数 语法格式: 操作函数: html 修改内容 点击button键后,jquery就会变为bootstrap 当然里面也可以进行判断,实现 ...
- How To Configure VMware fencing using fence
本文主要简单介绍一下如何在RHEL 7 Pacemaker中配置一个fence_vmware_soap类型的STONITH设备(仅供测试学习). STONITH是Shoot-The-Other-Nod ...
- Codeforces #765D
我在这道题上花了2个小时,仍没解出.理一下当时的思路,看看症结到底在哪里. 题意 用 $[n]$ 表示集合 $\{1,2,3,\dots, n\}$ . 3个函数 $f \colon [n] \to ...
- PAT天梯赛练习题——L3-005. 垃圾箱分布(暴力SPFA)
L3-005. 垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁 ...
- POJ——2251Dungeon Master(三维BFS)
Dungeon Master Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 25379 Accepted: 9856 D ...
- BZOJ 1294 [SCOI2009]围豆豆Bean ——计算几何
显然我们不可能表示出一台路径,因为实在是太复杂了. 所以我们可以记录一下路径对答案的影响,显然路径对答案影响相同的时候,答案更优,所以我们可以用影响来代替路径. 所以我们考虑状压一下所有的豆子有没有被 ...