为什么我们可以在没有对象的情况下调用showA()方法?但是如果我在方法定义中使用void A :: showA(A&x),那么我必须使用A的对象来调用它,为什么?
#include <iostream>
class A {
public:
int a;
A() { a = 0; }
void showA(A&);
};
void showA(A& x)
{
std::cout << "A::a=" << x.a;
}
int main()
{
A a;
showA(a);
return 0;
}
答案 0 :(得分:5)
为什么我们可以在没有对象的情况下调用
showA()
方法?
您不调用成员函数A::showA
,而是调用 free 函数showA
。实际上,成员函数A::showA(A&)
是声明的,但从未定义,只有自由函数showA(A&)
有定义。
如果要呼叫A::showA
,则需要一个定义;
void A::showA(A& x) { /* ... */ }
// ^^^ this makes it a member function definition
然后将其称为
A a;
a.showA(a);
(请注意,将a
实例传递给在同一A::showA
实例上调用的a
并没有多大意义,但这是另一个问题。
答案 1 :(得分:1)
此功能
void showA(A& x)
{
std::cout << "A::a=" << x.a;
}
不是类A
的成员函数。
它接受一个A &
类型的参数。
对于成员函数showA
,则声明它但未定义。
您可以在类中声明它,例如
class A {
public:
int a;
A() { a = 0; }
void showA() const;
};
然后在类定义之外定义它,如
void A::showA() const
{
std::cout << "A::a=" << a;
}
在这种情况下,main函数可以看起来像
int main()
{
A a;
showA(a);
a.showA();
return 0;
}
答案 2 :(得分:0)
您不能调用它,因为showA(您正在考虑的那个)不是类的一部分。它是一个全局函数。您在类中声明的showA函数从未定义过。为此,请稍微修改一下代码。 更改这段代码。
void A::showA(const A& x) {
std::cout << "A::a=" << x.a; } // It is advised to make const as it doesn't change state.