C/C++结构体详解

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++中结构体的主要区别如下:

  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; };
};

此时,定义两个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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值