Unreal Engine 游戏开发学习笔记 20181102


本篇博文实为在”系统”学习 Unreal Engine 4 游戏开发后整理的学习笔记。笔记按照每天的学习内容进行整理记录备忘。

本文为 Week2 Class5! 其中 表示上午的学习内容, 表示下午的学习内容。从本周开始连续三周学习 C++ 基础。同时强烈推荐像我一样的初学者看下”菜鸟教程”的 C++ 部分,本周的笔记绝大部分整理的内容均来自菜鸟笔记,只是内容按照上课老师所讲并在笔记中穿插了一些老师上课所讲实例,感谢菜鸟笔记网站管理员的无私分享。

今日内容摘要(知识点梳理):
上午:
1. 作业辅导
2. 函数重载
3. 模板函数
4. 函数递归调用

下午:
1. char 字符串表达方式
2. 内存地址保存与获取内存数据
3. 数组的内存地址获取及数组内不同元素的内存地址获取
4. 字符数组的内存地址及使用char
字符串,初始化字符数组


周四作业辅导 函数重载 模板函数 递归

作业辅导

打印字符

1
2
3
4
5
6
7
8
9
10
11
12
 for (int i = 1; i < 5; i++) {
for (int j = 3; j > i - 1; j--) {
cout << " ";
}
for (int k = 1; k <= i; k++) {
cout << "*";
}
for (int l = 0; l < i - 1; l++) {
cout << "*";
}
cout << endl;
}

实现两个数的交换

1
2
3
4
5
6
int a = 3; int b = 4;
int temp = 0;
temp = a;
a = b;
b = temp;
cout << a << endl;;

函数重载

定义函数: 参数名 (形参)

例如下面这个计算矢量长度的函数:

1
2
3
4
5
float VectorLength(float x, float y, float z) {
float a = pow(x, 2) + pow(y, 2) + pow(z, 2);
return sqrt(a);

}

函数重载:

  • 函数名相同
  • 函数参数
    • 参数个数不同
    • 参数类型不同)

注意: 返回值类型不同 不构成承载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

float Plus(float a, float b) {
float c = a + b;
return c;
}

// 函数可以重名 形参不能重类型
int Plus(int a, int b) {
float c = a + b;
return c;
}

float Plus(int a, float b)
{
float c = a + b;
return c;
}

float Plus(int a) {
float c = a + a;
return c;
}

模板函数

C++ 模板 函数创建

1
2
3
4
5
6
template<typename T>     // 模板函数标志 必须说明  typename:类型名称(后面的T是某一种数据类型)、
// template<typename T> 表达下面是函数模板 T是一个函数类型
T Plus(T a, T b) {
T c = a + b;
return c;
}

模板函数的数据类型名称可以不同:

1
2
3
4
5
template<typename T, typename V>
T Plus(T a, V b) {
T c = a + b;
return c;
}

函数递归

函数的递归: 函数内部调用函数本身

递归计算阶乘

1
2
3
4
5
6
7
8
9
10
int Factorial(int a) {
if (a == 0 || a ==1 ) {
return 1; // return表示函数的返回值也表示函数的结束 return结束在后面的代码都将不会执行
cout << "我是return后面的代码" << endl;
}
else {
return a * Factorial(a - 1);
}

}

函数递归打印斐波那契数列

1
2
3
4
5
6
7
8
9
10
11
12
int Fibonacci(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
if(n!=0 && n!=1) {
return Fibonacci(n - 1) + Fibonacci(n - 2);
}

}

指针

指针

学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。
正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;

int main ()
{
int var1;
char var2[10];

cout << "var1 变量的地址: ";
cout << &var1 << endl;

cout << "var2 变量的地址: ";
cout << &var2 << endl;

return 0;
}

什么是指针?

指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

1
type *var-name;

在这里,type 是指针的基类型,它必须是一个有效的 C++ 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。但是,在这个语句中,星号是用来指定一个变量是指针。以下是有效的指针声明:

1
2
3
4
int    *ip;    /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */

所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。

C++ 中使用指针

使用指针时会频繁进行以下几个操作:

  • 定义一个指针变量
  • 把变量地址赋值给指针
  • 访问指针变量中可用地址的值。
    这些是通过使用一元运算符 * 来返回位于操作数所指定地址的变量的值。下面的实例涉及到了这些操作:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <iostream>

    using namespace std;

    int main ()
    {
    int var = 20; // 实际变量的声明
    int *ip; // 指针变量的声明

    ip = &var; // 在指针变量中存储 var 的地址

    cout << "Value of var variable: ";
    cout << var << endl;

    // 输出在指针变量中存储的地址
    cout << "Address stored in ip variable: ";
    cout << ip << endl;

    // 访问指针中地址的值
    cout << "Value of *ip variable: ";
    cout << *ip << endl;

    return 0;
    }

