2015-03-05 2 views
0

Предположим, что у нас есть функция-член от class X, и это X f(), которая возвращает объект class X и не принимает никаких аргументов.Что происходит, когда функция-член без аргументов вызывается объектом в C++

Так что, если он вызывается объектом class X, скажем X obj является объектом.

Так что, если мы называем obj.f(), так на С ++ правила секретный аргумент передается функции f() и что this указатель на объект, который содержит адрес объекта, который вызывает f().

Так что мое замешательство заключается в том, как он управляется C++, потому что это означает, что мы никогда не можем иметь функцию-член в C++ без каких-либо аргументов, потому что каждый раз, когда будет передан секретный аргумент.

Для функции с аргументом сказать func(int a), это на самом деле функция, которая может принимать 2 аргумента, где один из аргументов секретный аргумент (this указатель), а другой int a.

Итак, что мы можем сделать, если мы строго хотим использовать функцию-член в C++ без каких-либо аргументов (например, в случае процедуры обслуживания прерываний)?

Пожалуйста, скажите мне, если я ошибаюсь, или если у меня отсутствует какая-то концепция.

+0

Я d'ОНТ действительно получить, почему скрытый аргумент, что вы не потрудились управлять, может помешать вам делать то, что вы хотите – Guiroux

+0

вы можете сделать статический метод, который будет вызываться без «этого» секретного аргумента. –

+0

Я немного исправил ваш вопрос, но есть слишком много «так в нем», поэтому вы можете немного перефразировать его. BTW, для таких случаев, как ISR, вы можете просто объявить 'static void f()' inside 'class X'. Обратите внимание, что вам нужно вернуть 'void', потому что ISR не должен возвращать какое-либо значение. –

ответ

0

Что вы хотите, это class function, aka a static member function.

У него не будет подразумеваемого указателя this.

В C++, вы можете объявить один с ключевым словом: static

class foo 
{ 
public: 
    static void bar(); 
}; 

void foo::bar() 
{ 
    this; // error 
} 
+0

Спасибо zenith ... это на самом деле то, что я искал ... использование статической функции было бы идеальным для этой ситуации. –

+0

Без использования static всегда будет указатель, переданный этой функции ... –

+0

Да, но всегда тщательно думайте, действительно ли функция должна быть в классе или вообще должна быть свободной функцией. – emlai

1

Возможно, вы, вероятно, имеете в виду статическую функцию;

class Object { 
public: 
    static void function() {} 
}; 
+0

спасибо trenki ... за решение и очищение моей путаницы –