为什么我们使用'this->'而不是'这个'。访问会员?

时间:2009-03-25 07:01:50

标签: c++ visual-c++

我正在看一个人在C ++中为FaceBook做的图书馆。头文件是这样的:

#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;
}

我想知道的是为什么->用于点符号背后的理论。


更新: 对于与我同舟共济的其他人并学习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 个答案:

答案 0 :(得分:6)

“this”是指向当前对象的指针,即类A的内部方法(或构造函数),它的类型为“A *”。请注意,如果方法标记为const,则其类型为“A const *”。 因此使用“ - &gt;” (设计指针)而不是“。” (为类对象“A”设计或对类对象“A&amp;”)的引用

答案 1 :(得分:2)

在C ++中,this是指向自身对象的指针。在它有引用之前,它是早期版本的C ++的遗留物。如果现在将this添加到该语言中,它可能是一个引用,您可以使用.表示法。

答案 2 :(得分:2)

因为在类或结构成员中,“this”是指向当前实例的特殊指针。

每当您通过指针访问类或结构的成员时, - &gt;使用运算符。

如果您通过任何非指针(通常是引用)访问它们,则使用点运算符。

值得注意的是这个 - &gt;除了某些形式的模板实例外,语法不是必需的。不过,很多人选择使用它是出于风格的原因。关于S.O.背后的理由,有几个问题。已经

答案 3 :(得分:2)

您可以考虑以下示例。

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 * pa =&amp; a)间接调用A的成员函数时,使用箭头运算符( - &gt;)。

在C ++中, this 是指向调用对象的指针。因此我们也可以按如下方式定义A :: getX()函数:

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

或者:

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

这是对象A的指针,因此*取消引用它。所以我们可以使用上面的两个函数。

答案 4 :(得分:1)

如上所述,这是一个指针,而不是一个参考。因此你需要 - &gt;大致(虽然不完全相同)的运算符:(* this)。

它们的区别在于您可以超载 - &gt;类中的运算符或*运算符,可以具有不同的语义。事实上,如果一个类重写operator-&gt;并且返回的值不是原始指针,编译器将继续应用operator-&gt;到返回的对象,直到它到达本机指针。运营商。不能超载。

在你指向的构造函数中,使用它是完全可选的,因为没有名称冲突,代码可能只是命名了属性而没有进一步的限定。

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 ++谷歌。

答案 5 :(得分:0)

因为“ this”是指向当前对象的特殊指针,因此我们使用“->”通过指针和“”来访问对象的成员。用于直接调用对象的成员。