明晰class和struct之间的区别



                                                                                                                    class与struct
c++最初被称为“c with class”,足见class在c++中的地位。在c++中我们可以用class自定义用户数据类型,然而它还存在一个类似的——struct,他们似乎有着太多的相同的特点与功能。
由于在设计c++时就考虑到要向下兼容c,所以c++中的很多东西都能在c中找到,要谈及struct就要从c谈起。
c中struct的定义如下:
struct  结构名
{
  成员表
};
因为struct是一种数据类型,那么就肯定不能定义函数,所以在面向c的过程中,struct不能包含任何函数,如下所示:
struct  A
{
int length;
int width;
};
如果出现下面的结构体定义,编译器将报错:
struct  A
{
int length;
int width;
int GetSize()
{
return length*width;
};
};
面向过程的编程认为,数据和数据操作是分开的。然而当struct进入面向对象的c++时,其特性也有了新发展,就拿上面的错误函数来说,在c++中就能运行,因为在c++中认为数据和数据对象是一个整体,不应该分开,这就是struct在c和c++两个时代的差别。
写到这或许很多人就会有异或了:c++中的struct不就和class一样了?是的 ,他们用起来差别不大,主要差别有以下几点:
(1)关于使用大括号初始化
class和struct如果定义了构造函数,就不能用大括号进行初始化了;若没有定义,struct可以用大括号初始化,而class只有在所有成员变量全是public的情况下,才可以用大括号进行初始化。
#include<iostream>
using namespace std ;
struct SA
 {
     int a ;
      int b ;
 };
  SA data1 ={2,3}; // 程序正确
  struct SB
 {
      int a ;
      int b ;
      SB ( int x , int y )
           : a ( x )
           , b ( y )
      {}
      ~ SB ()
      {}
 };
  SB data2 ={2,3};  // 程序错误
  class CA
 {
  public :
      int a ;
      int b ;
 };
  CA data3 ={2,3}; // 正确
  class CB
 {
  public :
      int a ;
      int b ;
      CB ( int x , int y )
           : a ( x )
           , b ( y )
      {}
      ~ CB ()
      {}
 };
  CB data4 ={2,3};      // 错误
  class CC
 {
  public :
      CC ( int x , int y )
           : a ( x )
           , b ( y )
      {}
      ~ CC ()
      {}
  private :
      int a ;
      int b ;
 };
  CC data5 ={2,3}; // 错误
以上代码在vs2008下会提示
1>f:\ 程序 \ 继承和多态(初) \ 继承和多态(初) \test.cpp(21) : error C2552: data2 : 不能用初始值设定项列表初始化非聚合
1>f:\ 程序 \ 继承和多态(初) \ 继承和多态(初) \test.cpp(41) : error C2552: data4 : 不能用初始值设定项列表初始化非聚合
1>f:\ 程序 \ 继承和多态(初) \ 继承和多态(初) \test.cpp(53) : error C2552: data5 : 不能用初始值设定项列表初始化非聚合
关于 这种初始化的不同,在新的标准c++中已经不存在了,因为新标准制定了统一的初始化语法,代码如下:
// 类初始化
  C c {0,0}; // 相当于 C++0x 中的: C c(0,0);
  // 数组初始化
  int * a = new int [3] {1,2,3};
  // 成员变量初始化
  class X
 {
  int a [4];
  public :
      X ()
           : a {1,2,3,4}
      {}
 };
  //vector 容器初始化
  vector < string > vs ={ "first" , "second" , "third" };
  //map 容器初始化
  map singers =
 {
      {
       "Lady Gaga" , "+1 (212) 555-7890"     
      },
      {
      "Mr Wang" ,   "+1 (212) 555-5678"
        }
 };
虽然大括号的初始化方式在新标准中得到统一,但是现在也仅仅是标准,在新标准执行之前这种不同仍然存在。
(2)关于默认权限访问
class中默认成员访问权限是private,而struct的默认访问权限是public,具体代码如下:
struct SA
{
      int a ;
      int b ;
};
class CA
{
   int a ;
   int b ;
};
SA data1 ={2,3};
CA data2 ={2,3};
cout << data1 . a << data2 . a << endl ;
错误提示: 1>f:\ 程序 \ 继承和多态(初) \ 继承和多态(初) \test.cpp(94) : error C2552: data2 : 不能用初始值设定项列表初始化非聚合
(3)关于继承方式
class中默认继承方式是private,而struct的默认继承方式是public,具体代码如下:
struct SA
{
int a ;
int b ;
};
struct D1 : SA
{
   int c ;
};
class CA
{
public :
   int a ;
   int b ;
};
class D2 : CA
{
public :
int c ;
};
D1 a ;
D2 b ;
cout << a . a << endl ;
cout << b . a << endl ;
虽然感觉struct是多余的,但考虑到“对c兼容”就将struct保留了下来,并做了一些扩展使其更适合面向对象,所以c++中的struct再也不是c中的那个了。
而两者最大的区别就在于思想上,c语言编程单位是函数,语句是程序的基本单元。而C++语言的编程单位是类。从c到c++的设计有过程设计为中心向以数据组织为中心转移。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值