почему мы можем получить доступ к функции non_member из функции-члена в c ++ - PullRequest
0 голосов
/ 11 июня 2019

Следующий код компилируется без каких-либо предупреждений или ошибок:

#include <iostream>
using namespace std;
class demo_class
{
    int x;
    float y;
    public:
    void fun(void);
};
void fun2(void)
{
    cout<<"i am fun2\n";
}
void demo_class::fun(void)
{
    cout<<"i am fun\n";
    cout<<"i can call fun2\n";
    fun2();
}
int main()
{
    demo_class ob1;
    ob1.fun();
    return 0;
}

Я не понимаю, что поскольку область действия функции fun находится только в demo_class, то как она может вызывать функцию fun2, если она не показывает ошибку?как доступ к веселой функции только внутри demo_class?

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Поиск имени будет пытаться исследовать все возможные области, пока не найдет хотя бы одну из них в любой области, тогда поиск имени останавливается.

В этом случае имя fun2 не может быть найдено в области видимости класса, затем проверяется дополнительная область, т. Е. Глобальная область видимости, и обнаруживается ::fun2.

0 голосов
/ 11 июня 2019

Нет причин запрещать вызывать свободную функцию из функции-члена. Если бы это было так, классы были бы довольно бесполезны (они были бы способом предотвратить повторное использование кода вместо его поддержки).

Как упоминалось в комментарии, в cout<<"i am fun2\n"; вы вызываете функцию, не являющуюся членом, и вызов fun мало чем отличается от этого.

Далее, с крошкой соли ваш пример мало чем отличается от

#include <iostream>
using namespace std;
class demo_class
{

};
void fun2(void)
{
    cout<<"i am fun2\n";
}
void fun3(demo_class& dc)
{
    cout<<"i am fun\n";
    cout<<"i can call fun2\n";
    fun2();
}
int main()
{
    demo_class ob1;
    fun3(ob1);
    return 0;
}

Функция-член всегда может быть преобразована в свободную функцию. Если бы fun получал доступ к закрытым членам, мы должны были бы объявить его как friend, чтобы сделать вышеупомянутую работу, но в противном случае здесь нет проблем.

Вы также можете выполнять обратное и вызывать функции-члены в свободных функциях, как в

 struct foo {
     void bar(){}
 };

 void func(foo& f) { 
      f.bar();
 }

 int main() {
     foo f;
     func(f);
 }
...