一、

C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。

struct能包含成员函数吗?   能!

struct能继承吗?          能!!

struct能实现多态吗?       能!!!

最本质的一个区别就是默认的访问控制,体现在两个方面:

1)默认的继承访问权限。struct是public的,class是private的。

写如下的代码:

struct A

{

char a;

};

struct B : A

{

char b;

};

这个时候B是public继承A的。如果都将上面的struct改成class,那么B是private继承A的。这就是默认的继承访问权限。所以我们在平时写类继承的时候,通常会这样写:

struct B : public A

就是为了指明是public继承,而不是用默认的private继承。

当然,到底默认是public继承还是private继承,取决于子类而不是基类。我的意思是,struct可以继承class,同样class也可以继承struct,那么默认的继承访问权限是看子类到底是用的struct还是class。如下:

struct A{};

class B : A{};    //private继承

struct C : B{};  //public继承

2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。

3)“class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。

4) 还是上面所说的,C++中的struct是对C中的struct的扩充,既然是扩充,那么它就要兼容过去C中struct应有的所有特性。例如你可以这样写:

struct A    //定义一个struct

{

char c1;

int  n2;

double db3;

};

A a={'p',7,3.1415926};  //定义时直接赋值

也就是说struct可以在定义的时候用{}赋初值。

向上面的struct中加入一个构造函数(或虚函数),struct也不能用{}赋初值了。的确,以{}的方式来赋初值,只是用一个初始化列表来对数据进行按顺序的初始化,如上面如果写成A a={'p',7};则c1,n2被初始化,而db3没有。这样简单的copy操作,只能发生在简单的数据结构上,而不应该放在对象上。加入一个构造函数或是一个虚函数会使struct更体现出一种对象的特性,而使此{}操作不再有效。事实上,是因为加入这样的函数,使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。至于虚函数和普通成员函数有什么区别,我会具体写篇文章讨论。

那么,看到这里,我们发现即使是struct想用{}来赋初值,它也必须满足很多的约束条件,这些条件实际上就是让struct更体现出一种数据机构而不是类的特性。那为什么我们在上面仅仅将struct改成class,{}就不能用了呢?其实问题恰巧是我们之前所讲的——访问控制!你看看,我们忘记了什么?对,将struct改成class的时候,访问控制由public变为private了,那当然就不能用{}来赋初值了。加上一个public,你会发现,class也是能用{}的,和struct毫无区别!!!

从上面的区别,我们可以看出,struct更适合看成是一个数据结构的实现体,class更适合看成是一个对象的实现体。

二、

关于使用大括号初始化
  class和struct如果定义了构造函数的话,都不能用大括号进行初始化
  如果没有定义构造函数,struct可以用大括号初始化。
  如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。
关于默认访问权限
  class中默认的成员访问权限是private的,而struct中则是public的。
关于继承方式
  class继承默认是private继承,而struct继承默认是public继承。
  且看如下代码(看看编译器给出的错误信息):

class T1
{
 public:
  void f()
  {
   cout<<"T1::f()"<<endl;
  }
 int x,y;
};
struct T2
{
 int x;
 void f(){cout<<"T2::f()"<<endl;}
};
struct TT1 : T1
{
};
class TT2 : T2
{
};
int main()
{
 TT1 t1;
 TT2 t2;
 t1.f();
 t2.f();
}

关于模版
  在模版中,类型参数前面可以使用class或typename,如果使用struct,则含义不同,struct后面跟的是“non-type template parameter”,而class或typename后面跟的是类型参数。

template <struct X>
void f(X x)
{
}
//出错信息:d:codecpptestcpptestcpptest.cpp(33) : error C2065: 'X' : undeclared identifier

