class A1 { public: void func0(); }; void A1::func0() { }为什么不能再类外声明
时间: 2024-02-12 17:05:12 浏览: 90
这段代码定义了一个类 A1,该类包含了一个成员函数 func0。在类定义中声明了 func0,但是没有在类定义中实现它的定义。相反,函数的定义被放在了类定义的外部。
你问为什么不能在类外声明这个函数。实际上,可以在类外声明这个函数,但是必须同时提供函数的定义。例如,可以这样写:
```cpp
class A1 {
public:
void func0();
};
void A1::func0() {
// 函数实现
}
```
或者这样:
```cpp
class A1 {
public:
void func0();
};
void func0_impl(A1& a) {
// 函数实现
}
int main() {
A1 a;
func0_impl(a);
return 0;
}
```
在第一种情况下,函数的声明和定义都在类中,而在第二种情况下,函数的声明在类中,定义在类外,但是还需要提供一个辅助函数来实现实际的功能。
总之,如果想在类外声明成员函数,必须同时提供函数的定义。如果只提供了函数声明而没有提供定义,编译器会报错。
相关问题
class A { public: int a = 100; void func() {cout << "A 成员函数"} }; class B { public: int b = 200; void func() { cout << "B 成员函数" } }; A *a1; B b1; a1 = &b1; a1->func(); b1.func();
这段代码中存在一些语法错误,应该修改为以下代码:
```
#include <iostream>
using namespace std;
class A {
public:
int a = 100;
void func() { cout << "A 成员函数" << endl; }
};
class B {
public:
int b = 200;
void func() { cout << "B 成员函数" << endl; }
};
int main() {
A* a1;
B b1;
a1 = &b1;
a1->func();
b1.func();
return 0;
}
```
此时的输出结果应该为:
```
A 成员函数
B 成员函数
```
因为 `a1` 是一个指向 `A` 类型的指针,但是却指向了 `B` 类型的对象 `b1`。当调用 `a1->func()` 时,由于 `a1` 的静态类型是 `A*`,因此编译器会将 `a1->func()` 解释为调用 `A` 类型的 `func()` 函数,但是实际上 `a1` 指向的是 `B` 类型的对象 `b1`,因此会调用 `B` 类型的 `func()` 函数,输出字符串 `"B 成员函数"`。而当调用 `b1.func()` 时,直接调用 `B` 类型的 `func()` 函数,输出字符串 `"B 成员函数"`。
阅读全文