当上面的代码被编译和执行时,它会产生下列结果:

1
2
3
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20

上课案例了解指针

指针参数计算变量和
1
2
3
4
int Plus(int* a, int* b) {
int sum = *a + *b;
return sum;
}
指针参数计算整数数组中最大值及索引号
1
2
3
4
5
6
7
8
9
10
11
12
int FindMax(int* pIntArray, int length) {
int MaxValue = *pIntArray;
int MaxValueIndex = 0;
for (int i = 1; i < length; i++) {
if (*(pIntArray + i) > MaxValue) {
MaxValue = *(pIntArray + i);
MaxValueIndex = i;
}
}
cout << "最大值: " << MaxValue << " 最大值索引号: " << MaxValueIndex << endl;
return MaxValue, MaxValueIndex;
}
指针的模板函数
1
2
3
4
5
template<typename T>
T Plus(T* a, T*b) {
T c = *a + *b;
return c;
}
指针四则运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// FuXi.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;
int a = 5, b = 3;
int* Pa = &a;
int* Pb = &b;

int Plus(int* a, int* b) {
return *a + *b;
}

int Subtract(int* a, int* b) {
return *a - *b;
}

int Multiply(int* a, int* b) {
return *a * *b;
}

int Divede(int* a, int* b) {
return *a / *b;
}

int main()
{
cout << Plus(Pa, Pb) << endl;
cout << Subtract(Pa, Pb) << endl;
cout << Multiply(Pa, Pb) << endl;
cout << Divede(Pa, Pb) << endl;
return 0;
}

可能想问吧

今天上午讲解的主要是上午的作业辅导及函数基础,并没有很难,暂时没有想问的!


一起练习吧

  1. 指针参数函数计算数组平均值
  2. 指针参数函数统计一个字符串的字符个数。
  3. 求一个数的平方,实现5个重载。
  4. 打印乘法口诀(for循环)
  5. 输入一个名字,随机输出一句祝福的话。
  6. 输入三个数求最大数。


上课代码笔记
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
// C++ Week2 Day05 Class 
/*
作业辅导:函数体内return就结束函数。
/*
for (int i = 1; i < 5; i++) {
for (int j = 3; j > i - 1; j--) {
cout << " ";
}
for (int k = 1; k <= i; k++) {
cout << "*";
}
for (int l = 0; l < i-1; l++) {
cout << "*";
}
cout << endl;
}
*/
/*
int a = 3; int b = 4;
int temp = 0;
temp = a;
a = b;
b = temp;
cout << a << endl;;
cout << b << endl;
*/


#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>

using namespace std;

// 定义宏
#define GRAVITY 9.8;
// 1. 定义了一个枚举 就是创造了一个新的数据类型

// 定义函数 参数名 (形参)
// 函数重载:函数名相同 函数参数(1.参数个数不同 2.参数类型不同) 注意: 返回值类型不同 不构成承载
/*
float Plus(float a, float b) {
float c = a + b;
return c;
}

// 函数可以重名 形参不能重类型
int Plus(int a, int b) {
float c = a + b;
return c;
}

float Plus(int a, float b)
{
float c = a + b;
return c;
}

float Plus(int a) {
float c = a + a;
return c;
}
*/


// C++ 模板 函数创建
template<typename T> // 模板函数标志 必须说明 typename:类型名称(后面的T是某一种数据类型)、
// template<typename T> 表达下面是函数模板 T是一个函数类型
T Plus(T a, T b) {
T c = a + b;
return c;
}

template<typename T, typename V>
T Plus(T a, V b) {
T c = a + b;
return c;
}

float VectorLength(float x, float y, float z) {
float a = pow(x, 2) + pow(y, 2) + pow(z, 2);
return sqrt(a);

}

// 如果函数写在main函数的下面 需要在main函数前把函数头拷贝到Main函数前,这样函数就可正常声明了。
float VectorLength(float x, float y, float z);

// 函数的递归: 函数内部调用函数本身
// 阶乘 n! = 1 * 2 * 3 *...* (n-1) * n
int Factorial(int a) {
if (a == 0 || a ==1 ) {
return 1; // return表示函数的返回值也表示函数的结束 return结束在后面的代码都将不会执行
cout << "我是return后面的代码" << endl;
}
else {
return a * Factorial(a - 1);
}

}

