当前位置:  编程技术>c/c++/嵌入式

深入C++中struct与class的区别分析

    来源: 互联网  发布时间:2014-10-16

    本文导语:  一、C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数吗?   能!struct能继承吗?  能!!struct能实现多态吗?   能!!! 最本质的...

一、
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

    
 
 

您可能感兴趣的文章:

  • 深入C++浮点数无效值定义与判定的解决办法
  • 深入C++可见性与生命期的区别详解
  • 深入C++四种强制类型转换的总结
  • 用C++实现strcpy(),返回一个char*类型的深入分析
  • c++关键字mutable深入解析
  • 深入分析C++中两个大数相乘结果不正确的问题
  • 深入理解:Java是类型安全的语言,而C++是非类型安全的语言
  • 深入理解C++中常见的关键字含义
  • 深入分析C++中执行多个exe文件方法的批处理代码介绍
  • 从汇编看c++中变量类型的深入分析
  • C++ using namespace std 用法深入解析
  • 深入解析C++中的mutable关键字
  • C++实现strcmp字符串比较的深入探讨
  • C++中virtual继承的深入理解
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析
  • C++ Vector用法深入剖析
  • 深入C++中API的问题详解
  • C++中const的实现机制深入分析
  • 深入C++中inline关键字的使用
  • C++输入输出操作符重载的深入分析
  • Docker支持更深入的容器日志分析
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • try catch finally的执行顺序深入分析
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • ORA-00947:Not enough values (没有足够的值)的深入分析
  • 求一本電子書《深入分析Linux内核源码》
  • SQL语句中SUM与COUNT的区别深入分析
  • mysql中limit的用法深入分析
  • 深入分析NTFS中文件被锁定导致Process.Start失败的详解
  • 深入分析Java内存区域的使用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 关于《深入浅出MFC》
  • Linux有没有什么好的高级的书,我要深入,
  • 深入理解linux内核
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 如何深入Linux的内核学习?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 问一个《深入理解计算机系统》中的问题
  • ##想买书深入学习linux下的编程,请指教
  • 深入JDBC sqlserver连接写法的详解
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)
  • 请问JFC是否有必要深入研究?
  • 如何深入了解某个平台系统的底层
  • 各位,帮忙推荐几本深入学习Linux的书!!!




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3