一.函数参数:
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