C++青少年简明教程:结构体

C++青少年简明教程:结构体

在C++中,结构体(struct)是一种复合数据类型,它可以包含多个不同类型的数据成员(例如整数、浮点数、字符串、其他结构体等)。结构体的主要用途是将一组逻辑相关的数据项组织在一起。结构体中的每个元素称为成员(member)。结构体主要用于处理具有多个属性的复杂数据结构。

定义结构体的基本语法如下:

struct StructName {

Type1 member1;

Type2 member2;

// ...

};

其中,StructName是你为结构体定义的名称,Type1和Type2是成员变量的类型,member1和member2是成员变量的名称。

阅读C++中的结构体资料时,常见的说法结构体变量,结构体对象、结构体实例基本上是指的同一件事情。这些术语都是指的由结构体定义创建的变量。在C++中,结构体是一种用户定义的数据类型,因此由结构体创建的变量也可以被视为对象(或实例)。例如:

假设有结构体定义:

struct Student {

std::string name;

int age;

float grade;

};

你可以使用这个结构体定义来创建一个结构体变量(或结构体对象,或结构体实例):

Student s;

创建结构体的实例后,就可以使用点运算符.来访问和调用结构体的成员。这包括结构体的数据成员和函数成员。

下面是一个具体的示例,定义了一个名为Student的结构体,包含了三个成员:name,age和grade。

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

struct Student {
    string name;
    int age;
    float grade;
};

int main() {
    // 创建一个Student结构体的实例
    Student s;
    s.name = "John Doe";
    s.age = 20;
    s.grade = 3.7;

    // 输出Student结构体的信息
    cout << "Name: " << s.name << "\n";
    cout << "Age: " << s.age << "\n";
    cout << "Grade: " << s.grade << "\n";

    return 0;
}

在这个示例中,首先定义了一个Student结构体,然后在main函数中创建了一个Student的实例s,并为其成员赋值。然后,使用cout输出了Student实例的信息。其中使用.运算符来访问和设置s的数据成员name、age和grade。

注意,结构体的成员可以是任何类型,包括其他结构体。此外,结构体也可以包含函数【这些函数被称为成员函数(member function),成员函数可以访问结构体中的成员变量,并根据需要对这些变量进行操作】,这使得它们在功能上与类(class)非常相似。实际上,类和结构体的主要区别在于默认的访问级别:类的成员默认为私有(private),而结构体的成员默认为公有(public)。

下面是一个包含函数的结构体的例子:

cpp 复制代码
#include <iostream>
#include <string>
using namespace std;

struct Student {
    string name;
    int age;
    float grade;

    // 这是一个成员函数,它可以访问结构体的所有成员
    void print() {
        cout << "Name: " << name << "\n";
        cout << "Age: " << age << "\n";
        cout << "Grade: " << grade << "\n";
    }
};

int main() {
    // 创建一个Student结构体的实例
    Student s;
    s.name = "John Doe";
    s.age = 20;
    s.grade = 3.7;

    // 使用成员函数输出Student结构体的信息
    s.print();

    return 0;
}

在这个例子中,我们在Student结构体中定义了一个名为print的成员函数,它可以直接访问并打印结构体的所有成员。然后,在main函数中,我们创建了一个Student的实例,并使用。运算符调用了print函数来打印学生的信息。

下面给出一个求矩形面积和周长的示例

cpp 复制代码
#include <iostream>
using namespace std;

// 定义一个表示矩形的结构体
struct Rectangle {
    double width;     // 矩形宽度
    double height;    // 矩形高度

    // 成员函数:计算矩形面积
    double area() {
        return width * height;
    }

    // 成员函数:计算矩形周长
    double perimeter() {
        return 2 * (width + height);
    }
};

int main() {
    Rectangle rect;  // 创建一个Rectangle对象
    rect.width = 3.0; // 初始化width
    rect.height = 4.0; // 初始化height

    // 调用成员函数
    double area = rect.area();
    double perim = rect.perimeter();

    // 输出结果
    std::cout << "Area: " << area << std::endl;      // 输出 12.0
    std::cout << "Perimeter: " << perim << std::endl; // 输出 14.0

    return 0;
}

对上面程序改进,使用构造函数

构造函数是一种特殊的成员函数,它在创建对象时自动被调用,用于初始化对象的数据成员。构造函数在创建对象时必须被调用,如果没有提供构造函数,编译器会自动生成一个默认的无参构造函数。但是,如果你需要在对象创建时执行一些特殊的初始化操作,就必须自己定义构造函数。

构造函数是一个特殊的成员函数,它用于初始化对象。在C++中,构造函数的名字与类名(或结构体名)相同,并且没有返回类型(包括void)。对于上面的Rectangle结构体,如果你想添加一个构造函数来初始化宽度和高度:

Rectangle(double w, double h) : width(w), height(h) {}

解释一下:

Rectangle(double w, double h)定义了一个构造函数,它接收两个double类型的参数w和h。

width(w), height(h)是初始化列表,使用传入的w和h值初始化Rectangle类的width和height成员变量。

初始化列表的形式为:成员变量名(值)。

大括号{}内可以添加构造函数需要执行的其他操作,但这里是空的。

改进后的源码如下:

cpp 复制代码
#include <iostream>
using namespace std;

// 定义一个表示矩形的结构体
struct Rectangle {
    double width;     // 矩形宽度
    double height;    // 矩形高度

    // 构造函数
    Rectangle(double w, double h) : width(w), height(h) {}

    // 成员函数:计算矩形面积
    double area() {
        return width * height;
    }

    // 成员函数:计算矩形周长
    double perimeter() {
        return 2 * (width + height);
    }
};

int main() {
    // 创建一个矩形对象
    Rectangle rect(3.0, 4.0);

    // 调用成员函数计算面积和周长
    double area = rect.area();
    double perim = rect.perimeter();

    // 输出结果
    cout << "Area: " << area << endl;      // 输出 12.0
    cout << "Perimeter: " << perim << endl; // 输出 14.0

    return 0;
}
相关推荐
chordful11 分钟前
Leetcode热题100-32 最长有效括号
c++·算法·leetcode·动态规划
材料苦逼不会梦到计算机白富美22 分钟前
线性DP 区间DP C++
开发语言·c++·动态规划
ahadee39 分钟前
蓝桥杯每日真题 - 第12天
c++·vscode·算法·蓝桥杯
vortex51 小时前
解决 VSCode 中 C/C++ 编码乱码问题的两种方法
c语言·c++·vscode
醉颜凉3 小时前
【NOIP提高组】潜伏者
java·c语言·开发语言·c++·算法
hunandede3 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
c++·ffmpeg·音视频
爱学习的大牛1233 小时前
通过vmware虚拟机安装和调试编译好的 ReactOS
c++·windows内核
tumu_C5 小时前
C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型
c++·开源
杜若南星5 小时前
保研考研机试攻略(满分篇):第二章——满分之路上(1)
数据结构·c++·经验分享·笔记·考研·算法·贪心算法
Neophyte06085 小时前
C++算法练习-day40——617.合并二叉树
开发语言·c++·算法