当前位置:   article > 正文

C/C++结构体详解_c ++ 定义结构体

c ++ 定义结构体

1.结构体是什么?

结构体其实就是一个由多个数据打包成的新数据类型,可以包含多个数据类型。
如下就是一个结构体类型的定义:

// c++ 风格
struct Person
{
    string name;
    int age;
    double hight;
    double weight;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.结构体如何声明?

对于c++中的结构体的声明,像上面那样就行了;但你也会见到下面这样的:

// c 风格
typedef struct Person
{
    string name;
    int age;
    double hight;
    double weight;
}Per;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

这种写法是从c沿用来的,因为c中声明结构体必须加struct关键字,定义一个结构体变量也要加struct关键字,很麻烦,所以就用typedef,声明数据类型的别名。

例如:

// 此时,struct Person就等于Per;
struct Person person1;
Per person2;
  • 1
  • 2
  • 3

此外,可以起多个别名:

typedef struct Person
{
    string name;
    int age;
    double hight;
    double weight;
}Per,Man,Woman;
// 此时,struct Person就等于Per,Man,Woman;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.结构体如何定义变量?

  • 结构体类型 + 变量名 的方式;
struct Person person1;  // C 风格,多个struct关键字
Per person2;            // 以下都是 C++ 风格
  • 1
  • 2
  • 在声名的时候,一起定义;
struct Person   // 结构体声明
{
    string name;
    int age;
    double hight;
    double weight;
}ZhangSan,LiSi,person9527;  // 同时定义了几个变量
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 声明一个匿名结构体并创建变量(其他地方不能声明了,因为没有类型名);
struct
{
    string name;
    int age;
    double hight;
    double weight;
}ZhangSan,person9527;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.结构体变量如何初始化?

  • 可以各元素单独初始化,也可以定义时初始化。
struct Person
{
    string name;
    int age;
} ZhangSan = {"张三", 20};  // 定义时初始化

Person LiSi = {"李四", 39}; // 定义时初始化

Person WangWu;              // 各元素单独初始化
WangWu.age = 20;
WangWu.name = "王五";

Person ZhangLiu = ZhangSan; // 另一结构体变量赋值
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 结构体数组初始化
Person teachers[2] = {LiSi, {"Jack", 26}};
  • 1

4. C 和 C++中结构体的区别

如果你熟悉C++类的概念,那你会某些情况下,可以将C++的结构体视为类对象;
C 和 C++中结构体的主要区别如下:

  1. C结构体在定义时除非使用typedef,否则之后定义变量都必须跟上struct + 结构体名,而C++结构体可以直接使用结构体名,不受限制。
  2. C中结构体不能有成员函数,而C++中可以有,甚至可以有虚函数。所以C中不存在构造函数、虚构函数和this指针。
  3. C结构体只有public一种权限,而C++结构体有public、private、protect三种权限。
  4. C结构体不能在结构体中初始化成员变量,而C++结构体可以。
  5. C结构体没有继承关系,而C++结构体可以从类或者其他结构体继承而来。
  6. C结构体不能有静态成员变量,而C++结构体可以有。
  7. 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; };
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

此时,定义两个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);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出结果:(张三调用的是两个参数的构造函数,默认国籍是China;李四则是输入的值)

拷贝构造调用!
name:张三
age:20
nationality:China

name:李四
age:20
nationality:British

name:张三
age:20
nationality:China
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

以上就是本次分享全部内容,欢迎留言讨论!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/714904
推荐阅读
相关标签
  

闽ICP备14008679号