Pure_substance::Pure_substance(string n = "***", string f = "***", double w = 0, double q = 0) :name(n), formula(f) { weight = w; quality = q; }这段代码怎么修改能过编译
时间: 2024-03-16 07:43:42 浏览: 18
这段代码需要修改的地方是默认参数的位置,C++中默认参数只能放在函数声明中,不能放在定义中。修改后的代码如下:
```
Pure_substance::Pure_substance(string n, string f, double w, double q) :name(n), formula(f), weight(w), quality(q) {}
```
将默认参数去掉,直接在构造函数定义中给参数赋值即可。这样修改后,代码就可以通过编译了。
相关问题
void Mixture::Append(Pure_substance& x)//添加纯物质对象x {/*在此补充本段代码,如果x是一种新成分,就扩大堆区数组,加入新组成物质,并变更组成的种类数目;否则只需要更变原组成物质的质量。15分*/ int i, n = Find(x); if (n == -1) { Pure_substance* p = new Pure_substance[num + 1]; for (i = 0; i < num; i++) p[i] = ps[i]; p[i] = x; if (ps) delete[]ps; ps = p; num++; } else { ps[n].quality += x.quality; } }请检查这段代码哪里有问题
这段代码没有显著的问题,但是有一些可以改进的地方:
1. 在 `for` 循环中,可以使用 `memcpy` 函数来复制数组,而不是使用循环逐一复制。这样可以提高效率。
2. 在 `if (ps) delete[]ps;` 语句中,应该先判断 `ps` 是否为 `NULL`,否则可能会造成程序崩溃。
改进后的代码如下:
```
void Mixture::Append(Pure_substance& x) {
int i, n = Find(x);
if (n == -1) {
Pure_substance* p = new Pure_substance[num + 1];
if (ps) {
// 使用 memcpy 函数复制数组
memcpy(p, ps, num * sizeof(Pure_substance));
delete[] ps;
}
p[num] = x;
ps = p;
num++;
}
else {
ps[n].quality += x.quality;
}
}
```
class Pure_substance//纯物质类 string name;//物质名称 string formula;//化学式 double weight;//化学式量 double quality;//质量 int Mixture::Find(Pure_substance& x)//查询在堆数组中是否包含纯物质对象xi//在此补充本段代码,查询在堆数组中是否包含纯物质对象 ,如果包含 X,返回该物质所在堆区数组中的下标,否则返回-1.
int Mixture::Find(Pure_substance& x) {
for (int i = 0; i < size; ++i) {
if (*heap[i] == x) {
return i;
}
}
return -1;
}
在这段代码中,使用了一次运算符重载,即重载了 == 运算符,用于比较两个 Pure_substance 对象是否相等。这里假设已经对 == 运算符进行了重载。在函数中,遍历了堆数组,如果找到了与 x 相等的 Pure_substance 对象,则返回该对象在堆区数组中的下标,否则返回 -1。