为什么以下程序会导致错误?#include <iostream> #include <string> using namespace std; class B { int b; public: B(int i){ b = i; } }; class C { B b; public: C(int i){ b = B(i); } friend void show(); }; void show() { C c(10); cout<<"value of b is: "<<c.b.b<<endl;} int main(){ show(); return 0; }
时间: 2024-01-14 12:03:54 浏览: 69
使用include <iostream>时一定要加using namespace std
这个程序会导致错误,因为在C类的构造函数中,你试图将一个int类型的参数转换为B类的对象,然后将其赋值给C类的成员变量b。但是,由于B类没有默认构造函数,因此在C类的构造函数中,b成员变量在初始化时未被初始化。这导致在show函数中访问b.b时会导致未定义的行为。
要解决这个问题,你可以使用初始化列表来初始化C类的成员变量b。以下是修复后的示例代码:
```c++
#include <iostream>
#include <string>
using namespace std;
class B {
int b;
public:
B(int i) {
b = i;
}
};
class C {
B b;
public:
C(int i) : b(i) {} // 使用初始化列表来初始化b成员变量
friend void show();
};
void show() {
C c(10);
cout << "value of b is: " << c.b.b << endl;
}
int main() {
show();
return 0;
}
```
现在,你可以通过使用初始化列表来初始化C类的成员变量b,从而避免了未定义的行为。程序将输出"value of b is: 10"。
阅读全文