C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:
Title :标题
Author :作者
Subject :类目
Book ID :书的 ID
类与结构体在 C++ 中只有两点区别,除此这外无任何区别。
(1)class 中默认的成员访问权限是 private 的,而 struct 中则是 public 的。
(2)从 class 继承默认是 private 继承,而从 struct 继承默认是 public 继承。
(3)class 可以定义模板,而 struct 不可以。
首先,我不知道是不是版本的问题,在vs2017的使用过程中,我发现C++的结构体关键字typedef可以直接省略,甚至不省略的话vs还会提示你省略。
第二个是习惯上的,我最近在用C++实现一些数据结构,用了几次之后发现,如果在结构体能够完成目的的情况下就没必要去用类。
第三点是C与C++结构体中前者不能有函数,后者可以有。
C++ 中的 typedef 确实可以省略, 不是 vs2017 的问题。
C 语言的 struct 定义了一组变量的集合,C 编译器并不认为这是一种新的类型。
C++ 中的 struct 是一个新类型的定义声明, 所以可以省略 typedef, 定义变量的时候也可以省略 struct, 而不用向c语言那样没用 typedef 取新名字, 就需要用 struct 结构体名 这种形式定义变量。
typedef 的省略不是因为 c++ 可以省略,Mac OS 的 Xcode 就不可以省略的。
补充一下,C ++ 中的 typedef struct 是会对最后的 object_names 部分产生两种影响:
第一是不用 typedef:object_names 就相当于一个变量了,可以直接调用结构体中的内容
第二种是用 typedef:object_names 部分是个结构体类型,在调用结构体之前必须创建结构体的变量 object_names name;
. 与 -> 运算符
.(点)运算符和 ->(箭头)运算符用于引用类、结构和共用体的成员: 点运算符应用于实际的对象。箭头运算符与一个指向对象的指针一起使用。
例如,假设有下面的结构:
struct Employee {char first_name[16];int age;
} emp;
. 点运算符
下面的代码把值 zara 赋给对象 emp 的 first_name 成员:
strcpy(emp.first_name, "zara");
-> 箭头运算符
如果 p_emp 是一个指针,指向类型为 Employee 的对象,则要把值 zara 赋给对象 emp 的 first_name 成员,需要编写如下代码:
strcpy(p_emp->first_name, "zara");
-> 称为箭头运算符,它是由一个减号加上一个大于号组成。
简而言之,访问结构的成员时使用点运算符,而通过指针访问结构的成员时,则使用箭头运算符。
也就是说,用结构体定义了一个实体,那么这个实体要引用他里面的成员,就用 . 操作符,如果用结构体定义的是一个结构指针,那么要引用他里面的成员就用 ->。
可以将结构作为函数的返回值。实例如下:
#include
#include struct test{int i;char c;double d;float f;
};struct test set( int a, float b, char c, double d )
{struct test t;t.i = a;t.f = b;t.c = c;t.d = d;return t;
}void sig( int s );
void print(struct test t2)
{printf("int:%d\n",t2.i);printf("char:%c\n",t2.c);printf("float:%f\n",t2.f);printf("double:%lf\n",t2.d);
}void sig( int s )
{printf("捕获信号%d,跳出……",s);exit(1);
}
int main( void )
{struct test info;info = set(2,3.22,'d',4.335);print(info);return 0;
}