‫Olá e bem-vindo.
‫Nesta palestra, vamos aprender sobre um fenômeno estranho chamado parâmetro externo.
‫Este é um parâmetro que ao invés de passar o valor em C++, tendemos a passar o valor de uma
‫função.
‫E também veremos algo chamado referência constante e como esses dois conceitos estão
‫entrelaçados um com o outro.
‫Vamos mergulhar e descobrir isso.
‫Agora.
‫O lugar real em que as referências brilham é nos parâmetros das funções, porque toda vez que
‫criamos um float delta time como este em nosso componente, o que estamos fazendo é pegar uma cópia desse
‫float original e passá-lo para o função.
‫Então, em vez de fazer isso, o que podemos querer fazer é pegar uma referência e passar isso.
‫Então, vamos imaginar que deveríamos criar uma função para pegá-la, cada uma chamada de dano de impressão.
‫E como argumento para esta função, queremos passar um dano de flutuação.
‫Agora, isso, como eu disse, vai fazer uma cópia de tudo o que passamos e copiá-lo para essa variável.
‫Crie esta variável de parâmetro dentro da função de dano de impressão.
‫E precisamos ter um valor de retorno de void aqui também para completá-lo e um ponto e vírgula no final.
‫Vamos para o C++ e continuar esta conversa.
‫Vamos criar o dano de impressão aqui.
‫Coloque o você pegar uma classe na frente dela e vamos colocar algumas chaves em vez do ponto e vírgula.
‫Então nós temos uma cópia na variável de parâmetro de dano e é seguro porque se eu fosse causar dano igual
‫a cinco, eu só mudaria esta variável aqui dentro de dano de impressão.
‫Eu tenho uma cópia dele meu próprio.
‫Não posso estragar tudo por acaso.
‫Agora, e se eu não quiser fazer uma cópia?
‫Minha alternativa seria pegar uma referência.
‫Então, o que eu posso fazer aqui é colocar uma referência flutuante entrando em dano de impressão,
‫e eu preciso atualizar isso no arquivo C++ também.
‫E então eu posso ter esta mensagem de log que estamos usando a referência para vamos tirar isso e
‫colocar isso em dano de impressão.
‫Então agora pegamos nosso dano e estamos imprimindo atualizações de saída, as declarações de log dizem que dano é esse caso de
‫dano, é esse dano.
‫E em nosso componente tick, o que podemos fazer é imprimir o dano e passar a variável de dano e colocar o ponto e
‫vírgula no final.
‫E podemos nos livrar de nossa referência de dano por enquanto, porque o que temos agora é um flutuador
‫danificado que é criado em tecnologia.
‫A memória para isso foi criada aqui no take e então vamos e a entregamos a esta função de dano de impressão.
‫Mas como o parâmetro é uma referência, não estamos copiando esse dano.
‫Estamos pegando seu endereço e armazenando-o na referência para que, quando usarmos essa referência
‫na linha, estejamos realmente acessando a parte original da memória.
‫Portanto, nenhuma cópia teve que acontecer para que isso imprimisse o dano.
‫Agora vamos apenas verificar se isso está realmente fazendo o que esperamos que faça.
‫Se eu alterar o valor do dano para cinco, por exemplo, e então recompilar e apertar play, então vá e dê uma olhada
‫no log de saída e imprima que o dano é cinco.
‫Mas como temos uma referência, sabemos que podemos atualizar esse valor.
‫Então o que eu posso fazer é dizer que dentro dessa função eu poderia fazer, ei, dano deveria ser igual a
‫dois assim.
‫E se eu não tomasse cuidado, se eu achasse que tinha minha própria cópia, eu poderia pensar que está tudo bem.
‫Mas, na verdade, no componente tick, o que fizemos foi alterar as variáveis A originais.
‫Se eu colocar um pequeno log aqui para inspecionar a variável de dano original e colocarmos um percentual F
‫e passar o dano aqui, vamos codificar e compilar isso e vamos apertar play.
‫Dê uma olhada em nosso log de saída e você pode ver que agora o dano e o dano
‫original foram modificados.
‫Ambos foram alterados para o número dois, o que não é ótimo.
‫Você sabe, você pode acidentalmente causar muitos danos, se você me desculpar o trocadilho, alterando
‫variáveis que você não esperava mudar.
‫E aqui vem outro uso dessa palavra-chave const que vimos no passado.
‫Se eu colocar const na frente da minha referência float, então o que estou dizendo aqui é que esta deve ser
‫uma referência que você não pode alterar.
‫Você não pode chamar nenhuma função sem contato nele, você não pode configurá-lo.
‫Você não pode de forma alguma alterar o conteúdo dessa variável.
‫Você só pode usá-lo, você só pode lê-lo, você só pode ver o que está lá.
‫Então, se voltarmos a pegar uma cópia, precisamos ter certeza de que colocamos Const aqui nos parâmetros também
‫e podemos prosseguir e compilar e você vê que temos uma falha de compilação e o erro está dizendo que
‫o dano não pode ser atribuído a ele porque é uma variável constante.
‫Então isso nos dá a proteção que precisamos.
‫Então, de modo geral, se estamos tentando passar uma variável, de uma maneira eficiente, onde não queremos
‫fazer uma cópia, sempre usaremos a palavra-chave contact, além de usar uma referência,
‫porque isso nos impede de alterando acidentalmente esse conteúdo.
‫Agora, no entanto, às vezes você deseja usá-lo para alterar esse valor.
‫E o que podemos ter como exemplo, podemos ter um valor de retorno booleano e podemos querer dizer que
‫tem danos, mas também podemos, como fizemos no Blueprint no passado, querer ter um segundo valor de retorno.
‫Então, podemos dizer, temos algum dano e qual é esse dano?
‫Bem, neste caso, faz sentido usar uma referência simples sem contato, uma referência flutuante.
‫O dano, e normalmente nós chamaríamos isso de dano apenas para tornar realmente visível que isso
‫é um parâmetro conhecido como out.
‫Não é um parâmetro para passar coisas.
‫É um parâmetro para passar as coisas.
‫Agora, pode ser um pouco estranho de C++ e pode ser difícil de detectar.
‫Mas, de um modo geral, se você vir algum parâmetro que é uma referência,
‫mas não está marcado como contato, pode presumir que alguém pretendia usá-lo como um parâmetro de saída.
‫Então é isso que temos aqui.
‫Temos danos.
‫E se fôssemos implementar isso no CPP, então podemos colocar a classe você pegar uma classe na frente
‫aqui e podemos colocar nossos parênteses de chaves aqui.
‫Vamos comentar o dano de impressão da linha onde não está feliz porque estamos tentando
‫definir uma referência de contato.
‫E essencialmente o que poderíamos fazer aqui é que poderíamos fazer algum código, poderíamos ver se temos algum dano
‫e então imprimiríamos, sim, tudo bem.
‫Fora o dano é igual a cinco.
‫Então esse é o dano que foi feito e podemos retornar.
‫É verdade, porque temos algum dano que foi feito e isso agora podemos usar em algum
‫lugar como componentes TEC para recuperar o dano.
‫Então, aqui, em vez de definir o dano cinco, podemos obter o dano e imprimi-lo
‫se houver algum dano, para que possamos dizer algo nesse sentido se houver dano e, em seguida, passamos a variável que queremos
‫que seja preenchida com o dano .
‫Então danos, por exemplo, e aí podemos ter o corpo do nosso extrato e só poderíamos chamar de dano de impressão,
‫por exemplo, se houver algum dano a ser exibido e pudermos remover isso, você loga por completo.
‫Portanto, esta é a maneira que usamos referências sem contato como parâmetros de saída, uma maneira de obter vários valores
‫de retorno de uma função.
‫E normalmente quando fazemos isso, quando estamos chamando essa função, vamos criar a variável, mas não
‫vamos dar um valor inicial.
‫Então, na linha 39, basicamente eu tenho um dano de flutuação definido.
‫Eu o passo imediatamente na próxima linha.
‫E este é outro sinal revelador de que você está usando um parâmetro out.
‫Eu não dei nenhum valor antes de passá-lo para uma função significa que estou esperando que
‫essa função coloque o valor para mim.
‫Portanto, isso pode ser difícil de detectar no início e pode ser um pouco confuso.
‫Mas estas são as duas regras que eu gostaria que você se lembrasse.
‫Se você vir uma variável declarada e sem um valor e instantaneamente passada para uma função, pergunte a si mesmo se isso
‫é um parâmetro de saída.
‫E a outra regra é se você vê uma referência como um parâmetro, mas não é conteúdo, então isso também pode ser
‫uma dica de que este é um parâmetro de saída.
‫E, claro, se a variável ou parâmetro for nomeado como algo, então isso é uma oferta inoperante de que essa
‫coisa deve ser um parâmetro de saída.
‫Coisas boas.
‫Acho que isso nos preparou muito bem para sermos capazes de fazer uma varredura.
‫Então, vejo você na próxima palestra.