struct和class的区别

struct和class的区别
这个主页不错 里面的INF..DLL资料都还不错
2007-06-30 13:24

1

  如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同!简单的说就是,存取class的data member和非virtual function效率和struct完全相同!不管该data member是定义在基类还是派生类的。
  
  如果不是为了和C兼容,C++中就不会有struct关键字。因此建议是:如果不需要与C兼容或传递参数给C程序,不要在C++中用struct。
  
  注意class的data member在内存中的布局可不一定是data member的申明次序。C++只保证处于同一个access section的data member按照申明次序排列。

2

这个话题可能是非常简单的,两者都是用户自定数据类型,但是我们都知道当声明一个struct时,如果我们在struct中没有定义访问修饰符,struct中所有的成员(数据和函数)默认都是public访问修饰符;如果在Class没有定义访问修饰符,class中所有的成员(数据和函数)默认都是private访问修饰符。这也是他们之间唯一的区别。

如果你是一个语言的设计者,你会设计这样的两个类型吗?我想不会,因为它们之间完全没有正交性,这样的设计是冗余的。那么问题就是为什么在C++中存在struct?很多人都会想到这是为了让C++和C兼容,那么问题就是如何使用C++中的struct和C兼容起来。

把C++要交换到C程序的数据在C++程序中声明成一个struct,然后根据C++中程序的语意选择继承或者聚合这个struct,然后在使用的时候就可以把这个struct封装起来传递到C中或者从C中传递到C++。(注:在深入探索C++对象模型中建议使用聚合,而不是继承,原因是为了和C语言的空间分布兼容,因为在C++引入虚函数,虚继承导致了派生类的空间包括struct的空间和vptr、vbtl,而且vptr、vbtl存放在哪里由编译器自己决定,C++标准中没有定义)。

给出一个从C++到C语言的一个简单的例子:

//C++头文件moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

struct person

{

       int age;

       char name[20];

};

 

class male

{

      private:

              int wife;

              struct person per;

      public:

             int getAge()

             {

                return per.age;  

              }

};

extern "C" void print(person );

#endif

//C++的实现文件

#i nclude "moduleA.h"

#i nclude <stdio.h>

void print(person per)

{

     printf("age :%d,  /n",per.age);

        return  ;

}

/*待处理的C语言文件*/

#i nclude <stdio.h>

extern "C"

{

       #i nclude "moduleA.h" //或者只要这个也能通过编译

}

int main(void)

{

       person per;

    per.age = 18;

    print(per);

       return 0;

}

3

1、struct不允许显示声明其无参数构造函数,这不同于class
2、struct不允许声明时,初始化其数据成员值
3、struct作为参数传递时,可考虑使用ref,以优化性能:因为是值类型(但要注意其值的改变)
4、struct无继承,但其本身继承自System.ValueType ----> System.Object
5、struct可看作是缩小的class,适宜小数据成员时使用

下面列举出微软提供的例子供大家学习

// Copyright (C) 2000 Microsoft Corporation.    All rights reserved.

// struct2.cs
using System;

class TheClass
{
    
public int x;
}


struct TheStruct
{
    
public int x;
}


class TestClass
{
    
public static void structtaker(TheStruct s)
    
{
          s.x
= 5;
      }

    
public static void classtaker(TheClass c)
    
{
          c.x
= 5;
      }

    
public static void Main()
    
{
          TheStruct a
= new TheStruct();
          TheClass b
= new TheClass();
          a.x
= 1;
          b.x
= 1;
          structtaker(a);
          classtaker(b);
          Console.WriteLine(
"a.x = {0}", a.x);
          Console.WriteLine(
"b.x = {0}", b.x);
      }

}



这个例子的输出是:

a.x = 1b.x = 5

从这个例子例子可以看出,当一个结构被传递到一个方法时,被传递的只不过是一个副本,而一个类被传递时,被传递的是一个参考.所以a.x=输出的是1,不变,而b.x却变了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值