C++ 【错误求帮改】构造函数、析构函数,delete等编程时的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 【错误求帮改】构造函数、析构函数,delete等编程时的问题相关的知识,希望对你有一定的参考价值。

构建一个学生类,(1)包含姓名、高数、英语、C++四个私有成员变量,写一个构造函数为四个私有成员变量赋值。写一个析构函数,用delete语句回收对象所占内存空间,并每次打印一行“XX同学对象被回收。”(2)类里定义两个成员函数,分别为求每个人的平均分、输出成绩。(3)在main函数里构建一个10个学生的对象数组,并调用构造函数赋值,然后输出10位同学每个人的平均分。(4)调用析构函数,回收内存空间。
#include<iostream>
using namespace std;
class student
private:
int name;
int math;
int english;
int ccc;
public:
student(int n,int m,int e,int c)

name=n;
math=m;
english=e;
ccc=c;

~student()
delete[]name;
cout<<name<<"同学对象被回收"<<endl;
;
void average()
int a;
a=(math+english+ccc)*(1/3);
cout<<name<<" "<<a<<endl;

;
int main()

student stu[10] = student("a", 10,20,30), student("b", 10,20,30),student("c", 10,20,30),student("d", 10,20,30),student("e", 10,20,30),
student("f", 10,20,30),student("g", 10,20,30),student("h", 10,20,30),student("i", 10,20,30),student("j", 10,20,30),student("k", 10,20,30),;
stu[0].average();
stu[1].average();
stu[2].average();
stu[3].average();
stu[4].average();
stu[5].average();
stu[6].average();
stu[7].average();
stu[8].average();
stu[9].average();
~student();
return 0;

以下是部分错误,地方写不下啦,求帮忙,谢谢,会补赏:
18 21 C:\Users\liuyi\Desktop\1.cpp [Error] type 'int' argument given to 'delete', expected pointer
C:\Users\liuyi\Desktop\1.cpp In function 'int main()':
29 42 C:\Users\liuyi\Desktop\1.cpp [Error] invalid conversion from 'const char*' to 'int' [-fpermissive]
10 3 C:\Users\liuyi\Desktop\1.cpp [Note] initializing argument 1 of 'student::student(int, int, int, int)'

// 下面是我修正的代码
#include<iostream>
using namespace std;
class student 
private:
char* name;
int math;
int english;
int ccc;
public:
student(const char* n, int m, int e, int c)

name = new char[100];  // 为了配合你的delete,我使用new创建了一个数组。
strcpy_s(name, 100, n);  // 字符串拷贝函数,来初始化name
math = m;
english = e;
ccc = c;

~student() 
delete[] name;  // 只有被new[]的对象,才需要使用delete[]进行析构。
cout << name << "同学对象被回收" << endl;
;
void average() 
int a;
a = (math + english + ccc)*(1 / 3);
cout << name << "  " << a << endl;

;
int main()

student stu[10] =  
student("a", 10,20,30), 
student("b", 10,20,30),
student("c", 10,20,30),
student("d", 10,20,30),
student("e", 10,20,30),

student("f", 10,20,30),
student("g", 10,20,30),
student("h", 10,20,30),
student("i", 10,20,30),
// student("j", 10,20,30),  // 只有10个元素,所以我删除一个
student("j", 10,20,30), ;
stu[0].average();
stu[1].average();
stu[2].average();
stu[3].average();
stu[4].average();
stu[5].average();
stu[6].average();
stu[7].average();
stu[8].average();
stu[9].average();
// ~student(); // 析构函数不能由用户进行调用。
return 0;
参考技术A 把你的name的类型换成string

C++ 构造函数 & 析构函数

构造函数

构造函数 (constructor) 是一种特殊的成员函数. 它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的, 并且不会返回任何类型. 构造函数可用于为某些成员变量设置初始值.
在这里插入图片描述
格式:

Class::Class(); // 构造函数

默认构造函数

如果用户自己没有定义构造函数, C++ 系统会自动生成一个默认构造函数. 这个构造函数体是空的, 没有参数, 不执行初始化操作.

例如:

Time.h:

class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time(); // 默认构造函数
    void set_time(int h, int m, int s);
    void show_time();
};

Time.cpp:

#include "Time.h"
#include <iostream>

using namespace std;

