0

为什么我们可以在没有对象的情况下调用 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; 
}
4

3 回答 3

5

为什么我们可以在showA()没有对象的情况下调用方法?

您不调用成员函数A::showA,而是调用自由函数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,但这是另一个问题)。

于 2019-10-29T09:39:15.300 回答
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; 
}
于 2019-10-29T09:39:43.343 回答
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.
于 2019-10-29T10:04:27.957 回答