﻿1
00:00:04,410 --> 00:00:05,340
‫Olá e bem-vindo.

2
00:00:05,340 --> 00:00:10,290
‫Nesta palestra, vamos aprender sobre um fenômeno estranho chamado parâmetro externo.

3
00:00:10,290 --> 00:00:17,400
‫Este é um parâmetro que ao invés de passar o valor em C++, tendemos a passar o valor de uma

4
00:00:17,400 --> 00:00:18,000
‫função.

5
00:00:18,450 --> 00:00:23,340
‫E também veremos algo chamado referência constante e como esses dois conceitos estão

6
00:00:23,340 --> 00:00:25,380
‫entrelaçados um com o outro.

7
00:00:25,740 --> 00:00:27,720
‫Vamos mergulhar e descobrir isso.

8
00:00:28,880 --> 00:00:29,150
‫Agora.

9
00:00:29,150 --> 00:00:36,890
‫O lugar real em que as referências brilham é nos parâmetros das funções, porque toda vez que

10
00:00:36,890 --> 00:00:45,740
‫criamos um float delta time como este em nosso componente, o que estamos fazendo é pegar uma cópia desse

11
00:00:45,740 --> 00:00:49,520
‫float original e passá-lo para o função.

12
00:00:49,520 --> 00:00:55,760
‫Então, em vez de fazer isso, o que podemos querer fazer é pegar uma referência e passar isso.

13
00:00:56,240 --> 00:01:02,660
‫Então, vamos imaginar que deveríamos criar uma função para pegá-la, cada uma chamada de dano de impressão.

14
00:01:03,140 --> 00:01:09,200
‫E como argumento para esta função, queremos passar um dano de flutuação.

15
00:01:09,470 --> 00:01:14,720
‫Agora, isso, como eu disse, vai fazer uma cópia de tudo o que passamos e copiá-lo para essa variável.

16
00:01:14,720 --> 00:01:18,740
‫Crie esta variável de parâmetro dentro da função de dano de impressão.

17
00:01:19,930 --> 00:01:24,370
‫E precisamos ter um valor de retorno de void aqui também para completá-lo e um ponto e vírgula no final.

18
00:01:24,730 --> 00:01:28,590
‫Vamos para o C++ e continuar esta conversa.

19
00:01:28,600 --> 00:01:30,790
‫Vamos criar o dano de impressão aqui.

20
00:01:31,390 --> 00:01:39,250
‫Coloque o você pegar uma classe na frente dela e vamos colocar algumas chaves em vez do ponto e vírgula.

21
00:01:39,820 --> 00:01:48,280
‫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

22
00:01:48,280 --> 00:01:53,950
‫a cinco, eu só mudaria esta variável aqui dentro de dano de impressão.

23
00:01:53,950 --> 00:01:55,390
‫Eu tenho uma cópia dele meu próprio.

24
00:01:55,630 --> 00:01:57,910
‫Não posso estragar tudo por acaso.

25
00:01:58,180 --> 00:02:01,400
‫Agora, e se eu não quiser fazer uma cópia?

26
00:02:01,420 --> 00:02:04,330
‫Minha alternativa seria pegar uma referência.

27
00:02:04,630 --> 00:02:10,780
‫Então, o que eu posso fazer aqui é colocar uma referência flutuante entrando em dano de impressão,

28
00:02:10,780 --> 00:02:14,260
‫e eu preciso atualizar isso no arquivo C++ também.

29
00:02:14,740 --> 00:02:20,230
‫E então eu posso ter esta mensagem de log que estamos usando a referência para vamos tirar isso e

30
00:02:20,470 --> 00:02:22,540
‫colocar isso em dano de impressão.

31
00:02:22,750 --> 00:02:29,200
‫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

32
00:02:29,470 --> 00:02:30,940
‫dano, é esse dano.

33
00:02:31,300 --> 00:02:40,060
‫E em nosso componente tick, o que podemos fazer é imprimir o dano e passar a variável de dano e colocar o ponto e

34
00:02:40,060 --> 00:02:41,230
‫vírgula no final.

35
00:02:41,590 --> 00:02:48,670
‫E podemos nos livrar de nossa referência de dano por enquanto, porque o que temos agora é um flutuador

36
00:02:48,670 --> 00:02:51,010
‫danificado que é criado em tecnologia.

37
00:02:51,010 --> 00:03:00,100
‫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.

38
00:03:00,100 --> 00:03:06,640
‫Mas como o parâmetro é uma referência, não estamos copiando esse dano.

39
00:03:06,640 --> 00:03:13,300
‫Estamos pegando seu endereço e armazenando-o na referência para que, quando usarmos essa referência

40
00:03:13,300 --> 00:03:18,130
‫na linha, estejamos realmente acessando a parte original da memória.

41
00:03:18,130 --> 00:03:21,930
‫Portanto, nenhuma cópia teve que acontecer para que isso imprimisse o dano.