int Fibonacci(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
if(n!=0 && n!=1) {
return Fibonacci(n - 1) + Fibonacci(n - 2);
}

}

void MyPrintf(const char* str) {
cout << str << endl;
}

void MyPrintf(string str) {
cout << str << endl;
}

int Plus(int* a, int* b) {
int sum = *a + *b;
return sum;
}



int FindMax(int* pIntArray, int length) {
int MaxValue = *pIntArray;
int MaxValueIndex = 0;
for (int i = 1; i < length; i++) {
if (*(pIntArray + i) > MaxValue) {
MaxValue = *(pIntArray + i);
MaxValueIndex = i;
}
}
cout << "最大值: " << MaxValue << " 最大值索引号: " << MaxValueIndex << endl;
return MaxValue, MaxValueIndex;
}

// 指针四则计算

// 指针的模板函数
template<typename T>
T Plus(T* a, T*b) {
T c = *a + *b;
return c;
}

int class05()
{
/*
上午:

int a = 3, b = 5;
float c = 1.2f, d = 1.8f;
// 调用函数的的时候是实参 实际参数
// 虽然有两个函数 编译器可以根据实参判断使用哪个函数
// 一般情况下,函数名不会重复
cout << Plus<int>(a, b) << endl;
cout << Plus<float>(c, d) << endl;
cout << Plus(a, c)<<endl;
cout << Factorial(5) << endl;
cout << Fibonacci(5) << endl;

for (int i = 0; i < 13; i++) {
cout << Fibonacci(i) << " ";
}

*/

int a = 3;
// & 取地址符 &a 取得a变量的地址
// cout << &a << endl; //每次取得地址都是不一样的
// 下面的Pa本质上是一个变量 可以存放一个地址 但是只能存储int类型的地址
int* Pa = &a; // 变量Pa存放变量a的地址

int aa = 30;
Pa = &aa; // Pa本质是变量

float b = 1.1f;
float* Pb = &b; // 将变量b的地址保存在变量Pb中

char Char_a = 'A';
char* PChar_a = &Char_a;

string MyString = "Hello";
string* PMyString = &MyString;

double Weight = 100.0;
double* PWeight = &Weight;

long MyLongA = 1000L;
long* PMyLongA = &MyLongA;

// cout << *PMyLongA << endl; // 得到地址里面的数据
// cout << *&MyLongA << endl;

// 直接打印数组 会直接打印出内存地址(第一个元素的地址)
short MyShortArray[5] = { 1,3,5,7,9 };


// 数组名就是数组的地址 数组第一个元素的地址就是数组的地址
// cout << MyShortArray+1 << endl; //数组的第一个元素地址(数组地址) +1 就是第二个元素的地址
// cout << MyShortArray[0] << endl; //数组的数据是用方括号

short* PMyShortArray = MyShortArray; // 解除对指针的应用就是得到数据
cout << *PMyShortArray << endl;
// cout << PMyShortArray << endl;
// cout << PMyShortArray + 1 << endl;


// char 数组打印会直接打印数组里面的元素 而非数组的内存地址
char CharString[6] = { 'H','e','l','l','o','\0' };
// cout << CharString << endl;

// 用字符串“Hello”去初始化 char* str01
// 调用重载函数 char * 就是初始化一个字符串
const char* MyHello = "Hello"; //任何一个字符串都可以初始化char* 变量 又叫char指针
MyPrintf(MyHello);
string MyStrHello = "Hello";
MyPrintf(MyStrHello);

// 指针本身就是地址,并不是数据,通过指针可以得到数据
// 解除指针的引用就是得到数据

int indicator1 = 3;
int indicator2 = 5;

cout << Plus(&indicator1, &indicator2) << endl;

int IntArray01[5] = { 12,23,56,78,10 };
cout << FindMax(IntArray01, 5) << endl;
return 0;
}


// 知识点梳理:
/*
上午:
作业辅导
函数重载
模板函数
递归
*/
/*
下午:
char* 字符串表达方式
内存地址保存与获取内存数据
数组的内存地址获取及数组内不同元素的内存地址获取
字符数组的内存地址及使用char* 字符串,初始化字符数组

指针就是地址 注意写法
*/




我的作业提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Week2 Class05 Homework
#include "stdafx.h"
#include <iostream>
#include <string>
#include <math.h>
#include <stdio.h>
#include <time.h>