C++中struct和class的区别 [zz]相关推荐

  1. C与C++中struct及C++中struct与class的区别

    C++中struct与class的区别 struct class 备注 成员函数 能 能 均有构造函数及析构函数 继承性 能 能 多态性 能 能 均有虚函数 默认成员属性 public private ...

  2. C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...

  3. C# 中 Struct 与 Class 的区别,以及两者的适用场合

    C# 中 Struct 与 Class 的区别,以及两者的适用场合 先说区别,原文出处 http://www.dotnetspider.com/resources/740-Difference-bet ...

  4. C#中Struct与Class的区别

    class和struct最本质的区别是class是引用类型,而struct是值类型,它们在内存中的分配情况有所区别. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构 ...

  5. C++中Struct和Class的区别

    Struct和Class的区别 今天这篇博文主要讲解在C++中关键字struct和class的区别.这篇博文,将会系统的将这两个关键字的不同面进行详细的讲解. 从语法上来讲,class和struct做 ...

  6. c#中struct和class的区别

    简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建一个class类型实例被分配在托管堆上.但struct和class的区别远不止这么简单.本篇主要包 ...

  7. C# 中 Struct 和 Class 的区别总结

    翻译自 Manju lata Yadav 2019年6月2日 的博文 <Difference Between Struct And Class In C#>,补充了一些内容和示例. 结构体 ...

  8. C++_类和对象_封装_访问权限_C++中struct和class的区别---C++语言工作笔记037

    然后我们再来看c++中的访问权限控制,其实这个跟java中的很像 可以看到有3个,public 是类内类外都可以访问 protected 是保护权限,在类内可以访问,但是在类外不行.  这个在子类的时 ...

  9. C#中struct和class的使用区别是什么?

    class是引用类型,struct是值类型 引用类型在堆上,值类型是内联的. 值类型有全部的值的内容,而引用类型只有一个地址. 值类型总是有一个值,而引用类型指针可以为空. 为了优化减少体积 需要传递 ...

  10. C++中结构体与类的区别(struct与class的区别)

    C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能. struct能包含成员函数吗? 能! struct能继承吗? 能!! s ...

最新文章

  1. 黄仁勋从煤气灶下取出最新GPU:7nm全新安培架构,售价20万美元,训练性能顶6张V100...
  2. mysql5.7设置SQL Mode
  3. 为什么说嵌入式开发比单片机要难很多?
  4. 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用
  5. 使用jsp实现word excel格式报表打印-JSP教程 Jsp/Servlet
  6. 二十四节气插画素材,每一张都带你如感
  7. Being a good boy in the spring festival NIM博弈
  8. Facebook又开两处AI实验室,在西雅图和匹兹堡招兵买马
  9. python调用window dll和linux so例子
  10. 纯css+js打造返回顶部代码
  11. Linux打印显示时间
  12. echarts 背景颜色 渐变色,阴影效果
  13. 【数学建模】方差分析与回归分析的SPSS实现
  14. 数据科学-描述性统计
  15. Ubuntu20.04 添加右键新建文件
  16. 新品密集!2020中关村论坛技术交易大会-第二场新技术新产品首发活动圆满举行...
  17. 新仙剑奇侠传H5上线测试了
  18. C#调用12306API做余票查询
  19. html修改logo,教你用CSS3打造HTML5的Logo
  20. 谁是未来人类?虚拟人已进入日常生活

热门文章

  1. PHP找出专题下重复的商品数据
  2. java获取jsp页面下拉列表框_jQuery+jsp下拉框联动获取本地数据的方法(附源码)
  3. MAC使用CodeSign查看已签名的文件的数字签名情况
  4. JDK GUI对应的c文件
  5. VC++对话框里新添加的控件运行时不显示
  6. Dx unsupported class file version 52.0 Conversion to Dalvik format failed with error 1
  7. 今天有人问,为何汝粉丝这么少?
  8. 《TensorFlow技术解析与实战》学习笔记2
  9. QQ特性,决定了杀死进程不能收到电话呼叫
  10. 管理感悟:当领导就要敢于,及时做出决策