Time::Time() {
    hour = 0;
    minute = 0;
    second = 0;
}

void Time::set_time(int h, int m, int s) {
    hour = h;
    minute = m;
    second = s;
}

void Time::show_time() {
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include <iostream>

using namespace std;

int main() {

    Time time1;  // 实例化time
    time1.show_time();  // 调用show_time

    return 0;
}

输出结果:

0:0:0

重点:

  • 即使提供了其他构造函数, 提供一个默认构造函数几乎总是对的
  • 通常在默认构造函数中, 给成员提供的初始值应该指出该对象是 “空” 的

有参构造函数

构造函数中参数可以指定默认值. 如果童虎不指定实参指, 编译西永就使形参取默认值.

例如:

Time 类:

#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_H

class Time {
private:
    int hour;
    int minute;
    int second;
public:
    Time();  // 默认构造函数
    Time(int h, int m=0, int s=0);  // 有参构造函数
    void show_time();
};

#endif //PROJECT1_TIME_H

Time.cpp:

#include "Time.h"
#include <iostream>
using namespace std;

// 默认构造函数
Time::Time() : hour(0), minute(0), second(0) {}

// 有参构造函数
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}


void Time::show_time() {
    cout << hour << ":" << minute << ":" << second << endl;
}

main:

#include "Time.h"
#include <iostream>
using namespace std;

int main() {

    Time time1;
    time1.show_time();

    Time time2(8);
    time2.show_time();

    Time time3(8, 8);
    time3.show_time();
    
    Time time4(8, 8, 8);
    time4.show_time();

    return 0;
}

输出结果:

0:0:0
8:0:0
8:8:0
8:8:8

析构函数

析构函数 (destructor) 也是一个特殊的成员函数. 当对象的生命期结束时, 会自动执行析构函数. 析构函数的名字是类名前面加一个 “~” 符号.
在这里插入图片描述
格式:

Class::~Class();  // 析构函数

析构函数的作用在撤销对象占用的内存之前完成一些清理 & 善后的工作.

析构函数例子

Student 类:

#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H

#include <string>
using namespace std;

class Student {
private:
    int num;
    string name;
    char gender;
public:
    Student();
    Student(int num, string name, char gender);
    ~Student();
    void display();
};

#endif //PROJECT1_STUDENT_H

Student.cpp:

#include "Student.h"
#include <iostream>
using namespace std;

// 无参构造
Student::Student() : num(-1), name("None"), gender('N') {}

Student::Student(int n, string p, char g) : num(n), name(p), gender(g) {
    cout << "执行构造函数: " << "Welcome, " << name << endl;
}

void Student::display() {
    cout << "num: " << num << endl;
    cout << "name: " << name << endl;
    cout << "gender: " << gender << endl;
    cout << "===============" << endl;
}

Student::~Student() {
    cout << "执行析构函数: " << "Bye bye, " << name << endl;
}

main:

#include "Student.h"
#include <iostream>
using namespace std;

int main() {

    Student student1(1, "Little white", 'f');
    Student student2(2, "Big white", 'f');

    student1.display();
    student2.display();

    return 0;
}

输出结果:

执行构造函数: Welcome, Little white
执行构造函数: Welcome, Big white
num: 1
name: Little white
gender: f
===============
num: 2
name: Big white
gender: f
===============
执行析构函数: Bye bye, Big white
执行析构函数: Bye bye, Little white

析构函数执行时机

对于函数中定义的自动局部对象, 当函数被调用结束时, 对象释放. 在对象释放前自自动执行析构函数.
在这里插入图片描述

局部对象

static 局部对象只在 main 函数结束或调用 exit 函数结束程序时, 调用 static 局部对象的洗后函数.

全局对象

对于全局对象, 在程序的流程离开其作用域时 (如 main 函数结束或调用 exit 函数) 时, 调用该全局对象的析构函数.

以上是关于C++ 【错误求帮改】构造函数、析构函数,delete等编程时的问题的主要内容,如果未能解决你的问题,请参考以下文章

c++ 错误:预期构造函数、析构函数或在“(”标记之前的类型转换

c++ 复制构造函数和析构函数

构造函数与析构函数的起源

C++中使用构造函数和析构函数的对象计数器

用C++设计一个不能被继承的类(转)

C++ 构造函数 & 析构函数