为什么不能使用A的对象调用showA()?

时间:2019-10-29 09:37:33

标签: c++ scope-resolution-operator

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

3 个答案:

答案 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.