C++ shangji3构造函数和析构函数

该C++程序定义了一个StudentScore类,用于输入学生姓名和各科成绩,显示学生信息,计算平均成绩,展示课程平均分,并能按科目对成绩进行排序。主要功能包括输入学生数据、显示学生详细信息、计算个人和课程平均分以及按科目排序成绩。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include<string>
using namespace std;
class StudentScore {
public:
    StudentScore()
    {
        student_nr = 2;
    }
    StudentScore(int student_count)
    {
        student_nr = student_count;
    }
    void InputStudentNameAndScore();
    void ShowStudentNameAndSore();
    void ShowStudentAvgScore(int student_id);
    void ShowCourseAvgScore(string course_name);
    void OrderScoreByCourse(string course_name);
private:
    float score_table[100][3];
    string name_attay[100];
    int student_nr;


};

void StudentScore::InputStudentNameAndScore()
{
    for (int i = 0; i < student_nr; i++)
    {

        cout << "请输入学生姓名:" << endl;
        cin >> name_attay[i];
        cout << "请输入科目A成绩:" << endl;
        cin >> score_table[i][0];
        cout << "请输入科目B成绩:" << endl;
        cin >> score_table[i][1];
        cout << "请输入科目C成绩:" << endl;
        cin >> score_table[i][2];

    }
}
void StudentScore::ShowStudentNameAndSore()
{
    for (int i = 0; i < student_nr; i++) {
        cout << "姓名:" << name_attay[i] << "科目A成绩:" << score_table[i][0] << "科目B成绩:" << score_table[i][1] << "科目C成绩:" << score_table[i][2] << endl;

    }

}
void StudentScore::ShowStudentAvgScore(int student_id)
{
    for (int i = 0; i < student_nr; i++) {
        float avg = 0;
        avg = score_table[i][0] + score_table[i][1] + score_table[i][2];
        avg = avg / 3;
        cout << "姓名" << name_attay[i] << "平均成绩:" << avg << endl;
    }


}
void StudentScore::ShowCourseAvgScore(string course_name) {
    float avga = 0;
    float avgb = 0;
    float avgc = 0;
    for (int i = 0; i < student_nr; i++) {
        avga = avga + score_table[i][0];
        avgb = avgb + score_table[i][1];
        avgc = avgc + score_table[i][2];

    }
    avga = avga / student_nr;
    avgb = avgb / student_nr;
    avgc = avgc / student_nr;
    cout << "课程名称:A 平均成绩" << avga << endl;
    cout << "课程名称:B 平均成绩" << avgb << endl;
    cout << "课程名称:C 平均成绩" << avgc << endl;

}
void StudentScore::OrderScoreByCourse(string course_name) {

    for (int j = 0; j < 3; j++) {
        float temp;
        for (int i = 0; i < student_nr; i++)
        {
            if (score_table[i + 1][j] > score_table[i][j])
            {
                temp = score_table[i + 1][j];
                score_table[i + 1][j] = score_table[i][j];
                score_table[i][j] = temp;

            }
        }


    }
    cout << "课程A成绩排序:";
    for (int i = 0; i < student_nr; i++)

        cout << score_table[i][0] << " ";
    cout << endl;

    cout << "课程B成绩排序:";
    for (int i = 0; i < student_nr; i++)
        cout << score_table[i][1] << " ";
    cout << endl;

    cout << "课程C成绩排序:";
    for (int i = 0; i < student_nr; i++)
        cout << score_table[i][2] << " ";
    cout << endl;


}
int main()
{
    StudentScore x;
    x.InputStudentNameAndScore();
    x.ShowStudentNameAndSore();
    x.ShowStudentAvgScore(1);
    x.ShowCourseAvgScore("A");
    x.OrderScoreByCourse("B");
    return 0;

}

运行结果如图:

 

