C114门户论坛百科APPEN| 举报 切换到宽版

亚星游戏官网

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

亚星游戏官网-yaxin222  副版主

注册:2008-12-47

爱心徽章,2011年为家园助学活动奉献爱心纪念徽章

发表于 2011-8-2 23:31:01 |显示全部楼层
一.从struct开始说起
相信每一个学过C语言的同学都知道struct,用于定义用户自己的抽象数据类型

OK,下面来看一段代码:
  1. #include <iostream.h>
  2. struct A
  3. {
  4.     int a;
  5.     int b;
  6. };
  7. A a;
  8. int main()
  9. {
  10.     cout<<sizeof(a)<<"\n";   
  11.     return 0;
  12. }
复制代码
这是一段很普通的代码,定义了一个struct A类型的变量,然后将这个变量所占空间的大小给打印出来

细心的读者可能发现了这里的语法和以前学的纯C语言有点不太一样,在很多纯C编译器中,是不能这样定义的,要么在定义struct A类型的同时定义一个该类型的变量:
  1. struct A
  2. {
  3.     int a;
  4.     int b;
  5. }a;
复制代码
要么先把struct A定义为一个类型,再定义一个该类型的变量:
  1. typedef struct A
  2. {
  3.     int a;
  4.     int b;
  5. };

  6. A a;
复制代码
为什么C++里面就可以这样定义呢?因为C++编译器对C进行了扩展

下面来看看C++特有的东西:class
  1. class B
  2. {
  3.     int a;
  4.     int b;
  5. };
  6. B b;
  7. int main()
  8. {
  9.     cout<<sizeof(b)<<"\n";
  10.     return 0;
  11. }
复制代码
和前面一样,大家定义了class B和它的对象b,并且打印了这个对象所占空间的大小。


运行这两个程序,发现它们的运行结果是相同的:
亚星游戏官网-yaxin222

呵呵,是不是感觉struct和class有些相似啊!但是您可能会问“class里可以定义函数,struct里也可以吗?”,答案当然是肯定的。

现在大家将代码修改一下:
  1. #include <iostream.h>
  2. struct A
  3. {
  4.     int a;
  5.     int b;
  6.     void f()
  7.     {
  8.     }
  9. };
  10. A a;
  11. class B
  12. {
  13.     int a;
  14.     int b;
  15.     void f()
  16.     {
  17.     }
  18. };
  19. B b;
  20. int main()
  21. {
  22.     cout<<"\n"<<sizeof(a)<<"\n";
  23.     cout<<"\n"<<sizeof(b)<<"\n";
  24.     return 0;
  25. }
复制代码
运行结果如下:
亚星游戏官网-yaxin222

可以看出,struct里面也是可以定义函数的。那么,struct和class真的完全一样吗?答案是否定的

大家再将代码修改一下:
  1. #include <iostream.h>
  2. struct A
  3. {
  4.     int a;
  5.     int b;
  6.     void f()
  7.     {
  8.     }
  9. };
  10. A a;
  11. class B
  12. {
  13.     int a;
  14.     int b;
  15.     void f()
  16.     {
  17.     }
  18. };
  19. B b;
  20. int main()
  21. {
  22.     a.a = 1;
  23.     b.a = 2;
  24.     return 0;
  25. }
复制代码
运行代码,结果。。。无法通过编译,编译器报错:
亚星游戏官网-yaxin222

原来出错点在这里:
亚星游戏官网-yaxin222

看来struct和class还是有不同的!不同点就在于:
struct成员的默认访问权限是public的,而class成员的默认访问权限是private的!
可见,struct和class并没有本质区别,除了默认的成员访问权限不一样。

也许您学过JAVA,会发现在C++中定义class和在JAVA里不大一样,在C++里定义一个class后需要一个“;”,但是在JAVA中缺不需要。
这是因为C++是从C演化而来,这个“++”就是在C的基础上加了一些东西,一些面向对象的东西。同理,GPRS可以叫GSM++,HSPA可以叫3G++,呵呵
回到正题,因为C++是从C语言演化而来,是C语言的超集,因此保留了向前兼容的特性,因为C++中的class是从C语言中的struct演化而来,因此保留了struct定义时的格式:
  1. struct A{};
  2. class B{};
复制代码
在这点上,JAVA似乎要洒脱得多:
  1. public class A{}
复制代码
可以看出,在面向对象方面,JAVA比C++更彻底,因为JAVA自诞生之日起就是一门纯粹的面向对象的编程语言。

[ 本帖最后由 家园小助手 于 2011-12-20 14:30 编辑 ]

举报本楼

本帖有 53 个回帖,您需要登录后才能浏览 登录 | 注册
您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系大家 |网站地图  

GMT+8, 2024-11-26 04:27 , Processed in 0.295701 second(s), 16 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部
XML 地图 | Sitemap 地图