Я не понимаю этот урок об указателях - PullRequest
3 голосов
/ 25 марта 2012
    class SimpleCat
{
public:
    SimpleCat();
    SimpleCat(SimpleCat&);
    ~SimpleCat();
};

SimpleCat::SimpleCat()
{
    cout << "Simple Cat Constructor.. \n";
}

SimpleCat::SimpleCat(SimpleCat&)
{
    cout << "Simple Cat Copy Constructor ..\n";
}

SimpleCat::~SimpleCat()
{
    cout << "Simple Cat Destructor! ... \n";
}

SimpleCat *FunctionTwo(SimpleCat *theCat);

void main()
{
    cout << "Making a cat ...\n";
    SimpleCat Frisky;
    cout << "Calling FunctionTwo ..\n";
    FunctionTwo(&Frisky);
    system("pause");
}

SimpleCat *FunctionTwo (SimpleCat *theCat)
{
    cout << "FunctionTwo, Returning... \n";
    return theCat;
}

Хорошо, так что я не понимаю, зачем вам * для FunctionTwo? Если вы действительно хотите сделать мне одолжение, может кто-нибудь сломать код для меня (часть указателя, потому что я серьезно не понимаю, когда и зачем использовать * и &.

Ответы [ 3 ]

1 голос
/ 25 марта 2012

FunctionTwo возвращает указатель на объект SimpleCat. Как вы можете видеть, он также принимает указатель на объект SimpleCat в качестве параметра. В этом случае он просто принимает указатель и затем возвращает его.

Чтобы вызвать эту функцию, вам нужно передать указатель на нее. Если вы хотите передать Frisky функции, вам нужно передать адрес объекта Frisky. Это то, что делается, когда написано & Frisky. Создается указатель с адресом объекта Frisky.

Однако, когда аналогичное утверждение записывается в список параметров функции, то есть SomeFunction (SimpleCat & Frisky), она говорит вам, что объекты передаются в функцию с помощью reference . Это в основном позволяет использовать одно из преимуществ указателей, не беспокоясь о синтаксисе указателей. Вы обычно вызываете функцию, говоря SomeFunction (Frisky), и внутри функции вы используете Frisky с тем же синтаксисом, что и в основной функции, но вы должны помнить, что объект не копируется. И внутри main, и внутри SomeFunction вы выполняете операции с одним и тем же объектом. Это не копируется. Только информация, необходимая для доступа к Frisky, передается функции.

0 голосов
/ 25 марта 2012

ОК, давайте начнем с рассмотрения основного:

void main()
{
    cout << "Making a cat ...\n";
    SimpleCat Frisky;
    cout << "Calling FunctionTwo ..\n";
    FunctionTwo(&Frisky);
    system("pause");
}

Единственное, что может не иметь для вас смысла, если FuctionTwo(&Frisky). То, что это делает, передает адрес от Frisky до FucntionTwo(). Когда & помещается перед любой переменной, это просто означает захват адреса этой переменной.

Теперь давайте посмотрим на FunctionTwo():

SimpleCat *FunctionTwo (SimpleCat *theCat)
{
    cout << "FunctionTwo, Returning... \n";
    return theCat;
}

FunctionTwo принимает указатель SimpleCat. В этом случае SimpleCat уже определен как структура класса, который вы определили выше. Что означает *, так это то, что всякий раз, когда вы работаете с переменной theCat, вы работаете с адресом того, что было передано в функцию. Вот почему вам нужно разыменовать Frisky перед передачей его в функцию. Функция ищет адрес того, что передается.

Последнее, что вы видите FunctionTwo возвращает переменную theCat. Поскольку он был передан как Pointer , его необходимо вернуть как указатель. Вот почему функция объявляется как SimpleCat *FunctionTwo(), это готовит код для события, в котором тип возвращаемого значения - не целое значение, а ссылка на переменную со значением.

Здесь вы можете получить понятия Передача по ссылке и Передача по значению .

0 голосов
/ 25 марта 2012

Хорошо.Это довольно легко.Указатель - это операция, которая относится к некоторому пространству в памяти.Допустим, вы выделили какое-то место для экземпляра вашего класса в памяти, и указатель позволяет вам обратиться к начальной точке этого пространства.Насколько вы точно знаете, это определение класса экземпляра, расположенного в этом фрагменте памяти, вы можете использовать все методы и поля класса.Ссылка ниже может помочь вам справиться с этим В чем различия между переменной-указателем и ссылочной переменной в C ++? И да, ваша функция просто возвращает значение типа SimpleCat *, которое является указателем на SimpleCatструктура.

...