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.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会 ...
随机推荐
- verilog disable 用法 (易错!)
disable语句可以退出任何循环,能够终止任何begin..end块的执行,用于仿真验证中. 例如 begin:one ;i<;i=i+) begin:two ) disable one; / ...
- 【linux】 【网络】【转发】服务器版自定义安装无法有线上网问题
- 剑指Offer(书):反转链表
题目:输入一个链表,反转链表后,输出新链表的表头. 分析:要分清他的前一个节点和后一个节点,开始的时候前节点为null,后节点为head.next,之后,反转. public ListNode Rev ...
- 总线(bus);设备(devices);驱动(drivers)
Linux Cross Reference Free Electrons Embedded Linux Experts • Source Navigation • Diff Markup • Id ...
- LeetCode 637. Average of Levels in Binary Tree(层序遍历)
Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...
- redis安装与安全设置
redis Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 yum安装redis 1.yum安装 #前提得配置好阿里云yum源,epel源 # ...
- Java总结输入流输出流
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群:618528494 我们一起学Java! 1.什么是IO Java中I/O操作主要是指使用 ...
- [转]python开发_shelve_完整版
''' python中的shelve模块,可以提供一些简单的数据操作 他和python中的dbm很相似. 区别如下: 都是以键值对的形式保存数据,不过在shelve模块中, key必须为字符串,而值可 ...
- Python第三方库之openpyxl(11)
Python第三方库之openpyxl(11) Stock Charts(股票图) 在工作表上按特定顺序排列的列或行中的数据可以在股票图表中绘制.正如其名称所暗示的,股票图表通常被用来说明股价的波动. ...
- 去掉WordPress顶部工具条
WordPress为了方便管理员,或者登陆用户快速的从前台进入后台来管理网站,在WordPress网站顶部强制加入了一个工具条(admin bar),而且默认是对所有登陆用户都显示的,有时候看着挺烦心 ...