photo
+ Responder ao Tópico
Resultados de 1 a 1 de 1

Thread: Referência, Modificador & e Palavra-chave this

  1. #1 Fechar a publicação
    Senior Member jssuser's Avatar jssuser's Avatar
    Data de afiliação
    Aug 2018
    Postagens
    1,503
    Obrigado
    209
    Agradecimentos 1,574 Tempos em 856 Postagens
    AssinarAssinar
    subscritar: 0

    Referência, Modificador & e Palavra-chave this

    Passando Parâmetros por Referência
    Em MQL5, parâmetros de tipos simples podem ser passados tanto por valor como por referência, enquanto que parâmetros de tipos compostos são sempre passados por referência. Para informar ao compilador que um parâmetro deve ser passado por referência, o caractere "e comercial" & é adicionado antes do nome do parâmetro.

    Passar um parâmetro por referência significa passar o endereço da variável, é por isso que todas as mudanças no parâmetro que é passado por referência será imediatamente refletida na variável origem. Usando parâmetros passados por referência, pode-se implementar o retorno de vários resultados de uma função ao mesmo tempo. A fim de evitar alteração de um parâmetro passado por referência, use o modificador const.

    Assim, se o parâmetro de entrada de uma função for um array, um objeto de classe ou estrutura, o símbolo '&' é colocado no cabeçalho da função após o tipo da variável e antes de seu nome.

    Exemplo

    class CDemoClass
    {
    private:
    double m_array[];

    public:
    void setArray(double &array[]);
    };
    //+------------------------------------------------------------------+
    //| Preenchendo o array |
    //+------------------------------------------------------------------+
    void CDemoClass::setArray(double &array[])
    {
    if(ArraySize(array)>0)
    {
    ArrayResize(m_array,ArraySize(array));
    ArrayCopy(m_array, array);
    }
    }

    No exemplo acima, a classe CDemoClass é declarada, e contém o membro array private - m_array[] de tipo double. A função setArray() é declarada, e o parâmetro array[] é passado por referência. Se o cabeçalho da função não contém a indicação de passar por referência, isto é, não contém o caractere "e comercial" (&), uma mensagem de erro será gerada na tentativa de compilar tal código.

    Apesar do fato de que um array é passado por referência, não se pode atribuir um array ao outro. Nós precisamos realizar a cópia elemento a elemento de conteúdo do array origem para o array destino. A presença de & nas descrições de função é uma condição obrigatória para array e estruturas quando passado como parâmetro de função.

    Palavra-chave this
    Uma variável de tipo de classe (objeto) pode ser passado tanto por referência como por ponteiro. Assim como referência, o ponteiro permite ter acesso a um objeto. Após o ponteiro de objeto ser declarado, o operador new deve ser aplicado nele para criá-lo e inicializá-lo.

    A palavra reservada this é destinado para obter a referência do objeto para si mesmo, que fica disponível dentro de métodos de classe e estrutura. this sempre referencia o objeto, dentro do método em que ele é usado, e a expressão GetPointer(this) retorna o ponteiro do objeto, cujo membro é a função na qual a chamada ao GetPointer() é realizado. Em funções MQL5 não se pode retornar objetos, mas eles podem retornar ponteiro de objeto.

    Assim, se precisamos de uma função para retornar um objeto, nós podemos retornar o ponteiro deste objeto na forma de GetPointer(this). Vamos adicionar a função getDemoClass() que retorna o ponteiro do objeto para este classe, na descrição de CDemoClass.

    class CDemoClass
    {
    private:
    double m_array[];

    public:
    void setArray(double &array[]);
    CDemoClass *getDemoClass();
    };
    //+------------------------------------------------------------------+
    //| Preenchendo o array |
    //+------------------------------------------------------------------+
    void CDemoClass::setArray(double &array[])
    {
    if(ArraySize(array)>0)
    {
    ArrayResize(m_array,ArraySize(array));
    ArrayCopy(m_array,array);
    }
    }
    //+------------------------------------------------------------------+
    //| Retorna seu próprio ponteiro |
    //+------------------------------------------------------------------+
    CDemoClass *CDemoClass::getDemoClass(void)
    {
    return(GetPointer(this));
    }

    Estruturas não têm ponteiros, os operadores new e delete não podem ser aplicados a eles, GetPointer(this) não pode ser usado.

    Though trading on financial markets involves high risk, it can still generate extra income in case you apply the right approach. By choosing a reliable broker such as InstaForex you get access to the international financial markets and open your way towards financial independence. You can sign up here.


  2. The Following User Says Thank You to jssuser For This Useful Post:

    Não registrado (1 )

+ Responder ao Tópico

Permissões de postagens

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts