Доступ к функции-члену с указателем против объекта

0

Привет, я начал изучать c++, и я следую серии видеоуроков.

Для простоты рассмотрим следующий код:

#include <iostream>
using namespace std;

class Test{
public:
    Test();
    void printCrap();
private:
protected:
};

Test::Test(){

};

void Test::printCrap(){
    cout << "I don't get this yet..." << endl;
};

int main(){

    Test testOne;
    Test *testTwo = &testOne;

    testOne.printCrap();
    testTwo->printCrap();

    return 0;
};

Это похоже на код учебника, за единственным исключением, что я объединил код в 1 cpp для этого вопроса.

Что учебник не объясняет это рядом с очевидным, что это является фактической разницей/выгодой и где это applicable.Perhaps сценария, где -> против . будет иметь значение?

  • 0
    Единственное отличие состоит в том, что testTwo может содержать неверный адрес (в общем случае, а не в вашем примере)
  • 1
    Этот пример является ответом .
Теги:

7 ответов

3
Лучший ответ

Просто используйте . когда переменная, которую вы вызываете, является либо фактическим объектом, либо ссылкой. Используйте -> когда переменная является указателем на объект.

В общем, предпочитают использовать либо реальные объекты, либо ссылки на объекты. Указатели используются по мере необходимости. Некоторые случаи, когда вам часто нужно использовать указатели, являются:

  1. При использовании полиморфизма
  2. Когда вам нужен объект, чтобы пережить область, в которой он был создан
  • 0
    Спасибо за упоминание 1, 2.
  • 0
    Ссылки хороши и для полиморфизма.
3

testTwo->printCrap() - это просто синтаксический сахар для (*testTwo).printCrap(), не более того, не что иное.

  • 1
    Предполагая, что testTwo является указателем, а не классом (с определенным оператором * и / или -> ).
1

Это не вопрос преимуществ или различий. Если у вас есть указатель, вам нужно разыменовать его для доступа к элементам. Оператор -> эквивалентен

testTwo->print();
(*testTwo).print();  // same thing.

Если у вас есть экземпляр (или ссылка), который вы используете

testTwo.print();

Это синтаксис языка - его не касается предпочтений

1

Это просто работа с памятью. Когда вы его распределяете

Test testOne;

вы просто создаете объект в памяти, когда работаете, когда указываете на него

Text *testTwo = &testOne;

вы указываете на то же место, где re testOne. Вы только что создали другое имя для той же части памяти. И когда вам нужно передать эту вещь функции, вы не хотите создавать целый новый объект, но вы просто хотите указать на него как

function workWithObject(Test *testit)

Таким образом, testit указывает на ту же часть памяти, что и testTwo, и это textOne.

  • 0
    Хм, я вижу, что прояснил некоторые вещи для меня, спасибо.
0

у вас есть другой класс Test2, который унаследован от вашего первоначального теста. Test2 имеет собственную версию функции printCrap(). У нас есть два способа позвонить:

//as member function
Test.printCrap();
Test2.printCrap();
//as pointer 
ptr = &Test;
ptr->printCrap();
ptr = &Test2;
ptr->printCrap(); 

Приведенный выше код иллюстрирует использование только, не указывает, какой из них лучше.

0

Доступ к классу можно получить, применив . оператора к объекту класса testTwo или путем применения -> к указателю класса testTwo. Стрелка -> появилась с момента времени C и с избытком.

Также внутри класса вам не нужны никакие операторы. Просто вызовите printCrap. И если вы ищете статическую функцию-член, вы используете :: fe testOne::staticPrint.

0

. (точка) и оператор → (стрелка) используются для ссылки на отдельных членов классов, структур и союзов.

Оператор точки применяется к фактическому объекту. Оператор стрелки используется с указателем на объект.

Test testOne;
Test* testTwo = &testOne; 

здесь testTwo - это указательная переменная типа Test, указывающая на расположение памяти testOne, чтобы получить доступ к членам класса Test с помощью testTwo, для этого требуется разыменовать, что делается с помощью → оператора со стрелкой.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню