人工来啦~
有几个问题:
作用域问题:函数 f 被定义为 numbered 类的成员函数。当鱼油在 main() 函数中调用 f(a) 时,编译器会认为 f 是一个全局函数或当前作用域内的函数,而不是 numbered 类的成员。这就是为什么会报错的原因。
改进:鱼油可以将 f 改为全局函数或使用对象调用它。例如,使用 a.f(a);。
拷贝构造函数的设计:鱼油的拷贝构造函数只是简单地拷贝了原对象的 mysn 值。这在实际中可能不是鱼油想要的行为,尤其是当鱼油的类表示应该具有唯一标识的实体时。
改进:如果鱼油希望每个 numbered 对象都有一个唯一的 mysn 值,鱼油应该在拷贝构造函数中适当地修改这个值,而不是直接拷贝。
默认构造函数的设计:在鱼油的默认构造函数中,鱼油通过 mysn++ 来增加 mysn 的值。但是,由于每个对象的 mysn 都从 1 开始,所有对象的 mysn 都将是 2,这可能不是鱼油预期的行为。
改进:可以使用一个静态变量来跟踪下一个可用的 mysn 值。
代码优化:
#include <iostream>
using namespace std;
class numbered
{
private:
static unsigned nextsn;
unsigned mysn;
public:
numbered() : mysn(nextsn++) {}
numbered(const numbered& s) : mysn(nextsn++) {}
~numbered() { cout << "已经删除" << endl; }
friend void f(numbered s);
};
unsigned numbered::nextsn = 1;
void f(numbered s) {
cout << s.mysn << endl;
}
int main() {
numbered a, b = a, c = b;
f(a);
return 0;
}
|