1.5 结构体和类


返回目录 1 面向对象技术
上一节 1.4 cpp编程基础
下一节 1.6 cpp的常见特性


结构体

源代码

/* struct.cpp 结构体实例 */
#include <iostream>
#include <string>

struct Student
{
    std::string name; // 姓名
    std::string sex; // 性别
    int age; // 年龄
}typedef Student;

void STUDENT_dispalyInfos(Student student)
{
    /* 这个函数用来显示学生信息 */
    std::cout << "学生信息" << std::endl;
    std::cout << "姓名:" << student.name << std::endl;
    std::cout << "性别:" << student.sex << std::endl;
    std::cout << "年龄:" << student.age << std::endl;
}

int main()
{

    Student XiaoMing;

    XiaoMing.name = "小明";
    XiaoMing.sex = "男";
    XiaoMing.age = 18;

    STUDENT_dispalyInfos(XiaoMing);

    return 0;

}

编译运行

学生信息
姓名:小明
性别:男
年龄:18

源代码

/* class.cpp 类实例 */
#include <iostream>
#include <string>

class Student
{
private:
    std::string name; // 姓名
    std::string sex; // 性别
    int age; // 年龄
public:
    Student(); // 这是构造函数
    Student(std::string name, std::string sex, int age); // 构造函数重载
    ~Student(); // 析构函数
    void Init(std::string name, std::string sex, int age); // 初始化函数
    void displayInfos(); // 显示成员信息的函数
};

Student::Student()
{
    std::cout << "-++类实例化时,会先调用构造函数" << std::endl;

    this->name = "";
    this->sex = "";
    this->age = 0;

    std::cout << "+++" << name << "初始化完成" << std::endl;
}

Student::Student(std::string name, std::string sex, int age)
{
    std::cout << "-++类实例化时,会先调用构造函数" << std::endl;

    this->name = "";
    this->sex = "";
    this->age = 0;

    std::cout << "+++" << name << "初始化完成" << std::endl;

    Init(name, sex, age);
}

Student::~Student()
{
    std::cout << "-++对象销毁时,会调用析构函数" << std::endl;
    std::cout << "+++" << this->name << "已销毁" << std::endl;
}

void Student::displayInfos()
{
    std::cout << "————学生信息————" << std::endl;
    std::cout << "——姓名:" << this->name << std::endl;
    std::cout << "——性别:" << this->sex << std::endl;
    std::cout << "——年龄:" << this->age << std::endl;
    std::cout << "————————————" << std::endl;
}

void Student::Init(std::string name, std::string sex, int age)
{
    std::cout << "--+" << name << "完成初始化" << std::endl;
    this->name = name;
    this->sex = sex;
    this->age = age;
}

int main()
{

    Student XiaoMing; // 类实例化时调用无参的构造函数
    XiaoMing.Init("小明", "男", 20); // 手动调用初始化函数

    Student XiaoHong("小红", "女", 20); // 类实例化时调用有参的构造函数,直接初始化完成

    XiaoMing.displayInfos(); // 显示信息
    XiaoHong.displayInfos();

    return 0;

}

编译运行

-++类实例化时,会先调用构造函数
+++初始化完成
--+小明完成初始化
-++类实例化时,会先调用构造函数
+++小红初始化完成
--+小红完成初始化
————学生信息————
——姓名:小明
——性别:男
——年龄:20
————————————
————学生信息————
——姓名:小红
——性别:女
——年龄:20
————————————
-++对象销毁时,会调用析构函数
+++小红已销毁
-++对象销毁时,会调用析构函数
+++小明已销毁

可以看到,结构体与类有很大的相似之处,但是类内部允许有函数,并且有默认的构造函数(在类实例化时自动运行,可以重载)和默认的析构函数(对象生命周期结束时自动运行,回收资源)。

最先构造的对象,最后被析构。

类可以看成是一个独立的小程序,作为整个项目的基本机器存在着,我们一般会尽量少在main函数写大量的代码,而是集中到类或者函数中,直接在main函数中调用它们即可。

this直接指向实例化的对象对应的类中成员,在这个例子中用于和传入的外界参数与对象的数据成员区分开来。


返回目录 1 面向对象技术
上一节 1.4 cpp编程基础
下一节 1.6 cpp的常见特性


参考资料:

  • 《C++程序设计》传智播客
  • 百度百科

冰河相依
1 声望3 粉丝

于冰河相依。