Я довольно хорошо знаком с Java и С# и хочу расширить горизонт с помощью C++.
Но мне трудно понять, когда использовать ->
или .
оператора при доступе к элементу или методу objcect.
Я уверен, что я не первый, кто задал этот вопрос. Есть много вопросов, которые решают одну и ту же проблему, но я просто не могу связать предоставленные ответы с моим специальным случаем.
У меня очень простой класс, который называется Stock
:
class Stock
{
public:
int32_t value;
string name;
Stock(void);
~Stock(void);
void doStuff();
};
Я знаю, что если объект выделен на кучу, я должен использовать ->
и .
когда он находится в пространстве стека.
Но если бы я хотел напечатать длину строки имени объекта Stock
мне нужно было бы сделать что-то вроде этого:
Stock* bmw = new Stock;
bmw->name = "BMw";
cout << bmw->name.length() << endl;
Доступ к названию запаса осуществляется с помощью оператора "->", длина имени через ".". оператор. На мой взгляд, оба этих объекта (запас и строка) находятся в куче, поэтому мне нужен только оператор ->, верно?
Что мне здесь не хватает? Как это со струнами? Я все строки всегда указываю... Не могли бы вы объяснить те концепции, которые здесь работают немного?
Заранее благодарю за ваши ответы.
Markus
->
используется, когда у вас есть указатель .
используется, когда у вас есть экземпляр.
В вашем примере bmw
является указателем на экземпляр Stock
, поэтому вы ссылаетесь на его членов с помощью оператора ->
. поле name
является строковым экземпляром, поэтому вы используете .
оператор.
Вы также можете написать это как
(*bmw).name = "BMw";
Поскольку *bmw
возвращает экземпляр, адрес которого хранится в varialbe bmw
Это так просто - не путайте себя, внося стек и кучу. Это просто детали реализации распределения памяти.
Просто знайте, что вы используете оператор стрелки (->), когда u указывает на объект. в вашем случае член имени не является указателем на std :: string, поэтому вы не можете использовать оператор стрелки, вместо этого вы используете точку (.).
вы можете сделать что-то вроде этого:
std::string* name;
Stock* sptr = new Stock;
sptr->name = new std::string("blah blah blah");
std::cout << sptr->name->length << std::endl;
sptr->name
и локальное переменное name
это две разных вещей. Не путайте читателей
bmw->name.length()
bmw - указатель на ваш объект-хранилище, созданный на куче. Так что обращайтесь к своему члену (например, в имени вашего дела), которое вы должны использовать ->. После того как "bmw-> name" даст вам строковый объект. И этот строковый объект не выделяется с использованием новых средств, а не в кучу. Итак, сделайте доступ к этому члену (например, length()), вы должны использовать '.' ,
Добро пожаловать в родной мир, управляемый C++!
В C++ вам нужно использовать ->
только тогда, когда выражение слева оценивается как указатель class
, struct
или union
, в противном случае используется .
, Функция также может возвращать указатель на объект, и там вам нужно использовать ->
operator:
Stock* GetStockByIndex(int);
GetStockByIndex(0)->value;
Использование ->
не связано с new
/кучей и использованием .
не привязан к стеку выделенного объекта. Это просто контекст (выражение слева).
В ближайшем будущем вы также увидите, что:
Stock s;
s->calculate();
Как это возможно, вы можете удивиться. Это потому, что C++ позволяет ->
перегружать!
Добро пожаловать!
"Использовать" → "для объекта, выделенного в куче", неточно. Просто, когда вам нужен доступ к членам объекта с помощью указателя, вы должны использовать "->". Для других ситуаций используйте ".".
bmw
указателем, вы можете получить доступ к членам с помощью.
оператор. Оператор->
разыменовывает и обращается к члену.