📜  C++ 中的结构与类(1)

📅  最后修改于: 2023-12-03 15:13:58.950000             🧑  作者: Mango

C++中的结构与类

C++中的结构和类是两种类型的自定义数据类型,它们用于封装多个数据成员。本文将从以下几个方面介绍C++中的结构和类:

  • 结构与类的定义
  • 结构与类的初始化
  • 结构与类的成员访问
  • 结构与类的构造函数
  • 结构与类的析构函数
结构与类的定义

在C++中,结构体和类的定义方式类似,我们可以使用 structclass 关键字来定义结构体和类。

struct Student {
    int id;
    char name[20];
    int age;
};

class Person {
public:
    int age;
    char name[20];
    void print() {
        cout << "name: " << name << ", age: " << age << endl;
    }
};

在上面的代码中,我们定义了一个 Student 结构体和一个 Person 类,它们都有多个数据成员。注意 Person 类中 print 函数的声明方式,它使用了 public 访问修饰符,表示该函数是公有成员,在类外部可以调用。

结构与类的初始化

结构和类的初始化方式也很类似,我们可以使用花括号 {} 或者使用 = 运算符来初始化它们的数据成员。

// 初始化结构体
Student s1 = {2021001, "Alice", 18};
Student s2 = {2021002, "Bob", 19};

// 初始化类
Person p1 = {18, "Alice"};
Person p2 = {19, "Bob"};
p1.print();
p2.print();
结构与类的成员访问

我们可以使用点操作符 . 来访问结构和类的成员变量,使用点操作符 . 或者箭头操作符 -> 来访问结构和类的成员函数。

// 访问结构体成员变量
cout << "s1.id = " << s1.id << ", s1.name = " << s1.name << ", s1.age = " << s1.age << endl;

// 访问类的成员变量
cout << "p1.name = " << p1.name << ", p1.age = " << p1.age << endl;

// 访问类的成员函数
p1.print();
p2.print();

需要注意的是,如果要访问指向类的指针的成员,应该使用箭头操作符 ->。例如:

Person* p = new Person;
p->age = 18;
strcpy(p->name, "Alice");
p->print();
delete p;
结构与类的构造函数

结构和类都可以定义构造函数,它们是一种特殊的成员函数,在对象创建时被调用,用于初始化对象的数据成员。

class Person {
public:
    // 构造函数
    Person(int _age, const char* _name) {
        age = _age;
        strcpy(name, _name);
    }
private:
    int age;
    char name[20];
};

Person p(18, "Alice");
p.print();  // 输出 "name: Alice, age: 18"

在上面的代码中,我们定义了一个 Person 类,并在其中定义了一个构造函数。构造函数 Person(int _age, const char* _name) 用于初始化 Person 类的数据成员 agename。然后我们使用构造函数创建了一个 Person 对象并输出了它的数据成员。

需要注意的是,如果没有显式定义构造函数,C++会提供默认构造函数。默认构造函数是一个空函数,不进行任何操作。例如:

class Person {
public:
    int age;
    char name[20];
};

Person p;  // 调用默认构造函数
cout << "age: " << p.age << ", name: " << p.name << endl;  // 输出 "age: 0, name: "
结构与类的析构函数

结构和类也可以定义析构函数,它们是一种特殊的成员函数,在对象销毁时被调用,用于释放对象占用的资源。

class Person {
public:
    // 构造函数
    Person(int _age, const char* _name) {
        age = _age;
        name = new char[strlen(_name) + 1];
        strcpy(name, _name);
    }
    
    // 析构函数
    ~Person() {
        delete[] name;
    }
private:
    int age;
    char* name;
};

Person* p = new Person(18, "Alice");
delete p;  // 调用析构函数

在上面的代码中,我们定义了一个 Person 类,并在其中定义了一个析构函数。析构函数 ~Person() 用于释放 Person 类所占用的内存。然后我们通过 new 运算符创建了一个 Person 对象并在销毁时调用了析构函数。

需要注意的是,如果没有显式定义析构函数,C++会提供默认析构函数。默认析构函数是一个空函数,不进行任何操作。