struct 及与class的区别

一.函数参数:

1.传值:

传值时结构体参数会被拷贝一份,在函数体内修改结构体成员不能改变调用参数。在这种情况下,由于涉及到结构体参数的拷贝,程序空间及时间效率都会受到影响,这种方法基本不用。

2.传指针:

传指针是直接将结构体的首地址传递给函数体,在函数体中通过指针引用结构体成员,可以对结构体参数成员的值造成实际影响,这种用法效率高,经常采用。

如:

struct tagSTU{
  char name[20];
  int age;
}STUDENT;
void fun(STUDENT *pStu){
  cout<<pStu->name<<pStu->age<<endl;
}

二.对于某些版本的C语言编译器,返回值仅能为基本数据类型如int、char以及指针,结构体不能以值的方式返回,而有些版本的C编译器中又可以直接返回结构体变量。

C++可以直接返回结构体变量。

直接返回结构体变量如下:

typedef struct tagSTUDENT{
char name[20];
int age;
}STUDENT;
STUDENT fun();
int _tmain(int argc, _TCHAR* argv[])
{
STUDENT p=fun();
printf("p.name=%s",p.name);
return 0;
}
STUDENT fun()
{
STUDENT stu;
stu.age=18;
strcpy(stu.name,"xiaoming");
return stu;
}

以指针方式返回结构体如下:

STUDENT* fun()
{
STUDENT* p=malloc(sizeof(STUDENT));
p->age=18;
strcpy(p->name,"xiaoming");
return p;
}

三.结构体和类的比较

结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。
1.结构的构造函数和类的构造函数不同。
a.结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。
b.结构不能包含以下形式的初始值设定类:base(argument-list);
2.对于结构中的实例字段成员,不能在声明时赋值初始化。
3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。

5.结构在堆栈中创建,是值类型;类在堆中创建,是引用类型。

6.struct默认为public,class默认为private。

四.总结

结构体:

“没有默认的构造函数,但可以添加构造函数”      “没有析构函数”      “没有abstract和sealed(因为不能继承)”      “不能有protected修饰符”      “可以不适用new初始化”      “在结构中初始化实例字段是错误的”

类:

“有默认的构造函数”      “有析构函数”      “可以使用abstract和sealed”      “有protected修饰符”      “必须使用new初始化”


摘自:http://xiaoer-1982.iteye.com/blog/501988

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值