#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 13:03:02 浏览: 109
#include <iostream>
这段代码会出现错误,因为在类C的构造函数中,使用了成员初始化列表的方式对成员变量b进行了初始化,但是B类的构造函数需要一个int类型的参数,而在使用B(i)进行初始化时,会将i作为参数传递给B类的构造函数。但是由于B类没有定义默认构造函数,因此编译器无法找到合适的构造函数进行初始化,从而导致编译错误。
正确的做法是在类B中定义一个默认构造函数,如下所示:
```
#include <iostream>
#include <string>
using namespace std;
class B {
private:
int b;
public:
B() { b = 0; } // 定义默认构造函数
B(int i) { b = i; }
};
class C {
private:
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;
}
```
在上述代码中,定义了一个默认构造函数B()来解决编译错误。同时,在类C的构造函数中,使用成员初始化列表的方式对成员变量b进行了初始化,将参数i传递给B类的构造函数进行初始化。最后,调用show函数输出成员变量b的值。
阅读全文