<think>嗯,用户让我用C++举例说明构造函数析构函数的作用。首先,我需要回忆一下构造函数析构函数的基本概念。构造函数是在创建对象时自动调用的函数,用来初始化对象的状态。而析构函数则是在对象销毁时调用的,负责清理资源,比如释放内存或关闭文件。 用户可能刚开始学习C++,对这两个概念不太清楚,所以需要简单明了的解释。我应该用实际的例子来展示它们的工作过程。比如,可以创建一个类,比如学生类,然后在构造函数里输出信息,析构函数同样输出信息,这样用户可以看到它们何时被调用。 接下来,我需要考虑用户的背景。他们可能对面向对象编程有一定了解,但可能对构造函数析构函数的具体应用场景不熟悉。所以例子需要贴近实际,比如资源的获取释放,比如动态分配内存或者文件操作。但为了简单起见,可能先不用复杂的资源管理,而是用输出语句来演示生命周期。 然后,我需要构造一个例子。比如,一个Student类,构造函数里初始化姓名年龄,析构函数里输出被销毁的信息。然后在main函数里创建对象,可能在不同的作用域里,比如在代码块内部创建,这样析构函数会在离开作用域时自动调用。 另外,可能还需要考虑动态分配的情况,用newdelete来展示析构函数的作用。如果用户没有正确使用delete,可能导致内存泄漏,这时候析构函数如果没有正确释放资源,就会有问题。但在这个例子中,可能先不涉及内存泄漏,而是专注于自动调用的特性。 还要注意术语的准确性,比如构造函数没有返回值,名称与类名相同;析构函数前面加波浪号,且没有参数。这些都是需要指出的关键点。 用户可能想知道为什么需要这两个函数,所以解释它们的用途很重要。比如构造函数确保对象被正确初始化,避免未定义的状态;析构函数则防止资源泄漏,自动释放资源,提高代码的安全性。 最后,总结一下例子,说明构造函数析构函数如何协同工作,管理对象的生命周期。确保示例代码简单,注释清晰,用户能够直接编译运行,看到输出结果,从而理解调用时机。</think>好的!我用一个简单的 **C++ 示例**说明构造函数析构函数的作用,并解释它们的核心意义。 --- ### **示例代码** ```cpp #include <iostream> using namespace std; class Student { public: string name; int age; // 构造函数:对象创建时自动调用,用于初始化 Student(string n, int a) { name = n; age = a; cout << "构造函数调用!学生 " << name << " 已创建。" << endl; } // 析构函数:对象销毁时自动调用,用于清理资源 ~Student() { cout << "析构函数调用!学生 " << name << " 已销毁。" << endl; } }; int main() { // 在栈上创建对象(自动调用构造函数) Student s1("小明", 18); { // 在代码块内创建对象 Student s2("小红", 17); } // 此处代码块结束,s2 的析构函数自动调用 // 动态分配对象(需要手动 delete) Student* s3 = new Student("小刚", 19); delete s3; // 手动调用析构函数 return 0; } // 此处 main 结束,s1 的析构函数自动调用 ``` --- ### **运行结果** ``` 构造函数调用!学生 小明 已创建。 构造函数调用!学生 小红 已创建。 析构函数调用!学生 小红 已销毁。 构造函数调用!学生 小刚 已创建。 析构函数调用!学生 小刚 已销毁。 析构函数调用!学生 小明 已销毁。 ``` --- ### **核心作用解释** 1. **构造函数**: - **初始化对象**:在对象创建时自动调用,确保对象处于有效状态(如设置成员变量的初始值)。 - **重载支持**:可以定义多个构造函数,适应不同初始化场景(例如带参数/不带参数)。 2. **析构函数**: - **资源清理**:对象销毁时自动调用,用于释放对象占用的资源(如内存、文件句柄、网络连接)。 - **防止泄漏**:在动态内存分配(`new`/`delete`)场景中,析构函数确保资源被正确释放,避免内存泄漏。 --- ### **关键点总结** - **自动调用**:构造函数析构函数由编译器自动调用,无需手动触发。 - **生命周期管理**: - 栈对象(如 `s1`):离开作用域时自动析构。 - 堆对象(如 `s3`):需手动 `delete` 触发析构。 - **RAII 原则**:C++ 通过构造函数析构函数实现“资源获取即初始化”,确保资源安全。 希望这个例子能帮助你理解!如果有其他问题,欢迎继续提问 😊
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值