42
00:03:21,940 --> 00:03:25,240
‫Agora vamos apenas verificar se isso está realmente fazendo o que esperamos que faça.

43
00:03:25,240 --> 00:03:34,000
‫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

44
00:03:34,000 --> 00:03:38,410
‫no log de saída e imprima que o dano é cinco.

45
00:03:38,560 --> 00:03:42,880
‫Mas como temos uma referência, sabemos que podemos atualizar esse valor.

46
00:03:42,880 --> 00:03:48,880
‫Então o que eu posso fazer é dizer que dentro dessa função eu poderia fazer, ei, dano deveria ser igual a

47
00:03:48,940 --> 00:03:49,750
‫dois assim.

48
00:03:50,320 --> 00:03:55,300
‫E se eu não tomasse cuidado, se eu achasse que tinha minha própria cópia, eu poderia pensar que está tudo bem.

49
00:03:55,630 --> 00:04:01,540
‫Mas, na verdade, no componente tick, o que fizemos foi alterar as variáveis A originais.

50
00:04:01,560 --> 00:04:09,580
‫Se eu colocar um pequeno log aqui para inspecionar a variável de dano original e colocarmos um percentual F

51
00:04:09,580 --> 00:04:15,670
‫e passar o dano aqui, vamos codificar e compilar isso e vamos apertar play.

52
00:04:15,910 --> 00:04:21,850
‫Dê uma olhada em nosso log de saída e você pode ver que agora o dano e o dano

53
00:04:21,850 --> 00:04:22,960
‫original foram modificados.

54
00:04:22,960 --> 00:04:27,400
‫Ambos foram alterados para o número dois, o que não é ótimo.

55
00:04:27,430 --> 00:04:33,100
‫Você sabe, você pode acidentalmente causar muitos danos, se você me desculpar o trocadilho, alterando

56
00:04:33,100 --> 00:04:35,500
‫variáveis que você não esperava mudar.

57
00:04:36,010 --> 00:04:41,170
‫E aqui vem outro uso dessa palavra-chave const que vimos no passado.

58
00:04:41,620 --> 00:04:49,570
‫Se eu colocar const na frente da minha referência float, então o que estou dizendo aqui é que esta deve ser

59
00:04:49,570 --> 00:04:52,510
‫uma referência que você não pode alterar.

60
00:04:52,510 --> 00:04:56,290
‫Você não pode chamar nenhuma função sem contato nele, você não pode configurá-lo.

61
00:04:56,500 --> 00:05:00,370
‫Você não pode de forma alguma alterar o conteúdo dessa variável.

62
00:05:00,370 --> 00:05:04,360
‫Você só pode usá-lo, você só pode lê-lo, você só pode ver o que está lá.

63
00:05:04,450 --> 00:05:10,540
‫Então, se voltarmos a pegar uma cópia, precisamos ter certeza de que colocamos Const aqui nos parâmetros também

64
00:05:10,540 --> 00:05:17,170
‫e podemos prosseguir e compilar e você vê que temos uma falha de compilação e o erro está dizendo que

65
00:05:17,170 --> 00:05:21,850
‫o dano não pode ser atribuído a ele porque é uma variável constante.

66
00:05:22,270 --> 00:05:25,000
‫Então isso nos dá a proteção que precisamos.

67
00:05:25,390 --> 00:05:32,890
‫Então, de modo geral, se estamos tentando passar uma variável, de uma maneira eficiente, onde não queremos

68
00:05:32,890 --> 00:05:38,770
‫fazer uma cópia, sempre usaremos a palavra-chave contact, além de usar uma referência,

69
00:05:39,010 --> 00:05:43,630
‫porque isso nos impede de alterando acidentalmente esse conteúdo.

70
00:05:44,290 --> 00:05:50,350
‫Agora, no entanto, às vezes você deseja usá-lo para alterar esse valor.

71
00:05:50,680 --> 00:05:58,750
‫E o que podemos ter como exemplo, podemos ter um valor de retorno booleano e podemos querer dizer que

72
00:05:58,750 --> 00:06:06,580
‫tem danos, mas também podemos, como fizemos no Blueprint no passado, querer ter um segundo valor de retorno.

73
00:06:06,580 --> 00:06:10,640
‫Então, podemos dizer, temos algum dano e qual é esse dano?

74
00:06:10,780 --> 00:06:19,060
‫Bem, neste caso, faz sentido usar uma referência simples sem contato, uma referência flutuante.

75
00:06:19,530 --> 00:06:26,580
‫O dano, e normalmente nós chamaríamos isso de dano apenas para tornar realmente visível que isso

76
00:06:26,580 --> 00:06:29,280
‫é um parâmetro conhecido como out.

77
00:06:29,310 --> 00:06:31,110
‫Não é um parâmetro para passar coisas.

78
00:06:31,140 --> 00:06:33,360
‫É um parâmetro para passar as coisas.

