C++中的结构体
原创
©著作权归作者所有:来自51CTO博客作者CurryCoder的原创作品,请联系作者获取转载授权,否则将追究法律责任
1.Cpp中的结构体
2.定义结构体
3.访问结构体成员
- 为了访问结构体的成员,使用成员访问运算符’.’,成员访问运算符是结构体变量名称和要访问的结构体成员之间的一个点号,见具体的实例:
Books book1; // 定义结构体类型Books的变量book1
Books book2; // 定义结构体类型Books的变量book2
// book1详细介绍
strcpy(book1.title, "C++教程");
strcpy(book1.author, "菜鸟教程");
strcpy(book1.subject, "编程语言");
book1.book_id = 123;
// 输出book1的详细信息
cout << "book1的标题: " << book1.title << endl;
cout << "book1的作者: " << book1.author << endl;
cout << "book1的类别: " << book1.subject << endl;
cout << "book1的id: " << book1.book_id << endl;
cout << "----------------------------------------------------\n";
// book2详细介绍
strcpy(book2.title, "白夜行");
strcpy(book2.author, "东野圭吾");
strcpy(book2.subject, "文学");
book2.book_id = 666;
// 输出book2的详细信息
cout << "book2的标题: " << book2.title << endl;
cout << "book2的作者: " << book2.author << endl;
cout << "book2的类别: " << book2.subject << endl;
cout << "book2的id: " << book2.book_id << endl;
4.结构体作为函数参数
5.指向结构体的指针
- 定义指向结构体的指针,方式与定义指向其他类型变量的指针类型:
struct Books *struct_pointer;
- 在上述定义的指针变量中存储结构体变量的地址,为了查找结构体变量的地址,把&运算符放在结构体名称的前面:
struct_pointer = &book1;
- 为了使用指向该结构体的指针来访问结构体的成员,必须使用箭头->运算符:
struct_pointer->title;
- 具体见下面的实例:
// 指向结构体的指针,下面的函数以结构体指针作为函数形参
void print_book_info_with_pointer(struct Books *book_pointer){
cout << "书的标题: " << book_pointer->title << endl;
cout << "书的作者: " << book_pointer->author << endl;
cout << "书的类别: " << book_pointer->subject << endl;
cout << "书的id: " << book_pointer->book_id << endl;
}
// 指向结构体的指针
print_book_info_with_pointer(&book1); // 通过传book1的地址来输出book1信息
cout << "----------------------------------------------------\n";
print_book_info_with_pointer(&book2); // 通过传book2的地址来输出book2信息
6.typedef关键字
- 下面是一种更简单的定义结构体的方式,可以为创建的类型取一个"别名",实例如下:
// 使用typedef创建结构体
typedef struct Book_Info{
char title[50];
char author[50];
char subject[100];
int book_id;
}Book_Info;
- 可以直接使用Book_Info来定义Book_Info类型的变量,而不需要使用struct关键字,如下面的实例:
Book_Info book1_info, book2_info;
- 可以使用typedef关键字来定义非结构类型,如下面的实例:
typedef long int *pint32;
pint32 x, y, z; // x,y,z都是指向长整型long int的指针
7.结构体知识点总结
- 结构体和C++中只有三点区别,除此之外无任何区别:
- class中默认的成员访问权限是private的,而struct中则是public的
- 从class继承默认是private继承的,而从struct继承默认是piblic继承的
- class可以定义模板,而struct不可以
- C++中的结构体关键字typedef可以直接省略,甚至不省略的话,还会提示你省略;原因:C语言的 struct 定义了一组变量的集合,C编译器并不认为这是一种新的类型;C++中的struct是一个新类型的定义声明, 所以可以省略typedef, 定义变量的时候也可以省略struct, 而不用像C语言那样没使用typedef取新名字时, 就需要用"struct 结构体名"这种形式定义变量。
- 如果在结构体能够完成的目的的情况下,就没必要使用类;C与C++结构体中,前者不能有函数,后者可以有。
- .与->运算符区别:访问结构的成员时使用点运算符,而通过指针访问结构的成员时,则使用箭头运算符。也就是说,用结构体定义了一个实体,那么这个实体要引用他里面的成员,就用 . 操作符,如果用结构体定义的是一个结构指针,那么要引用他里面的成员就用->。
struct Employee{
char name[50];
int age;
char address[50];
}emp;
- 点运算符.使用如下:
strcpy(emp.name, "Curry_Coder");
- 如果p_emp是一个指针,指向数据类型为Employee的对象,则要把值zara赋值给对象emp的name,需要使用箭头运算符->,箭头运算符->使用如下:
strcpy(p_emp->name, "zara");
8.结构体的继承
- C++中的struct对C中的struct进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct能包含成员函数;struct能继承;struct能实现多态;与class的区别是:最本质的一个区别就是默认的访问控制,体现在两个方面:
- 默认的继承访问权限:struct是public的,class是private的;
struct A{
char a;
};
struct B:A{
char b;
};
-
struct作为数据结构的实现体,它默认的数据访问控制是public的。而class作为对象的实现体,它默认的成员变量访问控制是 private的。当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
struct A //定义一个struct
{
char c1;
int n2;
double db3;
};
A a={'p',7,3.1415926}; //定义时直接赋值
- 向上面的struct中加入一个构造函数(或虚函数),struct也不能用{}赋初值了。原因:加入一个构造函数或是一个虚函数会使 struct更体现出一种对象的特性,而使此{}操作不再有效。事实上,是因为加入这样的函数,使得类的内部结构发生了变化。而加入一个普通的成员函数呢?你会发现{}依旧可用。其实你可以将普通的函数理解成对数据结构的一种算法,这并不打破它数据结构的特性。