C ++ доступ к членам и функциям

0

Я довольно хорошо знаком с 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

  • 1
    Начните здесь . Лучший способ выучить C ++ - это начать читать хорошую книгу.
  • 0
    если вы не сделали bmw указателем, вы можете получить доступ к членам с помощью . оператор. Оператор -> разыменовывает и обращается к члену.
Теги:

5 ответов

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

-> используется, когда у вас есть указатель . используется, когда у вас есть экземпляр.

В вашем примере bmw является указателем на экземпляр Stock, поэтому вы ссылаетесь на его членов с помощью оператора ->. поле name является строковым экземпляром, поэтому вы используете . оператор.

Вы также можете написать это как

(*bmw).name = "BMw";

Поскольку *bmw возвращает экземпляр, адрес которого хранится в varialbe bmw

Это так просто - не путайте себя, внося стек и кучу. Это просто детали реализации распределения памяти.

  • 1
    ". используется, когда у вас есть экземпляр или ссылка "
1

Просто знайте, что вы используете оператор стрелки (->), когда 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;
  • 0
    sptr->name и локальное переменное name это две разных вещей. Не путайте читателей
0
bmw->name.length()

bmw - указатель на ваш объект-хранилище, созданный на куче. Так что обращайтесь к своему члену (например, в имени вашего дела), которое вы должны использовать ->. После того как "bmw-> name" даст вам строковый объект. И этот строковый объект не выделяется с использованием новых средств, а не в кучу. Итак, сделайте доступ к этому члену (например, length()), вы должны использовать '.' ,

0

Добро пожаловать в родной мир, управляемый C++!

В C++ вам нужно использовать -> только тогда, когда выражение слева оценивается как указатель class, struct или union, в противном случае используется . , Функция также может возвращать указатель на объект, и там вам нужно использовать -> operator:

Stock* GetStockByIndex(int);
GetStockByIndex(0)->value;

Использование -> не связано с new/кучей и использованием . не привязан к стеку выделенного объекта. Это просто контекст (выражение слева).

В ближайшем будущем вы также увидите, что:

Stock s;
s->calculate();

Как это возможно, вы можете удивиться. Это потому, что C++ позволяет -> перегружать!

Добро пожаловать!

0

"Использовать" → "для объекта, выделенного в куче", неточно. Просто, когда вам нужен доступ к членам объекта с помощью указателя, вы должны использовать "->". Для других ситуаций используйте ".".

Ещё вопросы

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