1 数据结构
数据结构是把一组相关的数据元素组织起来然后使用它们。C++语言允许用户以结构(struct)的形式自定义数据结构。结构(struct)以关键字struct开始,紧跟着结构名和结构体。结构体由花括号包围形成了一个新的作用域。结构体右侧的表示结束的花括号后必须写一个分号。
对于结构(struct)的详细介绍,请参考《C++中struct简介2-1》《C++struct简介2-1》。
2 结构的构造函数
每个结构都分别定义了它的对象被初始化的方式,结构通过一个或几个特殊的成员函数来控制其对象的初始化过程,这些函数叫做构造函数(constructor)。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
构造函数的名字和类名相同,但是没有返回类型。例如
struct myStruct1{
int i_num;
string s_num;
myStruct1(int i, string s)
{
i_num = i;
s_num = s;
}
};
其中,函数myStruct1即为自定义结构体myStruct1的构造函数。使用以下代码定义myStruct1的对象。
myStruct test_struct1 = myStruct1(1, “Hello”);
此时,test_struct中i_num的值是1;s_num的值是”Hello”。
3 构造函数初始值列表
构造函数初始值列表负责为新创建的对象的一个或几个数据成员赋值。在结构的构造函数参数列表圆括号与构造体的尖括号之间加入冒号,并且在冒号后面添加结构体成员变量的名字,每个名字的后面紧跟圆括号,圆括号中包含的就是成员变量的初始值。
struct myStruct2{
int i_num;
string s_num;
myStruct2():i_num(1), s_num("Hello")
{
}
};
通过以下代码定义myStruct2的对象
myStruct2 test_struct2 = myStruct2();
此时,test_struct2的i_num的值是1,s_num的值是”Hello”。
4 实战
4.1 问题提出
在CSDN论坛中有朋友问到以下代码的含义
struct File_not_found {
std::string filename;
File_not_found(const std::string& filename_ = std::string())
: filename(filename_) {}
};
struct Key_not_found {
std::string key;
Key_not_found(const std::string& key_ = std::string())
: key(key_) {}
};
以上代码实际上就用到了自定义结构体和结构体的构造函数等知识点。
4.2 问题解决
在“4.1 问题提出”中提到的代码定义了一个名为File_not_found的结构体,该结构体包含一个string类型的成员变量filename,用来保存文件名。正如“3 构造函数初始值列表”中提到的,该结构体的构造函数包含了初始化列表,该列表中将成员变量filename初始化为filename_,而filename_则是构造函数的参数,这个参数有一个默认值,即为空的字符串。File_not_found结构体的构造函数实际上等价于
File_not_found(const std::string& filename_ = std::string())
{
filename = filename_;
}
如果使用如下代码定义File_not_found结构体的对象:
File_not_found myFile1 = File_not_found();
此时,myFile1的成员变量filename的值是空字符串。如果使用如下代码定义File_not_found结构体的对象:
File_not_found myFile2 = File_not_found(“C:\\1.txt”);
此时,myFile2的成员变量filename的值是“C:\\1.txt”。
接下来在File_not_found结构体中又定义了名为Key_not_found的结构体。该结构体也包含一个string类型的成员变量key,用来保存键值。该结构体的构造函数定义方式与File_not_found结构体类似。