1.结构体是什么?
结构体其实就是一个由多个数据打包成的新数据类型,可以包含多个数据类型。
如下就是一个结构体类型的定义:
// c++ 风格
struct Person
{
string name;
int age;
double hight;
double weight;
};
2.结构体如何声明?
对于c++中的结构体的声明,像上面那样就行了;但你也会见到下面这样的:
// c 风格
typedef struct Person
{
string name;
int age;
double hight;
double weight;
}Per;
这种写法是从c沿用来的,因为c中声明结构体必须加struct
关键字,定义一个结构体变量也要加struct
关键字,很麻烦,所以就用typedef
,声明数据类型的别名。
例如:
// 此时,struct Person就等于Per;
struct Person person1;
Per person2;
此外,可以起多个别名:
typedef struct Person
{
string name;
int age;
double hight;
double weight;
}Per,Man,Woman;
// 此时,struct Person就等于Per,Man,Woman;
3.结构体如何定义变量?
- 结构体类型 + 变量名 的方式;
struct Person person1; // C 风格,多个struct关键字
Per person2; // 以下都是 C++ 风格
- 在声名的时候,一起定义;
struct Person // 结构体声明
{
string name;
int age;
double hight;
double weight;
}ZhangSan,LiSi,person9527; // 同时定义了几个变量
- 声明一个匿名结构体并创建变量(其他地方不能声明了,因为没有类型名);
struct
{
string name;
int age;
double hight;
double weight;
}ZhangSan,person9527;
3.结构体变量如何初始化?
- 可以各元素单独初始化,也可以定义时初始化。
struct Person
{
string name;
int age;
} ZhangSan = {"张三", 20}; // 定义时初始化
Person LiSi = {"李四", 39}; // 定义时初始化
Person WangWu; // 各元素单独初始化
WangWu.age = 20;
WangWu.name = "王五";
Person ZhangLiu = ZhangSan; // 另一结构体变量赋值
- 结构体数组初始化
Person teachers[2] = {LiSi, {"Jack", 26}};
4. C 和 C++中结构体的区别
如果你熟悉C++类的概念,那你会某些情况下,可以将C++的结构体视为类对象;
C 和 C++中结构体的主要区别如下:
- C结构体在定义时除非使用typedef,否则之后定义变量都必须跟上struct + 结构体名,而C++结构体可以直接使用结构体名,不受限制。
- C中结构体不能有成员函数,而C++中可以有,甚至可以有虚函数。所以C中不存在构造函数、虚构函数和this指针。
- C结构体只有public一种权限,而C++结构体有public、private、protect三种权限。
- C结构体不能在结构体中初始化成员变量,而C++结构体可以。
- C结构体没有继承关系,而C++结构体可以从类或者其他结构体继承而来。
- C结构体不能有静态成员变量,而C++结构体可以有。
- C结构体的空结构体sizeof为0,C++的sizeof为1。
对于区别1,上文已经表述过了;下面主要展示C++中的结构体的用法:
下面的示例中,展示了构造函数,private权限以及在结构体中初始化成员变量:
struct Person
{
public:
string name;
int age;
string nationality = "China";
private:
Gender gen = hide; // 对外不可见
public:
// 不同参数个数的构造函数:
Person(string _name, int _age) : name(_name), age(_age){};
Person(string _name, int _age, string _nationa) : name(_name), age(_age), nationality(_nationa){};
Person(string _name, Gender _gen, int _age, string _nationa) : name(_name), gen(_gen), age(_age), nationality(_nationa){};
// 拷贝构造函数
Person(const Person &obj) : name(obj.name), gen(obj.gen), age(obj.age), nationality(obj.nationality) { cout << "拷贝构造调用!" << endl; };
};
此时,定义两个Person变量看看:
void printP(Person &input) // 打印输出函数
{
cout << "name:" << input.name << endl;
// cout << "gen:" << input.gen << endl;
cout << "age:" << input.age << endl;
cout << "nationality:" << input.nationality << endl << endl;
};
Person p1("张三", 20);
Person p2("李四", female, 20, "British");
Person p3 = p1; // 这里将会调用拷贝构造函数
printP(p1);
printP(p2);
printP(p3);
输出结果:(张三调用的是两个参数的构造函数,默认国籍是China;李四则是输入的值)
拷贝构造调用!
name:张三
age:20
nationality:China
name:李四
age:20
nationality:British
name:张三
age:20
nationality:China
以上就是本次分享全部内容,欢迎留言讨论!