Почему мы используем «это->», а не «это». чтобы получить доступ к членам? - PullRequest
1 голос
/ 25 марта 2009

Я искал библиотеку, созданную человеком для FaceBook на C ++. Заголовочный файл такой:

#ifndef __FACEBOOK_H__
#define __FACEBOOK_H__

/**
 * Facebook Class 
 * Joel Seligstein
 * Last mod: Aug 22, 2006
 *
 * This is the beginnings of a facebook class set and REST client.  Its not documented
 * yet nor nearly complete.  But this is a release to demonstrate its usefulness.  
 * Please email joel@seligstein.com with suggestions or additions.
 *
 * TODO: Create classes/parsers for each request type
 * TODO: Linux URL launcher
 */

//uncomment to have verbose output turned on
//#define fb_debug 1

//define which platform you're compiling for
#define fb_windows 1
//#define fb_linux 1

#include <string>
#include <sstream>
#include <list>
using namespace std;

#ifdef fb_windows
#include <windows.h>
#endif

#include "curl/curl.h"
#include "xmlParser/xmlParser.h"
#include "md5.h"

class facebook
{
    public:
        //app/session vars
        string api_key;
        string secret;
        string token;
        string server;
        string session_key;
        string session_secret;
        string uid;
        bool has_session;

        facebook( string my_key, string my_secret, string my_server );
        bool authenticate( );
        bool request( string method, list<string> params, string *res );
        bool load_token( );
        void launch_login( string url );
        bool get_session( );
        void clean_up( );

    private:
        //curl info
        CURL *curl;
        CURLcode res;
        int call_id;

        //internal functions
        string get_signature( list<string> params );
        static string md5( string str );
        static string get_param_string( list<string> params, bool separate );
        static size_t write_callback( void *ptr, size_t size, size_t nmemb, void *userp );
};

#endif //__FACEBOOK_H__

Тогда внутри файла cpp мой вопрос касается этого, ниже приведен конструктор:

facebook::facebook( string my_key, string my_secret, string my_server )
{
    this->api_key = my_key;
    this->secret = my_secret;
    this->server = my_server;
    this->has_session = false;
    this->call_id = 0;
}

Почему они использовали оператор ->, а не .?

У меня ограниченное понимание того, что -> получает доступ к свойствам и методам типа непосредственно в памяти, но я в замешательстве, из-за неведения ожидал увидеть:

facebook::facebook( string my_key, string my_secret, string my_server )
{
    this.api_key = my_key;
    this.secret = my_secret;
    this.server = my_server;
    this.has_session = false;
    this.call_id = 0;
}

Все, что я хочу знать, - это теория, почему -> используется над точечной нотацией.


UPDATE: Для всех, кто находится в той же лодке, что и я, и изучает C ++. Я расширил пример, опубликованный участником в этом вопросе. Я также завернут в список инициализации для поля члена.

#include "stdafx.h"
#include <iostream>
using namespace std;

class A {
private:
    int x;
public:
    A() : x(0){}
    int getX() const {return x;}
    void setX(int xx) {x += xx;}
};

int main()
{
    A a;

    a.setX(13);

    A *pa = &a;

    pa->setX(2);

    A b = a;

    b.setX(5);

    cout << "a" << a.getX() << endl;

    cout << "a*" << pa->getX() << endl;

    cout << "b" << b.getX() << endl;

    return 0;
}

Ответы [ 6 ]

6 голосов
/ 25 марта 2009

«this» является указателем на текущий объект, т. Е. Внутри методов (или конструктора) класса A это тип «A *». Обратите внимание, что если метод помечен как const, он имеет тип «A const *». Отсюда использование «->» (составлено из указателей), а не «.» (предназначен для объектов класса "A" или ссылок на объекты класса "A &")

2 голосов
/ 25 марта 2009

Вы можете рассмотреть следующий пример.

class A {
    int x;
public:
    int getX() const {return x;}
    void setx(int xx) {x = xx;}
};

int main()
{
    A a;

    a.setX(13);
    cout << a.getX() << endl;

    A *pa = &a;

    cout << pa->getX() << endl;

    return 0;
}

Обратите внимание, что точка оператора (.) Используется при вызове функции-члена A напрямую с объектом a. Оператор стрелки (->) используется при косвенном вызове функции-члена A через указатель типа A (A * pa = & a).

В C ++, это является указателем на вызывающий объект. Таким образом, мы могли бы также определить функцию A :: getX () следующим образом:

int getX() const {return this->x;}

Или:

int getX() const {return (*this).x;}

это указатель на объект A, таким образом * это разыменовывает его. Таким образом, мы могли бы использовать обе функции выше.

2 голосов
/ 25 марта 2009

Поскольку внутри класса или члена структуры «this» является специальным указателем, который указывает на текущий экземпляр.

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

Если вы обращаетесь к ним через что-либо, что не является указателем (обычно это ссылка), вместо этого используется оператор точки.

Стоит отметить, что синтаксис this-> необязателен, за исключением некоторых форм создания шаблонов. Однако многие люди предпочитают использовать его по стилистическим соображениям. На S.O. есть пара вопросов, связанных с обоснованием этого. уже.

2 голосов
/ 25 марта 2009

В C ++ this - указатель на собственный объект. Это пережиток ранних версий C ++ до того, как на него были ссылки. Если бы this было добавлено к языку сейчас, это, вероятно, было бы ссылкой, для которой вы бы использовали нотацию ..

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

Как уже говорилось, это указатель, а не ссылка. Таким образом, вам нужен оператор ->, который примерно (хотя и не совсем совпадает с): (* this).

Они отличаются тем, что вы можете перегрузить оператор -> или * оператор в классе и могут иметь различную семантику. Фактически, если класс переопределяет operator-> и возвращаемое значение не является необработанным указателем, компилятор будет продолжать применять operator-> к возвращенному объекту, пока не достигнет собственного указателя. Оператор не может быть перегружен.

В конструкторе, который вы указали, использование этого является полностью необязательным, поскольку нет конфликта имен, код мог бы просто назвать атрибуты без дальнейшей квалификации.

facebook::facebook( string my_key, string my_secret, string my_server )
{
    api_key = my_key;
    secret = my_secret;
    server = my_server;
    has_session = false;
    call_id = 0;
}

И лучшим решением было бы использование списка инициализации. Если вы заинтересованы в изучении C ++ Google для этого.

0 голосов
/ 20 августа 2018

потому что «this» - это специальный указатель, который ссылается на текущий объект, и мы используем «->» для доступа к членам объекта через указатели и «. используется для непосредственного вызова члена объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...