为什么以下程序会导致错误?#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 10:03:54 浏览: 73
这个程序会导致错误,因为在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"。
相关问题
为什么以下程序会导致错误?#include <iostream> #include <string> using namespace std;class Box { int capacity; public: Box(int cap){ capacity = cap; } friend void show(); }; void Box::show() { Box b(10); cout<<"Value of capacity is: "<<b.capacity<<endl; } int main(){ show(); return 0; }
这个程序会导致错误,因为在Box类中定义了一个名为show的友元函数,但是在Box::show函数的实现中,它又创建了一个名为b的Box对象来访问capacity成员。然而,在main函数中调用的是show函数而不是Box类的对象,因此无法访问Box类的capacity成员。
要解决这个问题,你可以将Box::show函数中创建的Box对象替换为函数参数,然后将Box类的对象传递给show函数。或者你可以将Box::show函数的实现移动到main函数中,并在Box类中删除它的声明。以下是第一种解决方案的示例代码:
```c++
#include <iostream>
#include <string>
using namespace std;
class Box {
int capacity;
public:
Box(int cap) {
capacity = cap;
}
friend void show(Box obj);
};
void show(Box obj) {
cout << "Value of capacity is: " << obj.capacity << endl;
}
int main() {
Box b(10);
show(b);
return 0;
}
```
现在,你可以通过将Box类的对象传递给show函数来访问Box类的capacity成员,并且程序不会再导致错误。
为什么下面的程序会出现错误?#include <iostream> #include <string> using namespace std; class A { int a; public: virtual void func() = 0; }; class B: public A { public: void func(){ cout<<"Class B"<<endl; } }; int main(int argc, char const *argv[]) { A a; a.func(); return 0; }
这段代码会出现错误,因为在main函数中创建了一个抽象类A的对象a,而抽象类是不能被实例化的。
抽象类中有一个或多个纯虚函数,这些函数没有实现,只是做了函数的声明。抽象类不能被实例化,只能作为基类,由其派生出子类,子类必须实现基类中的纯虚函数。
在这段代码中,类A是一个抽象类,它包含一个纯虚函数func,而类B是类A的子类,实现了func函数。在main函数中,创建了一个类A的对象a,但是由于类A是抽象类,无法被实例化,因此会导致编译错误。
正确的做法是创建类B的对象,然后调用其func函数,如下所示:
```
int main(int argc, char const *argv[]) {
B b;
b.func();
return 0;
}
```
阅读全文