内容纲要
结构体嵌套结构体
作用:结构体中的成员可以是另一个结构体。
例如:每个老师辅导员,可以带学生。
struct student{
int id;
string name;
int age;
struct student stu;
}
struct student {
int age;
string name;
double score;
}
实例:
typedef struct IRISKEY3_EyeInfo
{
/// True if a pupil was found, otherwise false
bool bFoundPupil;
/// True if a Iris was found, otherwise false
bool bFoundIris;
/// Holds centre and radius for pupil or iris
struct SEyeComponent
{
/// X-coordinate of the centre
int nCentreX;
/// Y-coordinate of the centre
int nCentreY;
/// Radius of pupil or iris
int nRadius;
};
/// Holds the pupil information
SEyeComponent oPupil;
/// Holds the iris information
SEyeComponent oIris;
/**@brief Percentage of usable iris area
*@par
* This metric details the amount of usable iris area of the segmented
* image. The Segmented pupil and iris, eyelids and specular
* reflections are considered when calculating the percentage of the
* visible iris area. Value range: 0 - 100 (Higher = Better)
*/
double UsableIrisArea;
} IRISKEY3_EyeInfo;
#include <iostream>
#include "string"
using namespace std;
struct student {
string name;
int age;
int score;
};
struct teacher {
int age;
string name;
int id;
struct student stu;
};
int main() {
//student stu = { "张三",20,60 };
teacher t = {
30,"DearL",1234
};
t.stu.name = "法外狂徒张三";
cout << "t.name: " << t.name << " t.stu.name: " << t.stu.name << endl;
system("pause");
}
注意:上方结构体嵌套中,被嵌套方要提前定义,否则在当时不会报错,但是在结构体创建对象的时候编译会报错。
- 可以通过 父结构体.子结构体.参数 来进行赋值。
结构体做函数参数
作用:将结构体作为参数向函数中传递。
传递方式:1.值传递 2.地址传递。
#include <iostream>
#include "string"
using namespace std;
struct student {
string name;
int age;
int score;
};
struct teacher {
int age;
string name;
int id;
struct student stu;
};
void print(struct teacher teacher)
{
teacher.age = 100; //值传递中修改信息
cout << "print函数打印老师的age: " << teacher.age << endl; //100;
cout << "老师的姓名:" << teacher.name << " 学生的姓名:" << teacher.stu.name << endl;
}
void printTeacher(struct teacher * teacher)
{
teacher->age = 200; //地址传递中修改信息。
cout << "地址传递的老师姓名:" << teacher->name << " 地址传递的学生姓名:" << teacher->stu.name << endl;
}
int main() {
//student stu = { "张三",20,60 };
teacher t = {
30,"DearL",1234
};
t.stu.name = "法外狂徒张三";
cout << "t.name: " << t.name << " t.stu.name: " << t.stu.name << endl;
//结构体做参数传递
print(t);
cout << "值传递后的老师的年龄: " << t.age << endl; //30;不变,因为影响不了结果
//结构体地址传递
printTeacher(&t);
cout << "地址传递后的老师的年龄: " << t.age << endl; //200,变了,因为传进去的地址,直接被修改了内存中保存的数据
system("pause");
}
注意:
地址传递(引用传递)中通过指针修改了参数的值会影响在内存中保存的参数。
值传递中修改了对象的值的作用域只在被调用的函数中。
地址传递 使用访问修饰符 -> 来修改对象的参数。如果要修改对象中结构体参数则再 . 结构体中的成员。
- 特别重要:在值传递中是拷贝的值,而拷贝值会占用内存,如果数据量特别大的话 (一个很大的结构体数组),占用的空间会更多。因此使用引用传递能节省资源的消耗。但是要注意值的安全性
结构体中 const 使用场景
作用:用 const 来防止误操作
(正如上方结构体地址传递修改对象的参数)
- 特别重要:在值传递中是拷贝的值,而拷贝值会占用内存,如果数据量特别大的话,占用的空间会更多。因此使用引用传递能节省资源的消耗。但是要注意值的安全性
总结
1.结构体嵌套结构体能使自定义数据类型更有层次,类似于Java 中内部类的效果。
在实际应用中 Irience_SDK 下结构体定义在头文件中,结构体中嵌套另外一个 常量指针
。
2.结构体做函数参数时,注意传递参数的类型。分为引用传递和值传递。值传递属于拷贝,如果数据量很大时,会占用额外很多内存空间。Irience_SDK 中使用的是地址传递。
3.结构体中 const 的使用防止误操作而修改了成员变量的值。同时也能保护好数据的封装性。 建议回头看一看 常量指针、指针常量。