求助struct的struct有构造函数吗到底该怎么弄

浅析c与c++中struct的区别
转载 & & 作者:
c与c++中struct的区别你是否了解,下面小编就详细的为大家介绍一下
这里有两种情况下的区别。(1)C的struct与C++的class的区别。(2)C++中的struct和class的区别。在第一种情况下,struct与class有着非常明显的区别。C是一种过程化的语言,struct只是作为一种复杂数据类型定义,struct中只能定义成员变量,不能定义成员函数(在纯粹的C语言中,struct不能定义成员函数,只能定义变量)。例如下面的C代码片断: 代码如下:&&&&&&& struct Point&&&&&&& {&&&&&&&&&&&&&&& // 合法&&&&&&&&&&&&&&& // 合法&&&&&&&&&&&&&&& void print()&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& printf("Point print\n"); //编译错误&&&&&&&&&&&&&&& };}9&&&&&&& ;
这里第7行会出现编译错误,提示如下的错误消息:“函数不能作为Point结构体的成员”。因此大家看到在第一种情况下struct只是一种数据类型,不能使用面向对象编程。
现在来看第二种情况。首先请看下面的代码: 代码如下:&&&&&& #include &iostream&&&&&&&&&&&&&&& class CPoint&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //默认为private&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //默认为private&&&&&&&&&&&&&&& void print()&&&&&&&&&&&& //默认为private&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& cout && "CPoint: (" && x && ", " && y && ")" &&&&&&&&&&&&&&&&& }&&&&&&& public:&&&&&&&&&&&&&&& CPoint(int x, int y)&&&&& //构造函数,指定为public&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& this-&x =&&&&&&&&&&&&&&&&&&&&&&& this-&y =&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& void print1() //public&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& cout && "CPoint: (" && x && ", " && y && ")" &&&&&&&&&&&&&&&&& }&&&&&&& };&&&&&&& struct SPoint&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&&&&&& //默认为public&&&&&&&&&&&&&&&&&&&&&&&&&&&& //默认为public&&&&&&&&&&&&&&& void print()&&&&&&&& //默认为public&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& cout && "SPoint: (" && x && ", " && y && ")" &&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& SPoint(int x, int y)& //构造函数,默认为public&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& this-&x =&&&&&&&&&&&&&&&&&&&&&&& this-&y =&&&&&&&&&&&&&&& }&&&&&&& private:&&&&&&&&&&&&&&& void print1()&&&&& //private类型的成员函数&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& cout && "SPoint: (" && x && ", " && y && ")" &&&&&&&&&&&&&&&&& }&&&&&&& };&&&&&&& int main(void)&&&&&&& {&&&&&&&&&&&&&&& CPoint cpt(1, 2);& //调用CPoint带参数的构造函数&&&&&&&&&&&&&&& SPoint spt(3, 4);& //调用SPoint带参数的构造函数&&&&&&&&&&&&&&& cout && cpt.x && " " && cpt.y &&& //编译错误&&&&&&&&&&&&&&& cpt.print();&&&&&& //编译错误&&&&&&&&&&&&&&& cpt.print1();&&&&& //合法&&&&&&&&&&&&&&& spt.print();&&&&& //合法&&&&&&&&&&&&&&& spt.print1();&&&& //编译错误&&&&&&&&&&&&&&& cout && spt.x && " " && spt.y &&& //合法&&&&&&&&&&&&&&& return 0;&&&&&&& }
在上面的程序里,struct还有构造函数和成员函数,其实它还拥有class的其他特性,例如继承、虚函数等。因此C++中的struct扩充了C的struct功能。那它们有什么不同呢?
main函数内的编译错误全部是因为访问private成员而产生的。因此我们可以看到class中默认的成员访问权限是private的,而struct中则是public的。在类的继承方式上,struct和class又有什么区别?请看下面的程序: 代码如下:&&&&&& #include &iostream&&&&&&&&&&&&&&& class CBase&&&&&&& {&&&&&&& public:&&&&&&&&&&&&&&& void print()&&&&&&&&&&&&&&& //public成员函数&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&& cout && "CBase: print()..." &&&&&&&&&&&&&&&&& }&&&&&&& };&&&&&&& class CDerived1 : CBase&&&&&&& //默认private继承&&&&&&& {&&&&&&& };&&&&&&& class CDerived2 : public Cbase&& //指定public继承&&&&&&& {&&&&&&& };&&&&&&& struct SDerived1 : Cbase&&&&&&& //默认public继承&&&&&&& {&&&&&&& };&&&&&&& struct SDerived2 : private Cbase& //指定public继承&&&&&&& {&&&&&&& };&&&&&&& int main()&&&&&&& {&&&&&&&&&&&&&&& CDerived1 cd1;&&&&&&&&&&&&&&& CDerived2 cd2;&&&&&&&&&&&&&&& SDerived1 sd1;&&&&&&&&&&&&&&& SDerived2 sd2;&&&&&&&&&&&&&&& cd1.print();&&& //编译错误&&&&&&&&&&&&&&& cd2.print();&&&&&&&&&&&&&&& sd1.print();&&&&&&&&&&&&&&& sd2.print();&&& //编译错误&&&&&&&&&&&&&&& return 0;&&&&&&& }
可以看到,以private方式继承父类的子类对象不能访问父类的public成员。class继承默认是private继承,而struct继承默认是public继承。另外,在C++模板中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。事实上,C++中保留struct的关键字是为了使C++编译器能够兼容C开发的程序。答案:分以下所示两种情况。C的struct与C++的class的区别:struct只是作为一种复杂数据类型定义,不能用于面向对象编程。C++中的struct和class的区别:对于成员访问权限以及继承方式,class中默认的是private的,而struct中则是public的。class还可以用于表示模板类型,struct则不行。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
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技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte56被浏览6,733分享邀请回答typedef struct {
float x, y;
Vector2 a = { 1.0f, 2.0f };
Vector2 b = { .x = 3.0f, .y = 4.0f }; // C99 designator
C++ 在没有构造函数、没有继承基类、没有私有/保护的非成员变量等条件下(详看 ),也可以用初始化列表,与 C 兼容;但 designator 语法在 C++20 才会有。在实践上,虽然 C 语言没有构造函数的概念,也不妨碍使用者自行定义函数作初始化,如:Vector2 Vector2Init(float x, float y) {
Vector2 r = { x, y };
void foo() {
Vector2 a = Vector2Init(1.0f, 2.0f);
或void Vector2Init(Vector2* v, float x, float y) {
void foo() {
Vector2 a;
Vector2Init(&a, 1.0f, 2.0f);
这种 struct 初始化方式的「优点」是,使用者可用多个不同名字的函数定义不同的初始化方式。而 C++ 构造函数必须和类同名,只能通过参数类型来区分,例如用
这些东西。缺点是,无法规避使用者不调用函数,而 C++ 是可以自动调用缺省构造函数,或故意产生编译错误,令使用者知道忘记了写初始化参数,从而避免了一些 bug。相似地,C++ 也有析构函数,两者造就 C++ 的一大特徵 RAII(Resource Acquisition Is Initialization)。746 条评论分享收藏感谢收起struct foo { int bar; };
struct foo f;
struct foo f = { 42 };
struct foo f = { .bar = 42 };
C 语言本身是比较简单的,很多后辈语言的特性在这里只是从既有游戏规则上发展而来的惯有用法,甚至连最重要的内存分配功能都不是核心语言的一部分,而是以库函数的形式出现的。真要拿 C++ 的构造函数类比的话,也许类似这套基于
的 ADT 的做法更有可比性。struct foo;
struct foo *foo_create();
int foo_do_something(struct foo *f, int arg);
// 调用方法
void foo_destroy(struct foo *f);
就相当于构造函数。这样的做法中, 的结构并不在头文件中暴露,是不完整类型(incomplete type),于是避免了你绕过
对象的可能性。如果一定要说优点,那么这样一刀切的做法似乎更新手友好一些,同时由于在头文件里完全隐去了内部实现,似乎也是比 C++ 的类方式「封装」地更彻底。缺点则是代码非常 explicit,同时也没有 C++ 的瑰宝 RAII。21 条评论分享收藏感谢收起C++匿名struct 如何定义构造函数
[问题点数:20分,结帖人aasmfox]
C++匿名struct 如何定义构造函数
[问题点数:20分,结帖人aasmfox]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年1月 VC/MFC大版内专家分月排行榜第三
2015年9月 VC/MFC大版内专家分月排行榜第二2015年7月 硬件/嵌入开发大版内专家分月排行榜第二2014年5月 VC/MFC大版内专家分月排行榜第二2014年3月 VC/MFC大版内专家分月排行榜第二2013年10月 VB大版内专家分月排行榜第二2013年7月 VB大版内专家分月排行榜第二2012年5月 VB大版内专家分月排行榜第二2012年4月 VB大版内专家分月排行榜第二2012年2月 VB大版内专家分月排行榜第二2011年11月 VB大版内专家分月排行榜第二
2015年11月 VC/MFC大版内专家分月排行榜第三2015年6月 VC/MFC大版内专家分月排行榜第三2015年2月 VC/MFC大版内专家分月排行榜第三2014年1月 VC/MFC大版内专家分月排行榜第三2012年3月 VB大版内专家分月排行榜第三2011年12月 VB大版内专家分月排行榜第三2011年10月 VB大版内专家分月排行榜第三
匿名用户不能发表回复!|& 果然,c++ 的 struct 和 class 还真的是小异大同
class 的默认访问权限是private , struct的默认访问权限是public
class有继承,多态机制,struct 没有。
阅读(...) 评论()

我要回帖

更多关于 struct 构造函数 的文章

 

随机推荐