以下定义是否正确( )。 class A { public: int n=0; void fun(); };
时间: 2024-02-03 11:02:02 浏览: 28
这个定义是不正确的。在类定义中,不能直接初始化非静态成员变量。正确的写法应该是在类定义中声明非静态成员变量,但不进行初始化,在类外部定义成员函数时进行初始化,例如:
```
class A {
public:
int n;
void fun();
};
void A::fun() {
n = 0; // 在成员函数中初始化成员变量
}
```
相关问题
根据class ABC{public: int a, b; // 构造函数的声明 ABC(int a0, int b0); // 成员函数的声明 void fun();};// 构造函数的定义ABC::ABC(int a0, int b0){ a = a0; b = b0;}// 成员函数的定义void ABC::fun(){ // 在这里实现成员函数的具体功能}写出完整代码
完整的代码如下:
```
class ABC {
public:
int a, b;
ABC(int a0, int b0); // 构造函数的声明
void fun(); // 成员函数的声明
};
// 构造函数的定义
ABC::ABC(int a0, int b0) {
a = a0;
b = b0;
}
// 成员函数的定义
void ABC::fun() {
// 在这里实现成员函数的具体功能
}
// 示例代码
int main() {
ABC obj(1, 2); // 创建对象并调用构造函数
obj.fun(); // 调用成员函数
return 0;
}
```
#include <iostream> using namespace std; class A { private: int nVal; public: void Fun(){ cout << "A::Fun"<<endl;} void Do(){ cout << "A::Do"<<endl;} }; class B:public A{ public: virtual void Do(){ cout << "B::Do"<<endl;} }; class C:public B { public: void Do(){ cout << "C::Do"<<endl;} void Fun() { cout << "C::Fun"<<endl;} }; void Call( ){ p->Fun(); p->Do(); } int main(){ Call(new A()); ; return 0; }
这段代码存在一些问题,无法通过编译。主要问题如下:
1. `Call` 函数中使用了指针 `p`,但没有对其进行声明或初始化,会导致编译错误。可以将其声明为基类 A 的指针,如下所示:
```cpp
void Call(A* p){
p->Fun();
p->Do();
}
```
2. `Call` 函数中调用了函数 `p->Do()`,由于 `Do` 函数被声明为虚函数,因此会根据指针所指向的对象类型来动态绑定对应的函数。但是,在本例中,由于 `Call` 函数的参数类型为 `A*`,因此无论传递的是 `A`、`B` 还是 `C` 类型的对象,都将调用基类 `A` 中的 `Do` 函数,而不是子类 `B` 或 `C` 中的函数。可以将参数类型改为 `B*` 或 `C*`,这样就能够正确地调用对应的函数,如下所示:
```cpp
void Call(B* p){
p->Fun();
p->Do();
}
```
3. 在 `main` 函数中,调用了 `Call` 函数,并传递了一个 `A` 类型的对象指针。由于 `A` 类型没有继承关系,因此无法将其转换为 `B` 或 `C` 类型的指针。可以将其改为传递一个 `B` 或 `C` 类型的对象指针,例如:
```cpp
Call(new B());
Call(new C());
```
修改后的代码如下所示:
```cpp
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun(){ cout << "A::Fun" << endl; }
void Do(){ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do(){ cout << "B::Do" << endl; }
};
class C:public B {
public:
void Do(){ cout << "C::Do" << endl; }
void Fun(){ cout << "C::Fun" << endl; }
};
void Call(B* p){
p->Fun();
p->Do();
}
int main(){
Call(new B());
Call(new C());
return 0;
}
```
输出结果为:
```
A::Fun
B::Do
A::Fun
C::Do
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)