struct与class区别和Class的区别

比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
C++对象模型之struct和class的区别
关键字:C++
  今天这篇博文主要讲解在C++中关键字struct和class的区别。我的这篇博文,就按照系统的将这两个关键字的不同面进行详细的讲解。
  从语法上来讲,class和struct做类型定义时只有两点区别:
  (1)默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
  (2)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。以上两点也是struct和class最基本的差别,也是最本质的差别;
  但是在C++中,struct进行了扩展,现在它已经不仅仅是一个包含不同数据类型的数据结构了,它包括了更多的功能;
  首先,struct能包含成员函数吗?是的,答案是肯定的。
  好的,写一段代码验证一下:
  #include "stdafx.h"
  struct Test
  int getA()
  void setA(int temp)
  int _tmain(int argc, _TCHAR* argv[])
  Test testS
  testStruct.setA(10);
  cout《"Get the value from struct:"《testStruct.getA()《
  Test *testStructPointer = new T
  testStructPointer-&setA(20);
  cout《"Get the value from struct again:"《testStructPointer-&getA()《
  delete testStructP
  return 0;
  以上的代码会很正确的运行,是的;没错,struct能包含成员函数的。
  第二,struct有自己的构造函数吗?是的,可以的。
  #include "stdafx.h"
  struct Test
  Test()
  a = 100;
  int getA()
  void setA(int temp)
  int _tmain(int argc, _TCHAR* argv[])
  Test testS
  testStruct.setA(10);
  cout《"Get the value from struct:"《testStruct.getA()《 Test *testStructPointer = new T testStructPointer-&setA(20);
  cout《"Get the value from struct again:"<GETA()《ENDL;
  delete testStructP
  // test the constructor
  Test testC
  cout《"Set the value by the construct and get it:"《testConstructor.getA()《
  return 0;
  第三,struct可以有析构函数么?让我来验证一下;
  #include "stdafx.h"
  struct Test
  Test()
  a = 100;
  int getA()
  void setA(int temp)
  ~Test()
  cout《"Destructor function called."《
  int _tmain(int argc, _TCHAR* argv[])
  Test testS
  testStruct.setA(10);
  cout《"Get the value from struct:"《testStruct.getA()《 Test *testStructPointer = new T testStructPointer-&setA(20);
  cout《"Get the value from struct again:"<GETA()《ENDL;
  delete testStructP
  // test the constructor
  Test testC
  cout《"Set the value by the construct and get it:"《testConstructor.getA()《
  return 0;
  是的,完全支持析构函数。
  第四,struct支持继承么?再让我写代码验证一下;
  #include "stdafx.h"
  struct A
  a = 10;
  void print()
  cout《"I am from A"《
  struct B : A
  a = 30; // set a to 30
  b = 20;
  /*void print()
  cout《"I am from B"《
  int _tmain(int argc, _TCHAR* argv[])
  cout《b1.a《
  cout《b1.b《
  b1.print();
  cout《a1.a《
  a1.print();
  return 0;
  运行上述代码,struct支持继承。
  第五,struct支持多肽么?写代码测试一下便知;
  #include "stdafx.h"
  struct A
  virtual void print() = 0;
  struct B : A
  void print()
  cout《"I am from B"《
  struct C : A
  void print()
  cout《"I am from C"《 } }; int _tmain(int argc, _TCHAR* argv[]) { A *a1; B *b1 = new B; C *c1 = new C; a1 = b1; a1-&print(); // call B, not A
  a1 = c1;
  a1-&print(); // call C, not A
  return 0;
  第六,struct支持private、protected和public关键字么?
  #include "stdafx.h"
  struct A
  private:
  protected:
  public:
  b = 10;
  c = 20;
  d = 30;
  struct B : A
  void printA_C()
  cout《A::c《
  // private member can not see
  /*void printA_B()
  cout《A::b《
  void printA_D()
  cout《A::d《
  int _tmain(int argc, _TCHAR* argv[])
  // private member can not see
  //cout《a1.b《
  // protected member can not see
  //cout《a1.c《
  // public member can see
  cout《a1.d《
  return 0;
  写了这么多了,那么会出现这种一个状况,如果是class的父类是struct关键字描述的,那么默认访问属性是什么?
  当出现这种情况时,到底默认是public继承还是private继承,取决于子类而不是基类。class可以继承自struct修饰的类;同时,struct也可以继承自class修饰的类,继承属性如下列描述:
  struct A{};
  class B:A{}; // private 继承
  class A{};
  struct B:A{}; // public 继承
  最后,那么到底是使用struct,还是使用class呢?这个看个人喜好,但是这里有一个编程规范的问题,当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class.
[ 责任编辑:之极 ]
新经济、新业态环境下,数据量呈…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyteclass和struct_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
class和struct
上传于||文档简介
&&c&#8203;l&#8203;a&#8203;s&#8203;s&#8203;和&#8203;s&#8203;t&#8203;r&#8203;u&#8203;c&#8203;t&#8203;区&#8203;别
大小:3.34KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢c中的struct与class的区别
关于使用大括号初始化
class和struct如果定义了构造函数的话,都不能用大括号进行初始化如果没有定义构造函数,struct可以用大括号初始化。如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。
关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。
关于继承方式
class继承默认是private继承,而struct继承默认是public继承。
为什么在C++中存在struct?很多人都会想到这是为了让C++和C兼容,那么问题就是如何使用C++中的struct和C兼容起来。
把C++要交换到C程序的数据在C++程序中声明成一个struct,然后根据C++中程序的语意选择继承或者聚合这个struct,然后在使用的时候就
可以把这个struct封装起来传递到C中或者从C中传递到C++。(注:在深入探索C++对象模型中建议使用聚合,而不是继承,原因是为了和C语言的空
间分布兼容,因为在C++引入虚函数,虚继承导致了派生类的空间包括struct的空间和vptr、vbtl,而且vptr、vbtl存放在哪里由编译器
自己决定,C++标准中没有定义)。
给出一个从C++到C语言的一个简单的例子:
//C++头文件moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
struct person
char name[20];
class male
&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&
int getAge()
&&&&&&&&&&&&
&&&&&&&&&&&&&&&
return per.&
&&&&&&&&&&&&&
extern "C" void print(person );
//C++的实现文件
#include "moduleA.h"
void print(person per)
printf("age :%d, \n",per.age);
extern "C"
#include "moduleA.h" //或者只要这个也能通过编译
int main(void)
per.age = 18;
print(per);
讨论一下结构(struct)与类(class)的区别,你认为结构(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从根本上也只是个包装数据的语法机制。
---------------------------------------------------------------
最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点:“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。结构(struct),联合(union)以及类(class)的区别与联系?
[问题点数:80分,结帖人WYhack]
结构(struct),联合(union)以及类(class)的区别与联系?
[问题点数:80分,结帖人WYhack]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2010年7月 Linux/Unix社区大版内专家分月排行榜第三
2008年11月 C/C++大版内专家分月排行榜第三
2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
2012年11月 Linux/Unix社区大版内专家分月排行榜第二2011年8月 Linux/Unix社区大版内专家分月排行榜第二2008年10月 C/C++大版内专家分月排行榜第二
2012年8月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 struct与class区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信