79
00:06:33,630 --> 00:06:38,190
‫Agora, pode ser um pouco estranho de C++ e pode ser difícil de detectar.

80
00:06:38,490 --> 00:06:44,250
‫Mas, de um modo geral, se você vir algum parâmetro que é uma referência,

81
00:06:44,520 --> 00:06:50,700
‫mas não está marcado como contato, pode presumir que alguém pretendia usá-lo como um parâmetro de saída.

82
00:06:51,090 --> 00:06:52,530
‫Então é isso que temos aqui.

83
00:06:52,530 --> 00:06:53,750
‫Temos danos.

84
00:06:53,760 --> 00:07:01,380
‫E se fôssemos implementar isso no CPP, então podemos colocar a classe você pegar uma classe na frente

85
00:07:01,380 --> 00:07:05,700
‫aqui e podemos colocar nossos parênteses de chaves aqui.

86
00:07:06,120 --> 00:07:10,620
‫Vamos comentar o dano de impressão da linha onde não está feliz porque estamos tentando

87
00:07:10,620 --> 00:07:12,170
‫definir uma referência de contato.

88
00:07:12,780 --> 00:07:19,680
‫E essencialmente o que poderíamos fazer aqui é que poderíamos fazer algum código, poderíamos ver se temos algum dano

89
00:07:19,680 --> 00:07:22,170
‫e então imprimiríamos, sim, tudo bem.

90
00:07:22,200 --> 00:07:25,430
‫Fora o dano é igual a cinco.

91
00:07:25,440 --> 00:07:29,610
‫Então esse é o dano que foi feito e podemos retornar.

92
00:07:29,760 --> 00:07:36,480
‫É verdade, porque temos algum dano que foi feito e isso agora podemos usar em algum

93
00:07:36,510 --> 00:07:39,870
‫lugar como componentes TEC para recuperar o dano.

94
00:07:40,470 --> 00:07:46,020
‫Então, aqui, em vez de definir o dano cinco, podemos obter o dano e imprimi-lo

95
00:07:46,020 --> 00:07:53,790
‫se houver algum dano, para que possamos dizer algo nesse sentido se houver dano e, em seguida, passamos a variável que queremos

96
00:07:53,790 --> 00:07:56,490
‫que seja preenchida com o dano .

97
00:07:56,760 --> 00:08:04,980
‫Então danos, por exemplo, e aí podemos ter o corpo do nosso extrato e só poderíamos chamar de dano de impressão,

98
00:08:04,980 --> 00:08:11,700
‫por exemplo, se houver algum dano a ser exibido e pudermos remover isso, você loga por completo.

99
00:08:12,150 --> 00:08:19,320
‫Portanto, esta é a maneira que usamos referências sem contato como parâmetros de saída, uma maneira de obter vários valores

100
00:08:19,320 --> 00:08:21,240
‫de retorno de uma função.

101
00:08:21,540 --> 00:08:27,450
‫E normalmente quando fazemos isso, quando estamos chamando essa função, vamos criar a variável, mas não

102
00:08:27,450 --> 00:08:29,640
‫vamos dar um valor inicial.

103
00:08:29,940 --> 00:08:34,260
‫Então, na linha 39, basicamente eu tenho um dano de flutuação definido.

104
00:08:34,560 --> 00:08:36,990
‫Eu o passo imediatamente na próxima linha.

105
00:08:36,990 --> 00:08:41,590
‫E este é outro sinal revelador de que você está usando um parâmetro out.

106
00:08:42,120 --> 00:08:48,390
‫Eu não dei nenhum valor antes de passá-lo para uma função significa que estou esperando que

107
00:08:48,390 --> 00:08:51,390
‫essa função coloque o valor para mim.

108
00:08:51,690 --> 00:08:55,350
‫Portanto, isso pode ser difícil de detectar no início e pode ser um pouco confuso.

109
00:08:55,560 --> 00:08:58,200
‫Mas estas são as duas regras que eu gostaria que você se lembrasse.

110
00:08:58,200 --> 00:09:04,290
‫Se você vir uma variável declarada e sem um valor e instantaneamente passada para uma função, pergunte a si mesmo se isso

111
00:09:04,380 --> 00:09:05,880
‫é um parâmetro de saída.

112
00:09:05,880 --> 00:09:12,390
‫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

113
00:09:12,390 --> 00:09:15,420
‫uma dica de que este é um parâmetro de saída.

114
00:09:15,720 --> 00:09:21,780
‫E, claro, se a variável ou parâmetro for nomeado como algo, então isso é uma oferta inoperante de que essa

115
00:09:21,780 --> 00:09:23,940
‫coisa deve ser um parâmetro de saída.

116
00:09:24,360 --> 00:09:24,890
‫Coisas boas.

117
00:09:24,900 --> 00:09:28,850
‫Acho que isso nos preparou muito bem para sermos capazes de fazer uma varredura.

118
00:09:28,860 --> 00:09:30,750
‫Então, vejo você na próxima palestra.

