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等编程时的问题的主要内容,如果未能解决你的问题,请参考以下文章