从语法上,在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的差别的更多相关文章

  1. 搜狗面试的经典题(C++map按值排序,class struct的差别)

    一:起因 (1)java  Map排序(key,value).请看还有一篇博客 java Map排序 (2)c++ map排序(key,value),能够对c++ map和java Map进行对照:之 ...

  2. struct、union、enum and sizeof

    struct 1.结构体和数组的差别:能够再结构体里声明数组.结构体变量能够相互赋值.而数组不行. 2.struct与class的差别:class的成员訪问权限默认是private,而struct成员 ...

  3. C++之枚举

    1. 声明枚举类型格式 enum Day{ Mon,Tue=5,Wed};//Mon=0;Tue=5;Wed=6 enumDay1{Mon1,Tue1,Wed1};//Mon1=0;Tue1=1;We ...

  4. C++面试宝典2011版

    1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new相应free仅仅会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,ne ...

  5. C面试题

    1.sizeof()和strlen()使用? 答案: 1.从功能定义,strlen功能,要查找字符串的长度,sizeof功能是用来寻找指定的变量或变量类型的存储器占用 尺寸: 2.sizeof是运算符 ...

  6. C语言面试题大汇总之华为面试题 Eddy整理

    1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...

  7. Swift学习笔记-1

    Apple官方开发手冊地址: https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/La ...

  8. 怎样在C语言里实现“面向对象编程”

    有人觉得面向对象是C++/Java这样的高级语言的专利,实际不是这样.面向对象作为一种设计方法.是不限制语言的.仅仅能说,用C++/Java这样的语法来实现面向对象会更easy.更自然一些. 在本节中 ...

  9. CPP-练习

    HW: 1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会 ...

随机推荐

  1. Shell中各种括号的作用

    一.小括号,圆括号() 1.单小括号 () ① 命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号 ...

  2. $monitor用法

    1.$monitor 进程同一时间有且仅有一个,若多次调用$monitor,新进程会代替以前的monitor进程. 2.$fmonitor可以同时存在任意个. 3.一般不用$monitor系统函数. ...

  3. (三)Python3 循环语句——while

    while语句的一般形式: while 判断条件: 语句 同样需要注意冒号和缩进.另外,在 Python 中没有 do..while 循环. 以下实例使用了 while 来计算 1 到 100 的总和 ...

  4. shell-code-5-函数

    # 函数必须在使用前定义 # 如果不写return,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255) myFistFunc(){ read a read b return ...

  5. UITextView 实现placeholder

    1.在创建textView的时候,赋值其文本属性 即 textView.text = @"内容": 2.在开始编辑的代理方法中进行如下操作 - (void)textViewDidB ...

  6. 基础训练 Sine之舞

    Sine之舞 #include<iostream> #include<vector> #include<string.h> using namespace std; ...

  7. PAT Basic 1023

    1023 组个最小数 给定数字0-9各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意0不能做首位).例如:给定两个0,两个1,三个5,一个8,我们得到的最小 ...

  8. 文本搜索grep知识点总结

    文本搜索工具:grep, egrep     根据用户指定的模式对目标文件进行过滤,显示被模式匹配到的行     grep [OPTION]... 'PATTERN' FILE...          ...

  9. 为什么我打的jar包没有注解?

    本文来自网易云社区 作者:王飞 一.前言 一切问题的起源就是来自一个问题"为什么我打的jar包没有注解?",带着这个疑问查了一圈资料,原来问题主要是在没有将源码中的注释进行抽取打包 ...

  10. tensorflow在各种环境下搭建与对比

    tensorflow在各种环境下搭建与对比 由于有些训练是要长时间进行训练(几天),才能看出显著的结果,如果只是通过本地的计算机进行训练是不可能的.因此这周花了一些时间调研如何才能让神经网络长时间的进 ...