Привет, я начал изучать 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 сценария, где ->
против .
будет иметь значение?
Просто используйте .
когда переменная, которую вы вызываете, является либо фактическим объектом, либо ссылкой. Используйте ->
когда переменная является указателем на объект.
В общем, предпочитают использовать либо реальные объекты, либо ссылки на объекты. Указатели используются по мере необходимости. Некоторые случаи, когда вам часто нужно использовать указатели, являются:
testTwo->printCrap()
- это просто синтаксический сахар для (*testTwo).printCrap()
, не более того, не что иное.
testTwo
является указателем, а не классом (с определенным оператором *
и / или ->
).
Это не вопрос преимуществ или различий. Если у вас есть указатель, вам нужно разыменовать его для доступа к элементам. Оператор ->
эквивалентен
testTwo->print();
(*testTwo).print(); // same thing.
Если у вас есть экземпляр (или ссылка), который вы используете
testTwo.print();
Это синтаксис языка - его не касается предпочтений
Это просто работа с памятью. Когда вы его распределяете
Test testOne;
вы просто создаете объект в памяти, когда работаете, когда указываете на него
Text *testTwo = &testOne;
вы указываете на то же место, где re testOne. Вы только что создали другое имя для той же части памяти. И когда вам нужно передать эту вещь функции, вы не хотите создавать целый новый объект, но вы просто хотите указать на него как
function workWithObject(Test *testit)
Таким образом, testit указывает на ту же часть памяти, что и testTwo, и это textOne.
у вас есть другой класс Test2, который унаследован от вашего первоначального теста. Test2 имеет собственную версию функции printCrap(). У нас есть два способа позвонить:
//as member function
Test.printCrap();
Test2.printCrap();
//as pointer
ptr = &Test;
ptr->printCrap();
ptr = &Test2;
ptr->printCrap();
Приведенный выше код иллюстрирует использование только, не указывает, какой из них лучше.
Доступ к классу можно получить, применив .
оператора к объекту класса testTwo или путем применения ->
к указателю класса testTwo. Стрелка ->
появилась с момента времени C и с избытком.
Также внутри класса вам не нужны никакие операторы. Просто вызовите printCrap. И если вы ищете статическую функцию-член, вы используете :: fe testOne::staticPrint.
. (точка) и оператор → (стрелка) используются для ссылки на отдельных членов классов, структур и союзов.
Оператор точки применяется к фактическому объекту. Оператор стрелки используется с указателем на объект.
Test testOne;
Test* testTwo = &testOne;
здесь testTwo - это указательная переменная типа Test, указывающая на расположение памяти testOne, чтобы получить доступ к членам класса Test с помощью testTwo, для этого требуется разыменовать, что делается с помощью → оператора со стрелкой.
testTwo
может содержать неверный адрес (в общем случае, а не в вашем примере)