указатели & amp; ссылки на с ++, когда и где

Я возвращаюсь к C ++ после долгого предприятия в мире Java и переосмысливаю концепцию / синтаксис того, как C ++ использует указатели.

Итак, пара примеров.

в Яве

    public void MyFunc(MyClass class)
{
class.DoSomething;
}

такой же как

    void MyFunc (MyClass* class)
{
class->DoSomething;
}

а также

    public MyClass GetMyClass()
{
return class;
}

это то же самое, что (глядя на это, я понимаю, что мне пришлось бы хранить то, что я возвращаю здесь в указателе, так что это не то же самое …)

    MyClasss* GetMyClass()
{
return (&class); // could you say here "return <-MyClass"}

вместо этого, возможно, это то же самое (может показаться, что это должно вернуть объект MyClass, который находится в&MyClass «, так что вы сможете напрямую редактировать этот объект в этом месте, откуда бы он ни возвращался)

    MyClasss GetMyClass()
{
return (&class);
}

также вы можете использовать -> для доступа к объекту, хранящемуся по адресу, на который указывает указатель, можете ли вы использовать <- хранить адрес?

наконец, какой смысл

    void MyFunc(MyClass1 &class1, MyClass2 &class2)

против

    void MyFunc(MyClass1* class1, MyClass* class2)

это то, что для первого вы передаете в хранилище данных по адресу, в то время как в примере 2 вы передаете адрес данных, которые вы хотели бы использовать?

-2

Решение

Указатель — это адрес памяти, где вы можете найти свои данные (это может быть объект, структура или тип примитива). Когда ты сказал return (&object), вы возвращаете адрес памяти — одно число (скажем, 1736cbfa). С этим адресом памяти вы можете получить доступ к отдельным элементам объекта, используя оператор ->. Вы ничего не «отталкиваете» от вызывающей функции, поэтому вам не нужно ничего »<- «оператор. Просто представьте, что функция возвращает число, а особый вид магического числа, который сообщает вам, где находятся нужные вам данные, и с вами все будет в порядке.

Что касается вашего последнего пункта, void MyFunc(MyClass * object) отправляет копию адреса памяти / указатель / магический номер, где вы находите данные в функцию. void MyFunc(MyClass & object) в основном делает то же самое за кулисами, но позволяет напрямую ссылаться на object1 (как в object.element вместо object-> element). Этот второй метод предпочтителен, когда вы хотите изменить object1 внутри функции, так как вы не можете случайно разыменовать нулевой указатель таким образом.

3

Другие решения

Предполагая, что:

class MyClass
{
public:
void Foo() {}
}

class OtherClass:
{
public:
MyClass GetValue() { return myClass; }
MyClass& GetRef() { return myClass; }
MyClass* GetValPtr() { return &myClass; }
private:
MyClass myClass;
}

OtherClass bar;

Первый метод вернет копия члена по имени мои занятия. Если вы получите переменную и измените ее, это не повлияет на переменную-член. Вы можете позвонить Foo метод, как так, bar.GetVal().Foo(), Обратите внимание, что вы получили MyClass экземпляр по копирование Это. Если вы не назначите его переменной, вы не сможете повторно использовать этот конкретный экземпляр. Это НЕ призвание Foo на MyClass экземпляр члена внутри bar

Второй метод вернет ссылка к переменной-члену. Ссылки используются потому, что в отличие от указателей, они не может быть NULL. Вы можете получить доступ к Foo метод, как так, bar.GetRef().Foo(), Помните, что это будет вызвать метод MyClass экземпляр члена внутри bar.

Третий метод вернет указатель на член myClass. Вы можете получить доступ к Foo метод, как так, bar.GetPtr()->Foo(), Помните, что это будет вызвать метод MyClass экземпляр члена внутри bar.

1

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

Джава:

    public void myFunc(MyClass c)
{
c.doSomething();
}

C ++:
void myFunc (MyClass& учебный класс)
{
class.doSomething ();
}

Что касается вашего второго примера, он даже не будет компилироваться в Java:
публичный MyClass GetMyClass ()
{
вернуть MyClass;
}

Я думаю, что вы имеете в виду что-то вроде

    public MyClass getMyClass()
{
return new MyClass();
}

что в C ++ может быть сделано точно так же, но с указателем вместо ссылки:

    MyClass* getMyClass()
{
return new MyClass();
}

Что касается вашего последнего примера / вопроса, давайте упростим его до одного параметра:

void myFunc(MyClass c);

против

void myFunc(MyClass & rc)

против

void MyFunc(MyClass* pc)

Вот c это объект, rc является ссылкой на объект, и pc это указатель на объект.

У всех них есть различное использование. Синтаксис для использования c а также rc похож; оба используют . оператор для доступа к членам, так же, как в Java. Синтаксис для использования pc это отличается; указатели используют * оператор для косвенного -> оператор для доступа членов.

Я не уверен, что еще добавить здесь, если у вас нет более конкретного вопроса. Я предлагаю вам начать обновлять свои навыки C ++, просматривая классы и стандартные объектные переменные. Когда вы разберетесь с ними, вы можете перейти к указателям и ссылкам.

1
По вопросам рекламы [email protected]