using namespace std;

// 1.指针参数函数计算数组平均值
int ArrayAverage(int* IntArray, int length) {
int ArrarySum = 0, ArraryAverage = 0;
for (int i = 1; i < length; i++) {
ArrarySum +=(*(IntArray + i));
}
ArraryAverage = (*IntArray + ArrarySum) / length;
return ArraryAverage;
}


// 2.指针参数函数统计一个字符串的字符个数。
int StringLength(const char* String) {
return strlen(String);
}


// 3.求一个数的平方,实现5个重载。
int Mypower(int Number) {

return Number * Number;
}

float Mypower(float Number) {
return Number * Number;
}

double Mypower(double Number) {
return Number * Number;
}

long Mypower(long Number) {
return Number * Number;
}

short Mypower(short Number) {
return Number * Number;
}


// 4.打印乘法口诀


// 5.输入一个名字,随机输出一句祝福的话。
string Benediction(string InputString) {
string BenedictionString[] = { "\n年年有今日,岁岁有今朝\n","\n祝你生日快乐!\n","\n福如东海,寿比南山\n","\n心想事成,万事如意\n","\n百年好合,早生贵子\n","\n心想事成,马到成功\n" };
int StartInt = 0;
srand((unsigned)time(NULL));
int RandomIndex = StartInt + rand() % (size(BenedictionString)-1);
return BenedictionString[RandomIndex];
}


// 6.输入三个数求最大数。
int CompareMaxValue(int InputNumber) {
cout << "请依次输入 " << InputNumber << " 个数! " << endl << endl;
int *TempArray = new int[InputNumber];
int MaxValue = TempArray[0];
for (int i = 0; i < InputNumber; i++) {
cout << "请输入第 " << i + 1 << " 个数: " << endl << endl;
cin >> TempArray[i];
cout << endl;
}
for (int i = 0; i < InputNumber; i++) {
if (TempArray[i] > MaxValue) {
MaxValue = TempArray[i];
}
}
return MaxValue;
}


int class05_homework()
{

// 第一题:
cout << "第一题:指针参数函数计算数组平均值" << endl << endl;
int OnesIntArrary[] = { 1,2,3,4,5};
cout << "当前数组平均值为 :" << ArrayAverage(OnesIntArrary, 5) << endl;
cout << endl << "=================================================================================================================================================" << endl << endl;


// 第二题:
cout << "第二题:指针参数函数统计一个字符串的字符个数" << endl << endl;
const char* MyHello = "Hello";
cout << MyHello << "字符串长度为: " << StringLength(MyHello) << endl;
cout << endl << "=================================================================================================================================================" << endl << endl;



// 第三题:
cout << "第三题:求一个数的平方,实现5个重载" << endl << endl;
// short
cout << "short 类型函数重载测试: " << Mypower(2) << endl << endl;
// long
cout << "long 类型函数重载测试: " << Mypower(10000L) << endl << endl;
// int
cout << "int 类型函数重载测试: " << Mypower(4) << endl << endl;
// float
cout << "float 类型函数重载测试: " << Mypower(2.25f) << endl << endl;
// double
cout << "double 类型函数重载测试: " << Mypower(3.25) << endl << endl;
cout << endl << "=================================================================================================================================================" << endl << endl;



// 第四题:
cout << "第四题:打印乘法口诀" << endl << endl;
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << " * " << i << " = " << i * j << "\t";
}
cout << endl;
}
cout << endl << "=================================================================================================================================================" << endl << endl;



// 第五题:
cout << "第五题:输入一个名字,随机输出一句祝福的话" << endl << endl;
cout << "输入: ""高显""" << endl;
cout << Benediction("高显") << endl;
cout << endl << "=================================================================================================================================================" << endl << endl;



// 第六题:
cout << "第六题:输入指定数量数求最大数:" << endl << endl;
cout << "您输入的这组数中最大的是:" << CompareMaxValue(3) << endl << endl;
cout << endl << "=================================================================================================================================================" << endl << endl;


return 0;
}


----------本文结束感谢您的阅读----------

本文标题:Unreal Engine 游戏开发学习笔记 20181102

文章作者:XIANVFX

发布时间:2018年11月02日 - 09:11

最后更新:2019年05月21日 - 09:05

原始链接:www.xianvfx.top/UE4/Training/Week2_CPP1/Unreal_Engine_Learning_Notes_W2_5.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

(*❦ω❦) 感谢您的支持! (*❦ω❦)
0%