一、结构体定义
结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。
语法: struct 结构体名 { 结构体成员列表 };
二、C语言、C++结构体、C++类的区别
C++里根本就没有结构,仅仅为了兼容c才有结构这种东西,实际上除了名字以外,C++的结构就是类。
C的结构体和C++结构体的区别
- C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。
- C的结构体对内部成员变量的访问权限只能是public,而C++允许public、protected、private三种。
- C不是面向对象的语言,没有继承等概念。C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。C++,结构体除了可以包含变量外,还可以包含函数,能继承,能实现多态
C++的struct、C++的class区别
- 如果从空间分配上来看:struct变量放在栈上,而class变量放在堆上,因此struct变量会自动释放,而class变量需要手动释放。
- 在C++中,struct和class没啥两样,只是struct默认是public,class默认是private。
- struct内部成员变量、成员函数的默认访问级别是public类型的;
- class内部成员变量、成员函数的默认访问级别是private类型的;
三、结构体初始化方法(构造函数)
1.利用结构体自带的默认构造函数 2.利用带参数的构造函数 3.利用自定义的初始化函数
1、利用结构体自带的默认构造函数
#include <iostream>
using namespace std;
struct node {
int data;
string str;
char x;
} Node[2];
int main() {
Node[0] = {1, "123a", 'a'};
Node[1] = {2, "c++", 'd'};
for (int i = 0; i < 2; i++) {
cout << Node[i].data << " " << Node[i].str << " " << Node[i].x << endl;
}
return 0;
}
打印结果:
1 123a a
2 c++ d
Process finished with exit code 0
2、利用带参数的构造函数
链表节点:
struct ListNode {
int val;
ListNode *next;
ListNode() :val(), next(){}
ListNode(int x) : val(x), next(NULL) {}
};
#include <iostream>
using namespace std;
struct node {
int data;
string str;
char x;
node(int a, string b, char c) : data(a), str(b), x(c) {}
};
int main() {
node Node = node(4, "Java", '5');
cout << Node.data << " " << Node.str << " " << Node.x << endl;
return 0;
}
打印结果:
4 Java 5
Process finished with exit code 0
在建立结构体数组时,如果只写了带参数的构造函数将会出现数组无法初始化的错误!!!
#include <iostream>
using namespace std;
struct node {
int data;
string str;
char x;
node() : x(), str(), data() {}
node(int a, string b, char c) : data(a), str(b), x(c) {}
} Node[3];
int main() {
Node[0] = {1, "123a", 'a'};
Node[1] = {2, "c++", 'd'};
Node[2] = node(4, "Java", '5');
for (int i = 0; i < 3; i++) {
cout << Node[i].data << " " << Node[i].str << " " << Node[i].x << endl;
}
return 0;
}
打印结果:
1 123a a
2 c++ d
4 Java 5
Process finished with exit code 0
3、利用自定义的初始化函数
#include <iostream>
using namespace std;
struct node {
int data;
string str;
char x;
void init(int a, string b, char c) {
this->data = a;
this->str = b;
this->x = c;
}
} Node[3];
int main() {
Node[0].init(1, "123a", 'a');
Node[1].init(2, "c++", 'd');
Node[2].init(3, "123456", '9');
for (int i = 0; i < 3; i++) {
cout << Node[i].data << " " << Node[i].str << " " << Node[i].x << endl;
}
return 0;
}
打印结果:
1 123a a
2 c++ d
3 123456 9
Process finished with exit code 0
四、通过结构体创建变量的方式(3种)
结构体使用规则:
- 定义结构体时关键字是struct,不可省略
- 创建结构体变量时,关键字struct可以省略
- 结构体变量使用操作符"."访问成员
1、通过结构体创建变量的方式01
通过结构体创建变量的方式01:struct 结构体名 变量名
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
};
int main() {
struct student stu1;
stu1.name = "张三";
stu1.age = 18;
stu1.score = 100;
cout << "姓名:" << stu1.name << " 年龄: " << stu1.age << " 分数: " << stu1.score << endl;
return 0;
}
打印结果:
姓名:张三 年龄: 18 分数: 100
Process finished with exit code 0
2、通过结构体创建变量的方式02
通过结构体创建变量的方式02:struct 结构体名 变量名 = {成员1值,成员2值}
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
};
int main() {
struct student stu2 = {"李四", 19, 60};
cout << "姓名:" << stu2.name << " 年龄: " << stu2.age << " 分数: " << stu2.score << endl;
return 0;
}
打印结果:
姓名:李四 年龄: 19 分数: 60
Process finished with exit code 0
3、通过结构体创建变量的方式03
通过结构体创建变量的方式02:定义结构体时顺便创建变量
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
} stu3;
int main() {
stu3.name = "王五";
stu3.age = 18;
stu3.score = 80;
cout << "姓名:" << stu3.name << " 年龄: " << stu3.age << " 分数:" << stu3.score << endl;
return 0;
}
打印结果:
姓名:王五 年龄: 18 分数:80
Process finished with exit code 0
五、结构体数组
作用:将自定义的结构体放入数组中方便维护。
语法:struct 结构体名 数组名[元素个数] = { {}, {}, .....{} }
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
};
int main() {
struct student arr[3] =
{
{"张三", 18, 80},
{"李四", 19, 60},
{"王五", 18, 70}
};
for (int i = 0; i < 3; i++) {
cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数;" << arr[i].score << endl;
}
return 0;
}
打印结果:
姓名:张三 年龄:18 分数;80
姓名:李四 年龄:19 分数;60
姓名:王五 年龄:18 分数;70
Process finished with exit code 0
六、结构体指针
作用:通过指针访问结构体中的成员。利用操作符 -> 可以通过结构体指针访问结构体属性。
结构体指针可以通过 -> 操作符访问结构体中的成员。
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
};
int main() {
struct student stu = {"张三", 18, 100};
struct student *p = &stu;
p->score = 80;
cout << "姓名: " << p->name << " 年龄: " << p->age << " 分数: " << p->score << endl;
system("pause");
return 0;
}
打印结果:
姓名: 张三 年龄: 18 分数: 80
Process finished with exit code 0
七、“结构体”嵌套“结构体”
在结构体中可以定义另一个结构体作为成员,用来解决实际问题。
作用:结构体中的成员可以是另一个结构体。
例如:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体。
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
};
struct teacher {
int id;
string name;
int age;
struct student stu;
};
int main() {
struct teacher t1;
t1.id = 10000;
t1.name = "老王";
t1.age = 40;
t1.stu.name = "张三";
t1.stu.age = 18;
t1.stu.score = 100;
cout << "教师 职工编号:" << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl;
cout << "辅导学员 姓名:" << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl;
return 0;
}
打印结果:
教师 职工编号:10000 姓名: 老王 年龄: 40
辅导学员 姓名:张三 年龄:18 考试分数: 100
Process finished with exit code 0
八、结构体做函数参数
作用:将结构体作为参数向函数中传递。
传递的方式有两种:
#include<iostream>
using namespace std;
struct student {
string name;
int age;
int score;
};
void printfStudent(student stu);
void printfStudent2(student *stu);
int main() {
student stu = {"张三", 18, 100};
cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
cout << endl;
printfStudent(stu);
cout << "值传递---->主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
cout << endl;
printfStudent2(&stu);
cout << "地址传递---->主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
return 0;
}
void printfStudent(student stu) {
stu.age = 28;
cout << "值传递---->子函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
}
void printfStudent2(student *stu) {
stu->age = 28;
cout << "地址传递---->子函数中 姓名:" << stu->name << " 年龄: " << stu->age << " 分数:" << stu->score << endl;
}
打印结果:
主函数中 姓名:张三 年龄: 18 分数:100
值传递---->子函数中 姓名:张三 年龄: 28 分数:100
值传递---->主函数中 姓名:张三 年龄: 18 分数:100
地址传递---->子函数中 姓名:张三 年龄: 28 分数:100
地址传递---->主函数中 姓名:张三 年龄: 28 分数:100
Process finished with exit code 0
参考资料: C++结构体详解 结构体构造函数 C++ 结构体构造函数 C++结构体完全攻略(超详细) C++学习 — 结构体 C++ - 结构体构造函数使用总结
|