Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
00:00:00,160 --> 00:00:05,278
this complete c plus plus course will
2
00:00:03,040 --> 00:00:08,160
take you from being an absolute beginner
3
00:00:05,278 --> 00:00:10,480
to using advanced c plus plus features
4
00:00:08,160 --> 00:00:12,719
danielle gaguaya teaches this course he
5
00:00:10,480 --> 00:00:15,440
is an experienced software developer and
6
00:00:12,718 --> 00:00:18,399
has created many popular courses
7
00:00:15,439 --> 00:00:20,879
hello guys and welcome to this modern c
8
00:00:18,399 --> 00:00:22,559
plus plus 20 course this is a course
9
00:00:20,879 --> 00:00:24,399
that is going to take you from the
10
00:00:22,559 --> 00:00:26,079
absolute beginning where you know
11
00:00:24,399 --> 00:00:28,799
nothing about c plus plus and you're
12
00:00:26,079 --> 00:00:30,879
going to go all the way to a point where
13
00:00:28,800 --> 00:00:33,200
you can use some advanced features in
14
00:00:30,879 --> 00:00:34,600
the c plus plus programming language
15
00:00:36,558 --> 00:00:41,199
inheritance and polymorphism with the c
16
00:00:38,960 --> 00:00:42,960
plus plus programming language now i'm
17
00:00:42,960 --> 00:00:47,840
convincing you on why you should use c
18
00:00:45,359 --> 00:00:49,920
plus plus but c plus plus is a very
19
00:00:47,840 --> 00:00:52,960
powerful programming language you can
20
00:00:49,920 --> 00:00:55,039
use to do all kinds of crazy things you
21
00:00:52,960 --> 00:00:57,359
can use it to do systems programming you
22
00:00:55,039 --> 00:01:00,079
can build games with it and it is used
23
00:00:57,359 --> 00:01:03,039
in a wide range of areas so you can do a
24
00:01:00,079 --> 00:01:05,439
lot with c plus plus now who is this
25
00:01:03,039 --> 00:01:07,680
course for this course is built for
26
00:01:05,438 --> 00:01:09,599
complete beginners if you already have
27
00:01:07,680 --> 00:01:11,840
some experience with c plus plus you
28
00:01:09,599 --> 00:01:14,478
will still find some good things you can
29
00:01:11,840 --> 00:01:16,719
learn from the course but i am going to
30
00:01:14,478 --> 00:01:19,118
go from the absolute beginning showing
31
00:01:16,719 --> 00:01:21,438
you every little thing showing you the
32
00:01:19,118 --> 00:01:23,438
tools showing you the compilers and the
33
00:01:21,438 --> 00:01:25,279
editor we're going to be using here so
34
00:01:23,438 --> 00:01:26,559
we're going to spend a lot of time
35
00:01:26,560 --> 00:01:30,640
fundamentals by the time you are done
36
00:01:28,719 --> 00:01:33,840
with this course you will understand the
37
00:01:30,640 --> 00:01:36,159
bare fundamentals about c plus we will
38
00:01:33,840 --> 00:01:38,478
spend a lot of time exploring the
39
00:01:36,159 --> 00:01:40,079
procedure programming side of c plus
40
00:01:38,478 --> 00:01:42,719
plus so you're going to be writing
41
00:01:40,078 --> 00:01:44,239
programs that run from top to bottom and
42
00:01:42,719 --> 00:01:46,319
we're going to spend a lot of time in
43
00:01:44,239 --> 00:01:48,399
the editor writing code making sure you
44
00:01:46,319 --> 00:01:49,839
really understand what is going on here
45
00:01:48,399 --> 00:01:51,920
towards the end we're going to learn
46
00:01:49,840 --> 00:01:53,520
about object oriented programming and
47
00:01:53,519 --> 00:01:57,679
inheritance and polymorphism and these
48
00:01:55,920 --> 00:02:00,000
are the tools you're going to be using a
49
00:01:57,680 --> 00:02:02,240
lot in your career as a c plus plus
50
00:02:00,000 --> 00:02:04,319
developer another great feature of this
51
00:02:02,239 --> 00:02:06,640
course is that we spend a lot of time
52
00:02:04,319 --> 00:02:08,560
making sure you understand the tools so
53
00:02:06,640 --> 00:02:10,878
if you don't know what a compiler is if
54
00:02:08,560 --> 00:02:12,560
you don't know what an ide is we're
55
00:02:10,878 --> 00:02:14,318
going to make sure you understand these
56
00:02:12,560 --> 00:02:16,560
things and we're going to spend a lot of
57
00:02:14,318 --> 00:02:17,759
time using these things and by the time
58
00:02:16,560 --> 00:02:20,479
you're done with the course you're going
59
00:02:17,759 --> 00:02:22,318
to be very comfortable using the tools
60
00:02:20,479 --> 00:02:25,039
the editor of choice for the course is
61
00:02:22,318 --> 00:02:26,719
going to be visual studio code so that's
62
00:02:25,039 --> 00:02:29,199
an editor that is going to allow us to
63
00:02:26,719 --> 00:02:31,598
type in the code and give us some things
64
00:02:29,199 --> 00:02:34,238
like a syntax highlighting but we're
65
00:02:31,598 --> 00:02:36,479
going to be connecting our editor to a
66
00:02:34,239 --> 00:02:39,200
background compiler which is going to
67
00:02:36,479 --> 00:02:41,759
make sure our code is transformed
68
00:02:39,199 --> 00:02:43,679
to run on our computer but don't worry
69
00:02:41,759 --> 00:02:46,399
about all that craziness right now we're
70
00:02:43,680 --> 00:02:48,800
going to go in detail about these things
71
00:02:46,400 --> 00:02:51,439
for now i just want you to have a bird's
72
00:02:48,800 --> 00:02:54,000
eye view on what you can expect from the
73
00:02:51,439 --> 00:02:57,120
course here now i hope you know what to
74
00:02:54,000 --> 00:03:00,158
expect from the course but i also expect
75
00:02:57,120 --> 00:03:02,800
you to be ready to take the course and
76
00:03:00,158 --> 00:03:04,560
the requirements are really not that bad
77
00:03:02,800 --> 00:03:06,560
the only requirement is that you have
78
00:03:04,560 --> 00:03:08,400
time set aside to really practice what
79
00:03:06,560 --> 00:03:10,318
you learn from the course here and you
80
00:03:08,400 --> 00:03:12,239
need to have a strong drive and
81
00:03:10,318 --> 00:03:14,560
willingness to learn now if you want to
82
00:03:12,239 --> 00:03:17,360
follow along i am going to share a link
83
00:03:14,560 --> 00:03:19,280
to the github repository for the code i
84
00:03:17,360 --> 00:03:21,920
use in the course so you can check that
85
00:03:19,280 --> 00:03:24,000
out and really follow along if you want
86
00:03:21,919 --> 00:03:26,318
if you want some support we have a
87
00:03:24,000 --> 00:03:28,639
discord server dedicated for our
88
00:03:26,318 --> 00:03:30,798
students so you can join and be part of
89
00:03:28,639 --> 00:03:32,639
the community if you have a question you
90
00:03:30,799 --> 00:03:35,040
can ask but another thing i would
91
00:03:32,639 --> 00:03:37,359
encourage you to do is to also help
92
00:03:35,039 --> 00:03:39,359
others so if you see somebody asking a
93
00:03:37,360 --> 00:03:41,680
question try to help them you're going
94
00:03:39,360 --> 00:03:43,360
to learn a lot that way okay now that
95
00:03:41,680 --> 00:03:45,760
you know a bit about the course let's
96
00:03:43,360 --> 00:03:48,000
talk about myself here my name is daniel
97
00:03:45,759 --> 00:03:50,719
cacoya i am a software engineer i have
98
00:03:51,759 --> 00:03:56,560
and i am a professional c plus plus
99
00:03:53,919 --> 00:03:58,639
developer i do a lot of freelance work i
100
00:03:56,560 --> 00:04:00,959
work for a few companies i do all kinds
101
00:03:58,639 --> 00:04:03,598
of crazy things i also like to teach
102
00:04:00,959 --> 00:04:05,280
others so i have a few courses on udemy
103
00:04:03,598 --> 00:04:07,438
if you are interested in cute you can
104
00:04:05,280 --> 00:04:09,680
check these things out i also have a
105
00:04:07,438 --> 00:04:12,560
trending c plus plus course that you can
106
00:04:09,680 --> 00:04:14,480
check out but don't feel the need to go
107
00:04:12,560 --> 00:04:17,280
and check this ziplesque course out
108
00:04:14,479 --> 00:04:19,759
because a lot is covered in this youtube
109
00:04:17,279 --> 00:04:22,399
course here so that's really all about
110
00:04:19,759 --> 00:04:24,160
me okay now that you have an idea about
111
00:04:22,399 --> 00:04:26,159
the course we're going to head over in
112
00:04:24,160 --> 00:04:28,240
the next lecture and learn about the
113
00:04:26,160 --> 00:04:30,240
tools we're going to be using throughout
114
00:04:28,240 --> 00:04:32,478
the course here go ahead and finish up
115
00:04:32,478 --> 00:04:37,199
welcome to this new chapter where we're
116
00:04:34,399 --> 00:04:39,839
going to be exploring the c plus plus
117
00:04:37,199 --> 00:04:41,919
development tools you need to start
118
00:04:41,918 --> 00:04:46,959
applications and you really need two
119
00:04:44,319 --> 00:04:49,599
kinds of tools the first one is going to
120
00:04:46,959 --> 00:04:51,758
be an editor or an ide through which
121
00:04:49,600 --> 00:04:53,919
you're going to be writing your c plus
122
00:04:51,759 --> 00:04:56,319
plus code we are going to be using
123
00:04:53,918 --> 00:04:58,560
visual studio code as an editor in this
124
00:04:56,319 --> 00:05:01,199
course because it is very easy to
125
00:04:58,560 --> 00:05:04,079
install it is cross-platform it is going
126
00:05:01,199 --> 00:05:07,038
to run well on windows mac and linux and
127
00:05:04,079 --> 00:05:08,959
it supports a host of tools that are
128
00:05:07,038 --> 00:05:11,599
going to make your job easier as a
129
00:05:08,959 --> 00:05:14,000
surplus plus developer but that's not to
130
00:05:11,600 --> 00:05:16,160
say you can't use your favorite ide if
131
00:05:14,000 --> 00:05:18,560
you can but visual studio code is going
132
00:05:16,160 --> 00:05:20,479
to be our main editor in this course so
133
00:05:18,560 --> 00:05:22,399
i would recommend installing it to be
134
00:05:20,478 --> 00:05:25,120
able to follow along with what we do
135
00:05:22,399 --> 00:05:28,000
here now after we have an ide or an
136
00:05:25,120 --> 00:05:31,120
editor in place we will need a compiler
137
00:05:28,000 --> 00:05:33,120
and the compiler is a piece of software
138
00:05:31,120 --> 00:05:37,038
that takes the code we write in the
139
00:05:33,120 --> 00:05:40,639
editor and compiles that into code that
140
00:05:37,038 --> 00:05:43,279
can directly run on the hardware or
141
00:05:40,639 --> 00:05:45,038
binary executable format so this is what
142
00:05:43,279 --> 00:05:48,000
we're going to be doing here we're going
143
00:05:45,038 --> 00:05:50,000
to be typing our code in an editor like
144
00:05:48,000 --> 00:05:52,000
visual studio code we're going to be
145
00:05:50,000 --> 00:05:54,000
kicking off a process to compile our
146
00:05:52,000 --> 00:05:56,720
program and this is going to turn our
147
00:05:54,000 --> 00:05:59,120
program into a format that can run it
148
00:05:56,720 --> 00:06:00,880
directly on the hardware so for example
149
00:05:59,120 --> 00:06:03,439
if you are on a windows machine you're
150
00:06:00,879 --> 00:06:05,918
going to generate a binary executable
151
00:06:03,439 --> 00:06:08,079
that can directly run on windows if you
152
00:06:05,918 --> 00:06:10,719
are on linux we will generate a binary
153
00:06:08,079 --> 00:06:13,680
that can run on linux and the same
154
00:06:10,720 --> 00:06:15,600
concepts can really extend on mac or any
155
00:06:13,680 --> 00:06:18,160
other kind of operating system you might
156
00:06:15,600 --> 00:06:20,319
be working on with the course here so we
157
00:06:18,160 --> 00:06:23,120
need two tools we need an ide or an
158
00:06:20,319 --> 00:06:26,080
editor and a compiler and the tools you
159
00:06:23,120 --> 00:06:28,160
install are going to be depending on the
160
00:06:26,079 --> 00:06:30,478
operating system you are using to watch
161
00:06:28,160 --> 00:06:33,439
the course if you are on windows you're
162
00:06:30,478 --> 00:06:36,318
going to install a set of tools that are
163
00:06:33,439 --> 00:06:38,079
specific to windows if you are on linux
164
00:06:36,319 --> 00:06:40,319
you're going to install a set of tools
165
00:06:38,079 --> 00:06:44,000
for linux if you are on a mac you're
166
00:06:40,319 --> 00:06:46,319
going to install a set of tools specific
167
00:06:44,000 --> 00:06:49,918
to the apple operating system for
168
00:06:46,319 --> 00:06:52,479
desktop now on windows in terms of ides
169
00:06:49,918 --> 00:06:55,758
or integrated development environment it
170
00:06:52,478 --> 00:06:58,318
is possible to use a host of ides for
171
00:06:55,759 --> 00:07:00,639
example you can use code lite it is an
172
00:06:58,319 --> 00:07:03,039
ide you can use you can use microsoft
173
00:07:00,639 --> 00:07:05,038
visual studio but in this course we're
174
00:07:03,038 --> 00:07:08,079
going to be using visual studio code
175
00:07:05,038 --> 00:07:10,399
because it is easy to install it has a
176
00:07:08,079 --> 00:07:12,719
set of features that are really good it
177
00:07:10,399 --> 00:07:14,799
is popular it has a great community
178
00:07:12,720 --> 00:07:17,280
around it i think you're going to have a
179
00:07:14,800 --> 00:07:19,918
great time as a beginner to start
180
00:07:17,279 --> 00:07:22,159
writing your c plus plus programs using
181
00:07:19,918 --> 00:07:24,399
visual studio code that's not to say
182
00:07:22,160 --> 00:07:27,120
that you can't use another ide you can
183
00:07:24,399 --> 00:07:29,439
if you want but i am going to be using
184
00:07:27,120 --> 00:07:31,439
visual studio code in this course here
185
00:07:29,439 --> 00:07:34,478
now on linux we are also going to be
186
00:07:31,439 --> 00:07:37,120
using visual studio code as our editor
187
00:07:34,478 --> 00:07:39,038
in the course but there are other ides
188
00:07:37,120 --> 00:07:40,478
you can use for example you can use cute
189
00:07:39,038 --> 00:07:43,120
creator if you want you can use
190
00:07:40,478 --> 00:07:45,918
codelight you can use a host of other
191
00:07:43,120 --> 00:07:47,519
ides on linux but again visual studio
192
00:07:45,918 --> 00:07:49,439
code is going to be our thing in the
193
00:07:47,519 --> 00:07:52,318
course here and i would recommend
194
00:07:49,439 --> 00:07:54,478
installing it on your linux box if you
195
00:07:52,319 --> 00:07:57,280
are watching this course on the linux
196
00:07:54,478 --> 00:07:59,439
machine so for osx we are also going to
197
00:07:57,279 --> 00:08:02,318
be using visual studio code as our
198
00:07:59,439 --> 00:08:04,319
editor as i said it is cross platforms
199
00:08:02,319 --> 00:08:06,240
it runs where regardless of the
200
00:08:04,319 --> 00:08:08,319
operating system you might be using to
201
00:08:06,240 --> 00:08:09,840
watch the course but if you want you can
202
00:08:09,839 --> 00:08:14,638
ide which is xcode or even code lite all
203
00:08:12,639 --> 00:08:16,960
these are going to work if you want but
204
00:08:14,639 --> 00:08:19,918
again i would recommend going with
205
00:08:16,959 --> 00:08:22,239
visual studio code.plus to start out so
206
00:08:19,918 --> 00:08:24,240
that we have a common ground and you
207
00:08:24,240 --> 00:08:28,639
especially if you are a beginner now
208
00:08:26,399 --> 00:08:30,399
after we have an ide rolling we will
209
00:08:30,399 --> 00:08:35,278
and as we say the compiler is a tool
210
00:08:32,958 --> 00:08:38,239
that is going to transform your c plus
211
00:08:35,278 --> 00:08:40,799
plus code into a format that can run
212
00:08:38,240 --> 00:08:42,479
directly on the hardware so the compiler
213
00:08:40,799 --> 00:08:44,240
you use again is going to depend on the
214
00:08:42,479 --> 00:08:46,480
operating system where you are watching
215
00:08:44,240 --> 00:08:49,600
the course i am going to show you a
216
00:08:46,480 --> 00:08:52,159
bunch of compilers you can use but gcc
217
00:08:49,600 --> 00:08:54,399
is going to be our common base so on
218
00:08:52,159 --> 00:08:56,799
windows i will be using what we call
219
00:08:54,399 --> 00:08:58,320
mingw don't worry if you don't what it
220
00:08:56,799 --> 00:09:01,039
is i am going to show you in a minute
221
00:08:58,320 --> 00:09:03,920
when we install it but this is a project
222
00:09:01,039 --> 00:09:06,319
that brings the gcc compiler on windows
223
00:09:03,919 --> 00:09:08,399
so that we can use it easily and i am
224
00:09:06,320 --> 00:09:09,839
going to show you how to install it but
225
00:09:08,399 --> 00:09:12,159
i am also going to show you how to
226
00:09:09,839 --> 00:09:15,360
install the compiler from microsoft and
227
00:09:12,159 --> 00:09:17,600
the clang llvm compiler these are all
228
00:09:15,360 --> 00:09:20,159
available to you on windows and it is
229
00:09:17,600 --> 00:09:22,879
really easy to install them these days
230
00:09:20,159 --> 00:09:24,958
and i will be using them all if you are
231
00:09:22,879 --> 00:09:27,278
on windows i would recommend installing
232
00:09:24,958 --> 00:09:30,239
them all so that you really have a
233
00:09:27,278 --> 00:09:31,838
chance to try your c plus plus code on
234
00:09:30,240 --> 00:09:34,320
the different compilers and that's a
235
00:09:31,839 --> 00:09:36,399
really good thing to do if you test your
236
00:09:34,320 --> 00:09:38,959
c plus plus code against multiple
237
00:09:36,399 --> 00:09:41,360
compilers you will be increasing your
238
00:09:38,958 --> 00:09:43,679
chances for your code to really be
239
00:09:41,360 --> 00:09:46,399
portable and work on multiple compilers
240
00:09:43,679 --> 00:09:48,159
and operating systems and that cannot be
241
00:09:46,399 --> 00:09:50,240
a bad thing so i would recommend
242
00:09:48,159 --> 00:09:52,319
installing all these compilers if you
243
00:09:50,240 --> 00:09:54,320
are on windows i am also going to show
244
00:09:52,320 --> 00:09:56,320
you how to install two compilers on
245
00:09:54,320 --> 00:09:58,879
linux i am going to show you gcc we're
246
00:09:56,320 --> 00:10:01,760
going to install the shiny new feature
247
00:09:58,879 --> 00:10:03,600
in gcc we're going to install clang lvm
248
00:10:01,759 --> 00:10:05,759
on linux and we will be able to use all
249
00:10:03,600 --> 00:10:07,920
these compilers again if you are on
250
00:10:05,759 --> 00:10:10,000
linux i would recommend installing all
251
00:10:07,919 --> 00:10:12,719
these compilers so that you have a
252
00:10:10,000 --> 00:10:14,480
chance to try your code against multiple
253
00:10:12,720 --> 00:10:18,000
compilers and that's going to make your
254
00:10:14,480 --> 00:10:21,120
code much portable and easier to use on
255
00:10:18,000 --> 00:10:22,958
multiple compilers and platforms on the
256
00:10:21,120 --> 00:10:25,200
mac i am going to show you how to
257
00:10:25,200 --> 00:10:29,759
and i am going to show you how to
258
00:10:27,120 --> 00:10:32,240
install clangle lvm but if you want you
259
00:10:29,759 --> 00:10:34,159
can also install xcode and the compiler
260
00:10:32,240 --> 00:10:37,039
that comes with that for c plus but
261
00:10:34,159 --> 00:10:38,879
development all these are options to you
262
00:10:37,039 --> 00:10:41,120
but again in this course we are mostly
263
00:10:38,879 --> 00:10:43,360
going to be using the gcc compiler so i
264
00:10:41,120 --> 00:10:45,120
would recommend getting a hold of this
265
00:10:43,360 --> 00:10:47,519
if you don't want to install other
266
00:10:45,120 --> 00:10:50,399
compilers if you only have to install
267
00:10:47,519 --> 00:10:52,399
one compiler please install gcc that's
268
00:10:50,399 --> 00:10:54,480
going to be our main compiler in the
269
00:10:52,399 --> 00:10:56,240
course here okay so these are the tools
270
00:10:54,480 --> 00:10:58,879
we need we are going to head over in the
271
00:10:56,240 --> 00:11:01,600
next lecture and show you how to install
272
00:10:58,879 --> 00:11:03,600
the visual studio code editor on windows
273
00:11:01,600 --> 00:11:05,680
and really get started with that
274
00:11:03,600 --> 00:11:07,440
go ahead and finish up here and meet me
275
00:11:05,679 --> 00:11:09,679
in the next lecture this video i am
276
00:11:07,440 --> 00:11:12,079
going to show you how to install a c
277
00:11:09,679 --> 00:11:14,958
plus plus compiler on your windows
278
00:11:12,078 --> 00:11:16,958
operating system so we're going to be
279
00:11:14,958 --> 00:11:18,799
looking at three kinds of compilers
280
00:11:16,958 --> 00:11:21,518
we're going to look at the mingw
281
00:11:18,799 --> 00:11:23,759
compiler which gives us access to a gcc
282
00:11:21,519 --> 00:11:26,000
like compiler on windows we're going to
283
00:11:23,759 --> 00:11:27,679
look at clan llvm which is another
284
00:11:26,000 --> 00:11:30,159
compiler we're going to look at the
285
00:11:30,159 --> 00:11:34,799
now before we talk about any compiler i
286
00:11:32,559 --> 00:11:37,199
would like you to come to google or your
287
00:11:37,200 --> 00:11:41,278
c plus plus compiler support okay so
288
00:11:39,759 --> 00:11:43,838
we're going to choose this little guy
289
00:11:41,278 --> 00:11:46,078
here and this is really going to give us
290
00:11:46,078 --> 00:11:51,838
on which feature is supported by which c
291
00:11:48,958 --> 00:11:54,319
plus plus compiler for example if we are
292
00:11:51,839 --> 00:11:56,079
interested in c plus plus 20 which is
293
00:11:54,320 --> 00:11:58,639
the lattice standard that we have in
294
00:11:56,078 --> 00:12:00,958
simplest plus at the time of recording
295
00:11:58,639 --> 00:12:01,959
this video i am recording of this in
296
00:12:01,958 --> 00:12:07,599
2021 but if we go here we're going to
297
00:12:04,879 --> 00:12:09,600
see c plus plus 20 core features and
298
00:12:07,600 --> 00:12:12,000
we're going to see that we have a list
299
00:12:09,600 --> 00:12:15,040
of what each compiler supports we have
300
00:12:12,000 --> 00:12:18,078
gcc we have clan we have msvc we have
301
00:12:15,039 --> 00:12:20,078
the clan version from the apple company
302
00:12:18,078 --> 00:12:22,479
and if we scroll down we can really see
303
00:12:20,078 --> 00:12:26,000
the features that are supported by each
304
00:12:22,480 --> 00:12:27,600
compiler again gcc is going to be our
305
00:12:26,000 --> 00:12:30,078
choice in this course this is going to
306
00:12:27,600 --> 00:12:32,320
be our main compiler but nothing really
307
00:12:30,078 --> 00:12:34,799
stops you from using the clan compiler
308
00:12:32,320 --> 00:12:36,720
or the msvc compiler and if you happen
309
00:12:34,799 --> 00:12:38,319
to see that your compiler of choice
310
00:12:36,720 --> 00:12:40,800
doesn't support what you need for
311
00:12:38,320 --> 00:12:44,320
example you can see that at the current
312
00:12:40,799 --> 00:12:46,958
time lambdas in an evaluated context are
313
00:12:46,958 --> 00:12:51,278
you can see that it is ready here but
314
00:12:49,278 --> 00:12:55,919
this is a feature you can use both in
315
00:12:51,278 --> 00:12:59,278
gcc and the msvc compiler from microsoft
316
00:12:55,919 --> 00:13:01,278
so keep an eye out on this page here to
317
00:12:59,278 --> 00:13:03,519
know which kind of things you can use in
318
00:13:01,278 --> 00:13:05,838
your compiler if you try something out
319
00:13:03,519 --> 00:13:07,919
and you see that it doesn't work this is
320
00:13:05,839 --> 00:13:10,240
a good place to come and figure out if
321
00:13:07,919 --> 00:13:12,399
your compiler supports the feature that
322
00:13:10,240 --> 00:13:14,079
you are using in this video i am going
323
00:13:12,399 --> 00:13:16,639
to show you how to install the three
324
00:13:14,078 --> 00:13:19,838
most common compilers and those are gcc
325
00:13:16,639 --> 00:13:22,560
clang msvc if you want you can come in
326
00:13:19,839 --> 00:13:24,800
your search engine and type gcc to see
327
00:13:22,559 --> 00:13:27,039
what this is it is a good thing to do to
328
00:13:24,799 --> 00:13:28,719
learn about your tools here you can see
329
00:13:27,039 --> 00:13:31,039
that it is a compiler that is mostly
330
00:13:28,720 --> 00:13:33,759
used on the lenox platform but we can
331
00:13:31,039 --> 00:13:34,958
also use it on windows the latest
332
00:13:34,958 --> 00:13:39,119
installing is eleven two zero i think it
333
00:13:39,120 --> 00:13:43,039
six days ago so it is really fresh and
334
00:13:41,440 --> 00:13:45,040
we're going to be taking advantage of
335
00:13:43,039 --> 00:13:47,519
this another thing i should say here is
336
00:13:45,039 --> 00:13:50,078
that you should install the latest tools
337
00:13:47,519 --> 00:13:52,320
you can get your hands upon this is the
338
00:13:50,078 --> 00:13:54,319
version we're going to be mostly using
339
00:13:52,320 --> 00:13:55,760
in this course but if you are watching
340
00:13:54,320 --> 00:13:57,760
this in the future you're going to have
341
00:13:55,759 --> 00:14:00,078
a newer version i would recommend
342
00:13:57,759 --> 00:14:02,319
installing the latest version or the
343
00:14:00,078 --> 00:14:04,879
newest version you can get your hands
344
00:14:02,320 --> 00:14:07,760
upon so the first we're going to do is
345
00:14:04,879 --> 00:14:10,000
install a gcc compiler on windows i am
346
00:14:07,759 --> 00:14:13,360
going to show you a way we can get both
347
00:14:10,000 --> 00:14:15,278
gcc and clang in one go and to get
348
00:14:13,360 --> 00:14:17,759
access to that please go in your search
349
00:14:15,278 --> 00:14:19,838
engine and type windlabs and this is
350
00:14:17,759 --> 00:14:22,319
going to bring us to this project here
351
00:14:19,839 --> 00:14:25,440
if you want you can click upon this
352
00:14:22,320 --> 00:14:28,320
and this is a cool project by a guy who
353
00:14:25,440 --> 00:14:30,399
is providing worlds for these compilers
354
00:14:30,399 --> 00:14:35,759
so if you want you can just go down here
355
00:14:32,958 --> 00:14:37,759
and look at the lettuce releases again i
356
00:14:37,759 --> 00:14:43,360
lettuce you can get your hands upon in
357
00:14:39,839 --> 00:14:45,199
this case the lettuce happens to be 1120
358
00:14:43,360 --> 00:14:46,800
but in the future this is going to
359
00:14:45,198 --> 00:14:50,159
change you're going to find a version
360
00:14:46,799 --> 00:14:52,479
for 12 or 13 so please grab the newest
361
00:14:50,159 --> 00:14:54,399
version you can get your hands up on now
362
00:14:52,480 --> 00:14:58,000
i want you to install the version that
363
00:14:54,399 --> 00:15:01,039
says that it has llvm and clang so if
364
00:14:58,000 --> 00:15:03,440
you are on a 32-bit version on windows i
365
00:15:01,039 --> 00:15:06,319
would recommend getting this 7-zip
366
00:15:03,440 --> 00:15:08,800
archive on this zip archive here if you
367
00:15:06,320 --> 00:15:11,199
are on 64 i would recommend getting a
368
00:15:08,799 --> 00:15:13,120
hold of this or this little thing here
369
00:15:11,198 --> 00:15:15,039
it doesn't really matter but make sure
370
00:15:13,120 --> 00:15:16,959
you get the latest version you can get
371
00:15:15,039 --> 00:15:19,759
your hands upon and you can see that
372
00:15:16,958 --> 00:15:22,479
this conveniently says latest here so i
373
00:15:19,759 --> 00:15:24,480
am going to download the 64-bit version
374
00:15:22,480 --> 00:15:27,440
on windows i am going to grab the zip
375
00:15:24,480 --> 00:15:30,159
archive here and let's click upon this
376
00:15:27,440 --> 00:15:32,240
this should kick off my download and
377
00:15:30,159 --> 00:15:34,399
this is going to download on my system i
378
00:15:32,240 --> 00:15:36,079
can download this if i want and you're
379
00:15:34,399 --> 00:15:38,480
going to see that it is going to start
380
00:15:36,078 --> 00:15:41,439
downloading here and i am going to wait
381
00:15:38,480 --> 00:15:44,320
for this to finish again this is going
382
00:15:41,440 --> 00:15:46,639
to give us both the gcc compiler and the
383
00:15:44,320 --> 00:15:49,360
clan compiler and this is really like
384
00:15:46,639 --> 00:15:51,519
shooting two birds with one stone so
385
00:15:49,360 --> 00:15:53,440
this is going to be really good i
386
00:15:51,519 --> 00:15:56,159
already have this downloaded so i am
387
00:15:53,440 --> 00:15:58,560
just going to head over to the location
388
00:15:56,159 --> 00:16:01,759
where i have this downloaded i think i
389
00:16:01,759 --> 00:16:06,079
so let's crack this open and go in my
390
00:16:06,078 --> 00:16:12,958
and if i go in my compressed folder i am
391
00:16:08,879 --> 00:16:15,360
going to find winlabs llvm and mingw
392
00:16:12,958 --> 00:16:17,039
this is what you really want but if you
393
00:16:15,360 --> 00:16:20,639
don't want the clan compiler you can
394
00:16:17,039 --> 00:16:22,159
grab the one that doesn't say llvm here
395
00:16:20,639 --> 00:16:24,320
because we really want both of these
396
00:16:22,159 --> 00:16:26,559
compilers we are going to grab the one
397
00:16:24,320 --> 00:16:28,959
that has both the gcc compiler and the
398
00:16:26,559 --> 00:16:30,719
clan compiler if we crack this open
399
00:16:28,958 --> 00:16:32,879
let's open this together so that you can
400
00:16:30,720 --> 00:16:35,120
see what is happening we are going to
401
00:16:32,879 --> 00:16:37,360
have this little folder here if we go in
402
00:16:35,120 --> 00:16:39,679
we're going to find a bin folder if we
403
00:16:37,360 --> 00:16:40,959
go in and crack that open we're going to
404
00:16:40,958 --> 00:16:46,638
that says clang you see we have a clang
405
00:16:44,159 --> 00:16:48,879
compiler we have our clan plus plus
406
00:16:46,639 --> 00:16:50,959
compiler for c plus plus and if we go
407
00:16:48,879 --> 00:16:53,679
down we're going to find our g plus plus
408
00:16:50,958 --> 00:16:55,838
compiler and the gcc compiler this is
409
00:16:53,679 --> 00:16:58,479
what we want so what we are going to do
410
00:16:55,839 --> 00:17:01,040
is extract this somewhere on our system
411
00:16:58,480 --> 00:17:03,759
i put this on my c drive so if you go
412
00:17:01,039 --> 00:17:06,159
here you're going to find mingw64
413
00:17:03,759 --> 00:17:08,720
so all you really have to do is go where
414
00:17:08,720 --> 00:17:12,078
and say extract we're going to right
415
00:17:12,078 --> 00:17:16,720
and say extract to a location and you're
416
00:17:14,959 --> 00:17:19,759
going to specify where you want this to
417
00:17:16,720 --> 00:17:21,759
go and this is going to be extracted or
418
00:17:19,759 --> 00:17:23,439
even if you want you can extract here
419
00:17:21,759 --> 00:17:25,519
this is something i like to do this is
420
00:17:23,439 --> 00:17:28,079
going to show up in the current folder
421
00:17:25,519 --> 00:17:30,319
and you can grab this and paste that in
422
00:17:28,078 --> 00:17:33,119
a location where you want this in my
423
00:17:30,319 --> 00:17:35,678
case i put this in my c drive as i said
424
00:17:33,119 --> 00:17:37,759
here so this is going to be my compiler
425
00:17:35,679 --> 00:17:39,519
now once you have these compilers
426
00:17:37,759 --> 00:17:42,480
installed again we have the clan
427
00:17:39,519 --> 00:17:44,079
compiler we have the gcc compiler if we
428
00:17:42,480 --> 00:17:46,240
go down we're going to find the g plus
429
00:17:44,079 --> 00:17:48,399
plus we even have gdb which is a
430
00:17:46,240 --> 00:17:50,720
debugger we can use to debug c plus plus
431
00:17:48,400 --> 00:17:52,798
applications but we will talk about this
432
00:17:50,720 --> 00:17:54,558
later once you have this i would
433
00:17:52,798 --> 00:17:57,119
recommend putting this in your
434
00:17:54,558 --> 00:17:59,359
environment variables on windows the way
435
00:17:57,119 --> 00:18:00,959
you do this you grab this path well we
436
00:17:59,359 --> 00:18:02,558
have our compilers here and we're going
437
00:18:00,960 --> 00:18:03,759
to copy this this is something i
438
00:18:03,759 --> 00:18:10,558
and on windows 10 you can go on the
439
00:18:10,558 --> 00:18:15,038
and this is going to give us a window in
440
00:18:12,798 --> 00:18:16,798
which we can edit our environment
441
00:18:15,038 --> 00:18:19,119
variables we're going to click on this
442
00:18:16,798 --> 00:18:20,558
little thing this is going to open up on
443
00:18:19,119 --> 00:18:22,639
our system we're going to wait for this
444
00:18:20,558 --> 00:18:25,038
to open up and we're going to have a
445
00:18:22,640 --> 00:18:26,960
window that says system properties we're
446
00:18:25,038 --> 00:18:30,079
going to click on environment variables
447
00:18:26,960 --> 00:18:32,880
here and we can put this in our user
448
00:18:30,079 --> 00:18:34,960
environment variables or on our system
449
00:18:32,880 --> 00:18:37,280
environment variables since i am the
450
00:18:34,960 --> 00:18:40,160
only one using this system i like to put
451
00:18:37,279 --> 00:18:42,480
this in my path for my system variables
452
00:18:40,160 --> 00:18:45,360
so i am going to click on path and click
453
00:18:42,480 --> 00:18:48,240
edit here and i am going to add a path
454
00:18:45,359 --> 00:18:50,558
to my gcc and cloud installation here
455
00:18:48,240 --> 00:18:52,880
you can see that right here if you don't
456
00:18:50,558 --> 00:18:54,399
have this end you can click on new
457
00:18:52,880 --> 00:18:56,880
you're going to have a window here and
458
00:18:54,400 --> 00:18:58,720
you can paste this right in and you can
459
00:18:56,880 --> 00:19:01,679
click ok but i'm not going to do that
460
00:18:58,720 --> 00:19:04,000
because i already have this in here so
461
00:19:01,679 --> 00:19:06,880
what i am going to do is just delete
462
00:19:04,000 --> 00:19:08,880
this let's see if i can delete i can
463
00:19:06,880 --> 00:19:11,039
delete this little guy and i have my
464
00:19:08,880 --> 00:19:12,960
path in here so if you don't have this
465
00:19:11,038 --> 00:19:15,440
in please make sure you have this in
466
00:19:12,960 --> 00:19:17,519
your environment variables so we're
467
00:19:15,440 --> 00:19:19,519
going to cancel out of this but if this
468
00:19:17,519 --> 00:19:22,480
is the first time you do this you should
469
00:19:19,519 --> 00:19:24,960
click ok and one way to test that your
470
00:19:22,480 --> 00:19:27,839
environment variables are working or
471
00:19:24,960 --> 00:19:30,880
even if your compilers are working
472
00:19:27,839 --> 00:19:32,879
is to crack up a command line terminal
473
00:19:30,880 --> 00:19:34,559
so we're going to say cmd on the start
474
00:19:34,558 --> 00:19:40,639
and all you need to do is say g plus
475
00:19:37,038 --> 00:19:41,919
plus just like this dash dash version
476
00:19:40,640 --> 00:19:43,840
if you do this you're going to see
477
00:19:41,919 --> 00:19:45,038
information about your c plus plus
478
00:19:45,038 --> 00:19:49,679
and this is coming from the installation
479
00:19:46,960 --> 00:19:53,120
we just did and for clan you can say
480
00:19:49,679 --> 00:19:55,120
clan plus plus version and this is going
481
00:19:53,119 --> 00:19:57,279
to tell you the information about your
482
00:19:55,119 --> 00:19:58,798
clan compiler installation let's wait
483
00:19:57,279 --> 00:20:01,038
for this to come up i don't know why
484
00:19:58,798 --> 00:20:03,038
it's slow but you can see that we have a
485
00:20:01,038 --> 00:20:06,240
clank compiler the lattice version is
486
00:20:03,038 --> 00:20:08,558
1201 for the gcc compiler the latest
487
00:20:08,558 --> 00:20:13,759
and these are the compilers we can use
488
00:20:10,798 --> 00:20:16,480
to write c plus plus 20 applications
489
00:20:13,759 --> 00:20:19,279
okay so by now we have a gcc compiler
490
00:20:16,480 --> 00:20:22,319
through the main gw project we have a
491
00:20:19,279 --> 00:20:24,399
client llcm compiler on our system we
492
00:20:22,319 --> 00:20:27,439
are also going to see how to get a hold
493
00:20:24,400 --> 00:20:29,600
of the compiler from microsoft and to
494
00:20:27,440 --> 00:20:32,000
get hold of this you need to install
495
00:20:32,000 --> 00:20:36,079
to install microsoft visual studio all
496
00:20:34,079 --> 00:20:38,319
you have to do is come to your favorite
497
00:20:36,079 --> 00:20:41,279
search engine and say microsoft visual
498
00:20:38,319 --> 00:20:43,439
studio we can look at the 2019 version
499
00:20:41,279 --> 00:20:45,839
which is the latest i think and we're
500
00:20:43,440 --> 00:20:48,480
going to click on the download link here
501
00:20:45,839 --> 00:20:50,399
we have as the first link and we're
502
00:20:48,480 --> 00:20:52,720
going to see ways we can download this
503
00:20:50,400 --> 00:20:55,038
little guy now microsoft visual studio
504
00:20:52,720 --> 00:20:57,440
has a community version you can download
505
00:20:55,038 --> 00:20:59,679
for free but we also have a professional
506
00:20:57,440 --> 00:21:02,080
and enterprise versions that we're not
507
00:20:59,679 --> 00:21:04,400
going to care about in this course here
508
00:21:04,400 --> 00:21:09,038
the community version and that's going
509
00:21:06,880 --> 00:21:11,600
to be enough for our purposes here so if
510
00:21:09,038 --> 00:21:14,400
you click on free download here this is
511
00:21:11,599 --> 00:21:16,639
going to download and install the visual
512
00:21:14,400 --> 00:21:18,320
studio compiler you can click on this
513
00:21:16,640 --> 00:21:20,000
little guy and it is going to download
514
00:21:18,319 --> 00:21:22,240
an installer you're going to crack this
515
00:21:20,000 --> 00:21:25,440
open on your system and it is going to
516
00:21:22,240 --> 00:21:27,359
install the visual studio installer so
517
00:21:25,440 --> 00:21:29,360
once you have it installed you can come
518
00:21:29,359 --> 00:21:33,918
and say visual studio installer i think
519
00:21:32,319 --> 00:21:35,519
if you say visual studio you're going to
520
00:21:33,919 --> 00:21:38,000
have this pop-up somewhere on your
521
00:21:35,519 --> 00:21:39,839
system we're going to click on this and
522
00:21:38,000 --> 00:21:41,599
if you crack the installer open you're
523
00:21:39,839 --> 00:21:43,359
going to see a window like this which is
524
00:21:41,599 --> 00:21:46,000
really going to give you a chance to
525
00:21:43,359 --> 00:21:48,719
install the tools you want to use with
526
00:21:48,720 --> 00:21:53,839
ide and in this case we are interested
527
00:21:51,679 --> 00:21:55,600
in desktop development with c plus plus
528
00:21:53,839 --> 00:21:57,678
so we're going to click this little guy
529
00:21:55,599 --> 00:22:00,558
here we're going to take it open
530
00:21:57,679 --> 00:22:02,400
and once you do this you going to click
531
00:22:00,558 --> 00:22:05,038
download and install and this is going
532
00:22:02,400 --> 00:22:07,038
to install the visual studio compiler
533
00:22:05,038 --> 00:22:08,879
with the underlying compiler you see
534
00:22:07,038 --> 00:22:11,599
that this is going to give us access to
535
00:22:08,880 --> 00:22:13,360
the msvc compiler and all kinds of crazy
536
00:22:11,599 --> 00:22:16,480
things we really needed to write c plus
537
00:22:13,359 --> 00:22:18,798
plus applications on windows using the
538
00:22:16,480 --> 00:22:20,319
compiler from microsoft now i have to
539
00:22:18,798 --> 00:22:22,480
say this is going to take some time to
540
00:22:20,319 --> 00:22:24,879
install so if you see that this takes up
541
00:22:22,480 --> 00:22:27,919
20 minutes of your time don't worry this
542
00:22:24,880 --> 00:22:30,640
is really normal because this id and the
543
00:22:27,919 --> 00:22:33,440
compiler behind it and really large
544
00:22:30,640 --> 00:22:35,840
they're not like the gcc or the clan
545
00:22:33,440 --> 00:22:38,320
llvm compilers that we just installed
546
00:22:35,839 --> 00:22:39,678
okay so once you have this ticked or
547
00:22:38,319 --> 00:22:41,839
checked you're going to click on
548
00:22:39,679 --> 00:22:44,159
download or install whatever this button
549
00:22:41,839 --> 00:22:47,279
is saying here this is going to install
550
00:22:44,159 --> 00:22:49,520
both the microsoft visual studio ide
551
00:22:47,279 --> 00:22:51,839
and the compiler from microsoft that you
552
00:22:49,519 --> 00:22:54,400
can use directly to write c plus plus
553
00:22:51,839 --> 00:22:56,319
applications so once we have this open i
554
00:22:54,400 --> 00:22:58,080
am going to suppose that you have this
555
00:22:56,319 --> 00:22:59,918
installed already i am going to close
556
00:22:58,079 --> 00:23:00,720
out of this because i don't want to do
557
00:23:00,720 --> 00:23:04,480
and you're going to have visual studio
558
00:23:02,240 --> 00:23:06,079
installed on your system once you have
559
00:23:04,480 --> 00:23:09,120
this installed you're going to come to
560
00:23:06,079 --> 00:23:10,879
the start menu and say developer
561
00:23:09,119 --> 00:23:12,319
and this is going to bring up two things
562
00:23:10,880 --> 00:23:15,520
one is going to be the developer
563
00:23:12,319 --> 00:23:16,798
powershell for visual studio 2019 and
564
00:23:15,519 --> 00:23:18,558
the other is going to be a command
565
00:23:16,798 --> 00:23:19,918
prompt it doesn't really matter what you
566
00:23:18,558 --> 00:23:21,599
choose i am going to click on the
567
00:23:21,599 --> 00:23:26,558
and once you do this this is going to
568
00:23:23,679 --> 00:23:27,440
give you a terminal or a window through
569
00:23:27,440 --> 00:23:31,679
the environment variables are already in
570
00:23:29,919 --> 00:23:34,159
to start using the compiler from
571
00:23:31,679 --> 00:23:36,640
microsoft and if we come here and type
572
00:23:36,640 --> 00:23:39,919
we're going to see that we're going to
573
00:23:37,839 --> 00:23:41,678
see the information here if this gives
574
00:23:39,919 --> 00:23:43,840
you an error or something you're going
575
00:23:41,679 --> 00:23:46,080
to know that you didn't really install
576
00:23:43,839 --> 00:23:48,240
this properly so please go back and make
577
00:23:46,079 --> 00:23:50,079
sure you have this installed if you have
578
00:23:48,240 --> 00:23:52,720
a problem you can ask me i can do the
579
00:23:50,079 --> 00:23:54,879
best i can to help you out but by this
580
00:23:52,720 --> 00:23:57,440
moment we have three compilers on
581
00:23:54,880 --> 00:24:00,880
windows that we can use for c plus plus
582
00:23:57,440 --> 00:24:03,200
development we have the mingw or the gcc
583
00:24:00,880 --> 00:24:06,080
compiler in our hands we have the klanga
584
00:24:03,200 --> 00:24:09,679
lvm compiler and we have the compiler
585
00:24:06,079 --> 00:24:11,918
from microsoft and now we can install an
586
00:24:09,679 --> 00:24:14,400
ide or an editor and that's going to be
587
00:24:11,919 --> 00:24:16,480
visual studio code and we can connect
588
00:24:14,400 --> 00:24:19,038
that to these compilers so that we can
589
00:24:16,480 --> 00:24:21,200
start writing our own z plus bus 20
590
00:24:19,038 --> 00:24:23,119
applications we are going to head over
591
00:24:21,200 --> 00:24:25,278
in the next lecture and install the
592
00:24:25,278 --> 00:24:29,839
go ahead and finish up here and meet me
593
00:24:27,519 --> 00:24:31,679
there in this lecture i am going to show
594
00:24:29,839 --> 00:24:34,399
you how to install the visual studio
595
00:24:31,679 --> 00:24:36,480
code editor on windows so if you are
596
00:24:34,400 --> 00:24:39,200
watching this course on windows this
597
00:24:36,480 --> 00:24:42,000
video here is going to be a must watch
598
00:24:39,200 --> 00:24:44,080
we are going to head over to our search
599
00:24:42,000 --> 00:24:46,079
engine and type visual studio code this
600
00:24:44,079 --> 00:24:48,720
is going to give you a link where we can
601
00:24:46,079 --> 00:24:50,558
download this cool editor if you want
602
00:24:48,720 --> 00:24:52,960
you can learn all you can about it it is
603
00:24:50,558 --> 00:24:55,200
a source code editor made by microsoft
604
00:24:52,960 --> 00:24:57,840
it supports multiple languages but we're
605
00:24:55,200 --> 00:25:00,640
going to be using that specifically for
606
00:24:57,839 --> 00:25:03,678
c plus plus in the course here here i am
607
00:25:00,640 --> 00:25:06,000
at the page for the editor and you can
608
00:25:03,679 --> 00:25:08,559
read all you want about it but we are
609
00:25:06,000 --> 00:25:10,720
interested in downloading this for
610
00:25:08,558 --> 00:25:12,879
windows if you want you can click on
611
00:25:10,720 --> 00:25:14,480
this download button here but i am just
612
00:25:14,480 --> 00:25:19,679
and have download links for windows if i
613
00:25:17,839 --> 00:25:21,439
want i can click on user installer
614
00:25:19,679 --> 00:25:24,159
system installer you can click on what
615
00:25:21,440 --> 00:25:25,919
you want if you are on a 32-bit system
616
00:25:24,159 --> 00:25:28,080
you're going to download a 32-bit
617
00:25:25,919 --> 00:25:31,840
version i am just going to click on
618
00:25:28,079 --> 00:25:33,918
64-bit here because i am on a 64-bit
619
00:25:33,919 --> 00:25:38,480
in this video we are doing this for
620
00:25:36,000 --> 00:25:40,960
windows so this is going to be our area
621
00:25:38,480 --> 00:25:43,200
of interest here i am going to click on
622
00:25:40,960 --> 00:25:45,519
this download link and i am going to
623
00:25:45,519 --> 00:25:49,519
and i will have a window to start
624
00:25:47,359 --> 00:25:51,599
downloading visual studio code setup
625
00:25:49,519 --> 00:25:54,000
here i can save this file and it is
626
00:25:51,599 --> 00:25:55,918
going to start downloading once it is
627
00:25:54,000 --> 00:25:58,240
downloaded i am going to double click
628
00:25:55,919 --> 00:26:00,000
and really click my way through this
629
00:25:58,240 --> 00:26:02,960
until i have a visual studio code
630
00:26:02,960 --> 00:26:07,600
okay the download is good i can crack
631
00:26:07,599 --> 00:26:11,199
and you're going to see that it is
632
00:26:08,960 --> 00:26:13,519
saying that it has detected that visual
633
00:26:11,200 --> 00:26:15,840
studio code is already running on my
634
00:26:13,519 --> 00:26:17,200
system because i have it installed but
635
00:26:15,839 --> 00:26:19,439
if you don't have it installed you're
636
00:26:17,200 --> 00:26:21,679
going to click your way through and
637
00:26:19,440 --> 00:26:23,440
install this on windows and after you
638
00:26:23,440 --> 00:26:26,880
okay once you start visual studio code
639
00:26:25,278 --> 00:26:28,798
you're going to have a window like this
640
00:26:26,880 --> 00:26:30,880
if you run it for the first time you are
641
00:26:28,798 --> 00:26:33,599
probably going to see a windows with
642
00:26:33,599 --> 00:26:36,879
let's look at the welcome screen you're
643
00:26:35,359 --> 00:26:38,639
going to probably see you're going to
644
00:26:36,880 --> 00:26:40,960
probably see something like this but i
645
00:26:38,640 --> 00:26:42,640
am not sure but the most important thing
646
00:26:40,960 --> 00:26:44,880
is that you're going to have a window
647
00:26:42,640 --> 00:26:46,480
like this with visual studio code the
648
00:26:44,880 --> 00:26:49,440
first thing we want to do for c plus
649
00:26:46,480 --> 00:26:51,679
plus development is going to scroll down
650
00:26:49,440 --> 00:26:54,880
and click on this little thing that says
651
00:26:51,679 --> 00:26:57,278
extensions i am going to click on this
652
00:26:54,880 --> 00:27:00,720
and i am going to go in my search box
653
00:26:57,278 --> 00:27:02,400
here and type c and c plus i can even
654
00:27:00,720 --> 00:27:05,360
type c plus plus it doesn't really
655
00:27:02,400 --> 00:27:08,798
matter and this is an area where we can
656
00:27:05,359 --> 00:27:11,199
install extensions to make visual studio
657
00:27:08,798 --> 00:27:13,759
code do all kinds of crazy things in
658
00:27:11,200 --> 00:27:16,480
this case we are interested in making it
659
00:27:13,759 --> 00:27:18,319
support c and c plus plus so we are
660
00:27:16,480 --> 00:27:21,120
going to click on this extension that
661
00:27:18,319 --> 00:27:23,439
says microsoft here cnc plus plus i am
662
00:27:21,119 --> 00:27:25,199
going to click on this and if you don't
663
00:27:23,440 --> 00:27:27,120
have it installed you can click on the
664
00:27:25,200 --> 00:27:29,120
install button and it is going to
665
00:27:27,119 --> 00:27:32,079
install this little thing and make your
666
00:27:29,119 --> 00:27:34,398
computer ready to use visual studio code
667
00:27:32,079 --> 00:27:37,038
for c plus plus so make sure you install
668
00:27:34,398 --> 00:27:39,519
this and at the end it is going to say
669
00:27:37,038 --> 00:27:43,038
disable or uninstall because it will be
670
00:27:39,519 --> 00:27:45,599
already installed and enabled on your
671
00:27:43,038 --> 00:27:47,839
computer and this is really the end of
672
00:27:45,599 --> 00:27:49,678
our installation video for visual studio
673
00:27:47,839 --> 00:27:51,918
code we are going to head over in the
674
00:27:49,679 --> 00:27:54,880
next video and show you how you can make
675
00:27:51,919 --> 00:27:57,360
a visual studio code use the compilers
676
00:27:54,880 --> 00:27:59,440
that we installed in the previous video
677
00:27:57,359 --> 00:28:01,439
so go ahead and finish up here and meet
678
00:28:01,440 --> 00:28:06,320
in this video we're going to see how to
679
00:28:03,119 --> 00:28:09,439
connect our visual studio code editor to
680
00:28:06,319 --> 00:28:11,839
a compiler so that we can compile our
681
00:28:09,440 --> 00:28:14,240
projects easily through the visual
682
00:28:11,839 --> 00:28:17,038
studio code editor we already have the
683
00:28:14,240 --> 00:28:18,960
ide installed from the last two previous
684
00:28:17,038 --> 00:28:20,480
lectures when we have a compiler
685
00:28:18,960 --> 00:28:22,399
installed in the last lecture we
686
00:28:20,480 --> 00:28:25,839
installed the gcc compiler through the
687
00:28:22,398 --> 00:28:27,678
mingw project we installed the clangela
688
00:28:25,839 --> 00:28:30,079
vm compiler we even installed the
689
00:28:27,679 --> 00:28:32,640
compiler from microsoft now we're going
690
00:28:30,079 --> 00:28:35,199
to connect the ide to the compiler to
691
00:28:32,640 --> 00:28:38,399
make it really easy to compile c plus
692
00:28:35,200 --> 00:28:40,319
plus applications using these tools here
693
00:28:38,398 --> 00:28:42,239
what i am going to do is really set up a
694
00:28:40,319 --> 00:28:45,359
template project we're going to be
695
00:28:42,240 --> 00:28:48,079
reusing throughout this course here so i
696
00:28:45,359 --> 00:28:50,240
am going to go on a folder in my system
697
00:28:48,079 --> 00:28:52,240
and i am going to right click on the
698
00:28:55,278 --> 00:28:59,519
let's do this this is going to open this
699
00:28:57,359 --> 00:29:02,079
folder in visual studio code and i am
700
00:28:59,519 --> 00:29:04,240
going to trust this folder here be
701
00:29:02,079 --> 00:29:06,000
careful what you trust because some
702
00:29:04,240 --> 00:29:08,159
things are going to do some malicious
703
00:29:06,000 --> 00:29:11,038
things on your computer make sure you
704
00:29:08,159 --> 00:29:12,960
trust the folders that you open up so i
705
00:29:11,038 --> 00:29:15,759
am going to trust myself because i am
706
00:29:12,960 --> 00:29:18,159
the creator of this folder here and this
707
00:29:15,759 --> 00:29:20,558
is going to open visual studio code
708
00:29:18,159 --> 00:29:22,640
now in our install video we installed
709
00:29:20,558 --> 00:29:24,839
the c plus plus extension for visual
710
00:29:22,640 --> 00:29:27,120
studio code again if you don't have this
711
00:29:24,839 --> 00:29:29,199
installed please make sure you go back
712
00:29:27,119 --> 00:29:32,719
and install and make sure this is saying
713
00:29:29,200 --> 00:29:34,558
that this is enabled and now we want to
714
00:29:32,720 --> 00:29:36,798
use this to write c plus plus
715
00:29:34,558 --> 00:29:39,200
applications here we're going to write a
716
00:29:36,798 --> 00:29:42,240
simple toy c plus plus application to
717
00:29:39,200 --> 00:29:44,798
just test that our compilers support c
718
00:29:42,240 --> 00:29:46,798
plus plus 20 and then we're going to use
719
00:29:44,798 --> 00:29:49,599
this as a starting point or as a
720
00:29:46,798 --> 00:29:52,079
template project so i want you to click
721
00:29:52,079 --> 00:29:56,158
and we're going to create a file called
722
00:29:56,159 --> 00:30:01,520
and once you do that you will be able to
723
00:29:58,880 --> 00:30:03,120
type c plus plus code in this year so we
724
00:30:01,519 --> 00:30:05,519
are just starting out here i would
725
00:30:03,119 --> 00:30:08,639
recommend to type this exactly as i do
726
00:30:05,519 --> 00:30:11,519
here so we're going to say include and
727
00:30:08,640 --> 00:30:12,720
say opening angle bracket and say io
728
00:30:12,720 --> 00:30:15,839
and we're going to go down here and say
729
00:30:15,839 --> 00:30:23,519
and we're going to go inside these curly
730
00:30:18,960 --> 00:30:26,240
braces and say auto result and you are
731
00:30:23,519 --> 00:30:27,759
going to exactly type what i tap here
732
00:30:26,240 --> 00:30:30,159
don't worry we're going to have a chance
733
00:30:27,759 --> 00:30:33,440
to learn about all these things here so
734
00:30:30,159 --> 00:30:36,960
i am going to put a pair of parentheses
735
00:30:33,440 --> 00:30:39,600
and i am going to say 10. and i am going
736
00:30:36,960 --> 00:30:42,159
to put a weird operator here this is
737
00:30:39,599 --> 00:30:44,079
called the spaceship operator it is just
738
00:30:42,159 --> 00:30:46,559
something we can use to test that our
739
00:30:44,079 --> 00:30:48,240
compiler supports it plus plus 20 and
740
00:30:46,558 --> 00:30:50,879
we're going to put a 20 here and then
741
00:30:48,240 --> 00:30:53,200
we're going to try and see if this is
742
00:30:50,880 --> 00:30:55,200
greater than zero and we're going to
743
00:30:53,200 --> 00:30:57,360
print this out we're going to say stdc
744
00:30:55,200 --> 00:30:59,919
out again don't worry if you don't know
745
00:30:57,359 --> 00:31:02,240
what this is this is just a way for us
746
00:30:59,919 --> 00:31:05,200
to test and see if our compiler is going
747
00:31:02,240 --> 00:31:07,278
to be able to use c plus plus 20. we're
748
00:31:07,278 --> 00:31:12,558
and this is going to be our program now
749
00:31:10,319 --> 00:31:14,720
we want to make sure we compile this
750
00:31:12,558 --> 00:31:17,119
program so to bring in your compilers in
751
00:31:14,720 --> 00:31:19,519
visual studio code all you have to do is
752
00:31:17,119 --> 00:31:20,719
come to the terminal menu here so please
753
00:31:22,558 --> 00:31:27,200
an option to configure tasks i want you
754
00:31:27,200 --> 00:31:30,720
and once you do this you're going to see
755
00:31:28,798 --> 00:31:33,918
that visual studio code is going to find
756
00:31:30,720 --> 00:31:35,919
the compilers that we just installed you
757
00:31:36,798 --> 00:31:42,960
gcc compiler we installed in mingw you
758
00:31:40,000 --> 00:31:45,200
see that it has found the clan compiler
759
00:31:42,960 --> 00:31:46,720
i know about the g plus plus compiler
760
00:31:45,200 --> 00:31:50,080
because you can see the path here you
761
00:31:46,720 --> 00:31:52,798
can see c major w ben g plus plus dot
762
00:31:50,079 --> 00:31:55,278
exe this is where we installed our g
763
00:31:52,798 --> 00:31:56,960
plus plus compiler and i know about the
764
00:31:55,278 --> 00:31:59,119
clank compiler because that's what's
765
00:31:56,960 --> 00:32:02,480
being found here for example on this
766
00:31:59,119 --> 00:32:05,278
entry here you see it says cmajw bin
767
00:32:02,480 --> 00:32:07,679
clan plus plus so we wanted to configure
768
00:32:05,278 --> 00:32:10,079
these two compilers here and later
769
00:32:07,679 --> 00:32:12,480
visual studio could use them to build
770
00:32:12,480 --> 00:32:17,038
now what we're going to do is click on
771
00:32:14,240 --> 00:32:18,880
the g plus plus compiler first
772
00:32:17,038 --> 00:32:22,158
and when we do that this is going to
773
00:32:18,880 --> 00:32:24,640
create a tasks that json file in our
774
00:32:22,159 --> 00:32:27,679
project and you see that it has created
775
00:32:24,640 --> 00:32:30,960
a folder called dot vs code if i click
776
00:32:27,679 --> 00:32:33,440
on my main cpp file here and do reveal
777
00:32:33,440 --> 00:32:37,600
this is going to open up on my system
778
00:32:35,359 --> 00:32:40,240
and you see that this has created a dot
779
00:32:37,599 --> 00:32:43,359
vs code folder and if we go and we're
780
00:32:40,240 --> 00:32:45,120
going to find this tasks.json file this
781
00:32:43,359 --> 00:32:47,839
is going to be our configuration to
782
00:32:45,119 --> 00:32:50,079
configure which compilers that
783
00:32:47,839 --> 00:32:53,678
visual studio code is using to compile
784
00:32:50,079 --> 00:32:55,519
our main.cpp file here so if we go in
785
00:32:53,679 --> 00:32:57,600
it's going to really have everything
786
00:32:55,519 --> 00:32:59,839
ready for us so you're going to see that
787
00:32:57,599 --> 00:33:03,038
it's going to be using our g plus plus
788
00:32:59,839 --> 00:33:05,918
compiler this is the path to it and in
789
00:33:03,038 --> 00:33:08,640
our args options here we have the
790
00:33:05,919 --> 00:33:11,759
options that we pass to the compiler to
791
00:33:08,640 --> 00:33:13,519
compile our program here now i want to
792
00:33:11,759 --> 00:33:15,599
change this to say which kind of
793
00:33:15,599 --> 00:33:19,839
so we're going to change the level here
794
00:33:19,839 --> 00:33:24,398
g plus plus and say the version i think
795
00:33:22,079 --> 00:33:26,960
that's going to be more descriptive here
796
00:33:24,398 --> 00:33:28,959
so we're going to save world with g plus
797
00:33:31,159 --> 00:33:36,240
11.2.0 because that's our version here
798
00:33:34,480 --> 00:33:38,399
and the rest is really going to be
799
00:33:36,240 --> 00:33:40,720
enough so let's try and see if we can
800
00:33:38,398 --> 00:33:42,639
compile our program here and see the
801
00:33:43,519 --> 00:33:48,798
the other thing we need to do because
802
00:33:45,519 --> 00:33:51,679
this program is using c plus plus 20 we
803
00:33:48,798 --> 00:33:54,480
need to configure our compiler to use c
804
00:33:51,679 --> 00:33:56,559
plus plus 20. and one way to do that in
805
00:33:54,480 --> 00:33:58,000
gcc and you can really search these
806
00:33:58,000 --> 00:34:04,000
if we come to our search engine here and
807
00:34:00,480 --> 00:34:06,240
say configure gcc to use c plus plus 20
808
00:34:06,240 --> 00:34:11,039
and say c plus plus 20. you can search
809
00:34:08,719 --> 00:34:13,358
these things and find information and it
810
00:34:11,039 --> 00:34:14,159
is a really good way to test your things
811
00:34:14,159 --> 00:34:18,878
so let's see if we can find a link to
812
00:34:16,639 --> 00:34:22,000
help out we have a stack overflow link
813
00:34:18,878 --> 00:34:23,519
here so we can crack this open and if we
814
00:34:22,000 --> 00:34:25,918
go and we're going to find a batch of
815
00:34:23,519 --> 00:34:28,079
things for example we can say std c plus
816
00:34:25,918 --> 00:34:31,199
plus 20 here as an option to our
817
00:34:28,079 --> 00:34:33,919
compiler and this is going to bring
818
00:34:31,199 --> 00:34:36,239
c plus plus 20 support in our gcc
819
00:34:33,918 --> 00:34:38,559
compiler so i am going to copy this
820
00:34:36,239 --> 00:34:40,479
and i am going to come back in my visual
821
00:34:40,480 --> 00:34:45,760
and i am going to pass a flag to boiled
822
00:34:43,280 --> 00:34:48,480
in c plus 20 mode and it is something i
823
00:34:45,760 --> 00:34:50,399
just got from stack overflow here and we
824
00:34:48,480 --> 00:34:52,719
are going to pass this to our compiler
825
00:34:50,398 --> 00:34:54,559
and put a comma to make this a valid
826
00:34:52,719 --> 00:34:55,759
configuration file and i am going to
827
00:34:55,760 --> 00:35:00,000
now once we have this open and we want
828
00:34:58,400 --> 00:35:01,680
to build this we need to bring a
829
00:35:00,000 --> 00:35:03,358
terminal window so we we're going to
830
00:35:01,679 --> 00:35:05,679
bring the terminal window so that we can
831
00:35:03,358 --> 00:35:07,440
see things happening and we do that by
832
00:35:05,679 --> 00:35:09,039
coming to terminal and saying the new
833
00:35:09,039 --> 00:35:14,639
and we will come back to terminal again
834
00:35:11,760 --> 00:35:16,560
and say that we want to run a task in
835
00:35:14,639 --> 00:35:20,400
this case we're going to be running our
836
00:35:16,559 --> 00:35:22,078
world with gcc 1120 again if you are
837
00:35:20,400 --> 00:35:25,280
using a newer version that's what you
838
00:35:22,079 --> 00:35:27,359
should use and if we click on this thing
839
00:35:25,280 --> 00:35:29,599
please make sure you have the main cpp
840
00:35:27,358 --> 00:35:31,598
file selected before you do this so i
841
00:35:29,599 --> 00:35:34,079
have this selected and i'm going to go
842
00:35:31,599 --> 00:35:36,079
to run task and i am going to click on
843
00:35:34,079 --> 00:35:37,760
this little thing you're going to see
844
00:35:36,079 --> 00:35:40,640
that this is going to kick off the
845
00:35:40,639 --> 00:35:43,358
and we're going to wait for this to
846
00:35:41,920 --> 00:35:46,159
finish and you're going to see that it
847
00:35:43,358 --> 00:35:47,440
is using c plus plus 20 here we're going
848
00:35:46,159 --> 00:35:51,199
to see that the world finished
849
00:35:47,440 --> 00:35:55,358
successfully and we have a main.exe file
850
00:35:51,199 --> 00:35:58,480
created here so if we go in our terminal
851
00:35:55,358 --> 00:35:59,358
in visual studio code and click enter
852
00:35:59,358 --> 00:36:03,358
type clear and hit enter this is going
853
00:36:01,599 --> 00:36:05,920
to clear the screen this is something
854
00:36:03,358 --> 00:36:09,759
you can do to clear things out we can
855
00:36:05,920 --> 00:36:12,320
run this main.exe binary directly here
856
00:36:09,760 --> 00:36:14,880
so we're going to run exe here and if
857
00:36:12,320 --> 00:36:17,200
you run it it's going to say zero and
858
00:36:14,880 --> 00:36:19,838
this is an indication that we have our
859
00:36:17,199 --> 00:36:22,319
visual studio code editor connected up
860
00:36:19,838 --> 00:36:24,960
to our gcc compiler and we can use that
861
00:36:22,320 --> 00:36:27,039
to compile c plus plus applications and
862
00:36:24,960 --> 00:36:30,079
this is really the configuration with it
863
00:36:27,039 --> 00:36:32,079
now you may ask how do i know this how
864
00:36:30,079 --> 00:36:33,760
do i did i know the steps to follow to
865
00:36:33,760 --> 00:36:37,920
well if you come to extension tab here
866
00:36:36,079 --> 00:36:39,599
and before we even do that i want to
867
00:36:37,920 --> 00:36:42,159
bring to your attention that we have a
868
00:36:39,599 --> 00:36:44,960
bunch of tabs here in visual studio code
869
00:36:42,159 --> 00:36:47,679
we have a tab that says file i think the
870
00:36:44,960 --> 00:36:50,400
one here saying explorer we have a one
871
00:36:47,679 --> 00:36:52,480
we can use for version control if you
872
00:36:50,400 --> 00:36:54,400
use something like git or whatever you
873
00:36:52,480 --> 00:36:56,400
can use this but in this course we're
874
00:36:54,400 --> 00:36:58,800
mostly going to be using the explorer
875
00:36:58,800 --> 00:37:03,280
extensions tab to install things and at
876
00:37:01,358 --> 00:37:06,000
a later time i will show you how to use
877
00:37:03,280 --> 00:37:07,519
the debug tab here or run a debug tab
878
00:37:06,000 --> 00:37:10,320
but in most cases we're going to be
879
00:37:07,519 --> 00:37:12,239
using the explorer tab or the extensions
880
00:37:10,320 --> 00:37:14,320
tab here if you want you can click on
881
00:37:12,239 --> 00:37:16,479
this to close this so that you have some
882
00:37:14,320 --> 00:37:18,000
more space you can click again to bring
883
00:37:16,480 --> 00:37:20,240
this back these are some things you can
884
00:37:18,000 --> 00:37:22,880
do in visual studio code but i am going
885
00:37:20,239 --> 00:37:24,879
to show you how to configure your
886
00:37:22,880 --> 00:37:27,200
compilers where i got the information so
887
00:37:27,199 --> 00:37:30,639
and we're going to find our cnc plus
888
00:37:30,639 --> 00:37:35,759
if we scroll down we're going to find
889
00:37:32,960 --> 00:37:37,838
tutorials on how to set up this on
890
00:37:35,760 --> 00:37:39,440
different compilers for example you can
891
00:37:39,440 --> 00:37:44,240
to see how to set up a visual studio
892
00:37:41,358 --> 00:37:46,639
code to use your compiler from microsoft
893
00:37:44,239 --> 00:37:49,439
if we come back we can see a link to see
894
00:37:46,639 --> 00:37:51,679
how to use this with mingw on windows
895
00:37:51,679 --> 00:37:56,239
and let's see what else we have we can
896
00:37:53,920 --> 00:37:58,639
come back to here and we can see how to
897
00:37:56,239 --> 00:38:00,559
use this with gcc on linux or clango on
898
00:37:58,639 --> 00:38:02,960
a mac you can really choose whatever is
899
00:38:00,559 --> 00:38:05,838
relevant for your operating system but
900
00:38:02,960 --> 00:38:07,519
in this case here we are just using the
901
00:38:05,838 --> 00:38:10,719
windows operating system so we're going
902
00:38:07,519 --> 00:38:13,440
to see how to use this with the mingw
903
00:38:10,719 --> 00:38:16,480
compiler that we just installed now we
904
00:38:13,440 --> 00:38:18,639
can use the mingw compiler and i would
905
00:38:16,480 --> 00:38:21,039
recommend reading up on this entire
906
00:38:18,639 --> 00:38:24,159
thing to have an idea on what is
907
00:38:21,039 --> 00:38:26,239
happening we already have our g plus
908
00:38:24,159 --> 00:38:28,159
plus compiler so this is this command is
909
00:38:26,239 --> 00:38:30,719
going to work again if we come back to
910
00:38:28,159 --> 00:38:32,480
terminal here and run g plus plus
911
00:38:30,719 --> 00:38:34,159
version i think we can see that we run
912
00:38:32,480 --> 00:38:37,280
these commands here to see these things
913
00:38:34,159 --> 00:38:39,358
working so we have this step here and if
914
00:38:37,280 --> 00:38:41,040
you wonder what gdb is it is just a
915
00:38:39,358 --> 00:38:43,519
debugger you can use to debug your
916
00:38:41,039 --> 00:38:47,199
programs and again if we come to our
917
00:38:47,199 --> 00:38:51,118
version we're going to have this
918
00:38:48,719 --> 00:38:53,358
available from our mingw installation
919
00:38:51,119 --> 00:38:55,680
you can see that we have this here so
920
00:38:53,358 --> 00:38:58,159
this is working just fine you can really
921
00:38:55,679 --> 00:39:00,639
follow this and configure your visual
922
00:38:58,159 --> 00:39:02,480
studio code installation but i am just
923
00:39:00,639 --> 00:39:04,799
showing you how to do this pretty fast
924
00:39:02,480 --> 00:39:07,358
you can see that this is what we set up
925
00:39:04,800 --> 00:39:10,720
in our configuration file which is our
926
00:39:07,358 --> 00:39:14,078
tasks dot json file now one thing you
927
00:39:10,719 --> 00:39:17,039
can do is modify the task.json file to
928
00:39:14,079 --> 00:39:18,480
build every single file in your project
929
00:39:17,039 --> 00:39:20,960
and this is something that is going to
930
00:39:18,480 --> 00:39:23,440
make things easier what i'm going to do
931
00:39:20,960 --> 00:39:25,760
is go back to our visual studio code
932
00:39:23,440 --> 00:39:28,559
instance and find our project we're
933
00:39:25,760 --> 00:39:31,200
going to crack open our tasks that json
934
00:39:28,559 --> 00:39:32,320
file which is living in our dot vs code
935
00:39:32,320 --> 00:39:37,200
and i am going to take out the craziness
936
00:39:34,639 --> 00:39:39,838
i have in my arguments here i am going
937
00:39:37,199 --> 00:39:41,199
to select everything i am going to
938
00:39:41,199 --> 00:39:46,000
and i am going to put in a configuration
939
00:39:43,760 --> 00:39:48,560
that i am using for my projects here to
940
00:39:46,000 --> 00:39:50,639
make this super easy what this is doing
941
00:39:48,559 --> 00:39:53,519
it is telling the compiler to build in c
942
00:39:50,639 --> 00:39:55,039
plus plus 20 mode it is going to tell
943
00:39:53,519 --> 00:39:57,838
visual studio it is going to tell the
944
00:39:55,039 --> 00:40:00,239
compiler to build every single cpp file
945
00:39:57,838 --> 00:40:01,679
in our project so if we have multiple
946
00:40:00,239 --> 00:40:04,078
files they are going to be built
947
00:40:01,679 --> 00:40:06,879
together and we're going to specify the
948
00:40:04,079 --> 00:40:09,039
name for our output file for example if
949
00:40:06,880 --> 00:40:11,920
we don't want our binary executable to
950
00:40:09,039 --> 00:40:15,199
be named mainly.exe we can give it a
951
00:40:11,920 --> 00:40:17,599
name and i am going to be naming mine
952
00:40:15,199 --> 00:40:19,358
rooster.exe in the course here i would
953
00:40:17,599 --> 00:40:20,720
recommend doing the same so that we can
954
00:40:20,719 --> 00:40:24,879
the same habits as we go through the
955
00:40:23,039 --> 00:40:26,880
course here but of course you are free
956
00:40:24,880 --> 00:40:29,119
to use whatever you want in your c plus
957
00:40:26,880 --> 00:40:31,760
plus programs here so once you have this
958
00:40:29,119 --> 00:40:33,838
you can click save here and this is
959
00:40:31,760 --> 00:40:35,359
going to save our json file here i can
960
00:40:35,358 --> 00:40:39,279
and i am going to bring my terminal by
961
00:40:39,280 --> 00:40:44,160
and the terminal here this is going to
962
00:40:41,280 --> 00:40:46,800
bring back my terminal that i had before
963
00:40:44,159 --> 00:40:48,480
and i am going to run the clear command
964
00:40:48,480 --> 00:40:52,400
and i am going to do dir to show the
965
00:40:52,400 --> 00:40:58,160
of my folder on windows here i wanted to
966
00:40:55,440 --> 00:41:00,639
remove the main.exe file from the
967
00:40:58,159 --> 00:41:03,039
terminal here so what i am going to do
968
00:41:03,039 --> 00:41:07,358
and i am going to say the name of the
969
00:41:05,519 --> 00:41:08,239
file i want to remove i am going to say
970
00:41:08,239 --> 00:41:12,959
dot exe and if i hit enter notice what
971
00:41:11,358 --> 00:41:15,440
is going to happen the file is going to
972
00:41:12,960 --> 00:41:17,440
go away i don't see it anymore here i
973
00:41:15,440 --> 00:41:21,039
want to build again using my new
974
00:41:17,440 --> 00:41:23,920
configurations in my tasks the json file
975
00:41:21,039 --> 00:41:26,400
i am going to run the task to build with
976
00:41:26,400 --> 00:41:30,480
this is going to build again and you see
977
00:41:28,318 --> 00:41:32,880
that it is using the configurations that
978
00:41:30,480 --> 00:41:35,760
i passed you see that it is building
979
00:41:32,880 --> 00:41:38,000
every single cpp file in the directory
980
00:41:35,760 --> 00:41:40,800
here and it is going to generate a
981
00:41:38,000 --> 00:41:42,880
program called rooster.exe and we if we
982
00:41:40,800 --> 00:41:45,280
look here we're going to find it we can
983
00:41:45,280 --> 00:41:50,640
and we can type clear to clear things
984
00:41:47,599 --> 00:41:53,200
out and if we do the ir again we're
985
00:41:50,639 --> 00:41:55,719
going to see that we have rooster.exe
986
00:41:55,719 --> 00:42:00,078
rooster.exe here and this is going to do
987
00:41:58,079 --> 00:42:02,160
what we want this is really all you need
988
00:42:00,079 --> 00:42:05,119
to do to connect visual studio code to
989
00:42:02,159 --> 00:42:07,199
your gcc compiler now we're going to
990
00:42:05,119 --> 00:42:09,200
connect visual studio code to our clan
991
00:42:07,199 --> 00:42:10,799
compiler that we have installed we
992
00:42:09,199 --> 00:42:12,318
really want to be able to use it with
993
00:42:10,800 --> 00:42:14,240
our project here and we're going to go
994
00:42:12,318 --> 00:42:15,759
through the seven steps again so we're
995
00:42:14,239 --> 00:42:18,159
going to go to terminal and say
996
00:42:18,159 --> 00:42:22,960
and we're going to choose something that
997
00:42:19,838 --> 00:42:26,639
says the clanger compiler and we're
998
00:42:22,960 --> 00:42:29,679
going to find clang plus plus so let's
999
00:42:26,639 --> 00:42:32,358
hunt for that i have something that says
1000
00:42:32,358 --> 00:42:36,719
cloneplusplus.exe i am going to click on
1001
00:42:34,480 --> 00:42:39,079
that and if i do this this is going to
1002
00:42:39,079 --> 00:42:43,280
tasks.json file so watch out for this i
1003
00:42:43,280 --> 00:42:48,880
and let's crack this test that json file
1004
00:42:46,960 --> 00:42:50,480
open and you're going to see that this
1005
00:42:48,880 --> 00:42:54,000
is going to also set up another
1006
00:42:50,480 --> 00:42:56,159
configuration to world using my clang
1007
00:42:56,159 --> 00:43:00,799
and again i can edit this out a little
1008
00:42:58,159 --> 00:43:02,639
bit to say what we want let's look at
1009
00:43:00,800 --> 00:43:06,720
the version of cloud we have installed
1010
00:43:02,639 --> 00:43:07,838
to say that out this is going to be 12
1011
00:43:07,838 --> 00:43:11,759
1 so we're going to say world with clank
1012
00:43:11,760 --> 00:43:19,119
12 0 1 let's say that here in our level
1013
00:43:16,119 --> 00:43:20,960
12.0.1 we can say that right here and
1014
00:43:19,119 --> 00:43:23,599
you see that it is really doing the same
1015
00:43:20,960 --> 00:43:26,240
thing we did with our gcc compiler so
1016
00:43:23,599 --> 00:43:29,680
what i can really do is still everything
1017
00:43:26,239 --> 00:43:30,959
i did in my gcc compiler i can
1018
00:43:30,960 --> 00:43:36,800
and i am going to take out the arguments
1019
00:43:33,358 --> 00:43:39,358
i have in my args here and i use what i
1020
00:43:36,800 --> 00:43:41,359
have in my gcc compiler you can see that
1021
00:43:39,358 --> 00:43:44,000
you can use the client compiler and the
1022
00:43:41,358 --> 00:43:46,559
gcc compiler in the same way and this is
1023
00:43:44,000 --> 00:43:48,559
something really cool so now we have the
1024
00:43:46,559 --> 00:43:50,719
option to use two compilers and this is
1025
00:43:48,559 --> 00:43:52,480
really cool so we're going to close the
1026
00:43:50,719 --> 00:43:54,480
json file and it's going to be saved
1027
00:43:54,480 --> 00:43:58,000
and we're going to bring up our terminal
1028
00:43:58,000 --> 00:44:03,358
and let's bring this up a little bit and
1029
00:44:00,159 --> 00:44:05,598
we're going to do dir on windows and
1030
00:44:03,358 --> 00:44:08,480
we're going to remove the binary again
1031
00:44:05,599 --> 00:44:10,400
we're going to remove roster.exe
1032
00:44:08,480 --> 00:44:12,240
and again what you can do you can start
1033
00:44:10,400 --> 00:44:15,119
typing the name of the file you want to
1034
00:44:12,239 --> 00:44:16,799
remove and hit tab if you do that the
1035
00:44:15,119 --> 00:44:18,960
terminal is going to autocomplete this
1036
00:44:16,800 --> 00:44:20,880
for you and this is really cool so if i
1037
00:44:18,960 --> 00:44:23,440
do this the file is going to go away you
1038
00:44:20,880 --> 00:44:25,200
see that it is going right here
1039
00:44:25,199 --> 00:44:29,358
and what i am going to do is world with
1040
00:44:27,039 --> 00:44:31,838
the clan compiler can do that by coming
1041
00:44:29,358 --> 00:44:34,719
to terminal i am going to say that i
1042
00:44:31,838 --> 00:44:37,119
want to run a task and i am going to be
1043
00:44:34,719 --> 00:44:39,358
given an option i can either build with
1044
00:44:37,119 --> 00:44:42,640
gcc so if i choose gcc here it's going
1045
00:44:39,358 --> 00:44:44,639
to be used but i can also use clan let's
1046
00:44:42,639 --> 00:44:46,159
use clang here so i'm going to click on
1047
00:44:46,159 --> 00:44:49,279
and you're going to see that visual
1048
00:44:47,599 --> 00:44:50,400
studio code is going to kick off the
1049
00:44:50,400 --> 00:44:54,720
this is going to build my binary
1050
00:44:52,159 --> 00:44:56,960
executable and notice that it is using c
1051
00:44:54,719 --> 00:44:58,799
plus plus 20 again the build is going to
1052
00:44:56,960 --> 00:45:00,639
finish successfully and i will have a
1053
00:44:58,800 --> 00:45:04,000
binary here and this is going to be all
1054
00:45:00,639 --> 00:45:07,920
i need to do so if i hit enter and run
1055
00:45:07,920 --> 00:45:12,079
and hitting tab this is going to
1056
00:45:10,000 --> 00:45:14,639
auto-complete if i run it it's going to
1057
00:45:12,079 --> 00:45:16,400
say zero and this is what we expect here
1058
00:45:14,639 --> 00:45:18,480
if you have some kind of error please
1059
00:45:16,400 --> 00:45:20,639
try and fix it if you have a problem you
1060
00:45:18,480 --> 00:45:22,240
can ask me and i will do the best i can
1061
00:45:22,239 --> 00:45:26,239
okay now we have our two compilers
1062
00:45:24,000 --> 00:45:29,358
working we need to configure the
1063
00:45:26,239 --> 00:45:31,358
compiler from microsoft now the compiler
1064
00:45:29,358 --> 00:45:33,358
from microsoft is a little bit weird
1065
00:45:31,358 --> 00:45:35,598
again you can read up on this by coming
1066
00:45:33,358 --> 00:45:37,759
to your extension documentation
1067
00:45:35,599 --> 00:45:39,920
and going to using the compiler from
1068
00:45:37,760 --> 00:45:41,680
microsoft with visual studio code on
1069
00:45:39,920 --> 00:45:43,838
windows you can read up on all this if
1070
00:45:41,679 --> 00:45:46,159
you want but i am just going to show you
1071
00:45:43,838 --> 00:45:48,559
a quick way to get this running so the
1072
00:45:46,159 --> 00:45:51,358
compiler from microsoft is special in
1073
00:45:48,559 --> 00:45:53,440
that you have to specify the path to it
1074
00:45:51,358 --> 00:45:55,159
for example if we open a regular
1075
00:45:58,318 --> 00:46:01,480
we're going to see that the terminal is
1076
00:46:01,480 --> 00:46:07,119
cl.exe compiler is not recognized and
1077
00:46:04,880 --> 00:46:09,519
the reason is we don't have the proper
1078
00:46:07,119 --> 00:46:11,838
environment variable settings for the
1079
00:46:09,519 --> 00:46:14,159
operating system to find this compiler
1080
00:46:11,838 --> 00:46:16,559
when we call it right here we are able
1081
00:46:14,159 --> 00:46:19,039
to use g plus plus and clan because we
1082
00:46:16,559 --> 00:46:20,719
put the environment variables in place
1083
00:46:19,039 --> 00:46:22,400
if you remember when we installed them
1084
00:46:20,719 --> 00:46:25,439
we did something like this we came to
1085
00:46:22,400 --> 00:46:28,000
the start menu and did env we came to
1086
00:46:25,440 --> 00:46:29,200
environment variables here and we put
1087
00:46:29,199 --> 00:46:33,919
to our compilers in our environment
1088
00:46:32,159 --> 00:46:36,159
variables here you can see them right
1089
00:46:33,920 --> 00:46:37,920
here so we don't have the same thing for
1090
00:46:36,159 --> 00:46:40,078
the compiler from microsoft and that's
1091
00:46:37,920 --> 00:46:42,000
for a reason because we may have
1092
00:46:40,079 --> 00:46:43,359
multiple compilers installed from
1093
00:46:43,358 --> 00:46:47,199
then if you have multiple compilers it
1094
00:46:45,440 --> 00:46:49,838
would be really cumbersome to choose
1095
00:46:47,199 --> 00:46:52,480
which compiler you want the guys at
1096
00:46:49,838 --> 00:46:54,799
microsoft opted for the option for you
1097
00:46:52,480 --> 00:46:57,679
the developer to specify which compiler
1098
00:46:54,800 --> 00:47:00,480
you want to run by coming to the start
1099
00:46:57,679 --> 00:47:02,559
menu here and typing developer
1100
00:47:00,480 --> 00:47:04,960
and choose which powershell for the
1101
00:47:02,559 --> 00:47:07,358
compiler you want to use for example if
1102
00:47:04,960 --> 00:47:09,599
we want to use the visual studio 2019
1103
00:47:07,358 --> 00:47:11,519
compiler we can click on this and then
1104
00:47:13,119 --> 00:47:17,440
the c plus plus compiler from microsoft
1105
00:47:15,358 --> 00:47:20,880
for example if we wait for this to be
1106
00:47:20,880 --> 00:47:23,920
we're going to see that we're going to
1107
00:47:22,159 --> 00:47:26,239
have a message saying that this is our
1108
00:47:23,920 --> 00:47:28,079
compiler we can use it however we want
1109
00:47:26,239 --> 00:47:30,879
so what we're going to do is set up a
1110
00:47:28,079 --> 00:47:33,039
terminal like this and use this terminal
1111
00:47:30,880 --> 00:47:34,880
to start visual studio code and the
1112
00:47:33,039 --> 00:47:36,079
visual studio code is going to start in
1113
00:47:36,079 --> 00:47:40,000
where it can find the compiler from
1114
00:47:38,000 --> 00:47:41,838
microsoft i know this is confusing but
1115
00:47:40,000 --> 00:47:44,559
please bear with me this is what we need
1116
00:47:41,838 --> 00:47:46,558
to do to get this to work if we start
1117
00:47:44,559 --> 00:47:48,720
visual studio code in a mode where it
1118
00:47:46,559 --> 00:47:51,920
knows about the environment variables
1119
00:47:48,719 --> 00:47:54,799
for the compiler from microsoft we will
1120
00:47:51,920 --> 00:47:56,880
have the ability to say cl.exe
1121
00:47:54,800 --> 00:47:58,880
and we will be able to use that right
1122
00:47:56,880 --> 00:48:01,358
here but you see that it is not
1123
00:47:58,880 --> 00:48:03,358
recognized now but we can use the g plus
1124
00:48:04,480 --> 00:48:08,480
we're going to see that it's available
1125
00:48:05,838 --> 00:48:10,960
we can use it we can use clan plus plus
1126
00:48:08,480 --> 00:48:12,719
and if we do version as well we're going
1127
00:48:10,960 --> 00:48:15,119
to see that we can use this little guy
1128
00:48:12,719 --> 00:48:17,759
here we also want the ability to use the
1129
00:48:15,119 --> 00:48:20,079
compiler from microsoft but to have
1130
00:48:17,760 --> 00:48:22,640
access to that we will have to close the
1131
00:48:20,079 --> 00:48:24,160
visual studio code instance we have here
1132
00:48:22,639 --> 00:48:27,039
and we're going to come back to our
1133
00:48:24,159 --> 00:48:28,558
project let's see if i can find it here
1134
00:48:27,039 --> 00:48:30,719
so we're going to go to the location
1135
00:48:28,559 --> 00:48:32,319
where we have our project and we're
1136
00:48:30,719 --> 00:48:34,719
going to change to the location of the
1137
00:48:32,318 --> 00:48:37,440
project here so i can grab the location
1138
00:48:34,719 --> 00:48:39,838
from my visual studio code project that
1139
00:48:37,440 --> 00:48:41,920
i just set up i am going to come back to
1140
00:48:39,838 --> 00:48:44,078
my powershell window that knows about
1141
00:48:41,920 --> 00:48:46,800
the path to the c plus plus compiler
1142
00:48:44,079 --> 00:48:49,200
from microsoft and i am going to change
1143
00:48:46,800 --> 00:48:51,280
it to the location of my project here so
1144
00:48:49,199 --> 00:48:53,919
i am going to say cd and paste in the
1145
00:48:51,280 --> 00:48:56,000
path i just copied and if i hit enter
1146
00:48:53,920 --> 00:48:58,240
this is going to change to my location
1147
00:48:56,000 --> 00:49:00,239
and i really recommend using powershell
1148
00:48:58,239 --> 00:49:02,399
if you have access to this because it is
1149
00:49:00,239 --> 00:49:05,199
a little more convenient to use it
1150
00:49:02,400 --> 00:49:07,599
supports more commands that you can use
1151
00:49:05,199 --> 00:49:10,239
in the command prompt but again that's
1152
00:49:07,599 --> 00:49:13,280
going to be your choice now i am in the
1153
00:49:10,239 --> 00:49:14,959
location for my project if i do ls or
1154
00:49:14,960 --> 00:49:19,039
you can see that i can see my main cpp
1155
00:49:17,039 --> 00:49:22,079
file can see the binary we generated
1156
00:49:19,039 --> 00:49:24,800
earlier but this is not problem so what
1157
00:49:24,800 --> 00:49:29,680
and i say a dot and this is going to
1158
00:49:27,039 --> 00:49:32,480
start visual studio code in the current
1159
00:49:29,679 --> 00:49:34,159
folder of our project year so if you hit
1160
00:49:32,480 --> 00:49:36,079
enter we're going to wait for visual
1161
00:49:34,159 --> 00:49:38,239
studio code to come up it is going to
1162
00:49:36,079 --> 00:49:39,280
come up with the project we had in that
1163
00:49:41,358 --> 00:49:45,039
starting visual studio code this way is
1164
00:49:43,679 --> 00:49:47,519
that it's going to know about the
1165
00:49:45,039 --> 00:49:49,358
compiler from microsoft if we come back
1166
00:49:52,159 --> 00:49:56,078
you're going to see that now it knows
1167
00:49:53,838 --> 00:49:58,558
about the compiler from microsoft and we
1168
00:49:56,079 --> 00:50:00,400
can use it to do things so let's set
1169
00:49:58,559 --> 00:50:02,720
this up again if you want you can read
1170
00:50:02,719 --> 00:50:07,279
on the documentation from visual studio
1171
00:50:05,199 --> 00:50:08,879
code itself but again i am going to show
1172
00:50:07,280 --> 00:50:11,200
you how to do this you can see that it
1173
00:50:08,880 --> 00:50:13,358
is really the same things they are doing
1174
00:50:11,199 --> 00:50:15,519
here so let's come back to visual studio
1175
00:50:13,358 --> 00:50:18,400
code and we're going to go to terminal
1176
00:50:15,519 --> 00:50:20,719
and we want to configure a task
1177
00:50:18,400 --> 00:50:22,559
now you see that we have the compiler
1178
00:50:20,719 --> 00:50:25,519
from microsoft available you can see
1179
00:50:22,559 --> 00:50:28,599
that we can use that right here so what
1180
00:50:31,358 --> 00:50:35,759
and this is going to add a new entry in
1181
00:50:33,358 --> 00:50:37,920
our configuration file and it is going
1182
00:50:35,760 --> 00:50:40,800
to open up if we go here we are going to
1183
00:50:37,920 --> 00:50:43,200
find that we have a command to build
1184
00:50:40,800 --> 00:50:45,359
using the compiler from microsoft so
1185
00:50:43,199 --> 00:50:48,318
let's change the level here and i say
1186
00:50:45,358 --> 00:50:50,719
world with msvc i think this is going to
1187
00:50:48,318 --> 00:50:52,880
be more descriptive and this is really
1188
00:50:50,719 --> 00:50:55,199
going to build your thing now i am going
1189
00:50:52,880 --> 00:50:57,599
to change this up so that it works
1190
00:50:55,199 --> 00:50:59,919
everything in the current folder
1191
00:50:57,599 --> 00:51:01,359
and again i am going to remove
1192
00:51:01,358 --> 00:51:05,759
configuration that i have ready on my
1193
00:51:03,599 --> 00:51:08,079
system here this is what i use for all
1194
00:51:05,760 --> 00:51:10,319
my projects again this is just calling
1195
00:51:08,079 --> 00:51:12,720
the compiler and giving it options to do
1196
00:51:10,318 --> 00:51:14,719
things we just need to specify that we
1197
00:51:12,719 --> 00:51:17,279
want to use the lattice standard of the
1198
00:51:14,719 --> 00:51:18,639
c plus plus standard and it is going to
1199
00:51:18,639 --> 00:51:22,000
the input files we're going to be
1200
00:51:20,239 --> 00:51:24,399
building everything in the current
1201
00:51:22,000 --> 00:51:26,159
folder this is what we are saying here
1202
00:51:24,400 --> 00:51:28,480
and the output file is going to be
1203
00:51:28,480 --> 00:51:33,119
if we save this by saying ctrl s or
1204
00:51:33,119 --> 00:51:38,720
and close our tasks dot json file we can
1205
00:51:36,559 --> 00:51:41,200
bring up our terminal window by going to
1206
00:51:38,719 --> 00:51:44,318
view and saying the terminal here
1207
00:51:41,199 --> 00:51:46,318
and we can go down and clear we can say
1208
00:51:46,318 --> 00:51:52,800
and if we do rm and say rooster and hit
1209
00:51:50,960 --> 00:51:55,760
tab this is going to remove the binary
1210
00:51:52,800 --> 00:51:58,559
we generated with the clang llvm
1211
00:51:55,760 --> 00:52:01,040
compiler earlier now we want to build
1212
00:51:58,559 --> 00:52:02,559
with the compiler from microsoft so
1213
00:52:01,039 --> 00:52:04,639
let's do this we're going to say
1214
00:52:02,559 --> 00:52:07,680
terminal and we're going to say that we
1215
00:52:04,639 --> 00:52:10,400
want to run a task but this time we want
1216
00:52:07,679 --> 00:52:12,639
to build with msvc this is what we want
1217
00:52:10,400 --> 00:52:14,160
to do here if we click on this little
1218
00:52:12,639 --> 00:52:16,679
thing we're going to kick off the
1219
00:52:14,159 --> 00:52:18,879
process to build with the compiler from
1220
00:52:16,679 --> 00:52:21,759
microsoft and we're going to wait for
1221
00:52:21,760 --> 00:52:25,680
and if we wait we're going to see that
1222
00:52:23,440 --> 00:52:27,119
the world finished successfully and if
1223
00:52:25,679 --> 00:52:30,000
we look in our folder we're going to see
1224
00:52:27,119 --> 00:52:32,318
that we have our output file and we can
1225
00:52:30,000 --> 00:52:34,960
come in our terminal and hit to enter
1226
00:52:32,318 --> 00:52:38,318
and do clear to clear things up and if
1227
00:52:38,318 --> 00:52:43,119
and hit enter you're going to see that
1228
00:52:39,920 --> 00:52:46,400
it's going to say zero and this is
1229
00:52:43,119 --> 00:52:49,119
confirmation that we are able to use our
1230
00:52:46,400 --> 00:52:51,519
visual studio code editor and be able to
1231
00:52:49,119 --> 00:52:53,838
use it with all kinds of crazy compilers
1232
00:52:51,519 --> 00:52:56,239
and this is really cool if you are on
1233
00:52:53,838 --> 00:52:57,759
windows i recommend setting this up
1234
00:52:56,239 --> 00:53:00,399
because it's it's going to make it
1235
00:52:57,760 --> 00:53:02,079
easier to run a c plus plus applications
1236
00:53:02,079 --> 00:53:07,280
state-of-the-art compilers like msvc
1237
00:53:04,880 --> 00:53:09,838
clone and gcc here and this is really
1238
00:53:07,280 --> 00:53:12,240
cool now we have everything we need to
1239
00:53:09,838 --> 00:53:14,318
start running c plus plus applications
1240
00:53:12,239 --> 00:53:16,159
but before i let you go let's show you
1241
00:53:14,318 --> 00:53:18,960
how you can set this up so that you have
1242
00:53:16,159 --> 00:53:21,118
an easier time with regards to
1243
00:53:18,960 --> 00:53:22,720
intellisense and whatever so what we're
1244
00:53:21,119 --> 00:53:24,400
going to do we're going to go to our
1245
00:53:22,719 --> 00:53:25,919
view menu and we're going to choose
1246
00:53:25,920 --> 00:53:30,318
and in this we're going to say c or c
1247
00:53:30,318 --> 00:53:35,039
we can say something like this and we're
1248
00:53:32,480 --> 00:53:36,719
going to choose edit configuration ui
1249
00:53:35,039 --> 00:53:38,079
this is going to give us an option to
1250
00:53:38,079 --> 00:53:41,359
and i want you to configure things your
1251
00:53:43,920 --> 00:53:49,280
let's see the options we have here i am
1252
00:53:46,480 --> 00:53:52,880
only going to have the option for win32
1253
00:53:49,280 --> 00:53:54,640
but if we go down we can specify
1254
00:53:54,639 --> 00:53:57,838
visual studio code configured for for
1255
00:53:56,559 --> 00:54:00,079
example it's going to give us
1256
00:53:57,838 --> 00:54:02,000
intellisense or autocomplete and all
1257
00:54:00,079 --> 00:54:04,240
kinds of greater things using the
1258
00:54:02,000 --> 00:54:06,960
setting we choose here if we want we can
1259
00:54:04,239 --> 00:54:08,959
choose the gcc compiler or whatever i am
1260
00:54:06,960 --> 00:54:11,358
just going to leave in the windows msvc
1261
00:54:08,960 --> 00:54:13,358
compiler because i am on windows here
1262
00:54:11,358 --> 00:54:15,199
but know that you can configure these
1263
00:54:13,358 --> 00:54:17,358
things now if we go down we're going to
1264
00:54:15,199 --> 00:54:20,000
see that we have the option to configure
1265
00:54:17,358 --> 00:54:22,078
the c plus plus standard and the
1266
00:54:20,000 --> 00:54:23,599
compiler path that is going to be used
1267
00:54:22,079 --> 00:54:26,079
to figure things out we're going to be
1268
00:54:23,599 --> 00:54:27,760
using the compiler from microsoft here
1269
00:54:26,079 --> 00:54:29,839
but know that you have the option to
1270
00:54:27,760 --> 00:54:31,520
choose any other compiler for example we
1271
00:54:29,838 --> 00:54:33,599
can choose the g plus plus compiler we
1272
00:54:31,519 --> 00:54:35,599
can choose the clank plus class compiler
1273
00:54:33,599 --> 00:54:37,359
you can configure these things and if
1274
00:54:35,599 --> 00:54:40,079
you need to change this please come back
1275
00:54:37,358 --> 00:54:41,440
here and do these configurations here
1276
00:54:40,079 --> 00:54:43,839
we're going to leave in this whole
1277
00:54:41,440 --> 00:54:46,720
intellisense and what we will do
1278
00:54:43,838 --> 00:54:49,039
is configure visual studio code to use
1279
00:54:46,719 --> 00:54:50,838
the c plus plus 20 standard so we're
1280
00:54:50,838 --> 00:54:55,358
here and if you set this up you're going
1281
00:54:53,519 --> 00:54:58,159
to see that visual studio code is going
1282
00:54:58,159 --> 00:55:02,480
file which is going to store all these
1283
00:55:00,559 --> 00:55:03,760
configurations here so it is really
1284
00:55:03,760 --> 00:55:08,559
a configuration for what we choose in
1285
00:55:06,318 --> 00:55:10,318
our configuration here so make sure you
1286
00:55:08,559 --> 00:55:12,720
choose what makes sense again i would
1287
00:55:10,318 --> 00:55:14,400
recommend using c plus plus 20 but if
1288
00:55:12,719 --> 00:55:16,159
you go on top you can really use any
1289
00:55:14,400 --> 00:55:18,559
compiler you want i am going to use the
1290
00:55:16,159 --> 00:55:20,239
compiler from microsoft this is okay i
1291
00:55:20,239 --> 00:55:24,558
configuration for intellisense here and
1292
00:55:22,559 --> 00:55:26,400
i am going to close this and we are
1293
00:55:24,559 --> 00:55:28,880
really ready to start using visual
1294
00:55:26,400 --> 00:55:31,039
studio code to ride c plus plus
1295
00:55:28,880 --> 00:55:32,798
application so let's clean this up a
1296
00:55:31,039 --> 00:55:35,119
little bit we're going to view our
1297
00:55:32,798 --> 00:55:37,920
terminal and we're going to remove the
1298
00:55:35,119 --> 00:55:40,720
junk that was generated by the compiler
1299
00:55:37,920 --> 00:55:42,559
from microsoft i am going to say rm and
1300
00:55:42,559 --> 00:55:48,559
and i can remove the binary i can say rm
1301
00:55:46,400 --> 00:55:51,039
and say rooster and say tab this is
1302
00:55:48,559 --> 00:55:53,119
going to autocomplete and really remove
1303
00:55:51,039 --> 00:55:56,000
things i don't need i am going to remove
1304
00:55:53,119 --> 00:55:57,680
the pdb file i am going to remove
1305
00:55:57,679 --> 00:56:04,639
you know i am going to remove the main
1306
00:56:00,318 --> 00:56:07,599
object file so let's say main dot obj
1307
00:56:04,639 --> 00:56:10,639
and i am going to remove main dot
1308
00:56:07,599 --> 00:56:13,599
or vc we don't want to remove our cpd
1309
00:56:10,639 --> 00:56:16,239
file so now we have a project we can use
1310
00:56:13,599 --> 00:56:19,039
as a starting point to write c and c
1311
00:56:16,239 --> 00:56:21,519
plus plus applications here so what we
1312
00:56:19,039 --> 00:56:24,719
will be doing in the next few lectures
1313
00:56:21,519 --> 00:56:28,480
or the next few chapters is reusing
1314
00:56:24,719 --> 00:56:31,439
this thing here as a template project so
1315
00:56:31,440 --> 00:56:36,159
c plus plus 20 template project and
1316
00:56:34,719 --> 00:56:37,838
let's do this here i think i need to
1317
00:56:36,159 --> 00:56:40,078
close video studio code otherwise it's
1318
00:56:37,838 --> 00:56:43,039
going to complain so i am going to call
1319
00:56:40,079 --> 00:56:44,798
this little guy c plus plus 20 template
1320
00:56:44,798 --> 00:56:48,559
later when we start learning about c
1321
00:56:46,559 --> 00:56:50,640
plus plus proper we're going to be using
1322
00:56:48,559 --> 00:56:52,960
this as a starting point and we want to
1323
00:56:50,639 --> 00:56:55,598
have to reconfigure the compilers our
1324
00:56:55,599 --> 00:57:00,798
the compilers that we set up here namely
1325
00:56:58,079 --> 00:57:03,039
the compiler from microsoft the g plus
1326
00:57:00,798 --> 00:57:05,199
plus compiler and the clang plus plus
1327
00:57:03,039 --> 00:57:07,440
compiler and that's going to be really
1328
00:57:05,199 --> 00:57:09,199
cool this is really all i have to share
1329
00:57:07,440 --> 00:57:10,960
in this lecture i hope you have visual
1330
00:57:09,199 --> 00:57:13,199
studio code set up to use all these
1331
00:57:10,960 --> 00:57:15,119
compilers we are going to stop here in
1332
00:57:13,199 --> 00:57:16,879
this lecture the next one we're going to
1333
00:57:15,119 --> 00:57:19,280
start and see how to set up your
1334
00:57:16,880 --> 00:57:20,960
development environment on linux and
1335
00:57:19,280 --> 00:57:24,880
we're going to start by installing
1336
00:57:24,880 --> 00:57:29,119
go ahead and finish up here and meet me
1337
00:57:27,039 --> 00:57:31,920
there in this lecture we're going to see
1338
00:57:29,119 --> 00:57:34,640
how to install c plus plus compilers on
1339
00:57:31,920 --> 00:57:38,798
linux we are going to be working on an
1340
00:57:34,639 --> 00:57:42,078
ubuntu 2004 system and we will install a
1341
00:57:38,798 --> 00:57:44,559
new version of gcc and the latest
1342
00:57:42,079 --> 00:57:47,839
version i can get my hands on for clang
1343
00:57:44,559 --> 00:57:52,240
llvm so let's do this okay so here i am
1344
00:57:47,838 --> 00:57:55,440
on my linux box this is ubuntu 2004 if i
1345
00:57:55,440 --> 00:57:57,679
we're going to see the information on
1346
00:57:57,679 --> 00:58:02,960
and you will have to adapt this for
1347
00:57:59,838 --> 00:58:05,679
whatever linux distribution you are on
1348
00:58:02,960 --> 00:58:08,159
and to install gcc it's really simple
1349
00:58:05,679 --> 00:58:10,558
but the problem is the latest version of
1350
00:58:08,159 --> 00:58:13,759
gcc at the time of recording this video
1351
00:58:10,559 --> 00:58:16,319
is gcc 11 and it's not available in the
1352
00:58:13,760 --> 00:58:17,920
ubuntu packages now for example if you
1353
00:58:26,880 --> 00:58:30,240
you're going to put in your password
1354
00:58:28,318 --> 00:58:33,119
you're going to see that this is really
1355
00:58:30,239 --> 00:58:36,159
not available yet right we cannot find
1356
00:58:33,119 --> 00:58:38,318
this so the best version we can install
1357
00:58:36,159 --> 00:58:40,480
is gcc 10 which i happen to have
1358
00:58:38,318 --> 00:58:43,039
installed already on this system so
1359
00:58:40,480 --> 00:58:44,880
we're going to do gcc 10 that's what
1360
00:58:44,880 --> 00:58:48,079
and if we do this we're going to see
1361
00:58:46,400 --> 00:58:50,559
that this is already available you can
1362
00:58:48,079 --> 00:58:52,160
also install g plus plus done i think
1363
00:58:52,159 --> 00:58:56,480
okay so we're going to run the command
1364
00:58:53,679 --> 00:58:58,480
here and we're also going to see that
1365
00:58:56,480 --> 00:59:00,240
it's already available here but if you
1366
00:59:00,239 --> 00:59:04,479
they are going to be installed and you
1367
00:59:02,079 --> 00:59:07,039
can use them on your linux system
1368
00:59:04,480 --> 00:59:09,519
another tool that is necessary on linux
1369
00:59:07,039 --> 00:59:12,079
is the gdb debugger so we're going to do
1370
00:59:15,440 --> 00:59:19,200
right if you install it it's going to be
1371
00:59:17,358 --> 00:59:23,039
installed but i already have it
1372
00:59:19,199 --> 00:59:25,838
installed already so now if i do gcc 10
1373
00:59:23,039 --> 00:59:27,519
on my system here and say version we're
1374
00:59:25,838 --> 00:59:29,599
going to see the version printed out we
1375
00:59:27,519 --> 00:59:32,400
can do g plus plus stand we can see the
1376
00:59:29,599 --> 00:59:34,480
version here let's do that for c plus
1377
00:59:34,480 --> 00:59:40,000
so we're going to see the version here
1378
00:59:40,639 --> 00:59:44,318
and it is going to show up let's wait
1379
00:59:42,400 --> 00:59:46,880
for this we're going to see my gdp
1380
00:59:44,318 --> 00:59:50,000
version here and now i can use these
1381
00:59:46,880 --> 00:59:53,119
compilers to compile c plus plus code on
1382
00:59:50,000 --> 00:59:56,318
my linux box here so this completes our
1383
00:59:53,119 --> 00:59:57,920
steps to install a gcc compiler on linux
1384
00:59:56,318 --> 01:00:00,558
we're going to look at how we can get a
1385
01:00:00,559 --> 01:00:05,359
on our linux box here and it is really
1386
01:00:03,039 --> 01:00:07,599
simple all you have to do is to do
1387
01:00:07,599 --> 01:00:12,160
and we're going to install clang 12
1388
01:00:10,159 --> 01:00:14,480
because that's the latest version at the
1389
01:00:12,159 --> 01:00:15,920
time of recording this video if we do
1390
01:00:14,480 --> 01:00:17,920
this we're going to see that it's going
1391
01:00:15,920 --> 01:00:20,079
to install i already have it installed
1392
01:00:17,920 --> 01:00:22,318
here but if you don't have it installed
1393
01:00:20,079 --> 01:00:24,160
it's going to install on your system and
1394
01:00:22,318 --> 01:00:26,000
this is going to give you all the tools
1395
01:00:24,159 --> 01:00:28,558
you need to compile with the clan
1396
01:00:26,000 --> 01:00:30,559
compiler on this particular ubuntu
1397
01:00:28,559 --> 01:00:33,440
system these installs are going to be
1398
01:00:30,559 --> 01:00:37,440
installed in my user bin directory so if
1399
01:00:33,440 --> 01:00:39,039
i see the there and do analysis to show
1400
01:00:39,039 --> 01:00:42,960
and scroll up we're going to find all
1401
01:00:41,119 --> 01:00:45,838
the versions for clan you see i have
1402
01:00:42,960 --> 01:00:48,798
multiple versions clang 10 11 12
1403
01:00:45,838 --> 01:00:51,279
and we have clan plus plus variance of
1404
01:00:48,798 --> 01:00:53,920
this i think we do okay we have clank
1405
01:00:51,280 --> 01:00:55,760
plus plus and clan here and this is
1406
01:00:53,920 --> 01:00:58,639
going to do what we want we have the
1407
01:00:55,760 --> 01:01:01,359
clan combiner and the gcc compiler
1408
01:00:58,639 --> 01:01:03,598
installed on our system here now if you
1409
01:01:01,358 --> 01:01:05,279
want to get the latest version of gcc
1410
01:01:05,280 --> 01:01:11,280
one easy way i found is to go through a
1411
01:01:08,880 --> 01:01:12,880
package manager called homebrew let's
1412
01:01:12,880 --> 01:01:16,000
right if you search for this you're
1413
01:01:14,318 --> 01:01:18,239
going to find it and if you want you can
1414
01:01:18,239 --> 01:01:23,679
and when you install it it's going to to
1415
01:01:20,400 --> 01:01:25,358
be basically there ready to use
1416
01:01:23,679 --> 01:01:28,000
and to install it i think there's a
1417
01:01:25,358 --> 01:01:30,719
command there install home brew
1418
01:01:28,000 --> 01:01:32,159
let's do this install here and if we do
1419
01:01:32,159 --> 01:01:37,358
we should find a link to install this
1420
01:01:34,798 --> 01:01:39,358
let's find a link i think they have a
1421
01:01:37,358 --> 01:01:42,239
link you can copy aha it is this little
1422
01:01:39,358 --> 01:01:44,000
thing here you can copy it paste it in
1423
01:01:42,239 --> 01:01:45,838
your terminal and it is going to install
1424
01:01:45,838 --> 01:01:50,239
and when you have home brew installed
1425
01:01:48,480 --> 01:01:52,480
you can go through it to install the
1426
01:01:50,239 --> 01:01:54,399
latest version of gcc for example if we
1427
01:01:57,920 --> 01:02:03,039
we're going to find all the information
1428
01:02:00,400 --> 01:02:05,599
to install this through home brew and
1429
01:02:03,039 --> 01:02:07,359
you just have to do bro install gcc and
1430
01:02:05,599 --> 01:02:09,039
this is going to install this on your
1431
01:02:07,358 --> 01:02:11,279
system and you're going to see that it
1432
01:02:09,039 --> 01:02:13,520
is going to install the latest version
1433
01:02:11,280 --> 01:02:15,519
at the time of recording this video so
1434
01:02:13,519 --> 01:02:19,280
this is what you should do for example
1435
01:02:15,519 --> 01:02:21,759
if we go back to our linux box we can do
1436
01:02:19,280 --> 01:02:23,599
let's cd into our home directory and
1437
01:02:26,159 --> 01:02:30,318
and it's going to tell me that it is
1438
01:02:28,000 --> 01:02:31,280
already installed because i installed
1439
01:02:31,280 --> 01:02:34,960
but if you don't have it installed it's
1440
01:02:33,039 --> 01:02:37,839
going to install it and you do this
1441
01:02:34,960 --> 01:02:39,760
after you have gone through the steps
1442
01:02:39,760 --> 01:02:44,079
the home brew package manager on your
1443
01:02:41,920 --> 01:02:45,838
system and you do that by just copying
1444
01:02:44,079 --> 01:02:48,000
this link and pasting that in your
1445
01:02:45,838 --> 01:02:49,838
terminal and hitting enter and it's
1446
01:02:48,000 --> 01:02:52,559
going to give you directions on what you
1447
01:02:49,838 --> 01:02:54,798
can do to get this properly installed on
1448
01:02:52,559 --> 01:02:56,880
your system here so this is really cool
1449
01:02:54,798 --> 01:02:59,838
so if you want the absolute latest
1450
01:02:56,880 --> 01:03:01,760
version in gcc this is one way you have
1451
01:02:59,838 --> 01:03:04,159
to get a hold of it without really going
1452
01:03:01,760 --> 01:03:07,359
through the complex steps to build the
1453
01:03:04,159 --> 01:03:09,598
compiler yourself on linux okay it is
1454
01:03:07,358 --> 01:03:11,358
taking some more time here i am just
1455
01:03:09,599 --> 01:03:14,480
going to kill this because i already
1456
01:03:11,358 --> 01:03:19,358
have the latest version of gcc here if i
1457
01:03:14,480 --> 01:03:21,760
do jcc 11 on linux and the do version
1458
01:03:19,358 --> 01:03:24,159
i am going to see that i have 11 2 and
1459
01:03:21,760 --> 01:03:26,079
it was installed through homebrew and if
1460
01:03:24,159 --> 01:03:28,078
you let this run to completion it's
1461
01:03:26,079 --> 01:03:30,559
going to install this on your computer
1462
01:03:28,079 --> 01:03:33,599
we don't have to wait for this so now we
1463
01:03:30,559 --> 01:03:35,839
have the latest version of gcc on an
1464
01:03:33,599 --> 01:03:38,000
ubuntu system we also have the latest
1465
01:03:35,838 --> 01:03:40,480
version of clan this completes our
1466
01:03:38,000 --> 01:03:42,798
tutorial on how to set up compilers on
1467
01:03:40,480 --> 01:03:45,119
linux we are going to stop here in this
1468
01:03:42,798 --> 01:03:47,599
lecture this one we're going to install
1469
01:03:45,119 --> 01:03:49,440
visual studio code on the linux system
1470
01:03:47,599 --> 01:03:51,838
and then in the next one we're going to
1471
01:03:49,440 --> 01:03:54,079
link visual studio code to these
1472
01:03:51,838 --> 01:03:56,798
compilers and be able to use visual
1473
01:03:54,079 --> 01:03:59,760
studio code type code and compile our
1474
01:03:56,798 --> 01:04:01,519
programs using these two compilers here
1475
01:03:59,760 --> 01:04:03,599
so go ahead and finish up here and meet
1476
01:04:03,599 --> 01:04:08,318
in this lecture we're going to see how
1477
01:04:05,358 --> 01:04:11,038
to install the visual studio code editor
1478
01:04:08,318 --> 01:04:15,279
on a linux system and again we will be
1479
01:04:11,039 --> 01:04:17,119
working on our ubuntu 2004 system here
1480
01:04:15,280 --> 01:04:18,960
so let's head over to the website for
1481
01:04:17,119 --> 01:04:22,000
visual studio code and download our
1482
01:04:18,960 --> 01:04:24,318
binary and install it on our linux
1483
01:04:22,000 --> 01:04:26,960
system here okay so here we are at the
1484
01:04:24,318 --> 01:04:29,038
website for visual studio code you can
1485
01:04:26,960 --> 01:04:31,119
get there by searching for visual studio
1486
01:04:29,039 --> 01:04:33,359
code in your search engine and you're
1487
01:04:31,119 --> 01:04:34,720
going to land here and all we really
1488
01:04:34,719 --> 01:04:38,639
is go down to find our download links
1489
01:04:36,880 --> 01:04:41,440
we're going to see that for debian and
1490
01:04:38,639 --> 01:04:43,440
ubuntu we can download here but you can
1491
01:04:41,440 --> 01:04:45,920
also find something specific to other
1492
01:04:43,440 --> 01:04:49,280
distribution okay so we are going to
1493
01:04:45,920 --> 01:04:51,838
grab the 64-bit version of debian ubuntu
1494
01:04:49,280 --> 01:04:53,440
here because that's my system and you're
1495
01:04:51,838 --> 01:04:56,078
going to find whatever makes sense for
1496
01:04:53,440 --> 01:04:58,318
your distribution so let's grab this
1497
01:04:56,079 --> 01:05:00,000
here we're going to grab the link so if
1498
01:05:00,000 --> 01:05:04,480
this is going to kick off the download
1499
01:05:01,920 --> 01:05:07,039
process and you will see this downloaded
1500
01:05:04,480 --> 01:05:09,199
on your system and once you have this
1501
01:05:07,039 --> 01:05:11,520
downloaded you're going to install it
1502
01:05:09,199 --> 01:05:13,919
and in ubuntu you can just double click
1503
01:05:11,519 --> 01:05:16,400
on this to install it or you can install
1504
01:05:13,920 --> 01:05:19,519
it like you install any debian package
1505
01:05:16,400 --> 01:05:22,318
on a linux system for example if you are
1506
01:05:19,519 --> 01:05:24,960
unsure on how to install debian packages
1507
01:05:22,318 --> 01:05:28,079
all you have to do is do a simple search
1508
01:05:24,960 --> 01:05:30,318
so let's do google.com and go there and
1509
01:05:28,079 --> 01:05:32,880
we're going to see how to install
1510
01:05:35,679 --> 01:05:40,000
2004 so this is our version here and
1511
01:05:40,000 --> 01:05:44,798
instructions on how to do this it's
1512
01:05:42,239 --> 01:05:47,919
going to be really simple so we can go
1513
01:05:44,798 --> 01:05:51,358
down and find a way to install so all
1514
01:05:47,920 --> 01:05:53,119
you have to do is says you do dpkga
1515
01:05:51,358 --> 01:05:54,639
say i and you pass the name of the
1516
01:05:53,119 --> 01:05:56,798
package and this is going to install
1517
01:05:54,639 --> 01:05:58,719
visual studio code on your system once
1518
01:05:56,798 --> 01:06:01,119
you do this you will have visual studio
1519
01:05:58,719 --> 01:06:03,838
code installed and you will be ready to
1520
01:06:01,119 --> 01:06:05,519
start it and use it on your system here
1521
01:06:03,838 --> 01:06:08,159
once it is installed you will have the
1522
01:06:05,519 --> 01:06:11,440
ability to come in your system here for
1523
01:06:08,159 --> 01:06:13,358
example and say code dot and this is
1524
01:06:11,440 --> 01:06:15,519
going to open a visual studio code
1525
01:06:13,358 --> 01:06:17,440
instance on your system let's wait for
1526
01:06:15,519 --> 01:06:18,559
this to come up so that you really see
1527
01:06:18,559 --> 01:06:22,240
okay so this is going to open visual
1528
01:06:20,159 --> 01:06:24,879
studio coordinate system and you can
1529
01:06:22,239 --> 01:06:27,038
start using it like we will do in the
1530
01:06:24,880 --> 01:06:29,440
next lecture okay once you have a visual
1531
01:06:27,039 --> 01:06:31,440
studio code installed and started up on
1532
01:06:29,440 --> 01:06:32,798
your linux system the very first thing
1533
01:06:32,798 --> 01:06:37,519
is to install the extension that is
1534
01:06:35,199 --> 01:06:40,000
going to allow you to do some c and c
1535
01:06:37,519 --> 01:06:43,280
plus plus and to do that you will come
1536
01:06:40,000 --> 01:06:45,760
to this tab here that says extension and
1537
01:06:43,280 --> 01:06:47,519
in our search box you can start typing c
1538
01:06:47,519 --> 01:06:53,280
and you are going to have an entry that
1539
01:06:50,000 --> 01:06:55,119
says microsoft here so please select
1540
01:06:53,280 --> 01:06:56,640
this and this is going to be the
1541
01:06:55,119 --> 01:06:58,160
extension you need to install you're
1542
01:06:56,639 --> 01:06:59,519
going to click on install and it is
1543
01:06:59,519 --> 01:07:05,119
and this is what enables a visual studio
1544
01:07:02,400 --> 01:07:07,200
code to do some c plus plus programming
1545
01:07:05,119 --> 01:07:09,838
and this is really cool if you want you
1546
01:07:07,199 --> 01:07:11,759
can check out how to use it on linux and
1547
01:07:09,838 --> 01:07:13,519
you're going to have instructions on how
1548
01:07:11,760 --> 01:07:15,440
to do this but we will do this in the
1549
01:07:13,519 --> 01:07:18,239
next lecture and show you how to
1550
01:07:15,440 --> 01:07:20,798
configure visual studio code to use the
1551
01:07:18,239 --> 01:07:22,798
compilers that we have installed in a
1552
01:07:20,798 --> 01:07:25,038
previous lecture so we're going to tell
1553
01:07:22,798 --> 01:07:26,719
visual studio code to use our client
1554
01:07:25,039 --> 01:07:29,039
compiler we're going to tell it to use
1555
01:07:26,719 --> 01:07:31,038
our gcc compiler and we will have the
1556
01:07:29,039 --> 01:07:33,760
flexibility to come to terminal and
1557
01:07:31,039 --> 01:07:35,920
choose which compiler we want to use and
1558
01:07:33,760 --> 01:07:38,640
we're going to do all this in the next
1559
01:07:35,920 --> 01:07:40,798
lecture so go ahead and finish up here
1560
01:07:40,798 --> 01:07:45,920
in this lecture we're going to configure
1561
01:07:42,880 --> 01:07:49,039
our visual studio code editor to use the
1562
01:07:45,920 --> 01:07:51,039
compilers that we just installed in a
1563
01:07:49,039 --> 01:07:53,119
few previous lectures so we will be able
1564
01:07:51,039 --> 01:07:56,400
to type our code in our visual studio
1565
01:07:53,119 --> 01:07:58,640
code editor just like we do here and we
1566
01:07:56,400 --> 01:08:01,838
will pass the code through the compiler
1567
01:07:58,639 --> 01:08:04,400
to generate a binary that can in turn
1568
01:08:01,838 --> 01:08:06,318
run on our linux system here this is
1569
01:08:04,400 --> 01:08:08,400
what we want to do so we want visual
1570
01:08:06,318 --> 01:08:10,639
studio code to use the compilers that we
1571
01:08:08,400 --> 01:08:13,680
installed so let's head over to our
1572
01:08:10,639 --> 01:08:15,920
linux box and do this okay here i am on
1573
01:08:13,679 --> 01:08:18,559
my linux box this is the current
1574
01:08:15,920 --> 01:08:21,039
directory where i am at this is where i
1575
01:08:18,560 --> 01:08:24,319
am going to do my things here so i am
1576
01:08:21,039 --> 01:08:26,798
going to create a folder and call it a
1577
01:08:24,319 --> 01:08:27,960
template project let's do this we're
1578
01:08:27,960 --> 01:08:33,279
mkdir and we're going to say c plus plus
1579
01:08:31,039 --> 01:08:34,640
20 template project i think this is
1580
01:08:34,640 --> 01:08:39,039
or we can even say cpp because i'm not
1581
01:08:37,198 --> 01:08:41,678
sure the plus signs here are not going
1582
01:08:39,039 --> 01:08:44,319
to give us a problem let's play it on
1583
01:08:41,679 --> 01:08:46,960
the safe side and we are going to create
1584
01:08:44,319 --> 01:08:48,319
this folder and we're going to cd into
1585
01:08:48,319 --> 01:08:52,880
okay once we are in this folder we're
1586
01:08:50,560 --> 01:08:55,440
going to open this folder in visual
1587
01:08:52,880 --> 01:08:56,239
studio code and the easiest way to do
1588
01:08:56,238 --> 01:09:00,399
once you have visual studio code
1589
01:08:57,679 --> 01:09:01,359
installed is just to type code and type
1590
01:09:01,359 --> 01:09:05,440
and you will basically be telling the
1591
01:09:03,198 --> 01:09:08,238
operating system to open visual studio
1592
01:09:05,439 --> 01:09:10,000
code in the current folder here so i am
1593
01:09:10,000 --> 01:09:15,520
and this is going to kick it open and i
1594
01:09:13,359 --> 01:09:18,079
trust this folder because i just created
1595
01:09:15,520 --> 01:09:20,080
it and we are in our project here the
1596
01:09:18,079 --> 01:09:23,359
very first thing we're going to do is to
1597
01:09:20,079 --> 01:09:25,519
create a main cpp file so let's do that
1598
01:09:23,359 --> 01:09:26,798
and i did that by clicking on the plus
1599
01:09:26,798 --> 01:09:32,479
and i typed in the name of the file and
1600
01:09:29,920 --> 01:09:34,640
i am going to put in some dummy code
1601
01:09:32,479 --> 01:09:36,639
here that we want to use our starter
1602
01:09:36,640 --> 01:09:41,359
iostream and we're going to put in our
1603
01:09:39,520 --> 01:09:43,199
code here we're going to say main and
1604
01:09:41,359 --> 01:09:45,120
again you don't have to type all this if
1605
01:09:43,198 --> 01:09:47,278
you want you can get the code from the
1606
01:09:45,119 --> 01:09:49,278
resource section on the lecture so you
1607
01:09:47,279 --> 01:09:51,600
can copy the code paste that in here and
1608
01:09:49,279 --> 01:09:53,359
be on your merry way because we haven't
1609
01:09:51,600 --> 01:09:55,440
really started learning about c plus
1610
01:09:53,359 --> 01:09:57,760
plus we are setting up the environment
1611
01:09:55,439 --> 01:09:59,678
so don't stress yourself here
1612
01:09:57,760 --> 01:10:02,480
this is just some simple code to test
1613
01:09:59,679 --> 01:10:04,800
our compilers to see if they support c
1614
01:10:02,479 --> 01:10:07,359
plus plus 20 because we want to use the
1615
01:10:04,800 --> 01:10:10,400
letter standard we can get our hands on
1616
01:10:10,399 --> 01:10:14,238
type exactly what i typed here so we're
1617
01:10:14,238 --> 01:10:18,639
and we're going to put this weird
1618
01:10:15,920 --> 01:10:19,760
operator and say 20 and we want to see
1619
01:10:19,760 --> 01:10:24,239
madness here is greater than zero this
1620
01:10:22,238 --> 01:10:27,919
is what we want to do and we're going to
1621
01:10:24,238 --> 01:10:30,479
say stdc out and the same result okay so
1622
01:10:27,920 --> 01:10:31,920
type exactly what i type here and as we
1623
01:10:30,479 --> 01:10:34,000
progress in the course we're going to
1624
01:10:31,920 --> 01:10:38,319
make sense of all these madness we see
1625
01:10:34,000 --> 01:10:40,880
here so now that we have a cpp file
1626
01:10:38,319 --> 01:10:44,319
containing the code for our c plus plus
1627
01:10:40,880 --> 01:10:46,239
program we want to compile this and we
1628
01:10:44,319 --> 01:10:48,158
need to tell visual studio code which
1629
01:10:46,238 --> 01:10:50,639
compiler it's going to use to compile
1630
01:10:48,158 --> 01:10:52,559
this program here to give us a binary
1631
01:10:50,640 --> 01:10:55,520
that we can run so what we're going to
1632
01:10:55,520 --> 01:10:58,960
and we're going to say that we want to
1633
01:10:58,960 --> 01:11:02,880
and the task is really a set of
1634
01:11:00,960 --> 01:11:05,920
instructions you give to visual studio
1635
01:11:02,880 --> 01:11:08,960
code on how to take your c plus plus
1636
01:11:05,920 --> 01:11:11,199
project and turn that into a binary that
1637
01:11:08,960 --> 01:11:12,800
can run on that system here so that's
1638
01:11:11,198 --> 01:11:15,279
what we want to do we want to tell
1639
01:11:12,800 --> 01:11:16,719
visual studio code which compiler it's
1640
01:11:15,279 --> 01:11:18,800
going to use we're going to configure
1641
01:11:16,719 --> 01:11:21,279
task here and you're going to see that
1642
01:11:18,800 --> 01:11:24,079
it's going to discover many compilers on
1643
01:11:21,279 --> 01:11:27,599
my system here you see we have clan 10
1644
01:11:24,079 --> 01:11:30,719
clang 11 clan 12 and we should also have
1645
01:11:27,600 --> 01:11:33,679
gcc 11 if we keep scrolling down we're
1646
01:11:30,719 --> 01:11:36,399
going to find these little guys here i
1647
01:11:33,679 --> 01:11:38,079
have many compilers on this system so i
1648
01:11:40,399 --> 01:11:44,319
which is installed through home brew
1649
01:11:42,479 --> 01:11:46,879
this is what i'm going to choose here
1650
01:11:44,319 --> 01:11:48,960
you say it's saying g plus plus 11 but
1651
01:11:46,880 --> 01:11:51,359
if you have access to g plus plus 10 you
1652
01:11:48,960 --> 01:11:53,198
can also use that it's going to work
1653
01:11:51,359 --> 01:11:55,759
with what we want to do in this course
1654
01:11:53,198 --> 01:11:58,559
here mostly so i am going to choose the
1655
01:11:58,560 --> 01:12:04,719
and this is going to set up an entry in
1656
01:12:01,198 --> 01:12:06,719
our tasks dot json file to build and run
1657
01:12:04,719 --> 01:12:09,119
this program here and that's what we're
1658
01:12:06,719 --> 01:12:12,480
going to do okay you see it is using
1659
01:12:09,119 --> 01:12:14,559
this particular compiler and one thing
1660
01:12:12,479 --> 01:12:16,559
we can do before we try and build this
1661
01:12:14,560 --> 01:12:17,760
we can change the level here to make it
1662
01:12:17,760 --> 01:12:21,360
more descriptive so we're going to save
1663
01:12:27,679 --> 01:12:33,199
and this is all we can save this
1664
01:12:30,079 --> 01:12:35,198
and we can close this json file and if
1665
01:12:33,198 --> 01:12:37,678
we bring up a terminal window we can do
1666
01:12:35,198 --> 01:12:40,639
that by hitting terminal here and
1667
01:12:40,640 --> 01:12:46,000
this is going to open up the current
1668
01:12:42,319 --> 01:12:49,039
location for example if we do pwd in
1669
01:12:46,000 --> 01:12:50,399
this terminal here let's use lowercase i
1670
01:12:49,039 --> 01:12:52,479
think that's what it wants we're going
1671
01:12:50,399 --> 01:12:55,119
to see the location here this is my
1672
01:12:52,479 --> 01:12:56,559
project so to build i can come to
1673
01:12:56,560 --> 01:13:02,400
and i choose run task and i am going to
1674
01:12:59,359 --> 01:13:05,439
choose the task to compile with my gcc
1675
01:13:02,399 --> 01:13:08,399
installation here if i choose this
1676
01:13:05,439 --> 01:13:09,599
it is going to kick off the weld process
1677
01:13:08,399 --> 01:13:11,920
and you're going to see that the
1678
01:13:09,600 --> 01:13:13,280
gibberish i have here is not supported
1679
01:13:13,279 --> 01:13:18,079
compiler is not configured to use the c
1680
01:13:15,760 --> 01:13:22,400
plus plus 20. so all we really need to
1681
01:13:18,079 --> 01:13:24,559
do is go back to our command and tell it
1682
01:13:22,399 --> 01:13:26,960
to use c plus plus 20. and we can do
1683
01:13:24,560 --> 01:13:29,840
that by passing a specific instruction
1684
01:13:26,960 --> 01:13:32,000
to the compiler to use c plus plus 20
1685
01:13:29,840 --> 01:13:35,039
like we do on line 10 here so we're
1686
01:13:32,000 --> 01:13:36,640
going to say std equals c plus plus 20.
1687
01:13:35,039 --> 01:13:38,158
we are going to save this a little bit
1688
01:13:36,640 --> 01:13:39,679
and i really wanted you to see this
1689
01:13:38,158 --> 01:13:41,839
problem here because many people are
1690
01:13:39,679 --> 01:13:43,679
going to forget this and we're going to
1691
01:13:41,840 --> 01:13:46,239
try and build again making sure we are
1692
01:13:43,679 --> 01:13:49,119
selecting the main cpp file here so
1693
01:13:46,238 --> 01:13:51,359
let's go to terminal run task and use
1694
01:13:51,359 --> 01:13:55,839
and wait for it to do its thing you're
1695
01:13:53,198 --> 01:13:58,000
going to see that the world now finished
1696
01:13:58,000 --> 01:14:02,960
and if we come back to our terminal here
1697
01:14:00,640 --> 01:14:05,280
and do ls we're going to see that we
1698
01:14:05,279 --> 01:14:10,319
and if we run it we should see a zero so
1699
01:14:10,319 --> 01:14:14,238
and if we run it we're going to see a
1700
01:14:11,760 --> 01:14:16,480
zero meaning that our program is running
1701
01:14:14,238 --> 01:14:19,599
and working correctly we are able to
1702
01:14:16,479 --> 01:14:22,959
compile a c plus plus project on a linux
1703
01:14:19,600 --> 01:14:24,960
system here now if you want to see how i
1704
01:14:22,960 --> 01:14:27,920
came up with the information to use the
1705
01:14:24,960 --> 01:14:30,319
tax json file please come back to the
1706
01:14:30,319 --> 01:14:35,439
and choose the c and c plus plus
1707
01:14:33,198 --> 01:14:36,559
extension we're going to click on this
1708
01:14:35,439 --> 01:14:38,960
and we're going to see all the
1709
01:14:36,560 --> 01:14:41,760
instructions on how to use this guy on
1710
01:14:38,960 --> 01:14:43,119
the linux system here so gcc on linux we
1711
01:14:44,158 --> 01:14:48,399
information here now you can read up on
1712
01:14:46,319 --> 01:14:51,039
all this if you want but what i am going
1713
01:14:48,399 --> 01:14:52,879
to do is go to visual studio code and
1714
01:14:51,039 --> 01:14:55,359
show you exactly what you need to do to
1715
01:14:52,880 --> 01:14:57,920
get this to work what i want to do in
1716
01:14:55,359 --> 01:15:00,719
there is set this up to compile
1717
01:14:57,920 --> 01:15:03,440
everything in my what i want to do is to
1718
01:15:00,719 --> 01:15:06,640
set what i really want to do is to what
1719
01:15:03,439 --> 01:15:09,198
i really wanted to do is to set this up
1720
01:15:06,640 --> 01:15:11,760
so that it compiles every single cpp
1721
01:15:09,198 --> 01:15:13,678
file in my directory here and i can do
1722
01:15:13,679 --> 01:15:17,199
a set of instructions i had prepared
1723
01:15:17,198 --> 01:15:21,119
so we're going to tell it to compile in
1724
01:15:18,960 --> 01:15:24,158
c plus plus 20 mode we're going to tell
1725
01:15:21,119 --> 01:15:26,158
it to compile every single cpp file in
1726
01:15:24,158 --> 01:15:28,719
this directory and then we're going to
1727
01:15:26,158 --> 01:15:31,119
specify the output file name for our
1728
01:15:28,719 --> 01:15:33,439
binary now this is code i used on
1729
01:15:31,119 --> 01:15:35,279
windows i need to adapt it to be
1730
01:15:37,279 --> 01:15:42,399
documentation there and we can
1731
01:15:40,479 --> 01:15:44,238
we can scroll down a little bit and
1732
01:15:42,399 --> 01:15:46,000
we're going to see that they use
1733
01:15:44,238 --> 01:15:47,678
backslashes here so that's what we're
1734
01:15:46,000 --> 01:15:50,719
going to use in visual video code to
1735
01:15:47,679 --> 01:15:53,760
play it safe so we can say this
1736
01:15:50,719 --> 01:15:56,158
a backslash and this is a backslash
1737
01:15:53,760 --> 01:15:57,840
and we will try and build this and we're
1738
01:15:56,158 --> 01:16:00,079
going to see what happens here this is
1739
01:15:57,840 --> 01:16:02,239
going to build our project in c plus
1740
01:16:00,079 --> 01:16:04,719
plus 20 mode we're going to be building
1741
01:16:02,238 --> 01:16:07,279
every single cpp file in the project and
1742
01:16:04,719 --> 01:16:09,439
the output will be called rooster this
1743
01:16:07,279 --> 01:16:10,559
is what we want to do here let's save
1744
01:16:10,560 --> 01:16:15,840
and i am going to close this json file
1745
01:16:13,600 --> 01:16:19,679
and i will bring up my terminal by
1746
01:16:15,840 --> 01:16:23,119
coming to view and save a terminal here
1747
01:16:19,679 --> 01:16:25,359
and i can remove the main.exe file or
1748
01:16:23,119 --> 01:16:28,880
the main executable i had in there if i
1749
01:16:25,359 --> 01:16:31,839
do lsuc it's gone but now if we try and
1750
01:16:28,880 --> 01:16:33,199
compile with the gcc compiler
1751
01:16:31,840 --> 01:16:35,279
we're going to see what happens you see
1752
01:16:33,198 --> 01:16:37,678
the world is good and we have a binary
1753
01:16:35,279 --> 01:16:39,920
called rooster and we can run it here if
1754
01:16:37,679 --> 01:16:41,760
we do rooster we're going to see it run
1755
01:16:39,920 --> 01:16:43,760
and give us a zero and this is really
1756
01:16:41,760 --> 01:16:45,679
all we need to do now we have this
1757
01:16:45,679 --> 01:16:50,640
our gcc compiler but we wanted the same
1758
01:16:48,238 --> 01:16:52,238
for a clanger compiler and we want the
1759
01:16:50,640 --> 01:16:54,880
flexibility to be able to switch
1760
01:16:52,238 --> 01:16:57,439
compilers by coming here and just
1761
01:16:54,880 --> 01:16:59,119
selecting the right task so let's do
1762
01:16:57,439 --> 01:17:01,039
this we're going to configure clan we're
1763
01:16:59,119 --> 01:17:03,198
going to come to terminal we want to
1764
01:17:01,039 --> 01:17:04,800
configure a task and we're going to
1765
01:17:03,198 --> 01:17:07,599
choose the best we have in terms of
1766
01:17:04,800 --> 01:17:09,679
clang that happens to be clang
1767
01:17:07,600 --> 01:17:11,840
plus plus 12 here so we're going to
1768
01:17:09,679 --> 01:17:14,119
choose this and this is going to add an
1769
01:17:14,119 --> 01:17:18,960
tasks.json file we're going to change
1770
01:17:16,640 --> 01:17:21,199
this to say that we want to build with
1771
01:17:18,960 --> 01:17:23,840
clan let's do that we're going to say
1772
01:17:26,359 --> 01:17:30,479
12.0.1 if i remember correctly but we
1773
01:17:30,479 --> 01:17:36,000
our terminal here let's go to terminal
1774
01:17:33,039 --> 01:17:37,840
and we're going to say clang plus plus
1775
01:17:36,000 --> 01:17:39,920
and 12 that's the version and we're
1776
01:17:37,840 --> 01:17:42,319
going to ask it what's your version it's
1777
01:17:39,920 --> 01:17:44,560
going to tell us in detail and if we
1778
01:17:42,319 --> 01:17:47,599
wait we're going to see this speed out
1779
01:17:44,560 --> 01:17:50,480
on the terminal here and this happens to
1780
01:17:50,479 --> 01:17:53,519
so that's what we're going to say in our
1781
01:18:00,319 --> 01:18:05,599
and uh this is really all all we need to
1782
01:18:05,600 --> 01:18:10,560
to build in c plus plus 20 mod exactly
1783
01:18:07,920 --> 01:18:14,079
what we did for gcc here so i am going
1784
01:18:10,560 --> 01:18:16,239
to copy this and put that in my
1785
01:18:14,079 --> 01:18:18,158
arguments here i'm i am going to take
1786
01:18:16,238 --> 01:18:20,879
out whatever i had in there i am going
1787
01:18:18,158 --> 01:18:23,039
to put in my new things and let's see if
1788
01:18:20,880 --> 01:18:26,159
this compiler works now we're going to
1789
01:18:23,039 --> 01:18:28,640
save our tasks.json file and come back
1790
01:18:26,158 --> 01:18:30,719
to the cpp file we're going to bring up
1791
01:18:33,198 --> 01:18:38,238
and remove rooster because we wanted to
1792
01:18:35,600 --> 01:18:42,079
build a new one with our clank compiler
1793
01:18:38,238 --> 01:18:43,759
and we will come to terminal run task
1794
01:18:42,079 --> 01:18:46,640
now we're going to choose to build with
1795
01:18:43,760 --> 01:18:48,719
clang 12.0 we're going to fix this in a
1796
01:18:46,640 --> 01:18:51,039
minute but if we do this we're going to
1797
01:18:48,719 --> 01:18:53,359
see that our weld process is going to
1798
01:18:51,039 --> 01:18:55,519
start it's going to be building with our
1799
01:18:53,359 --> 01:18:57,839
clan compiler it's going to be using c
1800
01:18:55,520 --> 01:19:00,480
plus plus 20. it's going to be building
1801
01:18:57,840 --> 01:19:03,279
every single cpp file in this location
1802
01:19:00,479 --> 01:19:05,359
here and the output of the world will be
1803
01:19:03,279 --> 01:19:07,920
a binary called rooster that we have
1804
01:19:05,359 --> 01:19:09,759
right here so the build is good if we do
1805
01:19:07,920 --> 01:19:12,239
ls we're going to find rooster and if we
1806
01:19:09,760 --> 01:19:15,119
run it it's going to say zero exactly as
1807
01:19:12,238 --> 01:19:17,919
we expect here and we have visual studio
1808
01:19:15,119 --> 01:19:20,158
code properly configured to use our two
1809
01:19:17,920 --> 01:19:22,719
compilers the client compiler and the
1810
01:19:20,158 --> 01:19:24,719
gcc compiler let's come back to our
1811
01:19:22,719 --> 01:19:26,880
configuration and change this to say
1812
01:19:26,880 --> 01:19:32,719
to be super clear on the version we have
1813
01:19:29,600 --> 01:19:35,280
we can close our json file here
1814
01:19:32,719 --> 01:19:38,640
and come and try to build again if we do
1815
01:19:35,279 --> 01:19:40,639
terminal and run task we will have our
1816
01:19:38,640 --> 01:19:42,159
compiler here ignore all these things i
1817
01:19:40,640 --> 01:19:44,880
think visual video code is going to give
1818
01:19:42,158 --> 01:19:47,439
you duplicates but you can choose
1819
01:19:44,880 --> 01:19:48,880
the version that says what you want and
1820
01:19:47,439 --> 01:19:52,079
it is going to work so we're going to
1821
01:19:48,880 --> 01:19:54,480
choose gcc oh we are saying gcc but we
1822
01:19:52,079 --> 01:19:56,559
want clang here so let's say that we
1823
01:19:54,479 --> 01:19:58,079
want to build with clan we're going to
1824
01:20:02,198 --> 01:20:06,638
12.0.0 this is right here so we're going
1825
01:20:06,639 --> 01:20:11,039
and it's going to build successfully and
1826
01:20:08,399 --> 01:20:11,839
we will have our binary here if we run
1827
01:20:11,840 --> 01:20:16,079
it is going to say zero and this is
1828
01:20:13,439 --> 01:20:17,599
really what we need to do here so this
1829
01:20:16,079 --> 01:20:19,039
is really all i had to share in this
1830
01:20:17,600 --> 01:20:20,320
lecture showing you how you can
1831
01:20:20,319 --> 01:20:24,719
visual studio code to compile using the
1832
01:20:22,399 --> 01:20:26,799
compilers that we have installed another
1833
01:20:24,719 --> 01:20:30,480
thing you can do to make your experience
1834
01:20:26,800 --> 01:20:34,079
better is come back to view and select
1835
01:20:30,479 --> 01:20:36,238
command palette here and you can do c
1836
01:20:36,238 --> 01:20:40,638
configurations through a user interface
1837
01:20:39,279 --> 01:20:42,479
and if we do this you're going to see
1838
01:20:40,639 --> 01:20:45,359
that this is going to create a cpp
1839
01:20:42,479 --> 01:20:46,479
properties json file so this is where we
1840
01:20:46,479 --> 01:20:50,238
what kind of intelligence what kind of
1841
01:20:48,560 --> 01:20:53,600
what kind of compiler is going to be
1842
01:20:50,238 --> 01:20:55,119
used we can do all these things here so
1843
01:20:53,600 --> 01:20:57,360
we're going to leave it to the default
1844
01:20:55,119 --> 01:20:59,840
it's on our linux system it's going to
1845
01:20:57,359 --> 01:21:00,719
be using gcc 11 which is the best we
1846
01:21:02,719 --> 01:21:08,800
but uh one thing you should note in this
1847
01:21:06,800 --> 01:21:10,800
course here is the c plus plus standard
1848
01:21:08,800 --> 01:21:13,600
we wanted to use so we wanted to use z
1849
01:21:10,800 --> 01:21:16,000
plus plus 20 and we want visual studio
1850
01:21:16,719 --> 01:21:21,920
format our main cpp file based on the c
1851
01:21:19,600 --> 01:21:23,440
plus plus 20 standard year that's what
1852
01:21:21,920 --> 01:21:24,880
we can achieve with this so once you
1853
01:21:27,520 --> 01:21:30,800
and if we go back to the main cpp file
1854
01:21:30,800 --> 01:21:35,360
that this is no longer flagged as a
1855
01:21:33,520 --> 01:21:37,280
problem with squiggly lines visual
1856
01:21:35,359 --> 01:21:39,279
studio code is properly understanding
1857
01:21:37,279 --> 01:21:40,880
what is happening here and this is
1858
01:21:39,279 --> 01:21:42,880
something you can do to make your
1859
01:21:40,880 --> 01:21:45,119
experience a little bit better
1860
01:21:42,880 --> 01:21:47,840
okay now that we have this project set
1861
01:21:45,119 --> 01:21:50,639
up and ready on linux we're going to be
1862
01:21:47,840 --> 01:21:53,600
reusing this as a template project every
1863
01:21:50,639 --> 01:21:54,960
time we start something new on linux so
1864
01:21:53,600 --> 01:21:57,600
every time we want to create a new
1865
01:21:54,960 --> 01:21:59,840
project we will grab this entire folder
1866
01:21:57,600 --> 01:22:03,280
so for example we will come to our
1867
01:21:59,840 --> 01:22:06,400
terminal here and go up a little bit
1868
01:22:03,279 --> 01:22:08,319
so cd and go up one level and if we do
1869
01:22:06,399 --> 01:22:11,519
ls we're going to have our c plus plus
1870
01:22:08,319 --> 01:22:14,158
20 template project we will copy it and
1871
01:22:11,520 --> 01:22:15,520
rename it to start a new project and
1872
01:22:14,158 --> 01:22:17,519
that's going to give us all the
1873
01:22:15,520 --> 01:22:19,920
configuration that we did we don't need
1874
01:22:17,520 --> 01:22:22,800
to reconfigure the compilers or whatever
1875
01:22:19,920 --> 01:22:25,039
it is going to work right out of the box
1876
01:22:22,800 --> 01:22:27,600
and that's really what we did here we
1877
01:22:25,039 --> 01:22:30,158
set up a template project that we will
1878
01:22:27,600 --> 01:22:32,800
be reusing all over again in the course
1879
01:22:30,158 --> 01:22:35,439
as we progress learning about c plus
1880
01:22:32,800 --> 01:22:37,520
plus 20. i am going to stop here in this
1881
01:22:35,439 --> 01:22:39,519
lecture the next one i am going to show
1882
01:22:37,520 --> 01:22:42,800
you how you can set up a development
1883
01:22:39,520 --> 01:22:45,040
environment on the mac os system
1884
01:22:42,800 --> 01:22:46,320
go ahead and finish up here and meet me
1885
01:22:46,319 --> 01:22:50,799
in this video i am going to show you how
1886
01:22:48,079 --> 01:22:54,000
to install c plus plus compiler on your
1887
01:22:50,800 --> 01:22:56,639
mac os system and we have a bunch of
1888
01:22:54,000 --> 01:22:59,198
options on the mac we can install the
1889
01:22:56,639 --> 01:23:00,319
gcc compiler we can install the clang
1890
01:23:00,319 --> 01:23:05,519
of the apple company or we can install
1891
01:23:03,119 --> 01:23:07,519
the clangle vm version all these are
1892
01:23:05,520 --> 01:23:09,679
options and i will show you how to
1893
01:23:07,520 --> 01:23:12,239
install these i don't have access to a
1894
01:23:09,679 --> 01:23:14,719
mac device so i won't really be able to
1895
01:23:12,238 --> 01:23:17,039
install xcode and show you but i think
1896
01:23:14,719 --> 01:23:19,119
you can manage if you are using a mac
1897
01:23:17,039 --> 01:23:21,359
system it is nothing complicated you
1898
01:23:19,119 --> 01:23:23,039
just have to go to the apple store and
1899
01:23:21,359 --> 01:23:27,039
click on xcode and it is going to
1900
01:23:23,039 --> 01:23:28,960
install for a gcc and clang llvm i will
1901
01:23:27,039 --> 01:23:31,439
show you how to do this using the
1902
01:23:28,960 --> 01:23:34,399
homebrew package manager which is also
1903
01:23:31,439 --> 01:23:36,719
going to make this super easy okay so
1904
01:23:34,399 --> 01:23:39,519
let's head over to our browser and we
1905
01:23:36,719 --> 01:23:42,800
have a good link here from digitalocean
1906
01:23:39,520 --> 01:23:45,360
on how to install and use homobrew on a
1907
01:23:42,800 --> 01:23:47,679
mac os system this is a really validated
1908
01:23:45,359 --> 01:23:50,158
link you can see that right here and you
1909
01:23:47,679 --> 01:23:52,158
can read up on this if you are using a
1910
01:23:50,158 --> 01:23:54,879
mac system i am going to share the link
1911
01:23:52,158 --> 01:23:57,599
here in the resources section of the
1912
01:23:54,880 --> 01:24:00,000
course and to use this we will go
1913
01:23:57,600 --> 01:24:01,760
through the mac os terminal and it is
1914
01:24:00,000 --> 01:24:04,960
nothing complicated you can search for
1915
01:24:01,760 --> 01:24:07,520
it and open it up and after you do this
1916
01:24:04,960 --> 01:24:10,079
you will have to install the tools
1917
01:24:07,520 --> 01:24:12,639
needed to build things on the mac os
1918
01:24:10,079 --> 01:24:15,679
system and that's going to install xcode
1919
01:24:12,639 --> 01:24:18,239
here so grab the command here and run it
1920
01:24:15,679 --> 01:24:20,560
in your terminal and this is going to
1921
01:24:18,238 --> 01:24:22,158
install everything you need and after
1922
01:24:20,560 --> 01:24:24,800
you have this installed you're going to
1923
01:24:22,158 --> 01:24:29,198
install home brew i do recommend coming
1924
01:24:24,800 --> 01:24:32,320
up to the website here for homebrew and
1925
01:24:29,198 --> 01:24:34,960
clicking on this copy icon here this is
1926
01:24:32,319 --> 01:24:36,559
going to copy the entire thing and you
1927
01:24:36,560 --> 01:24:40,239
and once you copy it it is going to give
1928
01:24:40,238 --> 01:24:44,799
and you can go in the terminal on your
1929
01:24:42,158 --> 01:24:46,399
mac os system i am using a linux
1930
01:24:44,800 --> 01:24:49,199
terminal here and then you're going to
1931
01:24:46,399 --> 01:24:51,039
paste this command in here and hit enter
1932
01:24:49,198 --> 01:24:52,719
once you do that you will be prompted to
1933
01:24:51,039 --> 01:24:54,880
put in the password it's going to tell
1934
01:24:52,719 --> 01:24:56,560
you that it needs to install homebrew
1935
01:24:54,880 --> 01:24:58,880
and you are basically going to wait for
1936
01:24:56,560 --> 01:25:00,719
this to finish i have to warn you this
1937
01:24:58,880 --> 01:25:02,880
is going to take some time even if you
1938
01:25:00,719 --> 01:25:04,719
have a good internet connection this is
1939
01:25:02,880 --> 01:25:06,480
going to take some time so be patient
1940
01:25:04,719 --> 01:25:08,639
here when it's done it's going to tell
1941
01:25:06,479 --> 01:25:11,119
you that it is finished and you will be
1942
01:25:08,639 --> 01:25:13,920
ready to install the gcc compiler and
1943
01:25:11,119 --> 01:25:16,000
the client llvm compiler through your
1944
01:25:13,920 --> 01:25:18,158
homebrew installation here i am not
1945
01:25:16,000 --> 01:25:20,158
going to click on this because
1946
01:25:18,158 --> 01:25:22,399
i already have this installed on my
1947
01:25:20,158 --> 01:25:24,719
linux system here let's go back to the
1948
01:25:22,399 --> 01:25:27,279
link and see what they say next so after
1949
01:25:24,719 --> 01:25:30,880
you paste that in it's going to install
1950
01:25:27,279 --> 01:25:32,479
and after that you will see that
1951
01:25:30,880 --> 01:25:33,679
homebrew is going to be installed on
1952
01:25:35,039 --> 01:25:38,800
you can use home brew to start
1953
01:25:36,880 --> 01:25:41,119
installing and upgrading packages you
1954
01:25:38,800 --> 01:25:42,639
can really read up on this but what i
1955
01:25:42,639 --> 01:25:47,600
is that you can use home brew to install
1956
01:25:44,880 --> 01:25:49,840
the gcc compiler and the clang ll vm
1957
01:25:47,600 --> 01:25:52,840
compiler so if we come to the search
1958
01:25:52,840 --> 01:25:57,840
broom we're going to find instructions
1959
01:25:55,279 --> 01:26:00,639
on how to install this so all you need
1960
01:25:57,840 --> 01:26:02,159
to do really is to say brew install gcc
1961
01:26:00,639 --> 01:26:04,480
this is going to install the latest
1962
01:26:04,479 --> 01:26:09,919
if we come here and say llvm or clank
1963
01:26:11,600 --> 01:26:17,360
we can find that right here llvm
1964
01:26:15,679 --> 01:26:19,359
and it is going to give us instructions
1965
01:26:17,359 --> 01:26:20,238
on how to install this and all you have
1966
01:26:20,238 --> 01:26:25,439
is brew install llvm and this is going
1967
01:26:22,719 --> 01:26:28,158
to install these two compilers on your
1968
01:26:25,439 --> 01:26:30,799
mac system so once you do that you will
1969
01:26:28,158 --> 01:26:33,198
have them stored somewhere let's go to
1970
01:26:30,800 --> 01:26:35,920
the install link and we're going to see
1971
01:26:33,198 --> 01:26:38,879
that homebrew is basically going to be
1972
01:26:35,920 --> 01:26:41,520
installed into things in your user local
1973
01:26:38,880 --> 01:26:43,760
directory on a mac device please tell me
1974
01:26:41,520 --> 01:26:46,320
if this is true for your case and if you
1975
01:26:43,760 --> 01:26:49,440
have a problem we'll try and go through
1976
01:26:46,319 --> 01:26:51,119
that and fix that up so if you are on a
1977
01:26:49,439 --> 01:26:53,439
mac i would really recommend going
1978
01:26:51,119 --> 01:26:55,198
through this to install homebrew once
1979
01:26:53,439 --> 01:26:58,638
you have that installed you will go
1980
01:26:55,198 --> 01:27:01,519
through that to install both of the llvm
1981
01:26:58,639 --> 01:27:03,359
compiler and the gcc compiler and that's
1982
01:27:01,520 --> 01:27:05,920
going to give you the latest versions
1983
01:27:03,359 --> 01:27:08,559
for these compilers to find out if they
1984
01:27:05,920 --> 01:27:11,039
will installed you can go in your user
1985
01:27:08,560 --> 01:27:12,800
local directory and you can hunt through
1986
01:27:11,039 --> 01:27:15,439
these compilers and you're going to find
1987
01:27:12,800 --> 01:27:17,440
binaries for them and start using them
1988
01:27:15,439 --> 01:27:19,198
to build your c plus plus applications
1989
01:27:17,439 --> 01:27:21,839
you okay so by now i am going to
1990
01:27:19,198 --> 01:27:24,399
consider that you have both gcc and a
1991
01:27:21,840 --> 01:27:27,039
clang installed on your mac system the
1992
01:27:24,399 --> 01:27:29,279
next logical thing to do is to want the
1993
01:27:27,039 --> 01:27:31,679
apple version of clang and i think
1994
01:27:29,279 --> 01:27:32,479
that's going to come as part of xcode
1995
01:27:32,479 --> 01:27:38,399
and it is going to come as a result of
1996
01:27:35,760 --> 01:27:40,239
running the command that we did before i
1997
01:27:38,399 --> 01:27:41,920
think it was this little command here
1998
01:27:40,238 --> 01:27:43,519
which is going to install everything you
1999
01:27:44,840 --> 01:27:49,920
ide so this is all i have to share in
2000
01:27:47,359 --> 01:27:52,079
this lecture again i apologize i don't
2001
01:27:49,920 --> 01:27:53,600
have access to a mac device but if you
2002
01:27:52,079 --> 01:27:56,238
have a problem you can tell me and i
2003
01:27:53,600 --> 01:27:57,440
will try to help you out and get this
2004
01:27:57,439 --> 01:28:00,799
we are going to stop here in this
2005
01:27:59,039 --> 01:28:03,279
lecture the next one we're going to see
2006
01:28:00,800 --> 01:28:06,000
how we can install xcode on your mac
2007
01:28:03,279 --> 01:28:07,439
device go ahead and finish up here
2008
01:28:07,439 --> 01:28:12,479
in this video i am going to show you how
2009
01:28:09,279 --> 01:28:15,119
to install the visual studio code editor
2010
01:28:12,479 --> 01:28:17,839
on your mac os system please know that
2011
01:28:15,119 --> 01:28:20,479
you can also use other ides like x code
2012
01:28:17,840 --> 01:28:22,560
or code lite do c plus plus development
2013
01:28:20,479 --> 01:28:25,519
but visual studio code is going to be
2014
01:28:22,560 --> 01:28:27,600
our main editor in this course here and
2015
01:28:25,520 --> 01:28:29,840
i would recommend to install it so that
2016
01:28:27,600 --> 01:28:31,920
we are doing consistent things that's
2017
01:28:29,840 --> 01:28:34,560
going to reduce chances for you to get
2018
01:28:31,920 --> 01:28:37,119
confused so we are going to head over to
2019
01:28:34,560 --> 01:28:40,159
the website for visual studio code
2020
01:28:37,119 --> 01:28:43,198
and to get there we can just type visual
2021
01:28:40,158 --> 01:28:45,599
studio code in here on in our search
2022
01:28:43,198 --> 01:28:47,919
engine and we will have a link here that
2023
01:28:45,600 --> 01:28:50,960
we can use to download our fans
2024
01:28:47,920 --> 01:28:54,800
so we are going to go down and find
2025
01:28:50,960 --> 01:28:57,279
download links for windows linux and mac
2026
01:28:54,800 --> 01:28:58,880
please use the mac download button here
2027
01:28:57,279 --> 01:29:01,198
and you're going to download the binary
2028
01:28:58,880 --> 01:29:03,840
and install it i think it is going to be
2029
01:29:01,198 --> 01:29:05,039
in the download folder by default so all
2030
01:29:05,039 --> 01:29:10,479
is drag that up in your installation
2031
01:29:07,760 --> 01:29:12,239
directory so that it becomes a runnable
2032
01:29:10,479 --> 01:29:14,479
application after you do that you're
2033
01:29:12,238 --> 01:29:17,039
going to run it and it is going to run
2034
01:29:14,479 --> 01:29:19,439
and you will have a user interface like
2035
01:29:17,039 --> 01:29:21,600
this with visual studio code opened up
2036
01:29:19,439 --> 01:29:24,000
once you have that up you will need to
2037
01:29:21,600 --> 01:29:26,239
install the c plus plus extension and
2038
01:29:24,000 --> 01:29:28,639
what you need to do is come to the
2039
01:29:26,238 --> 01:29:30,638
extensions tab here and type c and c
2040
01:29:28,639 --> 01:29:33,039
plus plus in here and you're going to
2041
01:29:30,639 --> 01:29:35,920
have an entry for microsoft click on
2042
01:29:33,039 --> 01:29:38,238
that and install this extension on your
2043
01:29:35,920 --> 01:29:40,800
system and your visual studio code
2044
01:29:38,238 --> 01:29:43,519
instance is going to be ready to handle
2045
01:29:40,800 --> 01:29:44,960
some c plus plus development and this is
2046
01:29:43,520 --> 01:29:46,800
really all i had to share in this
2047
01:29:44,960 --> 01:29:49,119
lecture showing you how you can get this
2048
01:29:46,800 --> 01:29:51,600
installed again i apologize i don't have
2049
01:29:49,119 --> 01:29:54,559
access to a mac device so i used my
2050
01:29:51,600 --> 01:29:56,639
linux box running inside window
2051
01:29:54,560 --> 01:29:58,719
subsystem for linux to show you this but
2052
01:29:56,639 --> 01:30:00,800
this is good enough i think if you have
2053
01:29:58,719 --> 01:30:03,119
a problem you can tell me and i will do
2054
01:30:00,800 --> 01:30:05,279
the best i can to help you out for now
2055
01:30:03,119 --> 01:30:07,439
we're going to stop here in this lecture
2056
01:30:05,279 --> 01:30:09,920
in the next one i will try and show you
2057
01:30:07,439 --> 01:30:12,079
how to set up a visual studio code to
2058
01:30:09,920 --> 01:30:13,440
use the compilers that we installed in
2059
01:30:13,439 --> 01:30:17,039
go ahead and finish up here and meet me
2060
01:30:17,039 --> 01:30:21,920
in this lecture i am going to try and
2061
01:30:19,039 --> 01:30:24,238
show you how to configure visual studio
2062
01:30:21,920 --> 01:30:26,639
code to use the compilers that we
2063
01:30:24,238 --> 01:30:28,638
installed on our mac system in a
2064
01:30:26,639 --> 01:30:30,639
previous lecture so we want visual
2065
01:30:28,639 --> 01:30:33,039
studio code to be able to pick up our
2066
01:30:30,639 --> 01:30:35,679
gcc compiler and use it we want it to
2067
01:30:33,039 --> 01:30:37,760
pick up our client compiler and use it
2068
01:30:35,679 --> 01:30:40,719
we also wanted to pick up our clanger
2069
01:30:37,760 --> 01:30:43,600
compiler from apple and use it to build
2070
01:30:40,719 --> 01:30:46,560
binaries that we can then run on our
2071
01:30:43,600 --> 01:30:48,880
system here so let's see how to do this
2072
01:30:46,560 --> 01:30:51,360
i have to say i don't own a mac device
2073
01:30:48,880 --> 01:30:53,279
so the best i can do here is describe
2074
01:30:51,359 --> 01:30:54,960
the process to you and if you have a
2075
01:30:53,279 --> 01:30:57,198
problem you can tell me i will do the
2076
01:30:54,960 --> 01:30:59,679
best i can to help you out okay so once
2077
01:30:57,198 --> 01:31:01,039
you have visual studio code installed
2078
01:30:59,679 --> 01:31:03,359
you're going to create a folder
2079
01:31:01,039 --> 01:31:06,079
somewhere and open visual studio code
2080
01:31:03,359 --> 01:31:08,639
from that folder and what you will
2081
01:31:06,079 --> 01:31:10,158
basically do is use the terminal to
2082
01:31:08,639 --> 01:31:12,560
navigate to a location you're going to
2083
01:31:10,158 --> 01:31:14,559
create a folder you can even call it cpp
2084
01:31:12,560 --> 01:31:17,280
template project you're going to hop
2085
01:31:14,560 --> 01:31:19,920
over into that folder and then open
2086
01:31:17,279 --> 01:31:23,840
visual studio code from that folder here
2087
01:31:19,920 --> 01:31:26,800
so for example we can hop over into cpp
2088
01:31:23,840 --> 01:31:29,600
and run code and say dot that's going to
2089
01:31:26,800 --> 01:31:31,840
open visual studio code in that folder
2090
01:31:29,600 --> 01:31:34,159
and from that folder you will create a
2091
01:31:31,840 --> 01:31:36,639
main cpp file by clicking on the plus
2092
01:31:34,158 --> 01:31:39,279
button here and you will create the cpp
2093
01:31:36,639 --> 01:31:42,639
file call it main cpp and you can put in
2094
01:31:39,279 --> 01:31:45,198
the content here and once you have this
2095
01:31:42,639 --> 01:31:48,560
the next task is going to be to set up a
2096
01:31:45,198 --> 01:31:50,719
compiler to build this little thing so
2097
01:31:48,560 --> 01:31:52,480
once you have this project you will come
2098
01:31:50,719 --> 01:31:55,198
to terminal i think there's going to be
2099
01:31:52,479 --> 01:31:58,079
a terminal menu somewhere and you will
2100
01:31:55,198 --> 01:32:00,158
choose configure tasks once you do that
2101
01:31:58,079 --> 01:32:03,279
visual studio code is smart enough to
2102
01:32:00,158 --> 01:32:05,519
scan your system and find any compiler
2103
01:32:03,279 --> 01:32:07,679
you have installed the first thing that
2104
01:32:05,520 --> 01:32:09,600
is likely to be found is the apple
2105
01:32:07,679 --> 01:32:10,880
client compiler so you're going to find
2106
01:32:10,880 --> 01:32:15,600
plus plus compiler so you can choose
2107
01:32:12,880 --> 01:32:18,000
that and you can use that for the apple
2108
01:32:15,600 --> 01:32:20,639
client compiler we are lucky we even
2109
01:32:18,000 --> 01:32:23,119
have a tutorial on how to do that so if
2110
01:32:20,639 --> 01:32:25,760
we click on our extensions tab here and
2111
01:32:26,960 --> 01:32:32,079
if we scroll down we're going to see a
2112
01:32:28,880 --> 01:32:33,600
link on using the client on mac os here
2113
01:32:32,079 --> 01:32:36,158
this is going to give us all the
2114
01:32:33,600 --> 01:32:38,719
instructions we need to use visual
2115
01:32:36,158 --> 01:32:41,599
studio code with the client compiler
2116
01:32:38,719 --> 01:32:43,119
from the apple company so if you scroll
2117
01:32:41,600 --> 01:32:45,600
down you're going to be able to read up
2118
01:32:43,119 --> 01:32:47,760
on all this but what i really want you
2119
01:32:45,600 --> 01:32:49,280
to see is the configuration file you're
2120
01:32:47,760 --> 01:32:51,679
going to see that it's going to be using
2121
01:32:49,279 --> 01:32:54,639
the clang compiler from the user bin
2122
01:32:51,679 --> 01:32:57,600
directory and this is mostly going to be
2123
01:32:54,639 --> 01:33:00,400
the clang version from the apple company
2124
01:32:57,600 --> 01:33:02,560
and sometimes you don't want this so if
2125
01:33:00,399 --> 01:33:04,960
you want to use the clang version that
2126
01:33:02,560 --> 01:33:07,199
we installed through home brew i think
2127
01:33:04,960 --> 01:33:08,800
you will need to go through the user
2128
01:33:07,198 --> 01:33:10,719
local directory because that's where
2129
01:33:08,800 --> 01:33:12,000
homebrew is going to put it you're going
2130
01:33:10,719 --> 01:33:14,158
to see that that's going to be the
2131
01:33:12,000 --> 01:33:16,479
location here from our tutorial and
2132
01:33:14,158 --> 01:33:19,679
you're going to hunt down for the clan
2133
01:33:16,479 --> 01:33:21,759
compiler and find your binary and that's
2134
01:33:19,679 --> 01:33:23,440
what we're going to be using next but
2135
01:33:21,760 --> 01:33:26,079
for the first time if you want to use
2136
01:33:23,439 --> 01:33:28,079
the clan compiler from apple this is the
2137
01:33:26,079 --> 01:33:30,639
configuration you need and all you need
2138
01:33:28,079 --> 01:33:32,158
to do in this case is change this to c
2139
01:33:32,158 --> 01:33:35,839
now once you have this configured you
2140
01:33:34,238 --> 01:33:38,959
will have the ability to come to
2141
01:33:35,840 --> 01:33:40,319
terminal let's show our files here you
2142
01:33:38,960 --> 01:33:42,158
will have the ability to come to
2143
01:33:40,319 --> 01:33:44,479
terminal and run task and choose the
2144
01:33:42,158 --> 01:33:46,719
compiler that's going to be the clang
2145
01:33:44,479 --> 01:33:48,638
compiler from apple but you can also
2146
01:33:46,719 --> 01:33:50,639
configure other compilers and all you
2147
01:33:48,639 --> 01:33:52,800
really have to do is choose them in the
2148
01:33:50,639 --> 01:33:55,760
list here and you're going to have a
2149
01:33:55,760 --> 01:34:00,079
json file to be exact let's show that up
2150
01:34:00,079 --> 01:34:03,600
and that's going to give you the
2151
01:34:01,359 --> 01:34:06,079
instructions you need to build this
2152
01:34:03,600 --> 01:34:07,679
and in most cases you will just need to
2153
01:34:06,079 --> 01:34:10,158
be careful about the path to the
2154
01:34:07,679 --> 01:34:12,239
compiler so for example if you are using
2155
01:34:10,158 --> 01:34:14,719
the gcc version you installed through
2156
01:34:12,238 --> 01:34:17,119
homo brew you're going to find that in
2157
01:34:14,719 --> 01:34:19,520
your location you're going to make sure
2158
01:34:17,119 --> 01:34:22,559
that's the correct one and you will put
2159
01:34:19,520 --> 01:34:25,520
in these instructions here to tell your
2160
01:34:22,560 --> 01:34:28,080
compiler to build every single cpp file
2161
01:34:25,520 --> 01:34:29,600
in the directory here this is what we do
2162
01:34:28,079 --> 01:34:32,079
if you use clan you're going to have
2163
01:34:29,600 --> 01:34:34,079
something like this and again i am
2164
01:34:32,079 --> 01:34:36,639
describing this to you because i don't
2165
01:34:34,079 --> 01:34:38,238
have a mac available to me right now
2166
01:34:36,639 --> 01:34:41,039
and if you have a problem you can tell
2167
01:34:38,238 --> 01:34:44,079
me we can try and sort this out okay and
2168
01:34:41,039 --> 01:34:46,399
by this time you will have the ability
2169
01:34:44,079 --> 01:34:47,760
to use your visual studio code instance
2170
01:34:47,760 --> 01:34:53,039
c plus plus programs using either the
2171
01:34:50,560 --> 01:34:55,520
apple client compiler the llvm glango
2172
01:34:53,039 --> 01:34:57,359
compiler or the gcc compiler and all
2173
01:34:55,520 --> 01:34:59,920
these are going to be compiling in c
2174
01:34:57,359 --> 01:35:02,000
plus plus 20 mode again to both you need
2175
01:34:59,920 --> 01:35:03,760
to make sure you have the file selected
2176
01:35:02,000 --> 01:35:05,920
and choose whatever compiler you want to
2177
01:35:03,760 --> 01:35:08,400
use for example if you want to use clone
2178
01:35:05,920 --> 01:35:09,920
12 from homebrew you're going to you're
2179
01:35:08,399 --> 01:35:12,000
going to select that and it is going to
2180
01:35:09,920 --> 01:35:13,600
be used to build your project and you
2181
01:35:12,000 --> 01:35:16,000
will have the ability to run your
2182
01:35:13,600 --> 01:35:18,079
projects just like we do here and it is
2183
01:35:16,000 --> 01:35:20,800
going to work let's make sure we are
2184
01:35:18,079 --> 01:35:23,118
running rooster here our binary
2185
01:35:20,800 --> 01:35:25,520
and it is going to run and printer 0 and
2186
01:35:23,118 --> 01:35:27,198
this is going to work again i am really
2187
01:35:25,520 --> 01:35:28,400
sorry i don't have a mac device
2188
01:35:28,399 --> 01:35:33,118
but this is what i have to work with now
2189
01:35:31,039 --> 01:35:35,118
if you have a problem on a mac device
2190
01:35:33,118 --> 01:35:37,920
please tell me i will do the best i can
2191
01:35:38,319 --> 01:35:43,679
in this lecture we're going to explore
2192
01:35:40,238 --> 01:35:46,158
the option to use online compilers if
2193
01:35:43,679 --> 01:35:49,520
for whatever reason we can't install a
2194
01:35:46,158 --> 01:35:51,599
radio compiler on our system and again
2195
01:35:49,520 --> 01:35:54,800
the goal is to be able to turn the code
2196
01:35:51,600 --> 01:35:57,679
we type into what looks like an ide
2197
01:35:54,800 --> 01:36:00,880
into a compiler and get a binary that we
2198
01:35:57,679 --> 01:36:03,039
can run and see the output of there are
2199
01:36:00,880 --> 01:36:05,920
a few online compilers that are very
2200
01:36:03,039 --> 01:36:08,000
popular within the c plus plus community
2201
01:36:05,920 --> 01:36:11,520
one box is one of them there is also
2202
01:36:08,000 --> 01:36:14,158
compiler explorer and kodiro but there
2203
01:36:11,520 --> 01:36:16,480
may be other ones out there if you do
2204
01:36:14,158 --> 01:36:19,198
research on your own we're going to go
2205
01:36:16,479 --> 01:36:22,000
to the browser and actually check each
2206
01:36:19,198 --> 01:36:25,839
of these out okay here we are in our
2207
01:36:22,000 --> 01:36:27,920
browser here i am on onebox.org
2208
01:36:25,840 --> 01:36:30,159
and you see that it really looks like an
2209
01:36:27,920 --> 01:36:32,960
ide inside we have the code we've been
2210
01:36:30,158 --> 01:36:36,079
running all along to make sure that it
2211
01:36:32,960 --> 01:36:38,000
compiles with c plus plus 20. on the
2212
01:36:36,079 --> 01:36:40,399
left here we have a few options we can
2213
01:36:38,000 --> 01:36:42,719
select which compiler we want to use you
2214
01:36:40,399 --> 01:36:43,839
see that there is a couple of gcc
2215
01:36:43,840 --> 01:36:48,159
you can see that this is a really nice
2216
01:36:48,158 --> 01:36:54,479
gcc versions you see we have clan 12
2217
01:36:51,920 --> 01:36:57,679
so if you want to test clang out you can
2218
01:36:54,479 --> 01:37:00,079
select it let's actually try this
2219
01:36:57,679 --> 01:37:02,880
so we're going to use clang head
2220
01:37:02,880 --> 01:37:09,199
so let's hit enter and see if clank 12
2221
01:37:09,198 --> 01:37:12,638
and you see that it really works clan
2222
01:37:12,639 --> 01:37:17,039
should support c plus plus 20 like this
2223
01:37:17,039 --> 01:37:22,399
gcc because that's what i like and you
2224
01:37:20,399 --> 01:37:25,279
can try putting different things in your
2225
01:37:22,399 --> 01:37:28,399
c plus plus code to see if the compiler
2226
01:37:25,279 --> 01:37:29,920
actually responds for example we can say
2227
01:37:37,279 --> 01:37:42,639
the message output here another good
2228
01:37:40,000 --> 01:37:45,920
thing with these online compilers is
2229
01:37:42,639 --> 01:37:48,000
that you can share this code and anybody
2230
01:37:45,920 --> 01:37:50,639
will be able to look at the code here
2231
01:37:48,000 --> 01:37:51,920
and run it so this is a really good way
2232
01:37:51,920 --> 01:37:57,679
get help from your instructor so i do
2233
01:37:55,198 --> 01:37:59,678
encourage you if you run into a problem
2234
01:37:57,679 --> 01:38:01,679
come and use one of these compilers and
2235
01:37:59,679 --> 01:38:04,480
send me the link the way you can send
2236
01:38:01,679 --> 01:38:07,039
the link you can hit on share here this
2237
01:38:04,479 --> 01:38:09,678
button here you're going to get the url
2238
01:38:07,039 --> 01:38:12,079
that you can copy and send to anybody
2239
01:38:09,679 --> 01:38:14,000
and they will be able to see your code
2240
01:38:12,079 --> 01:38:16,079
just like we're going to see here in a
2241
01:38:14,000 --> 01:38:18,399
minute okay you see that it isn't the
2242
01:38:16,079 --> 01:38:20,319
exact same thing and anybody on the
2243
01:38:18,399 --> 01:38:22,559
internet will be able to see your code
2244
01:38:20,319 --> 01:38:24,158
and try to find whatever the problem is
2245
01:38:24,158 --> 01:38:29,039
very fast one box is one compiler you
2246
01:38:27,039 --> 01:38:31,359
can play with the options that we have
2247
01:38:31,359 --> 01:38:35,679
load different libraries you see they
2248
01:38:33,520 --> 01:38:38,400
have a lot of boost libraries but this
2249
01:38:35,679 --> 01:38:40,079
is of no interest to us right now you
2250
01:38:38,399 --> 01:38:42,799
can play with it and see what you like
2251
01:38:40,079 --> 01:38:44,559
about it another one is kaliru which is
2252
01:38:42,800 --> 01:38:47,119
another online compiler you see it
2253
01:38:44,560 --> 01:38:49,280
doesn't have a lot of options like we
2254
01:38:47,118 --> 01:38:51,279
had in one box for example you cannot
2255
01:38:49,279 --> 01:38:54,719
change the compiler it's going to be
2256
01:38:51,279 --> 01:38:56,639
using g plus plus but if we hit compile
2257
01:38:54,719 --> 01:38:58,800
link and run it's going to run our code
2258
01:38:56,639 --> 01:39:00,960
and we're going to get the output here
2259
01:38:58,800 --> 01:39:02,960
again we can try and change this so that
2260
01:39:00,960 --> 01:39:04,960
you know i'm not lying to you so we can
2261
01:39:09,118 --> 01:39:15,359
std endl if you want you can hit control
2262
01:39:12,560 --> 01:39:17,600
plus on your browser and it's going to
2263
01:39:17,600 --> 01:39:24,159
and if we compile link and run
2264
01:39:21,600 --> 01:39:26,159
we should see the sky is blue in the
2265
01:39:24,158 --> 01:39:28,719
output window here this is really all
2266
01:39:26,158 --> 01:39:30,719
you can do with kolero and if you like
2267
01:39:28,719 --> 01:39:32,960
it you can donate to the developers i
2268
01:39:30,719 --> 01:39:36,399
think we have the same thing
2269
01:39:32,960 --> 01:39:39,520
on one box but it is in japanese so i
2270
01:39:39,520 --> 01:39:44,320
okay another one is compiler explorer
2271
01:39:42,238 --> 01:39:46,559
which is a really good one the main
2272
01:39:44,319 --> 01:39:49,279
purpose of this is really not giving you
2273
01:39:46,560 --> 01:39:52,239
the output it is actually seeing
2274
01:39:49,279 --> 01:39:54,399
assembly code that is generated for your
2275
01:39:52,238 --> 01:39:56,638
c plus plus code this is something a
2276
01:39:54,399 --> 01:39:58,719
little bit advanced for our purposes
2277
01:39:56,639 --> 01:40:01,679
here so we're going to ignore this we're
2278
01:39:58,719 --> 01:40:04,158
just going to be using it to test our
2279
01:40:01,679 --> 01:40:07,039
code with some of the popular compilers
2280
01:40:04,158 --> 01:40:08,879
if you look here on this drop box you
2281
01:40:07,039 --> 01:40:11,039
see that they also have a lot of
2282
01:40:08,880 --> 01:40:13,600
compilers you can use different gcc
2283
01:40:11,039 --> 01:40:16,800
compilers i think they have clan they
2284
01:40:13,600 --> 01:40:20,079
even have msvc how cool is this so you
2285
01:40:16,800 --> 01:40:22,079
can use a lot of compilers gcc clang you
2286
01:40:20,079 --> 01:40:23,760
see we have a lot of clan compilers we
2287
01:40:23,760 --> 01:40:28,960
11 here so this is a really good way to
2288
01:40:26,479 --> 01:40:30,638
try things out we're going to come back
2289
01:40:32,399 --> 01:40:38,719
and i noticed that i passed the flag of
2290
01:40:35,359 --> 01:40:41,519
c plus 20 to be able to support c plus
2291
01:40:38,719 --> 01:40:44,158
plus 20. again if i come here in my code
2292
01:40:46,639 --> 01:40:51,440
don't worry about these errors they're
2293
01:40:48,238 --> 01:40:53,439
going to go away in a minute
2294
01:40:51,439 --> 01:40:55,839
let's wait for the program to compile
2295
01:40:53,439 --> 01:40:58,799
you see that it is compiling let's wait
2296
01:40:55,840 --> 01:40:59,920
a minute the sky is white and everything
2297
01:40:59,920 --> 01:41:04,000
if you don't see this output here it is
2298
01:41:01,920 --> 01:41:06,800
possible that you didn't check this
2299
01:41:04,000 --> 01:41:08,319
checkbox run the compiled output
2300
01:41:08,319 --> 01:41:13,039
dropbox and make sure this is checked
2301
01:41:10,719 --> 01:41:16,239
and you should have a window like i have
2302
01:41:13,039 --> 01:41:18,880
here compiler explorer also allows you
2303
01:41:16,238 --> 01:41:20,000
to share your code with people on the
2304
01:41:20,000 --> 01:41:24,000
let me see if i can find the option to
2305
01:41:24,000 --> 01:41:30,399
you come to this drop box and you get a
2306
01:41:33,118 --> 01:41:38,479
and open a private window in my browser
2307
01:41:36,000 --> 01:41:39,439
here so that we know that it is some
2308
01:41:39,439 --> 01:41:44,719
browser that is going to be opening this
2309
01:41:42,399 --> 01:41:47,198
link and getting access to the same code
2310
01:41:44,719 --> 01:41:48,719
we have in compiler explorer and this is
2311
01:41:48,719 --> 01:41:52,319
and you see that we get compiler
2312
01:41:50,479 --> 01:41:53,118
explorer privacy we're going to close
2313
01:41:53,118 --> 01:41:57,198
and you see that we have the same code
2314
01:41:55,039 --> 01:41:59,198
we can try modifying this code for
2315
01:41:57,198 --> 01:42:01,439
example we can take out this third line
2316
01:41:59,198 --> 01:42:03,759
here it's going to start compiling you
2317
01:42:01,439 --> 01:42:06,000
see that it is compiling and it is going
2318
01:42:03,760 --> 01:42:08,639
to give us the output that we expect
2319
01:42:06,000 --> 01:42:11,760
from this so this is a really good tool
2320
01:42:08,639 --> 01:42:14,319
to try out if you want to share your
2321
01:42:11,760 --> 01:42:16,000
code with some people that are not close
2322
01:42:14,319 --> 01:42:18,719
to you this is a really good way to do
2323
01:42:16,000 --> 01:42:21,198
this it is also good to try out
2324
01:42:18,719 --> 01:42:24,319
different compilers for example if you
2325
01:42:21,198 --> 01:42:26,479
don't have a gcc compiler you can try it
2326
01:42:24,319 --> 01:42:29,439
out here and see if it does things for
2327
01:42:26,479 --> 01:42:32,000
example we didn't install clang on our
2328
01:42:29,439 --> 01:42:34,879
system but we can try it out and see if
2329
01:42:32,000 --> 01:42:37,359
it runs or could but make sure you pass
2330
01:42:34,880 --> 01:42:39,600
the correct flats here because you are
2331
01:42:37,359 --> 01:42:41,599
responsible for this if you pass the
2332
01:42:41,600 --> 01:42:46,639
you're going to get arrows for example
2333
01:42:49,840 --> 01:42:57,279
and oh and recognize command line option
2334
01:42:52,880 --> 01:42:59,118
std hello but if we say c plus plus 20
2335
01:42:57,279 --> 01:43:01,519
it is going to work so make sure you
2336
01:43:01,520 --> 01:43:06,320
in this lecture you're going to write
2337
01:43:03,198 --> 01:43:08,638
your first c plus 20 program and we're
2338
01:43:06,319 --> 01:43:10,880
going to start and attempt to understand
2339
01:43:08,639 --> 01:43:13,440
our program let's hop over to visual
2340
01:43:10,880 --> 01:43:15,679
studio code and actually do that the
2341
01:43:13,439 --> 01:43:18,479
first thing we want to do is to set up
2342
01:43:15,679 --> 01:43:20,880
our code so that we can open that in
2343
01:43:18,479 --> 01:43:24,399
visual studio code we're going to start
2344
01:43:20,880 --> 01:43:26,400
from our c plus 20 template project that
2345
01:43:26,399 --> 01:43:31,279
and i'm going to be doing the projects
2346
01:43:28,479 --> 01:43:33,439
for this chapter in this folder here so
2347
01:43:31,279 --> 01:43:35,679
we're going to do our very first c plus
2348
01:43:33,439 --> 01:43:39,279
plus program so what we're going to do
2349
01:43:35,679 --> 01:43:40,560
is go inside our c plus plus 20 template
2350
01:43:40,560 --> 01:43:45,520
and i noticed that we actually left in
2351
01:43:42,719 --> 01:43:47,600
the boiled files we don't want so
2352
01:43:45,520 --> 01:43:49,199
what we're going to do is remove this
2353
01:43:49,198 --> 01:43:54,079
and that this vc 140 fan we don't want
2354
01:43:55,920 --> 01:44:02,079
the main cpp file and the dot vs code
2355
01:43:59,760 --> 01:44:04,800
folder we're going to copy these things
2356
01:44:02,079 --> 01:44:07,198
and we're going to put them in our first
2357
01:44:07,198 --> 01:44:11,759
and we're going to open this folder in
2358
01:44:08,960 --> 01:44:14,399
visual studio code visual studio code is
2359
01:44:11,760 --> 01:44:17,280
not opened up you see that i have my
2360
01:44:14,399 --> 01:44:19,599
developer powershell opened if you want
2361
01:44:17,279 --> 01:44:21,519
you can open visual studio code directly
2362
01:44:19,600 --> 01:44:23,119
without going through this if you're not
2363
01:44:21,520 --> 01:44:26,000
going to be using the visual studio
2364
01:44:23,118 --> 01:44:28,319
compiler but i want to have the option
2365
01:44:26,000 --> 01:44:30,319
to use that compiler so this is how i am
2366
01:44:28,319 --> 01:44:32,840
going to open my visual studio code
2367
01:44:34,719 --> 01:44:39,679
to open this up i'm going to hit enter
2368
01:44:37,279 --> 01:44:41,679
and visual studio code is going to open
2369
01:44:39,679 --> 01:44:44,079
and it is going to open whatever we did
2370
01:44:41,679 --> 01:44:46,158
in the last lecture we don't want this
2371
01:44:44,079 --> 01:44:48,158
project because this is a template
2372
01:44:46,158 --> 01:44:51,279
project from the last chapter we're
2373
01:44:48,158 --> 01:44:52,638
going to close this folder go to file
2374
01:44:52,639 --> 01:44:57,679
close folder and we're going to open the
2375
01:44:54,960 --> 01:45:00,560
new folder we want to work on we're
2376
01:44:57,679 --> 01:45:02,239
going to go to file and hit open folder
2377
01:45:00,560 --> 01:45:04,239
we're going to go to the location where
2378
01:45:02,238 --> 01:45:06,079
our project is so you're going to go
2379
01:45:04,238 --> 01:45:07,039
where yours is i'm going to browse to
2380
01:45:07,039 --> 01:45:12,960
and i'm going to go in the current
2381
01:45:08,960 --> 01:45:14,000
chapter and choose 3 2 first c plus plus
2382
01:45:16,639 --> 01:45:20,800
it's going to open up and you're going
2383
01:45:20,800 --> 01:45:27,039
the last template project are still
2384
01:45:24,399 --> 01:45:29,039
valid here they were copied over if we
2385
01:45:27,039 --> 01:45:30,639
open the main cpp file it's going to be
2386
01:45:29,039 --> 01:45:31,679
the main thing we had in the last
2387
01:45:32,399 --> 01:45:37,118
we have the option to run task you're
2388
01:45:34,960 --> 01:45:39,760
going to see that we have two compilers
2389
01:45:37,118 --> 01:45:42,399
available and this is really good we are
2390
01:45:39,760 --> 01:45:45,119
ready to start using this let's try and
2391
01:45:45,118 --> 01:45:48,479
and we're going to have our binary
2392
01:45:48,479 --> 01:45:53,359
we can click in the terminal here
2393
01:45:51,439 --> 01:45:54,879
and if we want to open the terminal
2394
01:45:53,359 --> 01:45:57,839
again we have the option to come in
2395
01:45:54,880 --> 01:46:00,480
terminal and new terminal this is going
2396
01:45:57,840 --> 01:46:01,679
to open this up if we do dir in the
2397
01:46:01,679 --> 01:46:07,679
we're going to see our program generated
2398
01:46:04,560 --> 01:46:08,719
we can remove this thing here and say rm
2399
01:46:08,719 --> 01:46:15,679
dot exe and remove this we can clear
2400
01:46:13,520 --> 01:46:17,840
and we have a clean project we can start
2401
01:46:15,679 --> 01:46:20,158
learning from okay now we have the
2402
01:46:17,840 --> 01:46:22,639
project and it is building successfully
2403
01:46:20,158 --> 01:46:25,279
let's try to understand the code we have
2404
01:46:22,639 --> 01:46:28,000
in here the first statement we have it
2405
01:46:28,000 --> 01:46:34,000
this is a feature c plus plus offers to
2406
01:46:31,039 --> 01:46:37,039
load the pro built libraries that we can
2407
01:46:34,000 --> 01:46:39,600
use iostream is specifically going to
2408
01:46:37,039 --> 01:46:42,000
help us print thanks to the console
2409
01:46:39,600 --> 01:46:43,280
we've seen that we can for example print
2410
01:46:44,479 --> 01:46:51,678
let's take out all these things in here
2411
01:46:47,600 --> 01:46:54,639
and say std column column c out
2412
01:46:51,679 --> 01:46:57,440
this is coming from i iostream and we're
2413
01:46:54,639 --> 01:46:59,920
going to put two less than symbols we're
2414
01:46:57,439 --> 01:47:02,079
going to open two quotes and inside
2415
01:46:59,920 --> 01:47:05,039
we're going to type hello world
2416
01:47:02,079 --> 01:47:09,519
and we're going to go outside the quotes
2417
01:47:05,039 --> 01:47:12,319
and do two less than signs and say std
2418
01:47:12,319 --> 01:47:16,960
and put a semicolon this is going to
2419
01:47:14,800 --> 01:47:18,400
print things on the console if we run
2420
01:47:18,399 --> 01:47:23,599
so if we run this program the first
2421
01:47:21,520 --> 01:47:26,719
thing we need to do is to build this
2422
01:47:23,600 --> 01:47:29,760
program so we can come to terminal task
2423
01:47:26,719 --> 01:47:32,480
and we're going to build it with gcc and
2424
01:47:29,760 --> 01:47:34,239
after we've built it we can hit enter to
2425
01:47:34,238 --> 01:47:38,799
and we can do dirt to see the content of
2426
01:47:36,880 --> 01:47:41,600
the folder you see that a program has
2427
01:47:38,800 --> 01:47:43,440
been generated we can run it and if we
2428
01:47:41,600 --> 01:47:46,320
run it it's going to say hello world
2429
01:47:43,439 --> 01:47:48,559
this message is coming from this
2430
01:47:46,319 --> 01:47:51,679
statement here and we have this
2431
01:47:48,560 --> 01:47:54,400
statement because we have included io
2432
01:47:51,679 --> 01:47:57,039
stream to really make this super clear
2433
01:47:54,399 --> 01:47:59,039
we can try to remove this line that says
2434
01:47:59,039 --> 01:48:03,279
and the moment we do that you're going
2435
01:48:00,960 --> 01:48:04,480
to see that this tab says we have
2436
01:48:07,039 --> 01:48:11,600
you're going to see the message
2437
01:48:08,639 --> 01:48:14,639
namespace sdd has no member c out name
2438
01:48:11,600 --> 01:48:16,079
space std has no member a and dl
2439
01:48:16,079 --> 01:48:21,439
the z plus plus program doesn't know
2440
01:48:18,479 --> 01:48:23,839
what sddc out means because we don't
2441
01:48:21,439 --> 01:48:25,919
have the library included and you also
2442
01:48:23,840 --> 01:48:27,920
see that we have these squiggly lines to
2443
01:48:25,920 --> 01:48:30,639
make it really clear that we have a
2444
01:48:27,920 --> 01:48:34,158
problem so to really be able to use this
2445
01:48:30,639 --> 01:48:36,400
we have to include a third party library
2446
01:48:34,158 --> 01:48:38,799
that brings these features into our
2447
01:48:36,399 --> 01:48:41,118
program and that's what the include
2448
01:48:38,800 --> 01:48:42,800
statement here is really doing so let's
2449
01:48:42,800 --> 01:48:48,880
and we're going to say i o stream again
2450
01:48:46,800 --> 01:48:50,159
and let's wait and see that the problem
2451
01:48:50,158 --> 01:48:54,319
and the one thing you should really know
2452
01:48:51,920 --> 01:48:57,440
is that we don't have a semicolon at the
2453
01:48:54,319 --> 01:49:00,158
end of the io stream statement we don't
2454
01:48:57,439 --> 01:49:03,039
need to put it there but many c
2455
01:49:00,158 --> 01:49:04,079
plus plus statements need a semicolon at
2456
01:49:04,079 --> 01:49:09,679
okay i think this really makes it clear
2457
01:49:06,319 --> 01:49:11,920
what the include statement here is doing
2458
01:49:09,679 --> 01:49:15,359
the other thing we have in our program
2459
01:49:17,520 --> 01:49:20,800
this thing here is called the main
2460
01:49:20,800 --> 01:49:26,079
a function in c plus plus is a block of
2461
01:49:23,520 --> 01:49:28,880
code that does a lot of things
2462
01:49:26,079 --> 01:49:31,359
but the main function here is special
2463
01:49:28,880 --> 01:49:33,440
because it is the starting point of your
2464
01:49:33,439 --> 01:49:38,719
we also call the main function the entry
2465
01:49:36,000 --> 01:49:41,039
point of the c plus plus program and
2466
01:49:38,719 --> 01:49:43,760
what that means is that if you open the
2467
01:49:41,039 --> 01:49:46,238
program the main function is going to be
2468
01:49:43,760 --> 01:49:48,079
the very first thing that is going to
2469
01:49:46,238 --> 01:49:50,879
run and the things are going to be
2470
01:49:48,079 --> 01:49:52,880
executed in the main function in order
2471
01:49:50,880 --> 01:49:55,279
so the statement on the top is going to
2472
01:49:52,880 --> 01:49:57,359
run first and the statement after that
2473
01:49:55,279 --> 01:49:59,359
until we hit the end of the function so
2474
01:49:57,359 --> 01:50:02,158
this is what we mean here to really
2475
01:49:59,359 --> 01:50:05,519
drive this home we can come here in our
2476
01:50:06,880 --> 01:50:13,840
and say sdd engl and by the way this e n
2477
01:50:11,520 --> 01:50:14,960
d l statement is going to print a new
2478
01:50:16,079 --> 01:50:22,000
see it in effect in a moment let's
2479
01:50:19,520 --> 01:50:25,199
actually take it out so that we can see
2480
01:50:22,000 --> 01:50:28,000
its effect we're going to also do sddc
2481
01:50:30,158 --> 01:50:36,719
is to print number one and number two on
2482
01:50:33,279 --> 01:50:38,960
the terminal let's build this program
2483
01:50:36,719 --> 01:50:42,079
and if you want to build the default
2484
01:50:38,960 --> 01:50:44,719
task you can hit ctrl shift b for it to
2485
01:50:42,079 --> 01:50:47,519
happen very fast but i am always going
2486
01:50:44,719 --> 01:50:50,239
to come here so that it is really clear
2487
01:50:47,520 --> 01:50:53,599
what i am doing a program should be
2488
01:50:50,238 --> 01:50:55,000
generated now if we try to run it
2489
01:50:55,000 --> 01:51:01,118
rooster.exe and again we can hit
2490
01:50:58,079 --> 01:51:03,760
the app arrow button on our keyboard so
2491
01:51:01,118 --> 01:51:05,759
that's the last command that we run from
2492
01:51:03,760 --> 01:51:07,840
this terminal runs and this is going to
2493
01:51:05,760 --> 01:51:10,079
speed things up a little bit so if we
2494
01:51:07,840 --> 01:51:13,199
run this program it should say number
2495
01:51:10,079 --> 01:51:16,238
one and number two as you see here
2496
01:51:13,198 --> 01:51:19,039
but these two things are cramped on one
2497
01:51:16,238 --> 01:51:21,678
line and the reason is we are not
2498
01:51:19,039 --> 01:51:24,319
printing new line characters after we
2499
01:51:21,679 --> 01:51:28,000
print number one and number two and we
2500
01:51:24,319 --> 01:51:31,439
can solve this problem by putting in two
2501
01:51:28,000 --> 01:51:33,679
less than symbols and saying std column
2502
01:51:33,679 --> 01:51:38,000
this is going to put a new line
2503
01:51:35,439 --> 01:51:39,118
character after number one we can build
2504
01:51:39,118 --> 01:51:43,679
for our new changes to tech effect
2505
01:51:42,158 --> 01:51:46,799
after we do that we click on the
2506
01:51:43,679 --> 01:51:48,880
terminal hit enter we hit the app arrow
2507
01:51:46,800 --> 01:51:51,599
button if we run it's going to say
2508
01:51:48,880 --> 01:51:54,159
number one and number two on two
2509
01:51:51,599 --> 01:51:56,639
separate lines because we are printing a
2510
01:51:54,158 --> 01:51:58,719
new line character after number one i
2511
01:51:56,639 --> 01:52:00,960
really hope this makes sense
2512
01:51:58,719 --> 01:52:02,960
please do take some time to play with us
2513
01:52:00,960 --> 01:52:05,279
because if this is the first time you're
2514
01:52:02,960 --> 01:52:08,000
doing this some things might not be
2515
01:52:05,279 --> 01:52:10,880
clear and the best way to really make
2516
01:52:08,000 --> 01:52:13,118
sense of this is to type code run it and
2517
01:52:10,880 --> 01:52:15,118
see the effect of what you type by
2518
01:52:13,118 --> 01:52:17,279
running your program so let's do this a
2519
01:52:15,118 --> 01:52:19,118
couple of times we're going to do sdd
2520
01:52:20,399 --> 01:52:25,359
the statement for number two we're going
2521
01:52:28,158 --> 01:52:34,719
and we're going to do stdeandl
2522
01:52:32,079 --> 01:52:36,039
to really show the problem again we're
2523
01:52:36,039 --> 01:52:41,920
stdendl on the number two line
2524
01:52:39,279 --> 01:52:43,519
we are going to weld the build is going
2525
01:52:43,520 --> 01:52:48,480
we're going to click in the terminal hit
2526
01:52:45,599 --> 01:52:50,159
enter hit the app arrow button run the
2527
01:52:48,479 --> 01:52:52,238
program again and you're going to see
2528
01:52:50,158 --> 01:52:55,198
it's saying number one it's going on the
2529
01:52:52,238 --> 01:52:57,198
new line printing number two but we not
2530
01:52:55,198 --> 01:52:59,919
to jump into the new line from number
2531
01:52:57,198 --> 01:53:02,319
two so number two and number three are
2532
01:52:59,920 --> 01:53:04,800
going to be cramped on one line that's
2533
01:53:02,319 --> 01:53:07,439
what we see here we can solve this again
2534
01:53:04,800 --> 01:53:08,639
by putting in a new line after number
2535
01:53:12,479 --> 01:53:17,279
and uh this should solve the problem
2536
01:53:14,960 --> 01:53:19,760
again let's build we're going to run our
2537
01:53:17,279 --> 01:53:21,439
build task the build is going to be
2538
01:53:19,760 --> 01:53:23,599
successful we're going to hit the app
2539
01:53:21,439 --> 01:53:25,839
arrow to run the program if we run it
2540
01:53:23,599 --> 01:53:28,880
it's going to say number one number two
2541
01:53:25,840 --> 01:53:31,599
and number three and this is really good
2542
01:53:28,880 --> 01:53:34,400
now it should be clear that statements
2543
01:53:31,599 --> 01:53:36,719
in the main function are run in order
2544
01:53:34,399 --> 01:53:40,319
from top to bottom and that the program
2545
01:53:36,719 --> 01:53:43,520
is going to end when it hits the end of
2546
01:53:40,319 --> 01:53:45,599
this curly brace that includes our
2547
01:53:43,520 --> 01:53:47,679
function we're going to have a chance to
2548
01:53:47,679 --> 01:53:52,079
in detail later in the course but we are
2549
01:53:50,399 --> 01:53:54,079
just getting started and we need to
2550
01:53:52,079 --> 01:53:56,399
start somewhere so that's why we're
2551
01:53:54,079 --> 01:53:59,519
doing this main function thing here
2552
01:53:56,399 --> 01:54:02,559
another thing you can do is return from
2553
01:53:59,520 --> 01:54:05,199
the main function and in many examples
2554
01:54:02,560 --> 01:54:06,800
you will see people do return 0
2555
01:54:06,800 --> 01:54:12,239
and this is a way for the main function
2556
01:54:09,359 --> 01:54:15,279
to send the message to the operating
2557
01:54:12,238 --> 01:54:17,598
system if it's finished successfully or
2558
01:54:15,279 --> 01:54:19,519
if there was some kind of problem
2559
01:54:17,599 --> 01:54:21,360
we're not going to go into any more
2560
01:54:19,520 --> 01:54:22,560
details about the main function because
2561
01:54:22,560 --> 01:54:27,840
too much for now we are just getting
2562
01:54:25,118 --> 01:54:30,719
started we are trying to get a feel of
2563
01:54:27,840 --> 01:54:33,279
how c plus works the main message here
2564
01:54:30,719 --> 01:54:36,560
is really that you should be able to
2565
01:54:33,279 --> 01:54:38,880
print things to the console using sddc
2566
01:54:36,560 --> 01:54:40,960
out you should be able to print a new
2567
01:54:40,960 --> 01:54:49,599
using sdd ndl this stdc out and
2568
01:54:45,880 --> 01:54:52,239
stdendl thank come from the iostream
2569
01:54:49,599 --> 01:54:53,920
library that we are including here
2570
01:54:52,238 --> 01:54:56,158
if we don't include this library we're
2571
01:54:53,920 --> 01:54:58,480
going to have problems because
2572
01:54:56,158 --> 01:55:00,960
our surplus plus program is not going to
2573
01:54:58,479 --> 01:55:03,279
know where they are coming from so we
2574
01:55:00,960 --> 01:55:04,960
should really put this in if we want to
2575
01:55:04,960 --> 01:55:10,560
and we can return from a function to let
2576
01:55:07,679 --> 01:55:13,599
the system know the operating system
2577
01:55:10,560 --> 01:55:16,320
if the program finished up successfully
2578
01:55:13,599 --> 01:55:18,400
or if there was some kind of problem and
2579
01:55:16,319 --> 01:55:20,319
again this project is using the
2580
01:55:20,319 --> 01:55:25,198
and this is really all we set out to do
2581
01:55:22,479 --> 01:55:27,678
in this lecture trying to make sense of
2582
01:55:25,198 --> 01:55:29,919
the main function in c plus plus to
2583
01:55:27,679 --> 01:55:32,000
really practice these things i would
2584
01:55:29,920 --> 01:55:34,158
challenge you to write a c plus plus
2585
01:55:32,000 --> 01:55:37,198
program just like this that is going to
2586
01:55:34,158 --> 01:55:39,519
print your name 10 times try to do that
2587
01:55:37,198 --> 01:55:42,079
and if you have a problem please do ask
2588
01:55:39,520 --> 01:55:43,119
me and i will do the best i can to help
2589
01:55:43,118 --> 01:55:46,319
this is really all we set out to do in
2590
01:55:44,800 --> 01:55:48,159
this lecture i hope you found it
2591
01:55:46,319 --> 01:55:49,759
interesting we're going to stop here in
2592
01:55:48,158 --> 01:55:52,238
this lecture in the next one we're going
2593
01:55:49,760 --> 01:55:55,039
to start and learn about comments in c
2594
01:55:52,238 --> 01:55:56,559
plus plus go ahead and finish up here
2595
01:55:56,560 --> 01:56:00,560
in this lecture we're going to learn
2596
01:55:57,920 --> 01:56:02,800
about comments and c plus plus
2597
01:56:00,560 --> 01:56:05,920
comments are the way to put some
2598
01:56:02,800 --> 01:56:08,159
messages in your c plus plus chord that
2599
01:56:05,920 --> 01:56:10,319
are really meant to be read by humans
2600
01:56:08,158 --> 01:56:12,559
and one way we have to do comments in c
2601
01:56:10,319 --> 01:56:14,880
plus plus is through this backslash
2602
01:56:12,560 --> 01:56:17,039
backslash thing we have here this is
2603
01:56:14,880 --> 01:56:18,719
going to comment out the line so the
2604
01:56:17,039 --> 01:56:20,639
compiler is really not going to care
2605
01:56:18,719 --> 01:56:22,079
about it it's going to think that it is
2606
01:56:20,639 --> 01:56:24,880
something that is meant for the
2607
01:56:22,079 --> 01:56:26,880
developer to see so this is a one line
2608
01:56:24,880 --> 01:56:29,520
comment and this is how you do it in c
2609
01:56:26,880 --> 01:56:31,760
plus plus you can also comment out a
2610
01:56:29,520 --> 01:56:33,360
block of code in your c plus bus code
2611
01:56:31,760 --> 01:56:35,840
and this is something that comes in
2612
01:56:33,359 --> 01:56:39,039
quite handy many times you put your
2613
01:56:35,840 --> 01:56:41,440
comment in a backslash star and a star
2614
01:56:39,039 --> 01:56:43,679
backslash like this this is going to
2615
01:56:41,439 --> 01:56:45,519
comment things out in your code and the
2616
01:56:43,679 --> 01:56:47,760
compiler is really not going to care
2617
01:56:45,520 --> 01:56:50,239
about this let's hop over to visual
2618
01:56:47,760 --> 01:56:52,159
studio code and actually play with us so
2619
01:56:50,238 --> 01:56:54,238
here we are in the folder that is going
2620
01:56:52,158 --> 01:56:55,920
to contain our code the first thing i'm
2621
01:56:54,238 --> 01:56:58,638
going to do is go through the template
2622
01:56:55,920 --> 01:57:00,560
project i'm going to copy my files
2623
01:56:58,639 --> 01:57:02,480
and i'm going to go up again and we're
2624
01:57:00,560 --> 01:57:04,480
going to be learning about comments so
2625
01:57:02,479 --> 01:57:07,359
i'm going to put this in the folder on
2626
01:57:04,479 --> 01:57:09,759
comments i am going to close whatever
2627
01:57:07,359 --> 01:57:11,759
folder we have opened in visual studio
2628
01:57:09,760 --> 01:57:14,159
code and i'm going to browse to the
2629
01:57:11,760 --> 01:57:15,360
location where my project on comment
2630
01:57:15,359 --> 01:57:20,079
my project is in this folder that is
2631
01:57:17,920 --> 01:57:22,480
named three three comments i'm going to
2632
01:57:20,079 --> 01:57:25,198
open the folder and if i open the main
2633
01:57:22,479 --> 01:57:27,359
cpp file i'm going to find the starter
2634
01:57:25,198 --> 01:57:29,279
project we're going to remove this const
2635
01:57:27,359 --> 01:57:31,519
eval thank because we're really not
2636
01:57:29,279 --> 01:57:33,439
ready to understand this yet it was in
2637
01:57:33,439 --> 01:57:38,719
test that our compilers support c plus
2638
01:57:36,319 --> 01:57:40,479
plus 20. so we're going to remove this
2639
01:57:38,719 --> 01:57:42,960
and we're going to put in a message that
2640
01:57:40,479 --> 01:57:45,118
says hello world you already know how to
2641
01:57:42,960 --> 01:57:47,279
do that from the last lecture so we're
2642
01:57:47,279 --> 01:57:54,238
hello world and we're going to say
2643
01:57:50,599 --> 01:57:55,920
stdendl and don't forget this semicolon
2644
01:57:54,238 --> 01:57:58,319
at the end if you do you're going to
2645
01:57:55,920 --> 01:58:00,880
have problems so make sure your code
2646
01:57:58,319 --> 01:58:03,920
looks like this try to build it to make
2647
01:58:00,880 --> 01:58:07,118
sure it's working fine this is going to
2648
01:58:03,920 --> 01:58:09,279
run the gcc tasked world we can click on
2649
01:58:07,118 --> 01:58:10,799
the terminal here and it's going to
2650
01:58:10,800 --> 01:58:16,639
and we can open a new terminal here if
2651
01:58:13,599 --> 01:58:19,360
we want if we do dir we're going to find
2652
01:58:16,639 --> 01:58:21,679
our rooster program inside we can run it
2653
01:58:19,359 --> 01:58:23,359
and it's going to say hello world we
2654
01:58:21,679 --> 01:58:25,440
already know to do this from the last
2655
01:58:23,359 --> 01:58:28,158
lecture and in this one we are going to
2656
01:58:25,439 --> 01:58:31,118
be learning about comments the first
2657
01:58:28,158 --> 01:58:32,638
thing you can do is use slash slash so
2658
01:58:32,639 --> 01:58:40,079
and uh let's put some message here this
2659
01:58:36,158 --> 01:58:41,679
branch and the iostream library this is
2660
01:58:40,079 --> 01:58:44,000
a nice message that is going to give
2661
01:58:41,679 --> 01:58:46,158
some more information about this
2662
01:58:44,000 --> 01:58:48,158
statement to whoever might be reading
2663
01:58:46,158 --> 01:58:50,238
this program and this is called a one
2664
01:58:48,158 --> 01:58:52,319
line comment you can really put this
2665
01:58:50,238 --> 01:58:54,638
wherever you want in your c plus plus
2666
01:58:52,319 --> 01:58:56,799
file we can go in the main function for
2667
01:58:54,639 --> 01:58:59,118
example and say this is going to print
2668
01:58:56,800 --> 01:59:01,520
hello world to the console or the
2669
01:58:59,118 --> 01:59:03,839
terminal we can really put this anywhere
2670
01:59:01,520 --> 01:59:06,320
we can even put it after the return
2671
01:59:03,840 --> 01:59:08,480
statement here and really put in
2672
01:59:06,319 --> 01:59:10,799
whatever piece of information we think
2673
01:59:08,479 --> 01:59:13,598
is going to make sense to wherever it's
2674
01:59:10,800 --> 01:59:16,239
going to be reading our program okay
2675
01:59:13,599 --> 01:59:19,119
this is how you do a line comment you
2676
01:59:16,238 --> 01:59:21,359
can also do comments across different
2677
01:59:19,118 --> 01:59:23,039
lines and the way you do that you put
2678
01:59:23,039 --> 01:59:29,679
slash star and go down and say star
2679
01:59:27,439 --> 01:59:31,759
slash like this and whatever is going to
2680
01:59:29,679 --> 01:59:33,920
be in the middle here is going to be a
2681
01:59:31,760 --> 01:59:36,320
comment this is usually called a block
2682
01:59:33,920 --> 01:59:38,880
comment you can put in whatever you want
2683
01:59:36,319 --> 01:59:40,559
so if you have a piece of text that you
2684
01:59:38,880 --> 01:59:43,520
would like to use as a comment in your
2685
01:59:40,560 --> 01:59:46,159
program this is one way you can do this
2686
01:59:43,520 --> 01:59:48,880
one thing you should know though is that
2687
01:59:46,158 --> 01:59:50,479
you cannot nest these things but before
2688
01:59:48,880 --> 01:59:52,960
we do that let's try to build our
2689
01:59:50,479 --> 01:59:55,359
program to really show that there is no
2690
01:59:52,960 --> 01:59:58,319
problem if we have these comments in the
2691
01:59:55,359 --> 02:00:00,719
world is successful and if we click on
2692
02:00:00,719 --> 02:00:06,158
and hit clear to clear things out in the
2693
02:00:03,599 --> 02:00:08,079
terminal we can try to run our rooster
2694
02:00:06,158 --> 02:00:10,799
program and it's going to say hello
2695
02:00:08,079 --> 02:00:12,960
world you see that all these green lines
2696
02:00:10,800 --> 02:00:15,360
which are comments are really not
2697
02:00:12,960 --> 02:00:17,359
affecting the program all the compiler
2698
02:00:15,359 --> 02:00:19,439
is going to care about is this include
2699
02:00:17,359 --> 02:00:21,359
thing it's going to care about the main
2700
02:00:19,439 --> 02:00:23,598
function here it's going to ignore these
2701
02:00:21,359 --> 02:00:26,000
green things it's going to be like these
2702
02:00:23,599 --> 02:00:28,400
green lines that are our comments are
2703
02:00:26,000 --> 02:00:30,158
not in there this is the effect comments
2704
02:00:28,399 --> 02:00:32,879
have in your program and we're going to
2705
02:00:30,158 --> 02:00:34,638
be using this a lot in this course
2706
02:00:32,880 --> 02:00:38,079
one thing you should know though is that
2707
02:00:34,639 --> 02:00:40,480
you cannot nest these block comments so
2708
02:00:38,079 --> 02:00:44,000
if you try to do something like this
2709
02:00:40,479 --> 02:00:46,479
and uh say this is one comment and uh
2710
02:00:44,000 --> 02:00:48,319
come again and say this is another
2711
02:00:46,479 --> 02:00:50,399
comment you see that we have problems
2712
02:00:48,319 --> 02:00:52,238
already nesting is not allowed you're
2713
02:00:50,399 --> 02:00:54,079
going to get a compiler error and we're
2714
02:00:52,238 --> 02:00:56,319
going to learn more about these errors
2715
02:00:54,079 --> 02:00:58,639
in the next lecture but don't do this
2716
02:00:56,319 --> 02:01:00,799
don't nest these block comments if you
2717
02:00:58,639 --> 02:01:03,520
do that you're going to get some
2718
02:01:00,800 --> 02:01:06,239
confusing errors and this is going to be
2719
02:01:03,520 --> 02:01:08,560
the cause for them so don't nest your
2720
02:01:06,238 --> 02:01:10,879
blog comments it's going to give you
2721
02:01:08,560 --> 02:01:12,560
headaches okay this is really all we set
2722
02:01:10,880 --> 02:01:15,199
out to do in this lecture learning about
2723
02:01:12,560 --> 02:01:17,840
comments in c plus plus you can do one
2724
02:01:15,198 --> 02:01:20,479
line comments on a single line like this
2725
02:01:17,840 --> 02:01:23,679
you can do block comments to comment out
2726
02:01:20,479 --> 02:01:25,439
a block of text you can't nest your blog
2727
02:01:23,679 --> 02:01:27,520
comments because that's going to give
2728
02:01:25,439 --> 02:01:31,759
you a lot of problems you don't want
2729
02:01:27,520 --> 02:01:33,840
that and really use comments wisely and
2730
02:01:31,760 --> 02:01:36,079
don't overdo it because it's going to
2731
02:01:33,840 --> 02:01:38,319
turn your program into a novel and i
2732
02:01:36,079 --> 02:01:40,079
don't think people want that so use this
2733
02:01:38,319 --> 02:01:42,000
feature when you need it to give some
2734
02:01:40,079 --> 02:01:44,238
more information about your code and
2735
02:01:42,000 --> 02:01:46,000
don't overdo this we are going to stop
2736
02:01:44,238 --> 02:01:48,319
here in this lecture the next one we're
2737
02:01:46,000 --> 02:01:51,118
going to learn about different kinds of
2738
02:01:48,319 --> 02:01:53,039
errors and warnings you can see in your
2739
02:01:53,039 --> 02:01:57,439
go ahead and finish up here and meet me
2740
02:01:55,679 --> 02:02:00,158
there in this lecture we're going to
2741
02:01:57,439 --> 02:02:02,719
learn about errors and warnings in your
2742
02:02:00,158 --> 02:02:05,519
c plus plus programs there are three
2743
02:02:02,719 --> 02:02:08,079
kinds of errors or warnings you can get
2744
02:02:05,520 --> 02:02:10,560
you can get compile time errors you can
2745
02:02:08,079 --> 02:02:13,118
get runtime errors and you can get
2746
02:02:10,560 --> 02:02:15,920
warnings but what is really meant by
2747
02:02:13,118 --> 02:02:19,519
these things remember the ultimate goal
2748
02:02:15,920 --> 02:02:22,158
of every developer or every c plus plus
2749
02:02:19,520 --> 02:02:25,679
developer in our case here is to be able
2750
02:02:22,158 --> 02:02:28,079
to generate a binary executable file
2751
02:02:25,679 --> 02:02:30,319
from the c plus plus code and we have to
2752
02:02:28,079 --> 02:02:32,399
run the code through the compiler to be
2753
02:02:30,319 --> 02:02:34,639
able to do that and one thing you should
2754
02:02:32,399 --> 02:02:36,158
know is that there is a set of
2755
02:02:36,158 --> 02:02:40,879
that the compiler enforces on our code
2756
02:02:40,880 --> 02:02:45,520
successfully and those requirements are
2757
02:02:43,198 --> 02:02:47,598
the rules really that we have to follow
2758
02:02:45,520 --> 02:02:49,280
in our c plus plus program and if we
2759
02:02:47,599 --> 02:02:51,360
break those rules we're going to get
2760
02:02:49,279 --> 02:02:54,000
problems and these problems are going to
2761
02:02:51,359 --> 02:02:56,639
come in the form of compile time errors
2762
02:02:56,639 --> 02:03:00,480
let's look at compile time errors in
2763
02:03:00,479 --> 02:03:05,598
here we have a simple c plus plus
2764
02:03:02,399 --> 02:03:08,238
program that has a few problems we have
2765
02:03:05,599 --> 02:03:12,239
forgotten to put the semicolon at the
2766
02:03:08,238 --> 02:03:14,319
end of our stdc out statement here and
2767
02:03:12,238 --> 02:03:15,598
the compiler is going to freak out
2768
02:03:15,599 --> 02:03:20,239
if we compile this program we're going
2769
02:03:17,439 --> 02:03:22,719
to get a bunch of errors and the ide is
2770
02:03:20,238 --> 02:03:24,319
going to show us this problem some ides
2771
02:03:22,719 --> 02:03:27,118
are going to give you different errors
2772
02:03:24,319 --> 02:03:28,799
for example here i was using codelite
2773
02:03:28,800 --> 02:03:33,760
error expected semicolon before return
2774
02:03:31,840 --> 02:03:36,560
or something like this so this is a
2775
02:03:33,760 --> 02:03:38,560
compiler error and if you have this kind
2776
02:03:36,560 --> 02:03:41,199
of errors your program is not going to
2777
02:03:38,560 --> 02:03:42,960
compile compilation is going to fail
2778
02:03:41,198 --> 02:03:44,559
you're going to get this error and
2779
02:03:42,960 --> 02:03:46,719
you're not going to get your binary
2780
02:03:44,560 --> 02:03:48,719
executable and when you have this you
2781
02:03:46,719 --> 02:03:51,760
basically have to go back and fix this
2782
02:03:48,719 --> 02:03:53,760
problem compile again and when you get
2783
02:03:51,760 --> 02:03:56,079
rid of these problems the compilation is
2784
02:03:53,760 --> 02:03:58,800
going to succeed this is what a compile
2785
02:03:56,078 --> 02:04:01,279
time error is another thing you can have
2786
02:03:58,800 --> 02:04:03,679
is the run time error this is not going
2787
02:04:01,279 --> 02:04:06,078
to cause a compile time error the
2788
02:04:03,679 --> 02:04:08,480
compilation is going to succeed but when
2789
02:04:06,078 --> 02:04:11,198
you run the program it's not going to do
2790
02:04:08,479 --> 02:04:13,118
what you intended it to do in the first
2791
02:04:11,198 --> 02:04:16,158
place for example you may want it to
2792
02:04:13,118 --> 02:04:18,479
print green on some user interface it's
2793
02:04:16,158 --> 02:04:20,559
going to print gray or whatever it's
2794
02:04:18,479 --> 02:04:22,399
really not going to do what you want so
2795
02:04:20,560 --> 02:04:24,400
it's a logical error that you have in
2796
02:04:22,399 --> 02:04:26,879
your program and you have to fix it to
2797
02:04:24,399 --> 02:04:29,198
get rid of this and another thing you
2798
02:04:26,880 --> 02:04:32,480
should know is that sometimes these run
2799
02:04:29,198 --> 02:04:35,118
time errors can cause your program to
2800
02:04:32,479 --> 02:04:37,198
fail and terminate immediately and we
2801
02:04:35,118 --> 02:04:38,880
say that the program has crashed we're
2802
02:04:37,198 --> 02:04:41,118
going to see an example of this in a
2803
02:04:38,880 --> 02:04:44,480
minute the last kind of problem you can
2804
02:04:41,118 --> 02:04:46,880
have in your program is a warning
2805
02:04:44,479 --> 02:04:49,598
this is a problem that is not serious
2806
02:04:46,880 --> 02:04:51,840
enough for the compiler to halt your
2807
02:04:49,599 --> 02:04:53,840
compilation compilation is going to
2808
02:04:51,840 --> 02:04:55,840
succeed but this is basically the
2809
02:04:53,840 --> 02:04:58,480
compiler telling you you are doing
2810
02:04:55,840 --> 02:05:00,719
something that has some problems and you
2811
02:04:58,479 --> 02:05:02,718
should really fix it before it becomes a
2812
02:05:00,719 --> 02:05:05,039
serious problem so that's going to be a
2813
02:05:02,719 --> 02:05:07,840
warning for example here you see some
2814
02:05:05,039 --> 02:05:10,078
compilers can warn you when you divide
2815
02:05:07,840 --> 02:05:12,000
stuff by zero and we're going to see how
2816
02:05:10,078 --> 02:05:14,319
this works the main message in this
2817
02:05:12,000 --> 02:05:16,960
lecture is that you may have problems in
2818
02:05:14,319 --> 02:05:19,359
your program and they are going to come
2819
02:05:16,960 --> 02:05:22,000
in three forms some are going to be
2820
02:05:19,359 --> 02:05:24,479
compile time errors some are going to be
2821
02:05:22,000 --> 02:05:26,639
run time errors some are going to be
2822
02:05:24,479 --> 02:05:28,879
warnings we are going to hop over to
2823
02:05:26,639 --> 02:05:31,840
visual studio code and actually play
2824
02:05:28,880 --> 02:05:34,159
with this okay here i am in visual
2825
02:05:31,840 --> 02:05:36,000
studio code the first thing i'm going to
2826
02:05:36,000 --> 02:05:40,319
the template project we're going to be
2827
02:05:37,760 --> 02:05:42,480
using in our project here the project is
2828
02:05:40,319 --> 02:05:44,880
going to leave in this folder errors and
2829
02:05:42,479 --> 02:05:47,439
warnings i am going to copy over the
2830
02:05:44,880 --> 02:05:48,880
files and i am going to go in the
2831
02:05:47,439 --> 02:05:51,439
current project we're going to be
2832
02:05:48,880 --> 02:05:53,840
working on and i am going to open this
2833
02:05:51,439 --> 02:05:56,399
folder in visual studio code i am going
2834
02:05:53,840 --> 02:05:58,800
to go to file close folder i am going to
2835
02:05:56,399 --> 02:06:01,118
close this one and i am going to open
2836
02:05:58,800 --> 02:06:03,760
our new project i am going to browse to
2837
02:06:01,118 --> 02:06:06,238
it the project is this one i am going to
2838
02:06:03,760 --> 02:06:08,480
select it and select folder and it is
2839
02:06:06,238 --> 02:06:10,718
going to open up in visual studio code i
2840
02:06:08,479 --> 02:06:13,439
am going to close this welcome screen
2841
02:06:10,719 --> 02:06:15,840
and open our main cpp file we are going
2842
02:06:13,439 --> 02:06:18,158
to get rid of this constable fan this is
2843
02:06:18,158 --> 02:06:22,638
thing we had and we don't really need it
2844
02:06:20,238 --> 02:06:25,198
now we're going to get there in due time
2845
02:06:22,639 --> 02:06:28,000
what we want to see is compile time
2846
02:06:25,198 --> 02:06:31,039
errors we're going to put in our stdc
2847
02:06:33,198 --> 02:06:37,519
we're going to end this stdndm and we're
2848
02:06:37,520 --> 02:06:42,560
remove the semicolon on purpose and if
2849
02:06:40,399 --> 02:06:44,638
we try to compile our program like this
2850
02:06:42,560 --> 02:06:47,039
we're going to get a compile time error
2851
02:06:44,639 --> 02:06:49,440
this is what we want to see so let's try
2852
02:06:47,039 --> 02:06:52,880
and build our program we're going to run
2853
02:06:49,439 --> 02:06:55,279
the task to build with gcc and you see
2854
02:06:52,880 --> 02:06:57,760
that the world fails we're going to get
2855
02:06:55,279 --> 02:07:00,559
a bunch of errors in our terminal it's
2856
02:06:57,760 --> 02:07:03,840
going to say in function it main
2857
02:07:00,560 --> 02:07:05,920
expected a semicolon before return it's
2858
02:07:03,840 --> 02:07:08,000
going to try its best to tell you what
2859
02:07:05,920 --> 02:07:10,639
the problem is but sometimes these
2860
02:07:08,000 --> 02:07:12,719
errors can be really confusing in this
2861
02:07:10,639 --> 02:07:15,440
case it is really easy because we
2862
02:07:12,719 --> 02:07:17,359
introduced this error on purpose so
2863
02:07:15,439 --> 02:07:19,198
we're going to fix it in a minute but
2864
02:07:17,359 --> 02:07:21,519
before we do that i want you to see
2865
02:07:19,198 --> 02:07:23,439
these problems tab it is where the
2866
02:07:21,520 --> 02:07:25,440
problems are going to show up in visual
2867
02:07:23,439 --> 02:07:28,479
studio code so you should see your
2868
02:07:25,439 --> 02:07:30,638
problems in here or through the terminal
2869
02:07:28,479 --> 02:07:32,959
here okay one thing you should know is
2870
02:07:30,639 --> 02:07:34,960
that when you have a compiler arrow
2871
02:07:32,960 --> 02:07:36,719
compilation is not going to succeed and
2872
02:07:34,960 --> 02:07:39,039
you're not going to have your binary
2873
02:07:36,719 --> 02:07:41,599
file which is what you really want so to
2874
02:07:39,039 --> 02:07:43,840
fix this problem we're going to put in
2875
02:07:41,599 --> 02:07:46,078
our semicolon here we're going to build
2876
02:07:43,840 --> 02:07:49,119
again we're going to go to terminal run
2877
02:07:46,078 --> 02:07:50,559
task we're going to build with gcc and
2878
02:07:49,118 --> 02:07:53,039
this time you're going to see that
2879
02:07:50,560 --> 02:07:55,360
compilation is going to succeed and we
2880
02:07:53,039 --> 02:07:57,118
have our program here we can run it
2881
02:07:55,359 --> 02:07:58,799
through the terminal here so we're going
2882
02:07:57,118 --> 02:08:01,679
to click the terminal is going to go
2883
02:08:01,679 --> 02:08:06,800
and if we do dur we're going to see our
2884
02:08:04,399 --> 02:08:09,598
files in here and we can run our program
2885
02:08:06,800 --> 02:08:12,239
we can say rooster and if we run we're
2886
02:08:09,599 --> 02:08:14,960
going to have hello world so i hope this
2887
02:08:12,238 --> 02:08:18,479
really makes it very clear what a
2888
02:08:14,960 --> 02:08:20,800
compile time error as so this is one
2889
02:08:18,479 --> 02:08:23,759
kind of error you can get the other one
2890
02:08:20,800 --> 02:08:26,239
is around time error and this comes in
2891
02:08:23,760 --> 02:08:28,880
the form of things that don't work as
2892
02:08:26,238 --> 02:08:31,198
you really expected so let's say we are
2893
02:08:28,880 --> 02:08:32,319
trying to do some computation in our
2894
02:08:33,118 --> 02:08:39,839
try to take 7 and divide this by 0 for
2895
02:08:37,279 --> 02:08:42,319
example and this is a statement there is
2896
02:08:39,840 --> 02:08:44,719
a load in c plus plus so let's try and
2897
02:08:42,319 --> 02:08:47,519
build this and see what we get because
2898
02:08:44,719 --> 02:08:49,840
this is a common scenario where we have
2899
02:08:47,520 --> 02:08:53,280
run time errors we're going to run the
2900
02:08:49,840 --> 02:08:55,599
task to build with gcc okay if we do
2901
02:08:53,279 --> 02:08:58,399
this you see that world finished with
2902
02:08:55,599 --> 02:09:01,440
warnings we didn't get a compile time
2903
02:08:58,399 --> 02:09:03,679
arrow and our build was successful so to
2904
02:09:01,439 --> 02:09:06,399
really prove this i'm going to
2905
02:09:03,679 --> 02:09:08,480
go back in our directory i'm going to do
2906
02:09:06,399 --> 02:09:10,719
dur you're going to see that rooster is
2907
02:09:08,479 --> 02:09:12,118
there i'm going to remove it i'm going
2908
02:09:12,118 --> 02:09:17,519
rooster.exe this is how we remove stuff
2909
02:09:14,960 --> 02:09:19,520
from the command line when i do this and
2910
02:09:19,520 --> 02:09:24,480
executable file should be gone so let's
2911
02:09:21,840 --> 02:09:25,840
try and build with this statement and
2912
02:09:24,479 --> 02:09:28,959
and you're going to see that we get a
2913
02:09:25,840 --> 02:09:30,719
warning and not a compile time error
2914
02:09:28,960 --> 02:09:33,279
like we had here so we're going to go to
2915
02:09:30,719 --> 02:09:35,359
terminal run task we're going to build
2916
02:09:33,279 --> 02:09:37,679
with gcc and you're going to see that
2917
02:09:35,359 --> 02:09:39,839
we're going to have our executable here
2918
02:09:37,679 --> 02:09:42,960
but we had a warning and it's saying
2919
02:09:39,840 --> 02:09:45,920
that division by 0 was detected in our
2920
02:09:42,960 --> 02:09:48,719
program and it is a recipe for disaster
2921
02:09:45,920 --> 02:09:51,760
so why is it a disaster let's try and
2922
02:09:48,719 --> 02:09:54,480
run this program so we're going to
2923
02:09:51,760 --> 02:09:56,800
dirt to prove it's here and we're going
2924
02:09:54,479 --> 02:09:59,439
to run it if we run it it's going to say
2925
02:09:56,800 --> 02:10:02,400
hello world and it's going to end let's
2926
02:09:59,439 --> 02:10:04,719
try and actually use our own terminal to
2927
02:10:02,399 --> 02:10:06,960
see if we have a better chance of seeing
2928
02:10:04,719 --> 02:10:10,319
the problem here so i'm going to reveal
2929
02:10:06,960 --> 02:10:12,800
in explorer by clicking on main cpp and
2930
02:10:10,319 --> 02:10:15,198
i am going to try and open a terminal
2931
02:10:12,800 --> 02:10:17,360
window here powershell that we open
2932
02:10:15,198 --> 02:10:20,719
ourselves we've done this before
2933
02:10:17,359 --> 02:10:23,198
this shouldn't be new to you by now
2934
02:10:20,719 --> 02:10:24,560
so we're going to do dirt in here
2935
02:10:23,198 --> 02:10:27,519
and we're going to try and run the
2936
02:10:24,560 --> 02:10:30,480
program and it's going to run so so it's
2937
02:10:27,520 --> 02:10:33,360
not really giving us a run time error
2938
02:10:30,479 --> 02:10:35,118
here because we're not capturing this or
2939
02:10:33,359 --> 02:10:36,639
trying to use the result of this
2940
02:10:35,118 --> 02:10:38,960
division here we're just doing the
2941
02:10:36,639 --> 02:10:40,800
division which is a problem so let's try
2942
02:10:38,960 --> 02:10:43,118
and capture this we haven't learned
2943
02:10:40,800 --> 02:10:46,239
about variables yet but what we're going
2944
02:10:43,118 --> 02:10:48,799
to do now is do end value and we're
2945
02:10:46,238 --> 02:10:51,359
going to assign the result of this
2946
02:10:48,800 --> 02:10:54,079
division to this value and let's try
2947
02:10:51,359 --> 02:10:56,880
printing the result of dividing a number
2948
02:10:54,078 --> 02:10:59,118
by zero so we're going to do stdc out
2949
02:10:56,880 --> 02:11:02,078
and we're going to say value and this is
2950
02:10:59,118 --> 02:11:04,238
how you can print a value out on the
2951
02:11:02,078 --> 02:11:06,399
console okay now that we have this and
2952
02:11:04,238 --> 02:11:09,039
let's try and weld we're going to run
2953
02:11:06,399 --> 02:11:11,359
tasks and worldwide gcc we're going to
2954
02:11:09,039 --> 02:11:13,599
get the same warning but if we try to
2955
02:11:11,359 --> 02:11:17,039
run the program we're not going to get
2956
02:11:13,599 --> 02:11:19,440
what we expect let's run rooster exe we
2957
02:11:17,039 --> 02:11:21,439
expect it to say hello world and printed
2958
02:11:19,439 --> 02:11:23,359
the value but you see that it's really
2959
02:11:21,439 --> 02:11:26,238
struggling to print the value and it
2960
02:11:23,359 --> 02:11:29,679
gave up and ended immediately so this is
2961
02:11:26,238 --> 02:11:31,598
one example of a runtime error that you
2962
02:11:29,679 --> 02:11:33,279
can face in your program there are many
2963
02:11:31,599 --> 02:11:35,039
other kinds that we're going to see as
2964
02:11:35,039 --> 02:11:39,760
here we are just trying to raise your
2965
02:11:37,439 --> 02:11:41,759
awareness on these problems so that you
2966
02:11:39,760 --> 02:11:44,000
can know how to fix them when they come
2967
02:11:41,760 --> 02:11:46,880
up okay so this is all i can share with
2968
02:11:44,000 --> 02:11:48,560
you now about runtime errors we also had
2969
02:11:46,880 --> 02:11:50,800
a chance to see that this is also going
2970
02:11:48,560 --> 02:11:52,880
to give you a warning and a visual
2971
02:11:50,800 --> 02:11:55,520
studio code here is also helping out
2972
02:11:52,880 --> 02:11:58,319
telling us that we may have a problem
2973
02:11:55,520 --> 02:11:59,920
it's turning the main cpp file yellow
2974
02:11:58,319 --> 02:12:02,158
and it's saying that there is one
2975
02:11:59,920 --> 02:12:04,000
problem in this file and if you go here
2976
02:12:02,158 --> 02:12:06,319
you're going to see that we have a
2977
02:12:04,000 --> 02:12:08,158
warning here okay so this is one way you
2978
02:12:06,319 --> 02:12:09,599
have to see this so this is not
2979
02:12:08,158 --> 02:12:12,000
recommended to do so we're going to
2980
02:12:09,599 --> 02:12:14,719
comment this out okay this is really all
2981
02:12:12,000 --> 02:12:17,198
i had to share in this lecture we had a
2982
02:12:14,719 --> 02:12:19,039
chance to look at compile time errors we
2983
02:12:17,198 --> 02:12:21,919
also had a chance to look at warnings
2984
02:12:19,039 --> 02:12:24,078
and run time errors using this example
2985
02:12:21,920 --> 02:12:26,158
if you get a warning it is a message the
2986
02:12:24,078 --> 02:12:29,118
compiler is giving you that you should
2987
02:12:26,158 --> 02:12:32,000
really look it up and fix the problem
2988
02:12:29,118 --> 02:12:34,000
before it becomes more serious compile
2989
02:12:32,000 --> 02:12:36,238
time errors are going to cause your
2990
02:12:34,000 --> 02:12:38,078
compilation to fail and that's a really
2991
02:12:36,238 --> 02:12:41,279
good thing because the compiler is going
2992
02:12:38,078 --> 02:12:43,599
to stop you from generating a binary
2993
02:12:41,279 --> 02:12:45,759
that doesn't really do what you expect
2994
02:12:43,599 --> 02:12:47,840
it to do so that's a good thing but
2995
02:12:45,760 --> 02:12:50,239
sometimes the compiler want to give you
2996
02:12:47,840 --> 02:12:52,400
a compile arrow and you have a chance to
2997
02:12:50,238 --> 02:12:54,559
run into a runtime error and that's
2998
02:12:52,399 --> 02:12:57,118
really bad so be careful about these
2999
02:12:54,560 --> 02:12:58,800
things and when you have problems visual
3000
02:12:57,118 --> 02:13:01,519
studio code is going to show you the
3001
02:12:58,800 --> 02:13:03,360
problem in terminal or in this problems
3002
02:13:01,520 --> 02:13:05,199
tab and you're going to be able to fix
3003
02:13:03,359 --> 02:13:06,799
it up we're going to stop here in this
3004
02:13:05,198 --> 02:13:09,359
lecture in the next one we're going to
3005
02:13:06,800 --> 02:13:11,520
learn a little more about statements and
3006
02:13:09,359 --> 02:13:13,519
functions go ahead and finish up here
3007
02:13:11,520 --> 02:13:15,679
and meet me there in this lecture we're
3008
02:13:13,520 --> 02:13:18,560
going to learn about a little more about
3009
02:13:15,679 --> 02:13:21,118
statements and functions in c plus plus
3010
02:13:21,118 --> 02:13:26,880
computation in c plus plus you can say
3011
02:13:23,760 --> 02:13:30,000
that it is the smallest thing your cpu
3012
02:13:26,880 --> 02:13:32,000
can execute in your program every c plus
3013
02:13:30,000 --> 02:13:33,760
plus program is a collection of
3014
02:13:32,000 --> 02:13:37,039
statements so you're going to have a
3015
02:13:33,760 --> 02:13:39,360
bunch of statements that are organized
3016
02:13:37,039 --> 02:13:42,158
in a certain way to achieve whatever it
3017
02:13:39,359 --> 02:13:44,960
is you want and statements in c plus
3018
02:13:42,158 --> 02:13:47,439
plus must end with the semicolon we saw
3019
02:13:44,960 --> 02:13:49,840
in the last lecture that not putting
3020
02:13:47,439 --> 02:13:53,039
that semicolon is going to result in a
3021
02:13:49,840 --> 02:13:55,360
compile time error here is a basic
3022
02:13:53,039 --> 02:13:58,479
sample c plus plus program that we're
3023
02:13:55,359 --> 02:14:00,639
going to use to learn about statements
3024
02:13:58,479 --> 02:14:03,359
in the main function here we have two
3025
02:14:00,639 --> 02:14:05,359
variables declared we haven't really
3026
02:14:03,359 --> 02:14:08,238
learned about variables but they are a
3027
02:14:05,359 --> 02:14:11,359
way to store data in your program and
3028
02:14:08,238 --> 02:14:13,839
here we are storing two decimal numbers
3029
02:14:11,359 --> 02:14:16,078
one is called first number the second is
3030
02:14:13,840 --> 02:14:18,159
called second number we can do something
3031
02:14:16,078 --> 02:14:20,559
with these variables that we have in our
3032
02:14:18,158 --> 02:14:23,279
program for example we can add them to
3033
02:14:20,560 --> 02:14:25,599
have another variable in our program and
3034
02:14:23,279 --> 02:14:28,880
we can print that so you see here we are
3035
02:14:25,599 --> 02:14:31,920
saying stdc out the sum of two numbers
3036
02:14:28,880 --> 02:14:34,960
is sum so this is going to print 21
3037
02:14:31,920 --> 02:14:36,480
because it's going to add 12 and 9 and
3038
02:14:34,960 --> 02:14:39,118
the result of that is going to be
3039
02:14:36,479 --> 02:14:41,359
displayed on the terminal if we run this
3040
02:14:39,118 --> 02:14:44,319
program what i really want you to notice
3041
02:14:41,359 --> 02:14:47,839
is that this and first the number equals
3042
02:14:44,319 --> 02:14:50,479
12 thing is a statement in c plus plus
3043
02:14:47,840 --> 02:14:52,719
so it must end with a semicolon the line
3044
02:14:50,479 --> 02:14:55,279
here with second number is also a
3045
02:14:52,719 --> 02:14:58,319
statement so it must end with a
3046
02:14:55,279 --> 02:14:59,920
semicolon every single line we have here
3047
02:14:58,319 --> 02:15:02,639
in the main function is really a
3048
02:14:59,920 --> 02:15:05,039
statement and it must end with a
3049
02:15:02,639 --> 02:15:07,118
semicolon if we don't put the semicolon
3050
02:15:05,039 --> 02:15:09,039
in place we're going to get a compiler
3051
02:15:07,118 --> 02:15:11,519
error okay one other thing that is
3052
02:15:09,039 --> 02:15:14,238
really important to keep in mind is that
3053
02:15:11,520 --> 02:15:17,280
statements are executed in order in your
3054
02:15:14,238 --> 02:15:19,519
program and the order is from top to
3055
02:15:17,279 --> 02:15:21,840
bottom if you go back to our program
3056
02:15:19,520 --> 02:15:24,079
here so the first statement is the one
3057
02:15:21,840 --> 02:15:26,400
with first number here 12 is going to be
3058
02:15:24,078 --> 02:15:29,279
installed in memory when this statement
3059
02:15:26,399 --> 02:15:31,359
is executed by your computer and we're
3060
02:15:29,279 --> 02:15:33,279
going to go to the second statement with
3061
02:15:31,359 --> 02:15:35,759
second number and we're going to keep
3062
02:15:33,279 --> 02:15:38,078
going until we hit the end of the main
3063
02:15:35,760 --> 02:15:40,960
function and the return statement is
3064
02:15:38,078 --> 02:15:43,439
going to execute and when the main
3065
02:15:40,960 --> 02:15:45,920
function returns or terminates we're
3066
02:15:43,439 --> 02:15:47,919
going to get the return value sent to
3067
02:15:45,920 --> 02:15:50,800
your operating system and it's going to
3068
02:15:47,920 --> 02:15:52,800
know if your program ended successfully
3069
02:15:50,800 --> 02:15:54,880
or with a problem and the operating
3070
02:15:52,800 --> 02:15:57,199
system is going to know what to do with
3071
02:15:54,880 --> 02:15:59,920
that information execution keeps going
3072
02:15:57,198 --> 02:16:02,078
until we hit the end of the program or
3073
02:15:59,920 --> 02:16:04,000
if there is any other condition causing
3074
02:16:02,078 --> 02:16:05,920
for the program to terminate and we're
3075
02:16:04,000 --> 02:16:08,078
going to have more details about these
3076
02:16:05,920 --> 02:16:10,880
things later i just want you to know
3077
02:16:08,078 --> 02:16:12,960
that the statements are executed in
3078
02:16:10,880 --> 02:16:14,960
order in your main function another
3079
02:16:12,960 --> 02:16:18,239
concept i really want you to have an
3080
02:16:14,960 --> 02:16:20,239
idea about is the concept of functions a
3081
02:16:18,238 --> 02:16:22,319
function is really like a machine you
3082
02:16:20,238 --> 02:16:25,279
give it input and it's going to give you
3083
02:16:22,319 --> 02:16:27,599
output if we look at the operation here
3084
02:16:25,279 --> 02:16:30,479
to add first a number to second number
3085
02:16:27,599 --> 02:16:33,439
we can consider first number and second
3086
02:16:30,479 --> 02:16:35,359
number as input to the function and sum
3087
02:16:33,439 --> 02:16:37,599
is the output of the function we can
3088
02:16:35,359 --> 02:16:39,679
visualize that like this so we have a
3089
02:16:37,599 --> 02:16:42,079
first number and the second number we
3090
02:16:39,679 --> 02:16:44,000
pass that into our machine which is
3091
02:16:42,079 --> 02:16:46,879
really a function and we're going to get
3092
02:16:44,000 --> 02:16:49,519
the result of this function in a return
3093
02:16:46,879 --> 02:16:52,398
value or something that we get out of
3094
02:16:49,519 --> 02:16:55,280
the function as our result c plus plus
3095
02:16:52,398 --> 02:16:57,840
has a special syntax we use to define
3096
02:16:55,280 --> 02:17:00,559
functions this is our function to add
3097
02:16:57,840 --> 02:17:03,679
numbers on the left we have an integer
3098
02:17:00,558 --> 02:17:05,518
which is code name for a whole number in
3099
02:17:03,679 --> 02:17:07,840
c plus plus it's a number without
3100
02:17:05,519 --> 02:17:09,200
decimal points and it's a whole number
3101
02:17:07,840 --> 02:17:11,200
after that we have the name of the
3102
02:17:09,200 --> 02:17:13,599
function and we can name it whatever we
3103
02:17:11,200 --> 02:17:16,079
want and after that we're going to have
3104
02:17:13,599 --> 02:17:17,760
the list of parameters that we can pass
3105
02:17:16,079 --> 02:17:20,398
to the function and this is going to
3106
02:17:17,760 --> 02:17:22,719
work as the input to the function
3107
02:17:20,398 --> 02:17:26,239
after you do that you're going to have a
3108
02:17:22,718 --> 02:17:28,478
pair of curly braces the one is here the
3109
02:17:26,239 --> 02:17:30,799
other is here to the end and within
3110
02:17:28,478 --> 02:17:33,039
those curly braces it's going to be the
3111
02:17:30,799 --> 02:17:35,438
body of the function inside the function
3112
02:17:33,040 --> 02:17:37,120
you see that we are declaring a variable
3113
02:17:37,120 --> 02:17:41,519
and we are storing the sum of first
3114
02:17:39,679 --> 02:17:42,478
number and second number in this
3115
02:17:42,478 --> 02:17:47,679
and we are making this function return
3116
02:17:45,519 --> 02:17:50,000
the sum as the result and we're going to
3117
02:17:47,679 --> 02:17:52,000
be able to capture it if we call this
3118
02:17:50,000 --> 02:17:53,679
function in a function like me you're
3119
02:17:52,000 --> 02:17:56,079
going to see how this works in a minute
3120
02:17:53,679 --> 02:17:58,638
a function must be defined before it's
3121
02:17:56,079 --> 02:18:01,359
used so you can't really call a function
3122
02:17:58,638 --> 02:18:04,239
you haven't defined first in your c plus
3123
02:18:01,359 --> 02:18:06,639
plus program and here is a slightly
3124
02:18:04,239 --> 02:18:09,439
complete program to really put all these
3125
02:18:06,638 --> 02:18:11,920
ideas together we have our function to
3126
02:18:09,439 --> 02:18:14,079
add numbers it takes two numbers first
3127
02:18:11,920 --> 02:18:16,478
number and second number it's going to
3128
02:18:14,079 --> 02:18:19,280
add them up and store the results and
3129
02:18:16,478 --> 02:18:21,840
we're going to return some to be used by
3130
02:18:19,280 --> 02:18:24,719
whoever called this function and if you
3131
02:18:21,840 --> 02:18:27,280
look in our main program we have a
3132
02:18:24,718 --> 02:18:30,478
statement here we're going to store the
3133
02:18:27,280 --> 02:18:33,679
result of add numbers in the sum
3134
02:18:30,478 --> 02:18:35,519
variable and we pass first number and
3135
02:18:33,679 --> 02:18:37,599
second number in the function and we're
3136
02:18:35,519 --> 02:18:39,920
going to have that result stored in here
3137
02:18:37,599 --> 02:18:42,558
here we also call the function with
3138
02:18:39,920 --> 02:18:44,638
direct numbers you see that we pass in
3139
02:18:42,558 --> 02:18:46,718
34 and the seven and we're going to
3140
02:18:44,638 --> 02:18:48,718
print out the result here this is the
3141
02:18:46,718 --> 02:18:51,518
basic idea i want you to have about
3142
02:18:48,718 --> 02:18:53,919
functions they are reusable pieces of
3143
02:18:51,519 --> 02:18:55,840
code that group together a bunch of
3144
02:18:53,920 --> 02:18:58,159
statements to do whatever it is we
3145
02:18:55,840 --> 02:19:00,239
wanted to do in that function one
3146
02:18:58,159 --> 02:19:02,959
benefit about functions is that we can
3147
02:19:00,239 --> 02:19:05,519
reuse the code here if you look here we
3148
02:19:02,959 --> 02:19:07,678
are calling this function multiple times
3149
02:19:05,519 --> 02:19:10,159
without really rewriting these
3150
02:19:07,679 --> 02:19:12,000
statements that are inside the function
3151
02:19:10,159 --> 02:19:14,318
i know some of these concepts might be
3152
02:19:12,000 --> 02:19:17,200
cryptic to you right now we are going to
3153
02:19:14,318 --> 02:19:18,959
go to visual studio code and try this in
3154
02:19:17,200 --> 02:19:21,599
code and you're going to see exactly how
3155
02:19:18,959 --> 02:19:24,079
this works okay here we are in our
3156
02:19:21,599 --> 02:19:26,318
folder where we are storing our projects
3157
02:19:24,079 --> 02:19:28,718
i am going to grab the code from the
3158
02:19:26,318 --> 02:19:30,959
template project i am going to put that
3159
02:19:28,718 --> 02:19:33,438
in the current project which is
3160
02:19:30,959 --> 02:19:35,839
statements and functions i'm going to
3161
02:19:33,439 --> 02:19:38,479
paste that in here and i am going to
3162
02:19:35,840 --> 02:19:40,398
open this up in visual studio code i am
3163
02:19:38,478 --> 02:19:43,119
going to close the project we have right
3164
02:19:40,398 --> 02:19:46,079
now and i am going to open our new
3165
02:19:43,120 --> 02:19:48,160
project let's browse to its location i
3166
02:19:46,079 --> 02:19:50,719
am going to open the project on
3167
02:19:48,159 --> 02:19:52,879
statements and functions let's open this
3168
02:19:50,719 --> 02:19:55,358
folder in visual studio code and we're
3169
02:19:52,879 --> 02:19:57,039
going to have our starter project here i
3170
02:19:55,359 --> 02:19:59,040
am going to take out whatever we have in
3171
02:19:57,040 --> 02:20:01,120
the main function and take out this
3172
02:19:59,040 --> 02:20:03,359
contival thing we don't really need it
3173
02:20:01,120 --> 02:20:05,920
and we are going to try and define two
3174
02:20:03,359 --> 02:20:08,239
variables using two statements we are
3175
02:20:05,920 --> 02:20:10,960
going to say and first number and we're
3176
02:20:08,239 --> 02:20:13,199
going to put in a value let's say three
3177
02:20:10,959 --> 02:20:15,919
and we have to remember to end this with
3178
02:20:13,200 --> 02:20:18,240
a semicolon so this makes our statement
3179
02:20:15,920 --> 02:20:20,239
we can encode this in a comment to make
3180
02:20:18,239 --> 02:20:22,799
this pretty clear we're going to also
3181
02:20:20,239 --> 02:20:24,559
define a second variable so we're going
3182
02:20:24,559 --> 02:20:30,079
mean that it is a whole number it
3183
02:20:26,959 --> 02:20:32,318
doesn't have decimal points like 2.5 it
3184
02:20:30,079 --> 02:20:34,318
is a whole number like one or seven or
3185
02:20:32,318 --> 02:20:37,279
ten so we're going to say second number
3186
02:20:34,318 --> 02:20:39,439
we can give it a name and uh let's put
3187
02:20:37,280 --> 02:20:42,159
in a seven we're going to store these
3188
02:20:39,439 --> 02:20:44,239
values in our program and we can print
3189
02:20:42,159 --> 02:20:47,600
these values out let's print them out
3190
02:20:44,239 --> 02:20:49,840
first so we're going to say stdc out we
3191
02:20:47,600 --> 02:20:53,120
already know how to do that and we can
3192
02:20:49,840 --> 02:20:55,760
say first number and we can change these
3193
02:20:53,120 --> 02:20:58,800
output statements and say the first
3194
02:20:55,760 --> 02:21:02,239
number is first number you can do that
3195
02:20:58,799 --> 02:21:04,478
std endl and you can notice that visual
3196
02:21:02,239 --> 02:21:06,879
studio code is really helping out in
3197
02:21:04,478 --> 02:21:09,039
auto completing things we have in our
3198
02:21:06,879 --> 02:21:12,000
program let's print the second number to
3199
02:21:09,040 --> 02:21:13,520
really practice this so if we do std
3200
02:21:12,000 --> 02:21:15,439
you're going to see that it's going to
3201
02:21:13,520 --> 02:21:18,479
give us a bunch of options we can choose
3202
02:21:15,439 --> 02:21:20,800
from if you want you can scroll through
3203
02:21:18,478 --> 02:21:23,199
this with your mouse or you can just
3204
02:21:20,799 --> 02:21:25,840
type whatever you want to type so i am
3205
02:21:23,200 --> 02:21:28,000
going to do c out and it's going to try
3206
02:21:25,840 --> 02:21:30,398
and help out if i really want i can come
3207
02:21:28,000 --> 02:21:32,000
on c out here and click on it and it's
3208
02:21:30,398 --> 02:21:34,079
going to be auto completed which is
3209
02:21:32,000 --> 02:21:36,799
pretty cool so we're going to say second
3210
02:21:34,079 --> 02:21:38,879
number and we're going to say second
3211
02:21:36,799 --> 02:21:40,719
number here and it's going to auto
3212
02:21:40,719 --> 02:21:46,398
endl and we can try and compile this
3213
02:21:43,760 --> 02:21:49,359
program before we do i want you to guess
3214
02:21:46,398 --> 02:21:51,439
what we're going to get when we run this
3215
02:21:49,359 --> 02:21:53,840
program give it a guess we are then
3216
02:21:51,439 --> 02:21:56,318
going to go to terminal run task and
3217
02:21:53,840 --> 02:21:58,239
we're going to build this with gcc the
3218
02:21:56,318 --> 02:22:00,478
world is going to be successful we're
3219
02:21:58,239 --> 02:22:02,478
going to open this in our terminal the
3220
02:22:00,478 --> 02:22:04,639
terminal goes away no problem we're
3221
02:22:02,478 --> 02:22:08,159
going to open it again and we are going
3222
02:22:04,639 --> 02:22:09,959
to go in our folder and do the ir and
3223
02:22:08,159 --> 02:22:12,959
you're going to see that we have
3224
02:22:09,959 --> 02:22:15,599
rooster.exe our program we can run it
3225
02:22:12,959 --> 02:22:18,318
and it's going to say first number three
3226
02:22:15,600 --> 02:22:20,399
and second number s7 this is what we
3227
02:22:18,318 --> 02:22:22,478
have stored in these variables and the
3228
02:22:20,398 --> 02:22:25,039
benefit of storing your data in
3229
02:22:22,478 --> 02:22:27,199
variables is that you can change the
3230
02:22:25,040 --> 02:22:30,240
variables and let the rest of your
3231
02:22:27,200 --> 02:22:32,159
program really do the same things and
3232
02:22:30,239 --> 02:22:35,760
pick up the data that you have in those
3233
02:22:32,159 --> 02:22:37,200
variables for example we can put 13 in
3234
02:22:37,200 --> 02:22:41,439
and if we build again this number is
3235
02:22:39,200 --> 02:22:43,920
going to be picked up by this code and
3236
02:22:41,439 --> 02:22:46,960
we didn't need to go in and manually
3237
02:22:43,920 --> 02:22:49,600
change data in these sddc out statements
3238
02:22:46,959 --> 02:22:53,039
here let's weld so that we can see this
3239
02:22:49,600 --> 02:22:55,760
and we can close this by clicking and if
3240
02:22:53,040 --> 02:22:58,399
we run rooster again it's going to say
3241
02:22:55,760 --> 02:23:00,960
13 and 7. play with this a couple of
3242
02:22:58,398 --> 02:23:02,799
times until you really feel confident
3243
02:23:00,959 --> 02:23:04,799
and if you have any problem don't
3244
02:23:02,799 --> 02:23:06,799
hesitate to ask me i am going to do the
3245
02:23:06,799 --> 02:23:12,478
now that we have these numbers stored in
3246
02:23:09,120 --> 02:23:14,640
our program we can add them up let's say
3247
02:23:12,478 --> 02:23:16,959
and some we're going to declare another
3248
02:23:14,639 --> 02:23:20,000
variable and we're going to say it's
3249
02:23:16,959 --> 02:23:21,438
equal to first number plus second number
3250
02:23:20,000 --> 02:23:23,680
and we're going to end this with a
3251
02:23:21,439 --> 02:23:25,040
semicolon and we're going to print the
3252
02:23:25,040 --> 02:23:30,800
let's do sddc out and we're going to say
3253
02:23:28,239 --> 02:23:33,520
the sum is sum we're going to print our
3254
02:23:30,799 --> 02:23:37,199
variable here and we're going to print a
3255
02:23:33,520 --> 02:23:39,200
new line character with std endl we're
3256
02:23:37,200 --> 02:23:42,159
going to build our program so that our
3257
02:23:39,200 --> 02:23:44,399
changes are reflected in our binary here
3258
02:23:42,159 --> 02:23:47,359
so we're going to go to terminal
3259
02:23:44,398 --> 02:23:49,439
run task weld with gcc the build is
3260
02:23:47,359 --> 02:23:51,840
going to be successful we're going to
3261
02:23:49,439 --> 02:23:54,079
press any key we are going to click here
3262
02:23:51,840 --> 02:23:56,799
in the terminal and we're going to hit
3263
02:23:54,079 --> 02:23:58,959
enter and run rooster again and we
3264
02:23:56,799 --> 02:24:02,398
should see the sum and you see it says
3265
02:23:58,959 --> 02:24:05,199
the sum is 20 which is what we expect
3266
02:24:02,398 --> 02:24:07,519
now we are doing the sum here but it
3267
02:24:05,200 --> 02:24:10,479
would really be better if we're not
3268
02:24:07,520 --> 02:24:13,359
doing the sum in the main function here
3269
02:24:10,478 --> 02:24:15,679
what if we actually took this code and
3270
02:24:13,359 --> 02:24:18,239
wrapped it in a function that we could
3271
02:24:15,680 --> 02:24:20,398
reuse whatever we want we have seen how
3272
02:24:18,239 --> 02:24:22,079
we can declare a function so let's do
3273
02:24:20,398 --> 02:24:24,398
that we're going to follow the same
3274
02:24:22,079 --> 02:24:26,318
structure we saw in the slides earlier
3275
02:24:24,398 --> 02:24:29,279
so we're going to say and this is going
3276
02:24:26,318 --> 02:24:30,959
to be the return value or what we get
3277
02:24:29,280 --> 02:24:32,560
out of the function then we're going to
3278
02:24:30,959 --> 02:24:34,559
put in the name of the function we're
3279
02:24:32,559 --> 02:24:36,639
going to say add numbers and we're going
3280
02:24:34,559 --> 02:24:38,799
to pass in the parameters the parameters
3281
02:24:36,639 --> 02:24:40,639
can really have any name you want but
3282
02:24:40,639 --> 02:24:45,279
the type of the parameter first so the
3283
02:24:43,359 --> 02:24:48,960
parameters are also going to be whole
3284
02:24:45,280 --> 02:24:51,439
numbers like 1 5 7 or whatever you want
3285
02:24:48,959 --> 02:24:53,519
and we're going to say first program
3286
02:24:51,439 --> 02:24:55,600
and the second is going to also be a
3287
02:24:53,520 --> 02:24:56,960
whole number an integer and it's going
3288
02:24:56,959 --> 02:25:02,159
param okay after we do this we're going
3289
02:24:59,439 --> 02:25:04,960
to specify the body of the function
3290
02:25:02,159 --> 02:25:07,520
which is going to be between these curly
3291
02:25:04,959 --> 02:25:09,919
braces i am going to jump to the next
3292
02:25:07,520 --> 02:25:12,880
line so that this is really easy to see
3293
02:25:09,920 --> 02:25:14,879
so i am going to define our sum variable
3294
02:25:12,879 --> 02:25:17,679
inside the function it's going to be a
3295
02:25:14,879 --> 02:25:20,959
whole number and i can call it whatever
3296
02:25:17,680 --> 02:25:23,120
i want so let's call it result because
3297
02:25:20,959 --> 02:25:25,279
it's going to be the result of this
3298
02:25:23,120 --> 02:25:28,079
function and the result is going to be
3299
02:25:25,280 --> 02:25:30,239
the sum of first param and second param
3300
02:25:28,079 --> 02:25:32,398
okay i hope this makes sense and we're
3301
02:25:30,239 --> 02:25:35,199
going to end this with a semicolon
3302
02:25:32,398 --> 02:25:37,279
because every statement in c plus plus
3303
02:25:35,200 --> 02:25:38,399
has to end with the semicolon after we
3304
02:25:38,398 --> 02:25:43,039
we need to give it back to whoever
3305
02:25:40,879 --> 02:25:45,358
called this function and we're going to
3306
02:25:43,040 --> 02:25:47,600
do that with a return statement and
3307
02:25:45,359 --> 02:25:48,720
we're going to return the result to
3308
02:25:48,719 --> 02:25:52,318
might have called this function here now
3309
02:25:50,799 --> 02:25:54,478
that we have the function we can
3310
02:25:52,318 --> 02:25:56,879
actually use it we're going to go back
3311
02:25:54,478 --> 02:25:58,239
in our main function and what we're
3312
02:25:58,239 --> 02:26:04,239
is to reuse this sum variable and store
3313
02:26:01,680 --> 02:26:06,479
in whatever is returned from our
3314
02:26:04,239 --> 02:26:07,520
function the syntax for that is going to
3315
02:26:07,520 --> 02:26:12,079
and we're going to say equals and we're
3316
02:26:09,359 --> 02:26:14,318
going to say add numbers and we can pass
3317
02:26:12,079 --> 02:26:18,639
in whatever two numbers that we want to
3318
02:26:20,559 --> 02:26:27,199
we would expect this to give us 32
3319
02:26:23,760 --> 02:26:29,280
so if we print the sum again we can just
3320
02:26:29,280 --> 02:26:34,880
that prints the sum and reuse it here
3321
02:26:32,239 --> 02:26:37,199
let's align this a little bit and i want
3322
02:26:34,879 --> 02:26:39,438
you to take a guess at what we are going
3323
02:26:37,200 --> 02:26:41,359
to get from this program right now we
3324
02:26:39,439 --> 02:26:44,318
have these two numbers we are adding
3325
02:26:41,359 --> 02:26:46,239
them up if we get here this should print
3326
02:26:44,318 --> 02:26:50,239
the first number which is going to be a
3327
02:26:46,239 --> 02:26:52,398
13 so here we expect to get 13 and by
3328
02:26:50,239 --> 02:26:54,559
the time we hit this second number
3329
02:26:52,398 --> 02:26:57,279
statement we are going to print the
3330
02:26:54,559 --> 02:26:59,439
second number it's going to be 7. if we
3331
02:26:57,280 --> 02:27:02,479
get here we're going to print whatever
3332
02:26:59,439 --> 02:27:05,439
is stored in sum and in sum we have the
3333
02:27:02,478 --> 02:27:08,959
sum of first number and second number so
3334
02:27:05,439 --> 02:27:11,359
this should print 20 right and here we
3335
02:27:08,959 --> 02:27:14,478
are doing another sum of two numbers but
3336
02:27:11,359 --> 02:27:16,559
we are using a predefined function
3337
02:27:14,478 --> 02:27:19,119
that we have here before the main
3338
02:27:16,559 --> 02:27:21,199
function because you have to define the
3339
02:27:19,120 --> 02:27:24,319
function before you use it okay if we
3340
02:27:21,200 --> 02:27:27,200
add 25 and seven we are going to fall
3341
02:27:24,318 --> 02:27:28,959
into this function and it's going to add
3342
02:27:27,200 --> 02:27:30,399
those numbers up and we're going to get
3343
02:27:30,398 --> 02:27:34,318
and that's what we're going to return
3344
02:27:32,559 --> 02:27:36,478
and it is going to be saved in this
3345
02:27:34,318 --> 02:27:39,279
variable if we print it out it's going
3346
02:27:36,478 --> 02:27:42,799
to give us 32. i hope this makes sense
3347
02:27:39,280 --> 02:27:45,439
let's build and run our program run task
3348
02:27:42,799 --> 02:27:47,199
world with gcc the world is going to go
3349
02:27:45,439 --> 02:27:49,680
fine we're going to go back to our
3350
02:27:47,200 --> 02:27:52,800
terminal here that's clear so that
3351
02:27:49,680 --> 02:27:54,880
things don't disturb us and uh bring in
3352
02:27:52,799 --> 02:27:58,000
some confusion we're going to run our
3353
02:27:54,879 --> 02:28:00,079
rooster program and exactly what we have
3354
02:27:58,000 --> 02:28:03,120
here we have a 13 from the first
3355
02:28:00,079 --> 02:28:06,079
statement here we have a 7 from this
3356
02:28:03,120 --> 02:28:09,600
statement here we have a 20 from this
3357
02:28:06,079 --> 02:28:12,079
sum here which is here and we have a 32
3358
02:28:09,600 --> 02:28:13,760
that we got from this function the good
3359
02:28:12,079 --> 02:28:16,079
thing about functions is that we can
3360
02:28:13,760 --> 02:28:18,398
reuse them now that we know how to use
3361
02:28:16,079 --> 02:28:20,079
it we can use it again and we can say
3362
02:28:20,079 --> 02:28:26,478
add numbers and we can say 30 and
3363
02:28:24,159 --> 02:28:28,079
54 for example you add them up and
3364
02:28:26,478 --> 02:28:30,799
you're going to get the results so we're
3365
02:28:28,079 --> 02:28:33,520
going to print the result some and we're
3366
02:28:30,799 --> 02:28:35,519
going to put in the sum i really want
3367
02:28:33,520 --> 02:28:37,359
you to take some time and play with this
3368
02:28:35,520 --> 02:28:39,760
statement so that these things make
3369
02:28:37,359 --> 02:28:41,760
sense it's really not that difficult but
3370
02:28:39,760 --> 02:28:44,880
you just have to rock your brains around
3371
02:28:41,760 --> 02:28:47,200
how c plus plus defines these things so
3372
02:28:44,879 --> 02:28:51,759
we have this statement and we are adding
3373
02:28:47,200 --> 02:28:54,640
30 and 54 so it should get an 84 after
3374
02:28:51,760 --> 02:28:57,359
the 32 here let's weld we're going to
3375
02:28:54,639 --> 02:28:59,599
run the task to world with gcc we're
3376
02:28:57,359 --> 02:29:02,720
going to click on the terminal here and
3377
02:28:59,600 --> 02:29:04,399
hit enter let's clear so that we don't
3378
02:29:02,719 --> 02:29:07,358
have things disturbing us and we're
3379
02:29:04,398 --> 02:29:10,719
going to run our program and we have our
3380
02:29:07,359 --> 02:29:12,800
trusty 84 here i really hope this makes
3381
02:29:10,719 --> 02:29:15,679
sense and as a bonus i'm going to show
3382
02:29:12,799 --> 02:29:19,199
you that you can also call things
3383
02:29:15,680 --> 02:29:21,840
in the stdc out statement here without
3384
02:29:19,200 --> 02:29:24,079
having to store them in some predefined
3385
02:29:21,840 --> 02:29:27,920
variables and sometimes this comes in
3386
02:29:24,079 --> 02:29:31,200
handy so you can say std see out and
3387
02:29:27,920 --> 02:29:33,600
we're going to say sum and you might say
3388
02:29:31,200 --> 02:29:37,600
add numbers right in here and you're
3389
02:29:33,600 --> 02:29:40,800
going to say 3 for example and uh 42 and
3390
02:29:37,600 --> 02:29:43,200
this is going to give us a 45 that's
3391
02:29:40,799 --> 02:29:44,079
what we should expect to see after 84
3392
02:29:44,079 --> 02:29:49,039
so that's world and running the task to
3393
02:29:46,719 --> 02:29:51,760
build with gcc the world is going to be
3394
02:29:49,040 --> 02:29:54,080
successful we click on the terminal here
3395
02:29:51,760 --> 02:29:56,318
we hit enter so that we see our terminal
3396
02:29:54,079 --> 02:29:59,120
with output we're going to clear so that
3397
02:29:56,318 --> 02:30:01,600
we see our output without noise we're
3398
02:29:59,120 --> 02:30:04,240
going to run our program and we're going
3399
02:30:01,600 --> 02:30:06,000
to see a 45 here i really hope this
3400
02:30:04,239 --> 02:30:08,079
makes sense the whole point of this
3401
02:30:06,000 --> 02:30:10,559
lecture was to make you aware of
3402
02:30:08,079 --> 02:30:13,120
statements and function a statement is
3403
02:30:10,559 --> 02:30:16,079
the most basic unit in your c plus plus
3404
02:30:13,120 --> 02:30:19,200
program it basically lives on one line
3405
02:30:16,079 --> 02:30:20,959
but it can also spread across different
3406
02:30:19,200 --> 02:30:22,640
lines but we're not going to look at
3407
02:30:20,959 --> 02:30:25,119
that here maybe we're going to see that
3408
02:30:22,639 --> 02:30:27,760
later in the course statements are
3409
02:30:25,120 --> 02:30:30,240
executed in order so when our main
3410
02:30:27,760 --> 02:30:31,520
function gets to be run by the computer
3411
02:30:30,239 --> 02:30:33,439
it's going to go from the first
3412
02:30:31,520 --> 02:30:36,000
statement second statement third
3413
02:30:33,439 --> 02:30:39,040
statement and it's going to go until it
3414
02:30:36,000 --> 02:30:40,959
hits the end and we can see that here in
3415
02:30:39,040 --> 02:30:43,680
the order in which our numbers are
3416
02:30:40,959 --> 02:30:46,000
printed it is going from top to bottom
3417
02:30:43,680 --> 02:30:48,398
we have also seen that we can split our
3418
02:30:46,000 --> 02:30:50,159
code in different functions and wrap
3419
02:30:48,398 --> 02:30:52,799
whatever functionality we have in a
3420
02:30:50,159 --> 02:30:54,959
function we have seen the basic concepts
3421
02:30:52,799 --> 02:30:57,679
on functions a function has a return
3422
02:30:54,959 --> 02:31:00,079
value it has a name and you have to give
3423
02:30:57,680 --> 02:31:02,880
it the parameters and you put the body
3424
02:31:00,079 --> 02:31:05,760
of your function within these two curly
3425
02:31:02,879 --> 02:31:09,119
braces as an exercise i would challenge
3426
02:31:05,760 --> 02:31:11,680
you to do a function that multiplies two
3427
02:31:09,120 --> 02:31:14,000
numbers and call it in the main function
3428
02:31:11,680 --> 02:31:16,079
here to see the result if you have any
3429
02:31:14,000 --> 02:31:18,879
problem please do ask me i am going to
3430
02:31:16,079 --> 02:31:20,879
do the best i can to help you out this
3431
02:31:18,879 --> 02:31:22,559
covers all we set out to do in this
3432
02:31:20,879 --> 02:31:24,639
lecture and i hope you found it
3433
02:31:22,559 --> 02:31:26,318
interesting we're going to stop here in
3434
02:31:24,639 --> 02:31:29,279
this lecture in the next one we're going
3435
02:31:26,318 --> 02:31:32,239
to see how we can input and output
3436
02:31:29,280 --> 02:31:34,479
things from our c plus plus program go
3437
02:31:32,239 --> 02:31:35,920
ahead and finish up here and meet me
3438
02:31:34,478 --> 02:31:38,559
there in this lecture we're going to
3439
02:31:35,920 --> 02:31:41,120
learn about how we can get thanks in our
3440
02:31:38,559 --> 02:31:43,359
program and get things out of our
3441
02:31:41,120 --> 02:31:46,720
program and that's basically input and
3442
02:31:43,359 --> 02:31:49,040
output to and from our program we have
3443
02:31:46,719 --> 02:31:51,039
actually been doing this all along we
3444
02:31:49,040 --> 02:31:52,880
have been printing things from our
3445
02:31:52,879 --> 02:31:57,679
and with this technique you can really
3446
02:31:57,680 --> 02:32:02,960
as a highway that goes from your program
3447
02:32:01,040 --> 02:32:05,200
to the terminal you can basically think
3448
02:32:02,959 --> 02:32:08,239
of it like this data is going from your
3449
02:32:05,200 --> 02:32:10,560
program to sddc out and it's going from
3450
02:32:08,239 --> 02:32:13,280
here to the terminal and from this you
3451
02:32:13,280 --> 02:32:18,720
less than signs kind of point to the
3452
02:32:16,079 --> 02:32:22,318
left because data is going from your
3453
02:32:18,719 --> 02:32:25,279
program to htdc out and these two
3454
02:32:22,318 --> 02:32:29,840
symbols point to the left they point to
3455
02:32:25,280 --> 02:32:33,120
hddc out to signal to the fact that data
3456
02:32:29,840 --> 02:32:35,600
is going from here to here i really hope
3457
02:32:33,120 --> 02:32:37,920
this makes sense because sometimes these
3458
02:32:35,600 --> 02:32:41,040
things can confuse people this is the
3459
02:32:37,920 --> 02:32:43,520
reason why it's going from your data to
3460
02:32:41,040 --> 02:32:47,600
stdc out data is basically going from
3461
02:32:43,520 --> 02:32:50,079
your program into httc out and the sddc
3462
02:32:47,600 --> 02:32:52,000
out is one way we have to get data from
3463
02:32:50,079 --> 02:32:57,200
our program to the console there are
3464
02:32:52,000 --> 02:32:59,520
many others we have std c e r r or std
3465
02:32:57,200 --> 02:33:02,159
server this is what i'd like to call it
3466
02:32:59,520 --> 02:33:05,120
and what it does it prints errors to the
3467
02:33:02,159 --> 02:33:08,000
console we have stdc log which is going
3468
02:33:05,120 --> 02:33:09,760
to print log messages why do we have
3469
02:33:08,000 --> 02:33:12,478
these different things different
3470
02:33:09,760 --> 02:33:14,719
programs might decide to format these
3471
02:33:12,478 --> 02:33:17,199
messages differently because they are
3472
02:33:14,719 --> 02:33:19,519
different messages one is a simple
3473
02:33:17,200 --> 02:33:22,079
message from the program another is the
3474
02:33:19,520 --> 02:33:24,239
narrows you might want to turn this red
3475
02:33:22,079 --> 02:33:26,398
to really bring the attention
3476
02:33:24,239 --> 02:33:28,559
to this message because the user has to
3477
02:33:26,398 --> 02:33:30,719
solve that problem another might be a
3478
02:33:28,559 --> 02:33:33,039
log message that you want to store in
3479
02:33:33,040 --> 02:33:37,280
uses for these things differ and c plus
3480
02:33:35,439 --> 02:33:40,079
plus makes sure to give you different
3481
02:33:37,280 --> 02:33:42,720
ways to state your intent through the
3482
02:33:40,079 --> 02:33:47,600
tools that you use we have looked at
3483
02:33:42,719 --> 02:33:51,519
sddc out sddc error and stdc log what
3484
02:33:47,600 --> 02:33:53,439
does sd c i n do it does the reverse
3485
02:33:51,520 --> 02:33:56,479
it's going to take data out of the
3486
02:33:53,439 --> 02:33:58,880
program and bring that into the program
3487
02:33:56,478 --> 02:34:01,279
so let's look at a few examples using
3488
02:33:58,879 --> 02:34:04,478
these here we have an example of
3489
02:34:01,280 --> 02:34:06,800
printing data from the program to the
3490
02:34:08,719 --> 02:34:12,239
here we have a hello world message going
3491
02:34:12,239 --> 02:34:17,920
here we have a number going to c out
3492
02:34:15,680 --> 02:34:20,398
this is what we've been doing all along
3493
02:34:17,920 --> 02:34:22,318
we can also do a variable storing the
3494
02:34:20,398 --> 02:34:23,680
edge for example it's a whole number
3495
02:34:23,680 --> 02:34:30,000
so we print this out and the message is
3496
02:34:26,398 --> 02:34:32,079
going to go from the program to cl so
3497
02:34:30,000 --> 02:34:35,680
you can think that things are going from
3498
02:34:32,079 --> 02:34:37,760
the program to sddc out i really wanted
3499
02:34:35,680 --> 02:34:40,398
this to make sense okay if we go down
3500
02:34:37,760 --> 02:34:42,960
we're going to see that we can use cr to
3501
02:34:40,398 --> 02:34:45,358
print errors to the terminal and we
3502
02:34:42,959 --> 02:34:47,279
might say something went wrong or
3503
02:34:45,359 --> 02:34:50,159
something along these lines to bring the
3504
02:34:47,280 --> 02:34:53,280
attention to the problem and we can use
3505
02:34:50,159 --> 02:34:55,760
c log to print log messages and they
3506
02:34:53,280 --> 02:34:58,560
work the same way they all use the
3507
02:34:55,760 --> 02:35:01,280
stream output operator and it is going
3508
02:34:58,559 --> 02:35:03,519
to take data from the program to
3509
02:35:01,280 --> 02:35:05,760
the output stream really this is what we
3510
02:35:03,520 --> 02:35:08,239
mean here here is an example of how you
3511
02:35:05,760 --> 02:35:10,559
might read data and bring that into the
3512
02:35:08,239 --> 02:35:12,879
program here we have two variables one
3513
02:35:10,559 --> 02:35:15,600
is the age it's a whole number or an
3514
02:35:12,879 --> 02:35:18,000
integer and z plus plus and the other is
3515
02:35:15,600 --> 02:35:20,720
a string this is a type that allows you
3516
02:35:18,000 --> 02:35:22,559
to store strings in c plus plus we're
3517
02:35:20,719 --> 02:35:25,279
going to learn a little more about this
3518
02:35:22,559 --> 02:35:27,439
later but here i want to use it to
3519
02:35:25,280 --> 02:35:29,600
really make it clear that you can get
3520
02:35:27,439 --> 02:35:31,439
things from the outside and bring that
3521
02:35:29,600 --> 02:35:34,559
data in your program so we're going to
3522
02:35:31,439 --> 02:35:37,920
let the user type in the last name and
3523
02:35:37,920 --> 02:35:43,359
is getting data from the stream or from
3524
02:35:40,799 --> 02:35:45,920
the highway through which data comes
3525
02:35:43,359 --> 02:35:48,399
into our program and bringing that in
3526
02:35:45,920 --> 02:35:51,120
our program and here it should be clear
3527
02:35:48,398 --> 02:35:54,398
that the flow of data is in this
3528
02:35:51,120 --> 02:35:56,560
direction data is going from c i n and
3529
02:35:54,398 --> 02:35:59,119
we're storing that in a variable that we
3530
02:35:56,559 --> 02:36:01,519
have in our program that is called name
3531
02:35:59,120 --> 02:36:03,760
we do the same thing and ask the user to
3532
02:36:01,520 --> 02:36:06,159
print the age and they are going to
3533
02:36:03,760 --> 02:36:09,040
print that and the data is going to come
3534
02:36:06,159 --> 02:36:11,439
from cin and we're going to store that
3535
02:36:09,040 --> 02:36:13,120
in our edge variable here after we
3536
02:36:11,439 --> 02:36:14,800
collect the data from the user we're
3537
02:36:13,120 --> 02:36:16,960
going to print that and we're going to
3538
02:36:14,799 --> 02:36:18,799
say hello we're going to print the name
3539
02:36:16,959 --> 02:36:21,599
and we're going to say they are whatever
3540
02:36:18,799 --> 02:36:24,000
years old this is what this program does
3541
02:36:21,600 --> 02:36:27,200
and i really hope it makes it clear
3542
02:36:24,000 --> 02:36:29,200
how data input works through streams in
3543
02:36:27,200 --> 02:36:30,120
surplus plus another thing we can do
3544
02:36:30,120 --> 02:36:37,280
sddcin is chaining input and we can use
3545
02:36:34,639 --> 02:36:39,439
this technique to grab data in one
3546
02:36:37,280 --> 02:36:41,200
statement look at the program down here
3547
02:36:39,439 --> 02:36:43,680
to really understand this we have the
3548
02:36:41,200 --> 02:36:45,840
same variables age and name we let the
3549
02:36:43,680 --> 02:36:47,840
user type in the last name and age
3550
02:36:47,840 --> 02:36:53,120
and we grab the data like this we first
3551
02:36:50,318 --> 02:36:55,199
grab the name after that we grab the age
3552
02:36:53,120 --> 02:36:57,040
and we're going to print the same things
3553
02:36:57,040 --> 02:37:02,880
input stream operators like this to grab
3554
02:37:00,478 --> 02:37:04,478
the data in one go and this may come in
3555
02:37:04,478 --> 02:37:08,719
before we try these things in visual
3556
02:37:06,879 --> 02:37:10,799
studio code i want to bring your
3557
02:37:08,719 --> 02:37:13,760
attention to a problem that you are
3558
02:37:10,799 --> 02:37:16,879
likely to come in contact with and that
3559
02:37:13,760 --> 02:37:19,200
is reading data with spaces what if the
3560
02:37:19,200 --> 02:37:23,439
with spaces for example you asked me to
3561
02:37:21,359 --> 02:37:26,239
type my name i'm not going to type
3562
02:37:23,439 --> 02:37:28,000
daniel i'm going to type daniel cafwaya
3563
02:37:26,239 --> 02:37:30,559
and your program is going to run into
3564
02:37:28,000 --> 02:37:34,000
problems c plus plus allows to solve
3565
02:37:30,559 --> 02:37:35,119
this problem using std get line and you
3566
02:37:35,120 --> 02:37:39,840
using this syntax you're going to pass
3567
02:37:37,920 --> 02:37:41,760
in the stream where the data is going to
3568
02:37:39,840 --> 02:37:43,920
go and you're going to pass in the
3569
02:37:41,760 --> 02:37:45,040
variable that is going to read the data
3570
02:37:45,040 --> 02:37:50,000
information stored correctly in your
3571
02:37:47,200 --> 02:37:52,479
program this might be not making sense
3572
02:37:50,000 --> 02:37:55,040
yet to you we're going to go to visual
3573
02:37:52,478 --> 02:37:57,279
studio code and play with us and i am
3574
02:37:55,040 --> 02:37:59,840
sure it is going to make sense okay here
3575
02:37:57,280 --> 02:38:01,840
we are in visual studio code and we have
3576
02:37:59,840 --> 02:38:04,478
our project where we're going to store
3577
02:38:01,840 --> 02:38:06,639
our files data imported output we're
3578
02:38:04,478 --> 02:38:08,959
going to copy code from our template
3579
02:38:06,639 --> 02:38:11,119
project and we're going to put the data
3580
02:38:08,959 --> 02:38:13,438
in and i am going to open this folder in
3581
02:38:11,120 --> 02:38:15,920
visual studio code so let's close
3582
02:38:13,439 --> 02:38:18,960
whatever we have now and i am going to
3583
02:38:15,920 --> 02:38:21,520
open my folder let's browse there i am
3584
02:38:18,959 --> 02:38:24,000
on this folder data input and output i
3585
02:38:21,520 --> 02:38:26,560
am going to select that and the project
3586
02:38:24,000 --> 02:38:28,799
is going to open up in visual studio
3587
02:38:26,559 --> 02:38:30,719
code i am going to jump to my main
3588
02:38:28,799 --> 02:38:32,799
function i am going to take out things
3589
02:38:30,719 --> 02:38:34,799
we don't need and the first thing we're
3590
02:38:32,799 --> 02:38:36,079
going to do is printing data we have
3591
02:38:34,799 --> 02:38:38,239
really done this so we're going to
3592
02:38:36,079 --> 02:38:40,000
practice this a little bit we can say
3593
02:38:40,000 --> 02:38:47,359
and we can say hello c plus plus 20 why
3594
02:38:44,079 --> 02:38:50,079
not and we're going to put an std
3595
02:38:47,359 --> 02:38:53,680
endl at the end and remember our
3596
02:38:50,079 --> 02:38:56,959
semicolon and here i want you to really
3597
02:38:53,680 --> 02:39:01,040
put in your head that data is going from
3598
02:38:56,959 --> 02:39:02,879
our program here to hddc out and sddc
3599
02:39:01,040 --> 02:39:05,120
out is going to dump that on the
3600
02:39:02,879 --> 02:39:08,398
terminal that's how this works you can
3601
02:39:05,120 --> 02:39:11,760
also do a variable let's say ant
3602
02:39:08,398 --> 02:39:14,000
age for example let's say 21 and end
3603
02:39:11,760 --> 02:39:17,280
this with the semicolon and we can also
3604
02:39:14,000 --> 02:39:19,359
print the h we can say sddc out
3605
02:39:19,359 --> 02:39:23,600
age this is going to be sent to the
3606
02:39:23,600 --> 02:39:27,600
and we're going to do sdd and dl to add
3607
02:39:27,600 --> 02:39:32,239
new line character at the end and we can
3608
02:39:30,239 --> 02:39:34,159
try and build this before the program
3609
02:39:32,239 --> 02:39:36,239
gets more complicated let's go to
3610
02:39:34,159 --> 02:39:38,799
terminal we're going to run the test
3611
02:39:38,799 --> 02:39:44,318
and if we hit enter on the terminal here
3612
02:39:42,318 --> 02:39:47,039
the terminal is going to go away we're
3613
02:39:44,318 --> 02:39:49,600
going to create a new one no big deal
3614
02:39:47,040 --> 02:39:52,319
and uh if we do dir we're going to find
3615
02:39:49,600 --> 02:39:56,000
our rooster program if we run it it's
3616
02:39:52,318 --> 02:39:59,039
going to say hello c plus 20 and the age
3617
02:39:56,000 --> 02:40:01,600
is going to be 21. we are successfully
3618
02:39:59,040 --> 02:40:04,080
taking data from our program and
3619
02:40:01,600 --> 02:40:06,640
printing that to the terminal this is
3620
02:40:04,079 --> 02:40:09,359
pretty cool and you can think of sddc
3621
02:40:06,639 --> 02:40:12,079
out as the highway that is really going
3622
02:40:09,359 --> 02:40:16,079
to take your data from your program and
3623
02:40:12,079 --> 02:40:18,000
bring that to sddc out like this
3624
02:40:16,079 --> 02:40:20,398
we're also going to take the age it's
3625
02:40:18,000 --> 02:40:22,159
going to go through sddc out and it's
3626
02:40:20,398 --> 02:40:24,318
going to show up here you can think of
3627
02:40:22,159 --> 02:40:29,279
this like this okay now that we have
3628
02:40:24,318 --> 02:40:31,439
used sddc out we can use sddcr and sddc
3629
02:40:29,279 --> 02:40:34,000
log in the same way so we're going to
3630
02:40:34,000 --> 02:40:38,799
i'm going to say error message and the
3631
02:40:36,478 --> 02:40:41,358
message is going to be something is
3632
02:40:38,799 --> 02:40:43,840
wrong you may do whatever you want in
3633
02:40:41,359 --> 02:40:45,840
here and we have to remember to put a
3634
02:40:43,840 --> 02:40:48,239
new line character otherwise data is
3635
02:40:45,840 --> 02:40:51,359
going to be cramped on one line we can
3636
02:40:48,239 --> 02:40:54,959
also use sddc log it really works the
3637
02:40:51,359 --> 02:40:57,840
same way c log and we can say log
3638
02:40:54,959 --> 02:40:58,799
message and we're going to say something
3639
02:40:58,799 --> 02:41:05,920
and we remember to put std endl and our
3640
02:41:03,040 --> 02:41:07,520
semicolon if we build this program you
3641
02:41:05,920 --> 02:41:09,359
might guess what it's going to do it's
3642
02:41:07,520 --> 02:41:10,479
going to print these things on the
3643
02:41:13,439 --> 02:41:17,760
to terminal programs that support
3644
02:41:15,680 --> 02:41:20,079
features to format different messages
3645
02:41:17,760 --> 02:41:22,079
directly the program is going to know
3646
02:41:20,079 --> 02:41:24,159
that one message is a simple message the
3647
02:41:22,079 --> 02:41:26,799
other is an arrow the other is a log
3648
02:41:26,799 --> 02:41:30,559
but before we do that let's clear so
3649
02:41:28,639 --> 02:41:32,639
that we don't have noise here we're
3650
02:41:30,559 --> 02:41:34,959
going to run the program and it's going
3651
02:41:32,639 --> 02:41:37,278
to say the error message and the log
3652
02:41:34,959 --> 02:41:40,079
message here okay now what we're going
3653
02:41:37,279 --> 02:41:42,479
to look at is how we can get data into
3654
02:41:40,079 --> 02:41:44,799
our program and data is going to be
3655
02:41:42,478 --> 02:41:46,318
going in a different direction
3656
02:41:44,799 --> 02:41:49,358
it's going to be coming from the
3657
02:41:46,318 --> 02:41:51,519
terminal and flowing into our program
3658
02:41:49,359 --> 02:41:54,880
what we're going to do we're going to do
3659
02:41:51,520 --> 02:41:57,520
ant age one this is a new variable so
3660
02:41:54,879 --> 02:42:00,639
we're going to put in data and we're
3661
02:41:57,520 --> 02:42:04,079
going to bring in a string library to
3662
02:42:00,639 --> 02:42:05,439
allow our program to store strengths the
3663
02:42:04,079 --> 02:42:06,879
way we're going to do that we're going
3664
02:42:06,879 --> 02:42:11,278
strength this is how you do it in c plus
3665
02:42:09,279 --> 02:42:13,439
plus we haven't really learned about
3666
02:42:11,279 --> 02:42:15,600
this type it's a powerful type in c plus
3667
02:42:13,439 --> 02:42:17,600
plus but we will get it there when we
3668
02:42:15,600 --> 02:42:19,200
have more powerful tools to really
3669
02:42:17,600 --> 02:42:21,279
understand it we are just getting
3670
02:42:19,200 --> 02:42:24,159
started here so what we're going to do
3671
02:42:21,279 --> 02:42:25,680
we're going to say std strength and
3672
02:42:25,680 --> 02:42:30,960
and we're going to ask the user to print
3673
02:42:28,000 --> 02:42:33,520
their name and age you already know how
3674
02:42:30,959 --> 02:42:35,759
to do that so we're going to say please
3675
02:42:33,520 --> 02:42:38,800
type your name and age and we're going
3676
02:42:35,760 --> 02:42:41,520
to do stdndl on this and how we're going
3677
02:42:38,799 --> 02:42:43,318
to get data in the program we're going
3678
02:42:43,318 --> 02:42:50,398
stdcin and we're going to do std
3679
02:42:46,959 --> 02:42:53,199
cim and data is going to be going from
3680
02:42:50,398 --> 02:42:55,760
the stream to the program so the
3681
02:42:53,200 --> 02:42:56,560
stream input operator here points to the
3682
02:42:56,559 --> 02:43:00,959
and the data is going to be going in the
3683
02:42:59,279 --> 02:43:02,880
name variable because that's what
3684
02:43:00,959 --> 02:43:04,959
they're going to be typing in first
3685
02:43:02,879 --> 02:43:07,039
because that's what we told them to do
3686
02:43:04,959 --> 02:43:09,398
so we're going to store the name
3687
02:43:09,398 --> 02:43:17,439
stdcim data is going to be flowing from
3688
02:43:12,680 --> 02:43:19,120
sddcin into our h1 variable okay now
3689
02:43:17,439 --> 02:43:20,960
that the user has given us their
3690
02:43:19,120 --> 02:43:23,200
information we can greet them with a
3691
02:43:20,959 --> 02:43:26,799
personalized message we're going to say
3692
02:43:23,200 --> 02:43:29,279
stdc out hello and we're going to put
3693
02:43:26,799 --> 02:43:31,759
out their name and we're going to tell
3694
02:43:29,279 --> 02:43:32,640
them you are and we're going to put the
3695
02:43:32,639 --> 02:43:37,840
one because that's what they're going to
3696
02:43:34,559 --> 02:43:38,879
give us here and i'm going to say
3697
02:43:38,879 --> 02:43:44,639
and we're going to put an std endl here
3698
02:43:41,920 --> 02:43:47,600
i'm going to grab this and pull this to
3699
02:43:44,639 --> 02:43:50,559
the left so that we can see our entire
3700
02:43:47,600 --> 02:43:52,239
program here that's helpful so what we
3701
02:43:50,559 --> 02:43:54,398
are doing here we are getting data from
3702
02:43:52,239 --> 02:43:56,559
the user and we are storing that in our
3703
02:43:54,398 --> 02:43:58,639
variables and we are printing the
3704
02:43:56,559 --> 02:44:01,119
message so that the user can see it i
3705
02:43:58,639 --> 02:44:04,079
don't want the first things we did here
3706
02:44:01,120 --> 02:44:07,040
to disturb us when we world and try this
3707
02:44:04,079 --> 02:44:10,000
out so i am going to comment this out
3708
02:44:07,040 --> 02:44:12,000
and comment the first block of code out
3709
02:44:10,000 --> 02:44:14,398
using blog comments i think this is the
3710
02:44:12,000 --> 02:44:16,559
first time we use this and uh this is
3711
02:44:14,398 --> 02:44:18,799
going to be ignored by the compiler now
3712
02:44:16,559 --> 02:44:20,639
and it is only going to consider this
3713
02:44:18,799 --> 02:44:22,959
and this is going to be pretty cool
3714
02:44:20,639 --> 02:44:25,199
let's go down a little bit here and i
3715
02:44:22,959 --> 02:44:28,879
try to build the program we're going to
3716
02:44:25,200 --> 02:44:31,040
run the task that welds with gcc and uh
3717
02:44:28,879 --> 02:44:33,599
looks like the world is good we're going
3718
02:44:31,040 --> 02:44:36,560
to hit enter and we're going to clear so
3719
02:44:33,600 --> 02:44:38,318
that we are not disturbed by this we're
3720
02:44:36,559 --> 02:44:40,000
going to run the program let's say
3721
02:44:40,000 --> 02:44:44,559
it's going to ask me to type my name and
3722
02:44:42,559 --> 02:44:47,278
age my name is daniel i'm going to type
3723
02:44:44,559 --> 02:44:48,879
that hit enter it's going to want me to
3724
02:44:53,600 --> 02:44:59,840
and it's going to tell me hello daniel
3725
02:44:56,079 --> 02:45:02,000
you are 33 years old i put a slash here
3726
02:44:59,840 --> 02:45:04,159
we can try and run it again so that i
3727
02:45:02,000 --> 02:45:07,680
don't have to make that mistake again so
3728
02:45:04,159 --> 02:45:08,879
daniel that's my name i hit enter i say
3729
02:45:10,639 --> 02:45:16,318
it's going to say hello daniel you are
3730
02:45:13,040 --> 02:45:17,840
33 years old i really hope this brings
3731
02:45:21,680 --> 02:45:26,720
that takes data from the terminal into
3732
02:45:24,719 --> 02:45:28,559
your program so this is really what is
3733
02:45:26,719 --> 02:45:30,639
happening here when i type daniel it's
3734
02:45:28,559 --> 02:45:33,119
going to flow from the terminal and it's
3735
02:45:30,639 --> 02:45:35,840
going to go into my variable which is
3736
02:45:33,120 --> 02:45:38,720
name here and when i type the age it's
3737
02:45:35,840 --> 02:45:41,680
going to go in my edge variable here and
3738
02:45:41,680 --> 02:45:46,000
in here okay one other thing we can do
3739
02:45:46,000 --> 02:45:51,040
grab the data and put that in our
3740
02:45:48,318 --> 02:45:53,439
variables in one go so what we can do
3741
02:45:51,040 --> 02:45:54,359
here is comment this out and we're going
3742
02:45:54,359 --> 02:45:59,439
stdcin and we're going to put that in
3743
02:45:57,120 --> 02:46:02,720
name and we're going to change these two
3744
02:45:59,439 --> 02:46:05,200
things and put the other piece of data
3745
02:46:02,719 --> 02:46:07,679
in h1 if you run the program it's going
3746
02:46:05,200 --> 02:46:10,479
to work exactly the same way but we are
3747
02:46:07,680 --> 02:46:12,318
grabbing the data in one line so let's
3748
02:46:10,478 --> 02:46:15,119
weld to see this in action we're going
3749
02:46:12,318 --> 02:46:16,879
to run the task that worlds with gcc
3750
02:46:15,120 --> 02:46:18,960
we're going to click here and we're
3751
02:46:16,879 --> 02:46:21,039
going to clear if we run rooster it's
3752
02:46:18,959 --> 02:46:23,039
going to ask for the name and the age
3753
02:46:21,040 --> 02:46:26,160
i'm going to put in daniel and i'm going
3754
02:46:23,040 --> 02:46:28,319
to put my h and say 33 for example and
3755
02:46:26,159 --> 02:46:30,398
it's going to do exactly the same thing
3756
02:46:28,318 --> 02:46:32,159
but we have one compact line the last
3757
02:46:30,398 --> 02:46:34,879
thing i want to show you in this lecture
3758
02:46:32,159 --> 02:46:37,200
is how you can grab data with spaces
3759
02:46:34,879 --> 02:46:40,398
because if i try to put in data with
3760
02:46:37,200 --> 02:46:42,640
spaces here the program is going to fail
3761
02:46:40,398 --> 02:46:44,639
miserably let me show you this i'm going
3762
02:46:42,639 --> 02:46:47,439
to clear and i'm going to run rooster
3763
02:46:44,639 --> 02:46:50,318
again and i'm going to say daniel i'm
3764
02:46:47,439 --> 02:46:52,880
going to put in my full name and uh it's
3765
02:46:50,318 --> 02:46:55,519
really not grabbing the second name and
3766
02:46:52,879 --> 02:46:57,438
it didn't give me a chance to input my
3767
02:46:57,439 --> 02:47:03,040
so c plus plus provides a way to solve
3768
02:46:59,840 --> 02:47:04,880
this using std get line so let's see
3769
02:47:03,040 --> 02:47:06,240
what we are doing here and before we
3770
02:47:04,879 --> 02:47:08,719
play with this we're going to comment
3771
02:47:06,239 --> 02:47:11,279
out what we had here so that
3772
02:47:08,719 --> 02:47:14,159
it doesn't disturb us in what we are
3773
02:47:11,279 --> 02:47:16,560
about to do so let's come down here and
3774
02:47:14,159 --> 02:47:18,478
say that we were doing data input this
3775
02:47:16,559 --> 02:47:21,439
is helpful here and we're going to go
3776
02:47:18,478 --> 02:47:23,599
down and grab data with spaces so i am
3777
02:47:21,439 --> 02:47:25,840
going to set up another strength and
3778
02:47:23,600 --> 02:47:28,318
this is going to store my full name
3779
02:47:25,840 --> 02:47:30,318
that's what i'm going to say here and to
3780
02:47:28,318 --> 02:47:33,199
grab it i'm going to tell the user to
3781
02:47:30,318 --> 02:47:35,760
type in their full name and age so i am
3782
02:47:33,200 --> 02:47:38,880
going to sddc out so the way i'm going
3783
02:47:35,760 --> 02:47:40,880
to grab the data i'm going to do std get
3784
02:47:38,879 --> 02:47:42,799
line you see that we have this function
3785
02:47:40,879 --> 02:47:45,920
here and it's going to take an input
3786
02:47:42,799 --> 02:47:47,519
stream so asd dcin is going to work and
3787
02:47:45,920 --> 02:47:49,760
the second parameter is going to be the
3788
02:47:47,520 --> 02:47:51,680
variable where this string data is going
3789
02:47:49,760 --> 02:47:54,559
to be stored we're going to pass in our
3790
02:47:51,680 --> 02:47:57,920
full name and this is going to work just
3791
02:47:54,559 --> 02:47:59,680
fine and we're going to also grab the h
3792
02:47:57,920 --> 02:48:01,559
using the same technique we've used
3793
02:48:01,559 --> 02:48:07,680
stdcin and we're going to store that in
3794
02:48:04,559 --> 02:48:10,719
our h3 variable once we have the data we
3795
02:48:07,680 --> 02:48:12,720
can greet our user using the same
3796
02:48:10,719 --> 02:48:15,278
message we had before so i'm going to
3797
02:48:12,719 --> 02:48:17,599
copy that if i can do that and i'm going
3798
02:48:15,279 --> 02:48:19,439
to paste that here i'm going to bring
3799
02:48:17,600 --> 02:48:21,680
this to the same location it's going to
3800
02:48:19,439 --> 02:48:25,040
be full name here and it's going to say
3801
02:48:21,680 --> 02:48:28,479
h3 and let's try and weld we're going to
3802
02:48:25,040 --> 02:48:31,600
terminal run the task to bolt with gcc
3803
02:48:28,478 --> 02:48:33,760
and we have a problem because we forgot
3804
02:48:31,600 --> 02:48:35,680
our semicolon see how these problems
3805
02:48:33,760 --> 02:48:38,398
might come to you uh-huh so we're going
3806
02:48:35,680 --> 02:48:41,120
to put in our semicolon and another
3807
02:48:38,398 --> 02:48:42,398
thing i really want you to see
3808
02:48:42,398 --> 02:48:47,199
bring these things to the next line if
3809
02:48:44,639 --> 02:48:49,358
they turn out too long like we see here
3810
02:48:47,200 --> 02:48:51,200
so i can for example put this to the
3811
02:48:49,359 --> 02:48:53,120
next line and it is going to work just
3812
02:48:51,200 --> 02:48:56,159
fine so what i am going to do i'm going
3813
02:48:53,120 --> 02:48:59,279
to try and weld again run task to build
3814
02:48:56,159 --> 02:49:00,398
with gcc you see that the world is good
3815
02:49:00,398 --> 02:49:05,519
bring in our terminal i'm going to clear
3816
02:49:02,879 --> 02:49:07,438
so that we don't have noise here and
3817
02:49:05,520 --> 02:49:09,600
we're going to run our program it's
3818
02:49:07,439 --> 02:49:11,600
going to ask me to put in my full name
3819
02:49:11,600 --> 02:49:15,600
and it's going to want the age i'm going
3820
02:49:13,520 --> 02:49:18,640
to say 33 and it's going to reach me
3821
02:49:15,600 --> 02:49:21,600
hello daniel gaway you are 33 years old
3822
02:49:18,639 --> 02:49:24,478
we are able to bring data with spaces
3823
02:49:21,600 --> 02:49:26,800
into our program and this concludes what
3824
02:49:24,478 --> 02:49:30,639
we had to say in this lecture i hope it
3825
02:49:26,799 --> 02:49:33,519
made it very clear what these htd n and
3826
02:49:30,639 --> 02:49:36,000
stdc out things are they are basically
3827
02:49:33,520 --> 02:49:38,640
highways that take data out of your
3828
02:49:36,000 --> 02:49:40,639
program or bring data into your program
3829
02:49:38,639 --> 02:49:42,398
and the way you use them is what we've
3830
02:49:40,639 --> 02:49:44,159
done here in this course i would
3831
02:49:42,398 --> 02:49:45,840
encourage you to play with us a couple
3832
02:49:44,159 --> 02:49:47,680
of times if this is the first time
3833
02:49:45,840 --> 02:49:49,520
you're doing this we are going to stop
3834
02:49:47,680 --> 02:49:51,920
here in this lecture in the next one
3835
02:49:49,520 --> 02:49:54,560
we're going to try and recap on the c
3836
02:49:51,920 --> 02:49:57,120
plus plus development workflow go ahead
3837
02:49:54,559 --> 02:49:59,039
and finish up here and meet me there
3838
02:49:57,120 --> 02:50:02,160
in this lecture we're going to explore
3839
02:49:59,040 --> 02:50:04,800
the c plus plus execution model and show
3840
02:50:02,159 --> 02:50:08,079
you a simplified version of the memory
3841
02:50:04,799 --> 02:50:11,278
model of your c plus plus program here
3842
02:50:08,079 --> 02:50:13,680
is how our program looks it is a simple
3843
02:50:11,279 --> 02:50:15,840
program in our main function it is going
3844
02:50:13,680 --> 02:50:17,600
to call a simple function that is going
3845
02:50:15,840 --> 02:50:19,680
to add two numbers we have seen a
3846
02:50:17,600 --> 02:50:22,239
program like this before and when we
3847
02:50:19,680 --> 02:50:25,200
compile it it's going to be turned into
3848
02:50:22,239 --> 02:50:28,159
a binary this black icon here represents
3849
02:50:25,200 --> 02:50:29,439
the binary executable and it is not in
3850
02:50:29,439 --> 02:50:34,159
that you can read with your eyes if we
3851
02:50:31,680 --> 02:50:36,800
come back here to what we were doing in
3852
02:50:34,159 --> 02:50:39,600
the last lecture we can see our rooster
3853
02:50:36,799 --> 02:50:41,278
executable binary here if you try to
3854
02:50:39,600 --> 02:50:43,040
open it here you're going to see that
3855
02:50:41,279 --> 02:50:45,040
visual studio code is going to say the
3856
02:50:43,040 --> 02:50:48,240
file is not displayed in the editor
3857
02:50:45,040 --> 02:50:52,000
because it is either binary or uses an
3858
02:50:48,239 --> 02:50:53,520
unsupported text encoding so it says i
3859
02:50:52,000 --> 02:50:55,359
can't really say this because it's
3860
02:50:53,520 --> 02:50:57,760
binary and it says do you want to open
3861
02:50:55,359 --> 02:50:59,600
it anyway if i try to open it it's going
3862
02:50:57,760 --> 02:51:02,719
to be just some gibberish because this
3863
02:51:02,719 --> 02:51:09,039
read by programs it is not meant to be
3864
02:51:05,520 --> 02:51:11,760
by ides or text editors like visual
3865
02:51:09,040 --> 02:51:14,560
studio code so this is the binary file
3866
02:51:11,760 --> 02:51:16,478
we have here i tried to put a simplified
3867
02:51:14,559 --> 02:51:18,559
version of this program to represent
3868
02:51:16,478 --> 02:51:21,278
binary so that we can follow it up but
3869
02:51:18,559 --> 02:51:24,398
it is not in the form that is readable
3870
02:51:21,279 --> 02:51:26,720
by any human out there unless you are a
3871
02:51:24,398 --> 02:51:29,599
machine so why is it in binary because
3872
02:51:26,719 --> 02:51:31,920
binary format is easily understandable
3873
02:51:29,600 --> 02:51:34,079
by your cpu and we're going to see how
3874
02:51:31,920 --> 02:51:36,719
your program is loaded in memory and
3875
02:51:34,079 --> 02:51:39,200
executed statement by statement by the
3876
02:51:36,719 --> 02:51:41,679
cpu so that you can really understand
3877
02:51:39,200 --> 02:51:44,319
this so here is a representation of your
3878
02:51:41,680 --> 02:51:45,840
program here we have our how to drive
3879
02:51:44,318 --> 02:51:48,639
and we have the program sitting
3880
02:51:45,840 --> 02:51:52,000
somewhere on our hard drive in binary
3881
02:51:48,639 --> 02:51:54,639
format and it's waiting to be run by you
3882
02:51:52,000 --> 02:51:56,879
by double clicking on it or opening it
3883
02:51:54,639 --> 02:51:59,680
in the terminal and on the left here we
3884
02:51:56,879 --> 02:52:02,478
see a representation of the memory of
3885
02:51:59,680 --> 02:52:05,200
our computer and when i say memory i
3886
02:52:02,478 --> 02:52:07,920
mean random access memory i don't mean
3887
02:52:05,200 --> 02:52:09,920
memory on your hard drive this should be
3888
02:52:07,920 --> 02:52:12,318
really clear this is the random access
3889
02:52:09,920 --> 02:52:15,200
memory of your computer that is running
3890
02:52:12,318 --> 02:52:18,239
your programs very fast so when you
3891
02:52:15,200 --> 02:52:20,720
double click on our program or if we
3892
02:52:18,239 --> 02:52:23,279
open it in the terminal the binary file
3893
02:52:20,719 --> 02:52:25,119
is going to be loaded up in memory and
3894
02:52:23,279 --> 02:52:27,520
you see it in red here this is a
3895
02:52:25,120 --> 02:52:30,240
representation of that and it is ready
3896
02:52:27,520 --> 02:52:32,319
to be run by the cpu by the time the cpu
3897
02:52:30,239 --> 02:52:34,478
says in the memory location it's going
3898
02:52:32,318 --> 02:52:36,559
to know i have a program to run and the
3899
02:52:34,478 --> 02:52:38,398
cpu is going to start running it
3900
02:52:36,559 --> 02:52:40,639
statement by statement it is going to
3901
02:52:38,398 --> 02:52:43,760
start by the top so it's going to see
3902
02:52:40,639 --> 02:52:46,478
that it needs to allocate space to store
3903
02:52:43,760 --> 02:52:48,800
our integer a it's going to allocate to
3904
02:52:46,478 --> 02:52:50,879
that somewhere on the memory in yellow
3905
02:52:48,799 --> 02:52:53,920
here you see a and it's going to see
3906
02:52:50,879 --> 02:52:55,519
that it should store in a value of 10
3907
02:52:53,920 --> 02:52:57,760
and it's going to do that you can see
3908
02:52:55,520 --> 02:53:00,239
that here it's going to go to the next
3909
02:52:57,760 --> 02:53:02,398
statement and the next statement tells
3910
02:53:02,398 --> 02:53:08,079
a value b and it's going to store in f5
3911
02:53:06,000 --> 02:53:10,559
it's going to go to the next statement
3912
02:53:08,079 --> 02:53:12,559
it's a variable called c it's going to
3913
02:53:10,559 --> 02:53:15,439
allocate space for it but we didn't
3914
02:53:12,559 --> 02:53:17,840
specify a value for c so what it's going
3915
02:53:15,439 --> 02:53:20,639
to do is store in some junk value the
3916
02:53:17,840 --> 02:53:22,880
value in there is really unspecified at
3917
02:53:20,639 --> 02:53:25,119
the moment it's going to jump to the
3918
02:53:22,879 --> 02:53:27,599
next statement and what it's going to do
3919
02:53:25,120 --> 02:53:29,279
is print some things on the console and
3920
02:53:27,600 --> 02:53:31,439
it is going to do that it's going to
3921
02:53:29,279 --> 02:53:34,720
jump to the next statement and it is
3922
02:53:31,439 --> 02:53:36,559
going to print statement 2 and here it
3923
02:53:34,719 --> 02:53:38,398
is going to notice that it is going to
3924
02:53:36,559 --> 02:53:40,719
call a function i don't know if you have
3925
02:53:38,398 --> 02:53:44,079
noticed but the cpu has allocated a
3926
02:53:40,719 --> 02:53:46,318
special memory location for our function
3927
02:53:44,079 --> 02:53:49,039
the function doesn't leave with our code
3928
02:53:46,318 --> 02:53:52,719
here or anywhere near the variables that
3929
02:53:49,040 --> 02:53:55,040
we have here there might be a huge chunk
3930
02:53:52,719 --> 02:53:57,840
of memory between these two or three
3931
02:53:55,040 --> 02:54:00,080
things so the cpu knows that it is going
3932
02:53:57,840 --> 02:54:02,719
to jump to another location it's going
3933
02:54:00,079 --> 02:54:04,799
to ask itself if i jump to that location
3934
02:54:02,719 --> 02:54:07,599
to run this function how am i going to
3935
02:54:04,799 --> 02:54:10,239
come back and the cpu is smart enough to
3936
02:54:07,600 --> 02:54:12,159
store the return address and that's what
3937
02:54:10,239 --> 02:54:13,920
it's going to do it's going to say if i
3938
02:54:12,159 --> 02:54:16,478
go to that function i want to come back
3939
02:54:13,920 --> 02:54:18,079
to the address 6 and run whatever is
3940
02:54:16,478 --> 02:54:21,278
after this address so it's going to
3941
02:54:18,079 --> 02:54:23,039
store 6 and cpu memory and it's going to
3942
02:54:21,279 --> 02:54:25,600
jump to the function it's going to take
3943
02:54:23,040 --> 02:54:28,640
the first parameter as a and the second
3944
02:54:25,600 --> 02:54:30,800
parameter as b so a is done the
3945
02:54:28,639 --> 02:54:33,199
parameter 1 is going to be 10 it's going
3946
02:54:30,799 --> 02:54:35,840
to take parameter 2 it's going to be 5
3947
02:54:33,200 --> 02:54:38,079
because it is b here and in b we have a
3948
02:54:35,840 --> 02:54:40,239
5 and it is going to jump to the next
3949
02:54:38,079 --> 02:54:42,559
statement in the function and it is
3950
02:54:40,239 --> 02:54:45,680
going to add up parameter 1 and
3951
02:54:42,559 --> 02:54:48,478
parameter 2. after it adds those things
3952
02:54:45,680 --> 02:54:50,720
up it's going to return the result to c
3953
02:54:48,478 --> 02:54:52,879
we can see that here okay that's what
3954
02:54:50,719 --> 02:54:55,438
the cpu is going to do it's going to put
3955
02:54:52,879 --> 02:54:57,358
the results in c and the result is a 15
3956
02:54:55,439 --> 02:55:00,079
so we're going to write that in there
3957
02:54:57,359 --> 02:55:01,920
and now that the function is really done
3958
02:55:00,079 --> 02:55:03,920
it's going to come back to its address
3959
02:55:01,920 --> 02:55:06,559
and it is going to jump to the next
3960
02:55:03,920 --> 02:55:09,120
segment after that it is going to
3961
02:55:06,559 --> 02:55:11,439
print three statement three it is going
3962
02:55:09,120 --> 02:55:14,560
to jump through the next line and print
3963
02:55:11,439 --> 02:55:17,680
statement four it's going to do that and
3964
02:55:14,559 --> 02:55:20,239
by this time we have reached the end of
3965
02:55:17,680 --> 02:55:22,639
our program and it is going to be popped
3966
02:55:20,239 --> 02:55:24,959
off the memory and your program is
3967
02:55:22,639 --> 02:55:28,478
basically going to end this is how your
3968
02:55:24,959 --> 02:55:30,559
program is executed by your cpu and why
3969
02:55:28,478 --> 02:55:32,799
am i showing you this because it is
3970
02:55:30,559 --> 02:55:35,359
really good to have an idea of how
3971
02:55:32,799 --> 02:55:38,000
memory is allocated and used by your
3972
02:55:35,359 --> 02:55:40,318
program another good reason is that some
3973
02:55:38,000 --> 02:55:42,719
c plus plus feature require you to have
3974
02:55:40,318 --> 02:55:44,639
an understanding of a memory model like
3975
02:55:42,719 --> 02:55:46,879
this to understand how they work for
3976
02:55:44,639 --> 02:55:49,358
example you have seen that to call this
3977
02:55:46,879 --> 02:55:53,039
function the program had to jump from
3978
02:55:49,359 --> 02:55:55,040
address 6 to 30 and this is really heavy
3979
02:55:53,040 --> 02:55:57,120
especially if you are running a simple
3980
02:55:55,040 --> 02:55:59,920
function like we are doing here to add
3981
02:55:57,120 --> 02:56:02,880
two numbers so the cpu can realize that
3982
02:55:59,920 --> 02:56:06,079
and optimize this call to the function
3983
02:56:02,879 --> 02:56:08,799
to an inline function and add these two
3984
02:56:06,079 --> 02:56:10,799
numbers up right here at address six
3985
02:56:08,799 --> 02:56:12,879
without jumping to this address here and
3986
02:56:10,799 --> 02:56:14,959
this may come in handy and you need an
3987
02:56:12,879 --> 02:56:17,278
understanding of this memory model to
3988
02:56:14,959 --> 02:56:19,438
really understand these features this is
3989
02:56:17,279 --> 02:56:22,000
just one example i am giving you you are
3990
02:56:19,439 --> 02:56:24,559
going to reuse this model a lot in your
3991
02:56:22,000 --> 02:56:26,478
career as a class plus developer and i
3992
02:56:24,559 --> 02:56:29,119
thought it was a really good idea for
3993
02:56:26,478 --> 02:56:30,639
you to understand it firsthand this is
3994
02:56:29,120 --> 02:56:33,040
really all i had to share in this
3995
02:56:30,639 --> 02:56:34,719
lecture i hope you found it interesting
3996
02:56:33,040 --> 02:56:36,720
in the next one we're going to try and
3997
02:56:34,719 --> 02:56:38,959
understand the difference between three
3998
02:56:36,719 --> 02:56:41,039
key components of the c plus plus
3999
02:56:38,959 --> 02:56:43,199
programming language go ahead and finish
4000
02:56:41,040 --> 02:56:45,120
up here and meet me there in this
4001
02:56:43,200 --> 02:56:47,680
lecture i want to highlight the
4002
02:56:45,120 --> 02:56:50,640
differences between what we call a c
4003
02:56:47,680 --> 02:56:53,359
plus plus core language feature or a
4004
02:56:50,639 --> 02:56:55,278
standard library feature or an stl
4005
02:56:53,359 --> 02:56:57,920
feature because these are terms that
4006
02:56:55,279 --> 02:57:00,479
come up a lot if you happen to read some
4007
02:56:57,920 --> 02:57:03,920
documentation about c plus plus a core
4008
02:57:00,478 --> 02:57:05,840
feature is really a basic building block
4009
02:57:03,920 --> 02:57:08,239
that makes up the c plus plus
4010
02:57:05,840 --> 02:57:10,880
programming language you can think of it
4011
02:57:08,239 --> 02:57:13,760
for example how you define variables the
4012
02:57:10,879 --> 02:57:16,159
rules that govern how you can define and
4013
02:57:13,760 --> 02:57:18,800
use a function in c plus plus the rules
4014
02:57:16,159 --> 02:57:21,359
that say what you can do and not do with
4015
02:57:18,799 --> 02:57:24,239
the basic features of c plus plus that's
4016
02:57:21,359 --> 02:57:26,800
really what can be qualified as the core
4017
02:57:24,239 --> 02:57:29,039
feature of the c plus plus programming
4018
02:57:26,799 --> 02:57:31,438
language i don't know if that makes any
4019
02:57:29,040 --> 02:57:33,359
sense if we come back in visual studio
4020
02:57:31,439 --> 02:57:35,920
code we have a program we have used in
4021
02:57:33,359 --> 02:57:38,640
the last few lectures for example these
4022
02:57:35,920 --> 02:57:41,359
basic types that you use in c plus plus
4023
02:57:38,639 --> 02:57:45,039
the rules that define how you can define
4024
02:57:41,359 --> 02:57:47,439
a function for example if you put a
4025
02:57:45,040 --> 02:57:50,720
an angle bracket here and try to compile
4026
02:57:47,439 --> 02:57:53,840
this program it is not going to work
4027
02:57:50,719 --> 02:57:56,879
because we have violated the rules of
4028
02:57:53,840 --> 02:57:59,120
the c plus plus programs the basic rules
4029
02:57:56,879 --> 02:58:01,438
that define how the c plus plus
4030
02:57:59,120 --> 02:58:03,279
programming language works the basic
4031
02:58:01,439 --> 02:58:05,279
types that are defined in the c plus
4032
02:58:03,279 --> 02:58:08,079
plus programming language these little
4033
02:58:05,279 --> 02:58:10,960
things make up the raw ingredients you
4034
02:58:08,079 --> 02:58:14,079
use to make up a proper c plus plus
4035
02:58:10,959 --> 02:58:16,318
programs and these little row components
4036
02:58:14,079 --> 02:58:18,959
that you use to put together a c plus
4037
02:58:16,318 --> 02:58:19,920
plus program are called core features
4038
02:58:19,920 --> 02:58:25,840
think of them as the foundation on top
4039
02:58:22,799 --> 02:58:28,799
of which we really build daily use c
4040
02:58:25,840 --> 02:58:31,600
plus plus programs the standard library
4041
02:58:31,600 --> 02:58:36,079
highly specialized components that we
4042
02:58:34,000 --> 02:58:38,478
can easily use in our c plus plus
4043
02:58:36,079 --> 02:58:41,760
programs and again coming back to our
4044
02:58:38,478 --> 02:58:44,239
program in visual studio code iostream
4045
02:58:41,760 --> 02:58:46,880
here is a standard library feature
4046
02:58:44,239 --> 02:58:49,039
string here is a standard library thing
4047
02:58:46,879 --> 02:58:51,920
we have in the c plus plus programming
4048
02:58:49,040 --> 02:58:54,960
language and again the c plus plus
4049
02:58:51,920 --> 02:58:57,680
standard library tries to provide highly
4050
02:58:54,959 --> 02:59:00,799
specialized components that we can use
4051
02:58:57,680 --> 02:59:02,800
in regular c plus plus programs when you
4052
02:59:00,799 --> 02:59:05,519
use the c plus plus programming language
4053
02:59:02,799 --> 02:59:08,318
you don't really want to extend the c
4054
02:59:05,520 --> 02:59:10,720
plus plus programming language you want
4055
02:59:08,318 --> 02:59:13,519
to use it to build something of your own
4056
02:59:10,719 --> 02:59:16,000
and uh the standard library features are
4057
02:59:13,520 --> 02:59:18,880
things you use to work on your programs
4058
02:59:16,000 --> 02:59:20,799
very fast for example we have used sddc
4059
02:59:18,879 --> 02:59:23,119
out without really going into the
4060
02:59:20,799 --> 02:59:25,039
details of how the data is taken from
4061
02:59:23,120 --> 02:59:27,680
this program to the terminal that's
4062
02:59:25,040 --> 02:59:30,319
really advanced and probably complicated
4063
02:59:27,680 --> 02:59:33,120
but it is wrapped into this reusable
4064
02:59:30,318 --> 02:59:36,079
components and one of them is iostream
4065
02:59:33,120 --> 02:59:38,800
and we can use it relatively easily in
4066
02:59:36,079 --> 02:59:40,879
our c plus plus program okay i hope now
4067
02:59:38,799 --> 02:59:43,599
you have a better idea of what the c
4068
02:59:40,879 --> 02:59:47,358
plus plus standard library is now what
4069
02:59:43,600 --> 02:59:50,318
is the stl the stl is really part of the
4070
02:59:47,359 --> 02:59:53,279
c plus plus standard library but it is a
4071
02:59:50,318 --> 02:59:56,079
collection of container types think of
4072
02:59:53,279 --> 02:59:58,720
them as collections of things and we
4073
02:59:56,079 --> 03:00:02,239
have a set of types that allow us to
4074
02:59:58,719 --> 03:00:04,959
store collections we have algorithms or
4075
03:00:02,239 --> 03:00:08,079
functions that work on these collections
4076
03:00:04,959 --> 03:00:10,799
and we have specialized types that are
4077
03:00:08,079 --> 03:00:12,959
called iterators that allow us to
4078
03:00:10,799 --> 03:00:16,079
navigate through these containers
4079
03:00:12,959 --> 03:00:18,639
potentially running these algorithms on
4080
03:00:16,079 --> 03:00:21,039
each element in the collection this is
4081
03:00:18,639 --> 03:00:24,159
probably not making sense by now but you
4082
03:00:21,040 --> 03:00:26,560
can think of the stl as a highly
4083
03:00:24,159 --> 03:00:28,079
specialized part of the c plus plus
4084
03:00:26,559 --> 03:00:30,000
standard library and we're going to
4085
03:00:28,079 --> 03:00:32,239
learn about many features of these
4086
03:00:30,000 --> 03:00:35,120
things throughout the course but i want
4087
03:00:32,239 --> 03:00:37,680
you to have a basic understanding
4088
03:00:35,120 --> 03:00:40,079
between these three terms a core feature
4089
03:00:37,680 --> 03:00:43,279
of the c plus plus programming language
4090
03:00:40,079 --> 03:00:46,398
is standard library feature and the stl
4091
03:00:43,279 --> 03:00:48,560
and i really hope this is clear to you
4092
03:00:46,398 --> 03:00:51,439
by now in this chapter we're going to
4093
03:00:48,559 --> 03:00:53,519
learn about variables and data types
4094
03:00:51,439 --> 03:00:55,520
before we talk about variables and data
4095
03:00:53,520 --> 03:00:58,079
types i would like to take a moment and
4096
03:00:58,079 --> 03:01:01,920
and if you look at these cards many of
4097
03:01:00,239 --> 03:01:03,520
these things should make sense now you
4098
03:01:01,920 --> 03:01:05,200
know about the main function you know
4099
03:01:03,520 --> 03:01:07,439
that it is the entry point of your
4100
03:01:05,200 --> 03:01:09,600
program you know that your program is
4101
03:01:07,439 --> 03:01:12,000
going to be made up of statements and
4102
03:01:09,600 --> 03:01:13,040
statements and with a semicolon in c
4103
03:01:13,040 --> 03:01:18,160
you know about functions errors warnings
4104
03:01:15,680 --> 03:01:20,318
you now have an idea about how you can
4105
03:01:18,159 --> 03:01:22,879
handle input and output from your
4106
03:01:20,318 --> 03:01:25,359
program you can use comments you know
4107
03:01:22,879 --> 03:01:27,519
about the memory model and the execution
4108
03:01:25,359 --> 03:01:29,520
model that we talked about in the last
4109
03:01:27,520 --> 03:01:31,760
lecture you know quite a lot now we have
4110
03:01:29,520 --> 03:01:34,079
been using a program like this to do
4111
03:01:31,760 --> 03:01:36,478
things in the last chapter but there is
4112
03:01:34,079 --> 03:01:39,439
one thing that isn't really explained
4113
03:01:36,478 --> 03:01:42,879
yet and that is this ant this end is a
4114
03:01:39,439 --> 03:01:46,159
type that is predefined in c plus plus
4115
03:01:42,879 --> 03:01:48,959
and c plus plus predefines many types
4116
03:01:46,159 --> 03:01:51,760
here we have a couple of these types for
4117
03:01:48,959 --> 03:01:53,919
you to see as examples it is one of them
4118
03:01:51,760 --> 03:01:56,800
we have seen it a lot of times in the
4119
03:01:53,920 --> 03:01:59,520
last chapter it is used to represent
4120
03:01:56,799 --> 03:02:02,159
whole numbers like one two and three but
4121
03:01:59,520 --> 03:02:05,200
we have others for example double and
4122
03:02:02,159 --> 03:02:08,159
float are used to represent fractional
4123
03:02:05,200 --> 03:02:12,319
numbers numbers that have decimal points
4124
03:02:08,159 --> 03:02:13,840
for example 2.5 7.3 and numbers like
4125
03:02:12,318 --> 03:02:15,840
that and we're going to see the
4126
03:02:13,840 --> 03:02:19,359
difference between these two another one
4127
03:02:15,840 --> 03:02:22,000
that is commonly used is char or car and
4128
03:02:19,359 --> 03:02:25,279
it is used to represent characters in
4129
03:02:22,000 --> 03:02:28,079
memory and you can store in characters
4130
03:02:25,279 --> 03:02:30,000
like a b c and d and all the other
4131
03:02:28,079 --> 03:02:32,559
characters you can really put in we have
4132
03:02:30,000 --> 03:02:35,040
a bull which is a type that is going to
4133
03:02:32,559 --> 03:02:37,359
store two possible states the only
4134
03:02:35,040 --> 03:02:39,520
values you can really store in here are
4135
03:02:37,359 --> 03:02:43,279
true or false and we're going to see how
4136
03:02:39,520 --> 03:02:46,239
this works void is uh somewhat confusing
4137
03:02:43,279 --> 03:02:49,200
because it represents a typeless type
4138
03:02:46,239 --> 03:02:51,760
and it is really meaningful when we get
4139
03:02:49,200 --> 03:02:53,920
to talk about functions in detail so
4140
03:02:51,760 --> 03:02:56,318
we're going to learn more about the void
4141
03:02:53,920 --> 03:02:59,120
type a little later in the course we
4142
03:02:56,318 --> 03:03:02,159
also have the auto type which is really
4143
03:02:59,120 --> 03:03:04,720
not a type it is a keyword you use in c
4144
03:03:02,159 --> 03:03:06,959
plus plus to deduce other types and
4145
03:03:04,719 --> 03:03:09,199
we're going to see how this works later
4146
03:03:06,959 --> 03:03:12,159
in the course these are a few examples
4147
03:03:09,200 --> 03:03:14,479
of types we can use in c plus plus and
4148
03:03:12,159 --> 03:03:16,398
we are going to play with most of them
4149
03:03:14,478 --> 03:03:19,119
in this chapter another thing i really
4150
03:03:16,398 --> 03:03:21,840
want you to see is what does it mean to
4151
03:03:19,120 --> 03:03:23,680
really put a 4 in a variable in your
4152
03:03:21,840 --> 03:03:26,799
program everything you have in this
4153
03:03:23,680 --> 03:03:29,520
program here is represented by ones and
4154
03:03:26,799 --> 03:03:31,759
zeros in the computer's memory it really
4155
03:03:29,520 --> 03:03:34,800
looks like this it's a bunch of ones and
4156
03:03:31,760 --> 03:03:36,559
zeros in the ram of your computer and
4157
03:03:34,799 --> 03:03:39,358
there must be a technique to make sense
4158
03:03:36,559 --> 03:03:41,760
of this gibberish here and store data
4159
03:03:39,359 --> 03:03:44,559
that makes sense to humans and the
4160
03:03:41,760 --> 03:03:47,439
starting point is to group these ones
4161
03:03:44,559 --> 03:03:49,760
and zeros into little chunks that we can
4162
03:03:47,439 --> 03:03:52,639
manipulate each of these ones and zeros
4163
03:03:49,760 --> 03:03:55,040
is called a bet so this zero here is a
4164
03:03:52,639 --> 03:03:57,039
bit this one here is a bet and if we
4165
03:03:55,040 --> 03:03:59,840
group eight beats together they are
4166
03:03:57,040 --> 03:04:01,920
going to form what we call a byte okay
4167
03:03:59,840 --> 03:04:04,960
if it makes sense you can group your
4168
03:04:01,920 --> 03:04:07,439
bits in bytes or if it makes sense to
4169
03:04:04,959 --> 03:04:09,199
group them in groups of 16 you can do
4170
03:04:07,439 --> 03:04:11,200
that like we see here we're going to see
4171
03:04:09,200 --> 03:04:13,359
a little more details about this in the
4172
03:04:11,200 --> 03:04:16,159
next lecture okay here you see that if
4173
03:04:13,359 --> 03:04:19,520
you really want you can treat each bit
4174
03:04:16,159 --> 03:04:21,840
as a self-contained piece of data but
4175
03:04:19,520 --> 03:04:24,640
this is really not very useful but there
4176
03:04:21,840 --> 03:04:26,799
are some corner use cases for this okay
4177
03:04:24,639 --> 03:04:29,519
now we really have two sides on the
4178
03:04:26,799 --> 03:04:32,318
right we have data in the format that is
4179
03:04:29,520 --> 03:04:35,120
really convenient and understandable by
4180
03:04:32,318 --> 03:04:37,680
humans and on the left we have how data
4181
03:04:35,120 --> 03:04:40,319
is represented in memory so there must
4182
03:04:37,680 --> 03:04:42,720
be a way to transform between these two
4183
03:04:40,318 --> 03:04:44,959
forms of data because humans can't
4184
03:04:42,719 --> 03:04:47,119
really handle these ones and zeros well
4185
03:04:44,959 --> 03:04:50,398
and we do the transformation between
4186
03:04:47,120 --> 03:04:52,640
these two representations of data using
4187
03:04:50,398 --> 03:04:55,199
number systems we have a few number
4188
03:04:52,639 --> 03:04:58,079
systems available to us that we can use
4189
03:04:55,200 --> 03:05:00,240
binary octal hexadecimal are a few
4190
03:04:58,079 --> 03:05:02,719
examples and we're going to learn about
4191
03:05:00,239 --> 03:05:04,719
them starting in the next lecture so go
4192
03:05:02,719 --> 03:05:06,639
ahead and finish up here and meet me
4193
03:05:04,719 --> 03:05:09,599
there in this lecture we're going to
4194
03:05:06,639 --> 03:05:11,840
learn a little more about number systems
4195
03:05:09,600 --> 03:05:14,079
number systems allow us to transform
4196
03:05:11,840 --> 03:05:16,719
data from the form that is really
4197
03:05:14,079 --> 03:05:19,200
convenient for humans in a form that is
4198
03:05:16,719 --> 03:05:21,358
convenient for computers in these ones
4199
03:05:19,200 --> 03:05:23,680
and zeros that you see on the left we
4200
03:05:21,359 --> 03:05:26,159
can also use them to do the reverse go
4201
03:05:23,680 --> 03:05:28,559
from ones and zeros and go in the format
4202
03:05:26,159 --> 03:05:31,600
that is convenient to humans like this
4203
03:05:28,559 --> 03:05:33,920
22 or this steve name here to make sense
4204
03:05:31,600 --> 03:05:36,559
of how these number systems work let's
4205
03:05:33,920 --> 03:05:38,879
analyze the decimal system that we
4206
03:05:36,559 --> 03:05:41,278
really use in daily life and that is
4207
03:05:38,879 --> 03:05:43,079
usually called base 10. so if you look
4208
03:05:43,079 --> 03:05:48,719
2371 number here we can really split it
4209
03:05:46,478 --> 03:05:51,199
in the form that you see to the right
4210
03:05:48,719 --> 03:05:53,599
here if you try and take this expression
4211
03:05:51,200 --> 03:05:55,359
we have on the right here and evaluate
4212
03:05:53,600 --> 03:05:58,079
it you're going to get this number here
4213
03:05:55,359 --> 03:06:01,200
2 times 10 to the power of 3 this
4214
03:05:58,079 --> 03:06:03,760
evaluates to 2000 and this one here is
4215
03:06:01,200 --> 03:06:06,560
going to evaluate to 300 this one is
4216
03:06:03,760 --> 03:06:08,960
going to evaluate to 70 and the last one
4217
03:06:06,559 --> 03:06:11,199
is going to evaluate to one and if you
4218
03:06:08,959 --> 03:06:12,959
add these things up you're going to end
4219
03:06:11,200 --> 03:06:16,159
up with this number so this is how we
4220
03:06:12,959 --> 03:06:18,318
can take a number and uh make up a base
4221
03:06:16,159 --> 03:06:22,318
10 representation of it we can do the
4222
03:06:18,318 --> 03:06:25,119
same thing for 924 here or 47 here it
4223
03:06:22,318 --> 03:06:27,519
really is basic math you don't need to
4224
03:06:25,120 --> 03:06:30,079
have a lot of background in math to make
4225
03:06:27,520 --> 03:06:33,359
sense of this so we're going to use this
4226
03:06:30,079 --> 03:06:35,120
exact form and understand binary numbers
4227
03:06:33,359 --> 03:06:37,760
if you look at what we have here we have
4228
03:06:35,120 --> 03:06:40,240
a few binary numbers that are made up of
4229
03:06:37,760 --> 03:06:42,478
ones and zeros that's why it's called
4230
03:06:40,239 --> 03:06:46,079
binary because you can only have two
4231
03:06:42,478 --> 03:06:48,959
states or zero or one in your numbers so
4232
03:06:46,079 --> 03:06:51,760
we can really do the same thing we are
4233
03:06:48,959 --> 03:06:53,919
in base two so instead of using a ten
4234
03:06:51,760 --> 03:06:55,920
here we're going to be using a two but
4235
03:06:53,920 --> 03:06:58,639
it is the same operations we really did
4236
03:06:55,920 --> 03:07:00,478
if you take this and multiply and add
4237
03:06:58,639 --> 03:07:03,920
these things up what you're going to end
4238
03:07:00,478 --> 03:07:05,840
up is a base 10 representation of this
4239
03:07:03,920 --> 03:07:08,239
number if we go in the middle here we
4240
03:07:05,840 --> 03:07:10,799
have something we can easily do without
4241
03:07:08,239 --> 03:07:13,359
using a calculator the expression on the
4242
03:07:10,799 --> 03:07:15,358
left here is going to evaluate to
4243
03:07:13,359 --> 03:07:18,000
zero because we are multiplying with
4244
03:07:15,359 --> 03:07:20,159
zero the second one is going to be a two
4245
03:07:18,000 --> 03:07:22,478
because we are taking one and
4246
03:07:20,159 --> 03:07:24,478
multiplying this by two the others are
4247
03:07:22,478 --> 03:07:27,920
going to be zeros but the last one is
4248
03:07:24,478 --> 03:07:30,639
going to be 2 to the power of 4 which is
4249
03:07:27,920 --> 03:07:33,760
16 and we're going to add a 2 and this
4250
03:07:30,639 --> 03:07:36,159
is going to evaluate to 18. we can
4251
03:07:33,760 --> 03:07:38,800
actually bring up our calculator on
4252
03:07:36,159 --> 03:07:40,719
windows 10 i think it can help in this a
4253
03:07:38,799 --> 03:07:44,159
little bit we're going to bring it up
4254
03:07:40,719 --> 03:07:46,478
and we want to put it in a programmer
4255
03:07:44,159 --> 03:07:48,879
mode and we're going to go back on our
4256
03:07:46,478 --> 03:07:51,199
slide and find our number which is one
4257
03:07:48,879 --> 03:07:55,119
zero zero one zero so we're going to
4258
03:07:51,200 --> 03:07:58,079
type it out one zero zero one zero in
4259
03:07:55,120 --> 03:08:01,760
binary this is binary that we have typed
4260
03:07:58,079 --> 03:08:04,398
here so let's clear this and do one zero
4261
03:08:01,760 --> 03:08:06,960
zero one zero and you're going to see
4262
03:08:04,398 --> 03:08:10,000
that in the decimal it is 18 which is
4263
03:08:06,959 --> 03:08:12,239
what we came up by computing this in our
4264
03:08:10,000 --> 03:08:14,478
brain let's try the one we had before
4265
03:08:12,239 --> 03:08:16,398
that we couldn't really do in our brain
4266
03:08:14,478 --> 03:08:18,799
we're going to say one zero zero one
4267
03:08:16,398 --> 03:08:22,639
zero one let's do that we're going to
4268
03:08:18,799 --> 03:08:26,159
clear one zero zero one zero one this is
4269
03:08:22,639 --> 03:08:28,318
going to evaluate to 37 in decimal and
4270
03:08:26,159 --> 03:08:30,478
you can use calculators like this to
4271
03:08:28,318 --> 03:08:33,199
really do the transformations between
4272
03:08:30,478 --> 03:08:35,438
these different number representations
4273
03:08:33,200 --> 03:08:38,240
okay down below we have a one one one
4274
03:08:35,439 --> 03:08:40,880
which is going to evaluate to a seven in
4275
03:08:38,239 --> 03:08:43,119
base ten okay if we have three digits we
4276
03:08:40,879 --> 03:08:45,759
can really represent numbers between
4277
03:08:43,120 --> 03:08:48,000
zero and seven and you see a table here
4278
03:08:45,760 --> 03:08:50,000
that is going to prove that zero zero
4279
03:08:48,000 --> 03:08:52,398
zero is going to evaluate to zero in
4280
03:08:50,000 --> 03:08:55,279
decimal zero zero one is going to be a
4281
03:08:52,398 --> 03:08:57,920
one and if you go down to one one one
4282
03:08:55,279 --> 03:09:00,239
that is going to evaluate to a seven you
4283
03:08:57,920 --> 03:09:02,478
can try and use a calculator to prove
4284
03:09:00,239 --> 03:09:05,079
this and really understand how this
4285
03:09:02,478 --> 03:09:07,438
works if we use the three digits
4286
03:09:05,079 --> 03:09:09,279
representation our numbers are going to
4287
03:09:07,439 --> 03:09:11,520
look something like this in memory we're
4288
03:09:09,279 --> 03:09:14,399
going to take the bits in memory and
4289
03:09:11,520 --> 03:09:16,239
group them in groups of three and we are
4290
03:09:14,398 --> 03:09:18,318
going to use binary to actually make
4291
03:09:16,239 --> 03:09:20,559
sense of these numbers for example here
4292
03:09:18,318 --> 03:09:22,478
on the left this is going to be a one
4293
03:09:20,559 --> 03:09:25,119
the second one from the left is going to
4294
03:09:22,478 --> 03:09:27,840
be a six and this is going to be a six
4295
03:09:25,120 --> 03:09:30,640
as well this is going to be a zero this
4296
03:09:27,840 --> 03:09:33,359
is going to be a three because we have
4297
03:09:30,639 --> 03:09:35,199
one and two here we add those up we get
4298
03:09:33,359 --> 03:09:37,200
a three if this doesn't make sense you
4299
03:09:35,200 --> 03:09:39,680
can try and use a calculator you're
4300
03:09:37,200 --> 03:09:42,800
going to see that it makes sense okay so
4301
03:09:39,680 --> 03:09:45,200
what if we want to group our digits in
4302
03:09:42,799 --> 03:09:47,119
groups of four we can do that and we're
4303
03:09:45,200 --> 03:09:49,600
going to end up with something like this
4304
03:09:47,120 --> 03:09:52,720
the values we can represent are going to
4305
03:09:49,600 --> 03:09:55,760
go from 0 all the way to 15 and you can
4306
03:09:52,719 --> 03:09:58,318
try and prove this using the calculator
4307
03:09:55,760 --> 03:10:00,318
like we just did and it is going to look
4308
03:09:58,318 --> 03:10:03,359
like this in memory so what we really
4309
03:10:00,318 --> 03:10:06,639
are doing is grouping the bits in
4310
03:10:03,359 --> 03:10:09,120
different sizes of data and we have a
4311
03:10:06,639 --> 03:10:11,760
kind of formula that we can use to make
4312
03:10:09,120 --> 03:10:14,239
sense of the data in memory for example
4313
03:10:11,760 --> 03:10:16,478
on the left here we have zero one one
4314
03:10:14,238 --> 03:10:20,000
zero if we go back to our table and
4315
03:10:16,478 --> 03:10:21,840
defined zero one one zero this is a six
4316
03:10:20,000 --> 03:10:24,799
and we're going to know that these four
4317
03:10:21,840 --> 03:10:27,120
bits here are really storing s6 and
4318
03:10:24,799 --> 03:10:29,358
there are ways you can manipulate this
4319
03:10:27,120 --> 03:10:31,920
in your c plus plus program we're going
4320
03:10:29,359 --> 03:10:33,359
to see that you can also use five digits
4321
03:10:31,920 --> 03:10:35,439
and you're going to end up with
4322
03:10:33,359 --> 03:10:38,720
something like this and the numbers are
4323
03:10:35,439 --> 03:10:40,880
going to go from 0 all the way to 32 and
4324
03:10:38,719 --> 03:10:43,760
this is how it's going to look in memory
4325
03:10:40,879 --> 03:10:46,000
you can try and come up with what this
4326
03:10:43,760 --> 03:10:48,318
represents in decimal i'm not going to
4327
03:10:46,000 --> 03:10:51,200
tell you this but we can try and figure
4328
03:10:48,318 --> 03:10:54,799
out the one on the left here so it is 0
4329
03:10:51,200 --> 03:10:59,439
1 1 0 1. if we go back we're going to
4330
03:10:54,799 --> 03:11:02,799
come up to 0 1 1 0 1 which is a 13 here
4331
03:10:59,439 --> 03:11:06,079
so this memory location these five bits
4332
03:11:02,799 --> 03:11:08,879
represent a 17 number so if we want to
4333
03:11:06,079 --> 03:11:11,760
kind of generalize what we have talked
4334
03:11:08,879 --> 03:11:14,000
about in the last slides if you have one
4335
03:11:11,760 --> 03:11:16,398
digit you can really represent two
4336
03:11:14,000 --> 03:11:18,478
states zero and one if you have three
4337
03:11:16,398 --> 03:11:20,639
digits you can represent numbers between
4338
03:11:18,478 --> 03:11:24,079
zero and seven and you can go all the
4339
03:11:20,639 --> 03:11:27,039
way down and if we generalize this in a
4340
03:11:24,079 --> 03:11:29,120
mathematical formula we can say that if
4341
03:11:27,040 --> 03:11:31,760
we have n digits we're going to be able
4342
03:11:29,120 --> 03:11:34,720
to represent between 0 and 2 to the
4343
03:11:31,760 --> 03:11:36,880
power of n minus 1. and if you try to
4344
03:11:34,719 --> 03:11:39,199
plug in any number of digits you're
4345
03:11:36,879 --> 03:11:43,278
going to see that this formula works
4346
03:11:39,200 --> 03:11:45,680
okay so these are a few grouping of bits
4347
03:11:43,279 --> 03:11:47,840
we have in practice we can use eight
4348
03:11:45,680 --> 03:11:51,359
digits and we can represent numbers
4349
03:11:47,840 --> 03:11:54,159
between zero and two 255 if we have 16
4350
03:11:51,359 --> 03:11:56,000
bits we can represent this range if we
4351
03:11:56,000 --> 03:12:02,318
represent this range if we have 64 bets
4352
03:11:59,520 --> 03:12:04,800
we can really represent a really huge
4353
03:12:02,318 --> 03:12:06,719
range i can't even say this number it's
4354
03:12:04,799 --> 03:12:09,599
really bad okay now you should have a
4355
03:12:06,719 --> 03:12:12,719
pretty good idea of the binary system
4356
03:12:09,600 --> 03:12:16,079
and different representations we can use
4357
03:12:12,719 --> 03:12:18,159
to make sense of binary numbers in a
4358
03:12:16,079 --> 03:12:21,439
computer's memory the last thing i want
4359
03:12:18,159 --> 03:12:24,398
you to see is what we call hexadecimal
4360
03:12:21,439 --> 03:12:27,439
number system and it is a technique we
4361
03:12:24,398 --> 03:12:30,238
use to shorten the length of how we
4362
03:12:27,439 --> 03:12:32,960
represent a binary number in memory how
4363
03:12:30,238 --> 03:12:36,398
does it work well we take our number and
4364
03:12:32,959 --> 03:12:38,879
split it in groups of four bets and each
4365
03:12:36,398 --> 03:12:41,199
group is assigned a symbol we can use to
4366
03:12:38,879 --> 03:12:43,119
represent it if we have four zeros
4367
03:12:43,120 --> 03:12:48,560
hexadecimal if we have zero zero zero
4368
03:12:46,000 --> 03:12:51,279
one we're going to represent a one and
4369
03:12:48,559 --> 03:12:53,920
you can see that if we go up to nine
4370
03:12:51,279 --> 03:12:56,159
this is really similar to what we have
4371
03:12:53,920 --> 03:12:58,159
in the decimal number system but once we
4372
03:12:56,159 --> 03:13:00,959
hit 10 we're going to represent that
4373
03:12:58,159 --> 03:13:04,000
with an a in hexadecimal 11 is going to
4374
03:13:00,959 --> 03:13:07,039
be b 12 is going to be c 13 is going to
4375
03:13:04,000 --> 03:13:09,040
be d 14 is going to be e and 15 is going
4376
03:13:07,040 --> 03:13:11,680
to be f so how do we use this to
4377
03:13:09,040 --> 03:13:14,080
represent binary numbers let's see an
4378
03:13:11,680 --> 03:13:16,159
example here we have a huge number that
4379
03:13:14,079 --> 03:13:18,559
we represent in memory it starts with
4380
03:13:16,159 --> 03:13:20,159
zero and ends with the one here so the
4381
03:13:18,559 --> 03:13:23,278
first thing we're going to do is to
4382
03:13:20,159 --> 03:13:25,760
split this in groups of four and the one
4383
03:13:23,279 --> 03:13:28,000
on the left is going to be a one one one
4384
03:13:25,760 --> 03:13:30,478
one if we come back to our table here
4385
03:13:28,000 --> 03:13:32,879
one one one one means f so we're going
4386
03:13:30,478 --> 03:13:35,840
to represent this with an f if you go to
4387
03:13:32,879 --> 03:13:39,039
the second group of four bets we have
4388
03:13:35,840 --> 03:13:42,000
zero zero one one if we go back zero
4389
03:13:39,040 --> 03:13:44,319
zero one one means three so we're going
4390
03:13:42,000 --> 03:13:46,318
to have a three here i hope this makes
4391
03:13:44,318 --> 03:13:48,398
sense and we're going to keep using the
4392
03:13:46,318 --> 03:13:52,318
same transformations and we're going to
4393
03:13:48,398 --> 03:13:55,519
come up with one f 0 3 e 6 and we can
4394
03:13:52,318 --> 03:13:57,519
represent this binary number using these
4395
03:13:55,520 --> 03:14:01,359
symbols you can see that we go from
4396
03:13:57,520 --> 03:14:03,920
using 32 bits to using one two three
4397
03:14:01,359 --> 03:14:06,238
four five six seven eight symbols to
4398
03:14:03,920 --> 03:14:09,200
represent this and this is shorter and
4399
03:14:06,238 --> 03:14:13,039
easily manipulable by humans and we use
4400
03:14:09,200 --> 03:14:15,120
a zero x in front to mean that this is a
4401
03:14:13,040 --> 03:14:18,160
hexadecimal number i really hope this
4402
03:14:15,120 --> 03:14:20,880
makes sense so if we have numbers that
4403
03:14:18,159 --> 03:14:23,200
don't really fit in groups of four we're
4404
03:14:20,879 --> 03:14:25,438
going to go from the left and split this
4405
03:14:23,200 --> 03:14:28,640
in groups of four and we're going to end
4406
03:14:25,439 --> 03:14:30,960
up with a group on the left that doesn't
4407
03:14:28,639 --> 03:14:34,159
really meet our requirements and what we
4408
03:14:30,959 --> 03:14:36,478
can do is add the missing bits and make
4409
03:14:34,159 --> 03:14:38,639
them zeros and we call this operation
4410
03:14:36,478 --> 03:14:40,559
padding this is what you can do to
4411
03:14:38,639 --> 03:14:42,959
really represent any number in
4412
03:14:40,559 --> 03:14:45,278
hexadecimal if you don't have enough
4413
03:14:42,959 --> 03:14:47,839
bits on the left we also have another
4414
03:14:45,279 --> 03:14:51,040
system that is really not widely used
4415
03:14:47,840 --> 03:14:53,680
today but i am mentioning it here for
4416
03:14:51,040 --> 03:14:56,000
completeness it is called octal system
4417
03:14:53,680 --> 03:14:59,439
it goes from zero all the way to seven
4418
03:14:56,000 --> 03:15:02,398
and we can divide our binary number into
4419
03:14:59,439 --> 03:15:04,639
groups of three and represent using
4420
03:15:02,398 --> 03:15:06,318
these zeros and ones to shorten the
4421
03:15:04,639 --> 03:15:07,920
length of the binary number we can
4422
03:15:06,318 --> 03:15:10,318
really do the same thing we did with
4423
03:15:07,920 --> 03:15:13,200
hexadecimal so we're going to take our
4424
03:15:10,318 --> 03:15:15,439
binary number and divide this in groups
4425
03:15:13,200 --> 03:15:19,120
of three the one on the left is going to
4426
03:15:15,439 --> 03:15:22,079
evaluate to a 7 because it's 1 1 1 and
4427
03:15:19,120 --> 03:15:23,920
one one one evaluates to seven in octal
4428
03:15:22,079 --> 03:15:26,238
system the second one is also going to
4429
03:15:23,920 --> 03:15:29,279
be a one one one the third one is going
4430
03:15:26,238 --> 03:15:31,680
to be one zero zero if we go in our
4431
03:15:29,279 --> 03:15:33,439
table it's going to be one zero zero
4432
03:15:31,680 --> 03:15:35,680
it's going to be a four and you see we
4433
03:15:33,439 --> 03:15:37,840
have a 4 here and you can do the same
4434
03:15:35,680 --> 03:15:39,760
things until you have figured out the
4435
03:15:37,840 --> 03:15:42,238
entire number here and you see on the
4436
03:15:39,760 --> 03:15:44,880
left we are doing padding and adding a
4437
03:15:42,238 --> 03:15:48,079
missing bit and making it to 0 so we are
4438
03:15:44,879 --> 03:15:51,519
coming up with 0 0 1 and if we go back
4439
03:15:48,079 --> 03:15:53,120
to our table here 0 0 1 is a 1 and
4440
03:15:51,520 --> 03:15:55,120
that's what we put here so we're going
4441
03:15:53,120 --> 03:15:59,680
to put this number here it's going to be
4442
03:15:55,120 --> 03:16:03,040
15 61 41 70 47 7 and we're going to add
4443
03:15:59,680 --> 03:16:05,760
a zero in front to mean that this is a
4444
03:16:03,040 --> 03:16:07,920
number represented in the octal system i
4445
03:16:05,760 --> 03:16:10,559
really hope this makes sense okay so we
4446
03:16:07,920 --> 03:16:12,799
have seen all these binary numbers and
4447
03:16:10,559 --> 03:16:15,840
different number systems we can use to
4448
03:16:12,799 --> 03:16:18,478
represent them but how do we use them in
4449
03:16:15,840 --> 03:16:20,559
a c plus plus program well i'm glad you
4450
03:16:18,478 --> 03:16:23,519
asked here is a simple example of how
4451
03:16:20,559 --> 03:16:26,559
you can represent the number 15 through
4452
03:16:23,520 --> 03:16:28,640
different number systems in c plus plus
4453
03:16:26,559 --> 03:16:31,600
if you just say 15 like this it's going
4454
03:16:28,639 --> 03:16:34,398
to be in decimal if you add a zero in
4455
03:16:31,600 --> 03:16:37,040
front it's going to mean that the number
4456
03:16:34,398 --> 03:16:40,159
is in octal system so this can be
4457
03:16:37,040 --> 03:16:43,439
confusing sometimes if you do 0 17 it's
4458
03:16:40,159 --> 03:16:45,520
not going to be 17. so if you say 0 17 c
4459
03:16:43,439 --> 03:16:48,238
plus plus is going to interpret this
4460
03:16:45,520 --> 03:16:50,800
number as if it is in octal system and
4461
03:16:48,238 --> 03:16:53,520
it is going to turn this into 15. down
4462
03:16:50,799 --> 03:16:56,318
here you see the same representation in
4463
03:16:53,520 --> 03:16:58,319
hexadecimal we saw that you use a 0x in
4464
03:16:56,318 --> 03:17:01,439
front to represent that it is in
4465
03:16:58,318 --> 03:17:03,039
hexadecimal and this is going to be 15
4466
03:17:03,040 --> 03:17:09,040
representation in binary using zeros and
4467
03:17:06,318 --> 03:17:11,039
ones and you use zero b in front like
4468
03:17:09,040 --> 03:17:14,239
this i have to say that this was only
4469
03:17:11,040 --> 03:17:17,120
possible since c plus plus 14. so if you
4470
03:17:14,238 --> 03:17:18,879
are using an older standard of c plus
4471
03:17:17,120 --> 03:17:21,040
plus you want to be able to represent
4472
03:17:18,879 --> 03:17:22,959
binary like this and if we run this
4473
03:17:21,040 --> 03:17:25,279
program it is going to print the same
4474
03:17:22,959 --> 03:17:27,679
thing it is going to print 15 but we
4475
03:17:25,279 --> 03:17:30,000
stored the number using different number
4476
03:17:27,680 --> 03:17:32,880
systems let's go to visual studio code
4477
03:17:30,000 --> 03:17:35,200
and try this out okay here we are in a
4478
03:17:32,879 --> 03:17:37,358
folder i have on my system where i am
4479
03:17:35,200 --> 03:17:39,520
going to be storing my projects for this
4480
03:17:37,359 --> 03:17:42,800
chapter the first thing i am going to do
4481
03:17:39,520 --> 03:17:45,359
is copy code from a template project i
4482
03:17:42,799 --> 03:17:48,639
am going to go in and copy things over
4483
03:17:45,359 --> 03:17:51,040
and i am going to put these in 4 2
4484
03:17:48,639 --> 03:17:53,278
number systems i am going to open this
4485
03:17:51,040 --> 03:17:55,920
folder in visual studio code so i am
4486
03:17:53,279 --> 03:17:58,238
going to go to file close the folder we
4487
03:17:55,920 --> 03:18:01,040
have now and i am going to open up a new
4488
03:17:58,238 --> 03:18:03,680
one open folder and i am going to browse
4489
03:18:01,040 --> 03:18:05,920
to the location of my project i am going
4490
03:18:03,680 --> 03:18:08,318
to open this project here that says
4491
03:18:05,920 --> 03:18:11,040
number systems we are going to get rid
4492
03:18:08,318 --> 03:18:13,359
of the welcome screen and open our main
4493
03:18:11,040 --> 03:18:16,239
cpp file we're going to get rid of this
4494
03:18:13,359 --> 03:18:19,279
constival thing and clear everything we
4495
03:18:16,238 --> 03:18:21,439
have in the main function here the first
4496
03:18:19,279 --> 03:18:23,680
thing we want to do is to store an
4497
03:18:21,439 --> 03:18:26,479
integer that is 15 and we're going to
4498
03:18:23,680 --> 03:18:28,238
say and number one the exact same thing
4499
03:18:26,478 --> 03:18:31,039
we had in the slides and we're going to
4500
03:18:28,238 --> 03:18:33,680
store 15 in this variable here this is
4501
03:18:31,040 --> 03:18:36,319
going to be represented in decimal and
4502
03:18:33,680 --> 03:18:39,840
if we want to store the semi number in
4503
03:18:36,318 --> 03:18:42,959
octo we saw that in our slides we could
4504
03:18:39,840 --> 03:18:45,520
store this as 0 17. so let's do that
4505
03:18:42,959 --> 03:18:48,959
we're going to say it number 2 and we're
4506
03:18:45,520 --> 03:18:51,279
going to store in 0 17. this is not
4507
03:18:48,959 --> 03:18:54,238
going to be 17 this is going to be a
4508
03:18:51,279 --> 03:18:56,238
representation of a number in octo
4509
03:18:54,238 --> 03:18:58,879
system so we're going to say that this
4510
03:18:56,238 --> 03:19:01,600
is octo and we can represent the number
4511
03:18:58,879 --> 03:19:04,398
in hexadecimal as well so we're going to
4512
03:19:01,600 --> 03:19:05,120
say it number three and it is going to
4513
03:19:05,120 --> 03:19:10,640
0x because it is hexadecimal and we're
4514
03:19:08,159 --> 03:19:12,879
going to say zero f this is how we
4515
03:19:10,639 --> 03:19:15,039
represent it you can use lowercase or
4516
03:19:12,879 --> 03:19:17,519
uppercase it won't really matter let's
4517
03:19:15,040 --> 03:19:19,760
use uppercase here and we can use binary
4518
03:19:17,520 --> 03:19:22,000
because we are using c plus plus 20. so
4519
03:19:19,760 --> 03:19:24,398
we're going to say and number four and
4520
03:19:22,000 --> 03:19:28,159
we're going to store in a representation
4521
03:19:24,398 --> 03:19:31,840
of 15 in binary and it happens to be
4522
03:19:28,159 --> 03:19:35,279
four zeros and four ones and we have to
4523
03:19:31,840 --> 03:19:37,840
prefix this with a zero b this is how it
4524
03:19:35,279 --> 03:19:40,238
works so this is going to be in binary
4525
03:19:37,840 --> 03:19:42,639
and if we print all these numbers up
4526
03:19:40,238 --> 03:19:44,799
we're going to see let me not tell you
4527
03:19:42,639 --> 03:19:47,920
this what do you think we'll see okay so
4528
03:19:44,799 --> 03:19:50,398
i went ahead and typed this out what do
4529
03:19:47,920 --> 03:19:52,398
you think we will see when we build and
4530
03:19:50,398 --> 03:19:54,639
run this program before we do that we're
4531
03:19:52,398 --> 03:19:56,398
going to open a terminal so that we see
4532
03:19:54,639 --> 03:19:58,639
it here and we're going to go to
4533
03:19:56,398 --> 03:20:01,439
terminal run task we're going to build
4534
03:19:58,639 --> 03:20:03,599
with gcc let's wait and see if the world
4535
03:20:01,439 --> 03:20:05,840
is successful world finished
4536
03:20:03,600 --> 03:20:07,520
successfully we have a rooster program
4537
03:20:07,520 --> 03:20:12,079
click somewhere in this terminal and our
4538
03:20:10,238 --> 03:20:14,079
terminal is going to show up if we do
4539
03:20:12,079 --> 03:20:16,559
dur you're going to see that our rooster
4540
03:20:14,079 --> 03:20:18,318
program is here and if we run it i want
4541
03:20:16,559 --> 03:20:21,119
you to take a moment and guess what
4542
03:20:18,318 --> 03:20:24,159
we're going to see hmm number one 15
4543
03:20:21,120 --> 03:20:26,560
number 215 in number 315 and number four
4544
03:20:24,159 --> 03:20:28,799
15. this is really the same number we
4545
03:20:26,559 --> 03:20:31,680
are storing in these variables but we
4546
03:20:28,799 --> 03:20:33,840
are using a different representation
4547
03:20:31,680 --> 03:20:36,159
that is going to be convenient depending
4548
03:20:33,840 --> 03:20:37,920
on whatever it is we are doing if it is
4549
03:20:36,159 --> 03:20:39,920
more convenient to use binary we are
4550
03:20:37,920 --> 03:20:42,559
going to use binary if it is more
4551
03:20:39,920 --> 03:20:45,359
convenient use hexadecimal please do use
4552
03:20:42,559 --> 03:20:48,318
hexadecimal but the representation of
4553
03:20:45,359 --> 03:20:50,079
this number in memory is really going to
4554
03:20:48,318 --> 03:20:52,559
be the same i really want you to take
4555
03:20:50,079 --> 03:20:54,398
some time and let this sink in because
4556
03:20:52,559 --> 03:20:57,278
you're going to see these things a lot
4557
03:20:54,398 --> 03:21:00,159
of times in your career as a software
4558
03:20:57,279 --> 03:21:02,319
developer so please do yourself a favor
4559
03:21:00,159 --> 03:21:04,159
and make sure you really understand this
4560
03:21:02,318 --> 03:21:06,238
okay this is really all we set up to do
4561
03:21:04,159 --> 03:21:08,719
in this lecture trying to make sense of
4562
03:21:06,238 --> 03:21:10,959
the binary numbers we have in memory and
4563
03:21:08,719 --> 03:21:13,840
how we transform between them and
4564
03:21:10,959 --> 03:21:16,559
different forms of data that is easily
4565
03:21:13,840 --> 03:21:18,880
manipulable by humans all data is
4566
03:21:16,559 --> 03:21:21,359
represented by a bunch of grouped cells
4567
03:21:18,879 --> 03:21:23,438
of zeros and ones we have seen this as
4568
03:21:21,359 --> 03:21:25,040
the range of your data grows so will be
4569
03:21:23,439 --> 03:21:27,040
the number of digits you need to
4570
03:21:25,040 --> 03:21:29,520
represent the data in memory we have
4571
03:21:27,040 --> 03:21:31,760
seen that the hexadecimal system makes
4572
03:21:29,520 --> 03:21:34,238
it a little easier for humans to handle
4573
03:21:31,760 --> 03:21:36,800
streams of data in ones and zeros octo
4574
03:21:34,238 --> 03:21:39,199
has the same goal as hexadecimal but
4575
03:21:36,799 --> 03:21:41,759
it's almost no longer used in modern
4576
03:21:39,200 --> 03:21:44,000
times i just mentioned it here for
4577
03:21:41,760 --> 03:21:46,079
completeness we are going to stop here
4578
03:21:44,000 --> 03:21:48,159
in this lecture in the next one we're
4579
03:21:46,079 --> 03:21:50,559
going to look at integers in a little
4580
03:21:48,159 --> 03:21:53,200
more detail so go ahead and finish up
4581
03:21:50,559 --> 03:21:55,199
here and meet me there in this lecture
4582
03:21:53,200 --> 03:21:58,079
we're going to learn a little more about
4583
03:21:55,200 --> 03:22:00,960
integers in c plus plus integers are
4584
03:21:58,079 --> 03:22:03,600
represented by ant and z plus plus it's
4585
03:22:00,959 --> 03:22:06,238
what you see on the left here and they
4586
03:22:03,600 --> 03:22:09,680
are used to store whole numbers things
4587
03:22:06,238 --> 03:22:12,318
like 1 2 and 3. they typically occupy 4
4588
03:22:09,680 --> 03:22:14,800
bytes or more in memory but in most
4589
03:22:12,318 --> 03:22:17,039
times it's going to be 4 bytes so for
4590
03:22:14,799 --> 03:22:19,679
example if you have a variable called
4591
03:22:17,040 --> 03:22:21,439
age and it is an integer this is how
4592
03:22:19,680 --> 03:22:23,680
it's most probably going to look in
4593
03:22:21,439 --> 03:22:25,840
memory it's going to take four bytes and
4594
03:22:23,680 --> 03:22:28,559
i really want to make it clear what a
4595
03:22:25,840 --> 03:22:31,359
variable is it is a named piece of
4596
03:22:28,559 --> 03:22:34,318
memory that you use to store specific
4597
03:22:31,359 --> 03:22:37,520
types of data okay so here if we have a
4598
03:22:34,318 --> 03:22:39,840
variable named age it is a named piece
4599
03:22:37,520 --> 03:22:42,399
of memory edge is going to be the name
4600
03:22:39,840 --> 03:22:44,559
of that piece of memory and we can store
4601
03:22:42,398 --> 03:22:46,559
data in that memory it's going to look
4602
03:22:44,559 --> 03:22:48,879
like this in memory but the value is
4603
03:22:46,559 --> 03:22:51,039
going to be stored in here in binary
4604
03:22:48,879 --> 03:22:54,079
format i really hope this makes sense a
4605
03:22:51,040 --> 03:22:56,399
variable is a named piece of memory that
4606
03:22:54,079 --> 03:22:58,478
we can use to store different kinds of
4607
03:22:56,398 --> 03:23:01,199
data and okay now we're going to look at
4608
03:22:58,478 --> 03:23:04,318
a few examples of how you can work with
4609
03:23:01,200 --> 03:23:07,040
integers in your c plus program you can
4610
03:23:04,318 --> 03:23:09,119
define a few variables here we have one
4611
03:23:07,040 --> 03:23:11,840
that is going to store the number of
4612
03:23:09,120 --> 03:23:14,960
elephants we have you can declare it
4613
03:23:11,840 --> 03:23:17,279
like this and not put in a value and if
4614
03:23:14,959 --> 03:23:19,759
you do it like this the compiler is just
4615
03:23:17,279 --> 03:23:21,920
going to put in some garbage value that
4616
03:23:19,760 --> 03:23:24,800
is really not meaningful for your
4617
03:23:21,920 --> 03:23:27,040
program so you see the warning we have
4618
03:23:24,799 --> 03:23:29,599
here as a comment the variable may
4619
03:23:27,040 --> 03:23:31,359
contain random garbage value and this is
4620
03:23:29,600 --> 03:23:33,760
something you need to be aware of
4621
03:23:31,359 --> 03:23:36,159
another way we can define integers in
4622
03:23:33,760 --> 03:23:38,719
our c plus plus program is this
4623
03:23:36,159 --> 03:23:40,478
statement here that declares a variable
4624
03:23:38,719 --> 03:23:43,119
called lion count it's going to
4625
03:23:40,478 --> 03:23:44,799
initialize to zero if we use curly
4626
03:23:43,120 --> 03:23:47,200
braces like this it's going to
4627
03:23:44,799 --> 03:23:49,679
initialize to 0 by default we can also
4628
03:23:47,200 --> 03:23:52,560
explicitly put in a value we can do the
4629
03:23:49,680 --> 03:23:55,520
same with cat count and we can use these
4630
03:23:52,559 --> 03:23:57,760
variables to do operations for example
4631
03:23:55,520 --> 03:24:00,079
we can declare another variable and it
4632
03:23:57,760 --> 03:24:02,398
is going to store the number of
4633
03:24:00,079 --> 03:24:05,680
domesticated animals and we're going to
4634
03:24:02,398 --> 03:24:07,760
add up the numbers for dogs and cats and
4635
03:24:05,680 --> 03:24:09,920
we're going to store the result of that
4636
03:24:07,760 --> 03:24:11,760
in our variable that is called
4637
03:24:09,920 --> 03:24:14,000
domesticated animals this is something
4638
03:24:11,760 --> 03:24:16,800
you can do another thing that can be
4639
03:24:14,000 --> 03:24:19,680
problematic is trying to use variables
4640
03:24:16,799 --> 03:24:21,599
that you haven't defined or declared in
4641
03:24:19,680 --> 03:24:23,520
your program that is going to give you a
4642
03:24:21,600 --> 03:24:25,439
compiler error and the compiler is
4643
03:24:23,520 --> 03:24:27,680
basically going to say i don't know what
4644
03:24:25,439 --> 03:24:30,398
doesn't exist one here is i don't know
4645
03:24:27,680 --> 03:24:33,040
what this doesn't exist to is it is not
4646
03:24:30,398 --> 03:24:36,559
defined anywhere in the program another
4647
03:24:33,040 --> 03:24:39,120
thing you can do is try and store a
4648
03:24:36,559 --> 03:24:41,278
fractional number in a variable that you
4649
03:24:39,120 --> 03:24:43,840
declared as an integer and this is going
4650
03:24:41,279 --> 03:24:47,359
to give you a warning because fractional
4651
03:24:43,840 --> 03:24:49,760
numbers are usually bigger in size than
4652
03:24:47,359 --> 03:24:51,840
integers and this is going to lose some
4653
03:24:49,760 --> 03:24:54,079
of your data we don't really have enough
4654
03:24:51,840 --> 03:24:55,520
tools to understand this now but we are
4655
03:24:54,079 --> 03:24:57,039
going to understand this a little bit
4656
03:24:55,520 --> 03:24:58,880
later in the course but this is
4657
03:24:57,040 --> 03:25:01,600
something you can do you can take a
4658
03:24:58,879 --> 03:25:03,839
fractional number and store that in an
4659
03:25:01,600 --> 03:25:06,720
integer variable and we're going to do
4660
03:25:03,840 --> 03:25:10,000
an example and see how this behaves with
4661
03:25:06,719 --> 03:25:12,959
our compiler that is gcc10 okay here we
4662
03:25:10,000 --> 03:25:15,520
have mostly used curly braces to
4663
03:25:12,959 --> 03:25:18,079
initialize our variables but we can also
4664
03:25:15,520 --> 03:25:20,238
use parenthesis and this is going to be
4665
03:25:20,238 --> 03:25:25,279
as functional variable initialization
4666
03:25:23,279 --> 03:25:26,880
because we are using parenthesis and
4667
03:25:25,279 --> 03:25:29,520
this is mostly going to do the same
4668
03:25:26,879 --> 03:25:33,039
thing we saw in the last slide with
4669
03:25:29,520 --> 03:25:35,200
curly braces but when we come to the
4670
03:25:33,040 --> 03:25:38,000
example here where we are storing a
4671
03:25:35,200 --> 03:25:41,040
fractional number this is going to
4672
03:25:38,000 --> 03:25:43,680
silently chop off the data you have in a
4673
03:25:41,040 --> 03:25:45,680
fractional number and turn that into an
4674
03:25:43,680 --> 03:25:47,680
integer and this is called implicit
4675
03:25:45,680 --> 03:25:50,639
conversions but if we go to the last
4676
03:25:47,680 --> 03:25:52,639
example here where we are storing 2.9
4677
03:25:50,639 --> 03:25:54,799
into an integer this is going to take
4678
03:25:52,639 --> 03:25:57,680
this fractional number chop off the
4679
03:25:54,799 --> 03:25:59,519
decimal point and only store 2 in this
4680
03:25:57,680 --> 03:26:02,079
integer and this might not be what you
4681
03:25:59,520 --> 03:26:04,479
want and it is going to happen silently
4682
03:26:02,079 --> 03:26:06,559
so this is a really bad way to do this
4683
03:26:04,478 --> 03:26:09,840
if you want to do something like this it
4684
03:26:06,559 --> 03:26:12,159
is preferable to use curly braces
4685
03:26:09,840 --> 03:26:14,079
because you are either going to get a
4686
03:26:12,159 --> 03:26:16,318
warning that this is going to lose you
4687
03:26:14,079 --> 03:26:18,079
data or you're going to get a compiler
4688
03:26:16,318 --> 03:26:20,478
error and the compiler is going to
4689
03:26:18,079 --> 03:26:22,959
completely stop you from doing this and
4690
03:26:20,478 --> 03:26:25,199
again if any of this doesn't make any
4691
03:26:22,959 --> 03:26:27,278
sense we're going to go in visual studio
4692
03:26:25,200 --> 03:26:29,840
code play with us and see how the
4693
03:26:27,279 --> 03:26:32,479
compiler behaves with these things we
4694
03:26:29,840 --> 03:26:34,639
have another way we can initialize our
4695
03:26:32,478 --> 03:26:36,959
variables in surplus plus we can use
4696
03:26:34,639 --> 03:26:39,840
assignment and we have done this a
4697
03:26:36,959 --> 03:26:41,679
couple of times in the course but this
4698
03:26:39,840 --> 03:26:44,159
is something you can do and we are going
4699
03:26:41,680 --> 03:26:45,920
to play with this in visual studio code
4700
03:26:44,159 --> 03:26:48,478
in a minute and you're going to see how
4701
03:26:45,920 --> 03:26:50,799
it works okay by now we have seen three
4702
03:26:48,478 --> 03:26:53,039
ways we can initialize our integer
4703
03:26:53,040 --> 03:26:58,000
initialization which is basically using
4704
03:26:55,439 --> 03:27:01,279
curly braces we can use functional
4705
03:26:58,000 --> 03:27:03,200
notation which is using the parenthesis
4706
03:27:01,279 --> 03:27:05,520
and we can use the assignment
4707
03:27:03,200 --> 03:27:07,600
initialization which is what we have
4708
03:27:05,520 --> 03:27:09,920
here another thing i really want you to
4709
03:27:09,920 --> 03:27:16,159
to query for the size of your variable
4710
03:27:13,279 --> 03:27:17,920
here we are trying to print the size an
4711
03:27:16,159 --> 03:27:20,318
integer is going to take on our
4712
03:27:17,920 --> 03:27:22,799
operating system and compiler and if we
4713
03:27:20,318 --> 03:27:25,119
try to run this on our compiler it's
4714
03:27:22,799 --> 03:27:28,719
going to tell us exactly how much memory
4715
03:27:25,120 --> 03:27:31,840
an integer occupies in our program we
4716
03:27:28,719 --> 03:27:34,000
can either pass and explicitly like this
4717
03:27:31,840 --> 03:27:36,559
or we can pass a variable name and it is
4718
03:27:34,000 --> 03:27:38,559
going to work equally well okay ants are
4719
03:27:36,559 --> 03:27:40,600
mostly going to take up four bytes in
4720
03:27:40,600 --> 03:27:45,760
representation of three ants in memory
4721
03:27:43,680 --> 03:27:48,000
if we go from this zero to this zero
4722
03:27:45,760 --> 03:27:50,478
this is going to be exactly four bytes
4723
03:27:48,000 --> 03:27:52,478
and this is how it may look in memory
4724
03:27:50,478 --> 03:27:55,358
one other thing i haven't really talked
4725
03:27:52,478 --> 03:27:57,920
about on purpose is that there are a few
4726
03:27:55,359 --> 03:28:00,479
rules you have to follow to name your
4727
03:27:57,920 --> 03:28:03,359
variables in c plus plus one of those
4728
03:28:00,478 --> 03:28:06,799
rules is that a variable must start with
4729
03:28:03,359 --> 03:28:08,880
a letter like a b c d up to z or an
4730
03:28:06,799 --> 03:28:10,719
underscore you can't start a variable
4731
03:28:08,879 --> 03:28:13,119
for example with a number that's going
4732
03:28:10,719 --> 03:28:15,760
to be a problem after the first
4733
03:28:13,120 --> 03:28:17,840
character in your variable name you can
4734
03:28:15,760 --> 03:28:20,238
really put in anything you can put in
4735
03:28:17,840 --> 03:28:22,079
numbers you can put in letters you can
4736
03:28:20,238 --> 03:28:24,478
really put anything you want but the
4737
03:28:22,079 --> 03:28:27,600
first one can't be a number variable
4738
03:28:24,478 --> 03:28:30,159
names are also case sensitive so if you
4739
03:28:27,600 --> 03:28:31,920
have a variable called bike account with
4740
03:28:31,920 --> 03:28:36,478
and you have another one that starts
4741
03:28:36,478 --> 03:28:40,639
these are going to be two different
4742
03:28:38,079 --> 03:28:44,000
variables and uh you have to be aware of
4743
03:28:40,639 --> 03:28:46,559
this no spaces or spatial characters are
4744
03:28:44,000 --> 03:28:48,799
allowed in your variables you can use
4745
03:28:46,559 --> 03:28:50,639
underscores but you can't use something
4746
03:28:48,799 --> 03:28:52,959
like plus because that's going to be
4747
03:28:50,639 --> 03:28:54,959
confusing to your compiler and these are
4748
03:28:52,959 --> 03:28:57,278
a few rules you really need to be aware
4749
03:28:54,959 --> 03:29:00,000
of and you're mostly going to be fine
4750
03:28:57,279 --> 03:29:02,720
the general form for declaring and
4751
03:29:00,000 --> 03:29:04,959
initializing your variable is what you
4752
03:29:02,719 --> 03:29:07,358
see here you're going to pass the type
4753
03:29:04,959 --> 03:29:09,679
in this case we have used and because we
4754
03:29:07,359 --> 03:29:11,600
are learning about ants you're going to
4755
03:29:09,680 --> 03:29:13,359
pass the variable name and you're going
4756
03:29:13,359 --> 03:29:18,079
initializing your variable with of
4757
03:29:15,760 --> 03:29:21,439
course this is braced initialization
4758
03:29:18,079 --> 03:29:23,920
because it is using curly braces but you
4759
03:29:21,439 --> 03:29:26,639
can also use functional initialization
4760
03:29:23,920 --> 03:29:28,559
or assignment initialization and it is
4761
03:29:26,639 --> 03:29:31,039
going to work equally well okay now we
4762
03:29:28,559 --> 03:29:34,478
have enough information to go in visual
4763
03:29:31,040 --> 03:29:37,520
studio code and play with us okay here i
4764
03:29:34,478 --> 03:29:40,238
am in my folder for the projects of this
4765
03:29:37,520 --> 03:29:43,359
chapter i am going to hop over in my
4766
03:29:40,238 --> 03:29:46,079
template project and copy the files that
4767
03:29:43,359 --> 03:29:48,960
i need i am going to go up again
4768
03:29:46,079 --> 03:29:50,478
and go on the project that is called
4769
03:29:50,478 --> 03:29:55,278
i am going to go in and paste in my
4770
03:29:52,719 --> 03:29:58,079
files and i am going to open up this
4771
03:29:55,279 --> 03:30:00,159
folder in visual studio code i am going
4772
03:29:58,079 --> 03:30:02,398
to close the welcome screen here and
4773
03:30:02,398 --> 03:30:07,920
and i am going to do the usual take out
4774
03:30:05,040 --> 03:30:10,160
the things we don't need to save on time
4775
03:30:07,920 --> 03:30:13,520
i am going to put in a piece of code
4776
03:30:10,159 --> 03:30:14,639
that i have lying on my drive and we're
4777
03:30:14,639 --> 03:30:19,199
go through it to save on typing time i
4778
03:30:17,200 --> 03:30:21,439
don't want you to suffer watching me
4779
03:30:19,200 --> 03:30:23,439
type this the first thing we have is the
4780
03:30:21,439 --> 03:30:25,840
elephant count this is a variable that
4781
03:30:23,439 --> 03:30:28,398
is not initialized so this is going to
4782
03:30:25,840 --> 03:30:30,799
contain garbage data it's not going to
4783
03:30:28,398 --> 03:30:33,119
contain anything that is useful to us
4784
03:30:30,799 --> 03:30:35,599
but some compilers are going to usefully
4785
03:30:33,120 --> 03:30:37,760
put in a zero because that's a logical
4786
03:30:35,600 --> 03:30:40,079
number to put in here if you didn't
4787
03:30:37,760 --> 03:30:43,120
explicitly put a number in here the
4788
03:30:40,079 --> 03:30:45,200
second one is using curly braces and
4789
03:30:43,120 --> 03:30:47,439
this is going to automatically
4790
03:30:45,200 --> 03:30:50,399
initialize to zero the third one is
4791
03:30:47,439 --> 03:30:53,120
going to be explicitly initialized with
4792
03:30:50,398 --> 03:30:55,920
the 10 and the cat count is going to be
4793
03:30:53,120 --> 03:30:58,000
initialized with 15. you can try and
4794
03:30:55,920 --> 03:31:00,318
print this out and see what you come up
4795
03:30:58,000 --> 03:31:02,238
with after compiling this application
4796
03:31:00,318 --> 03:31:04,478
another thing we have seen is that we
4797
03:31:02,238 --> 03:31:09,520
can do something like this and put an
4798
03:31:04,478 --> 03:31:12,639
expression into our curly braces and the
4799
03:31:09,520 --> 03:31:15,359
value this evaluates to is going to
4800
03:31:12,639 --> 03:31:18,238
initialize this domesticated animals
4801
03:31:15,359 --> 03:31:20,238
variable and now you should know that
4802
03:31:18,238 --> 03:31:22,639
this is probably going to take 4 bytes
4803
03:31:20,238 --> 03:31:25,760
in memory because it is an integer
4804
03:31:22,639 --> 03:31:28,639
this is really how c plus plus works
4805
03:31:31,439 --> 03:31:36,159
most times so integers is mostly going
4806
03:31:34,238 --> 03:31:38,799
to be four bytes on your system and
4807
03:31:36,159 --> 03:31:41,520
we're going to query this a little later
4808
03:31:38,799 --> 03:31:44,478
in this video okay let's try and compile
4809
03:31:41,520 --> 03:31:46,479
this program and see if it actually
4810
03:31:44,478 --> 03:31:49,119
works we're going to start world and you
4811
03:31:46,478 --> 03:31:51,840
see that the world is successful another
4812
03:31:49,120 --> 03:31:53,520
thing we can do is try and use variables
4813
03:31:51,840 --> 03:31:55,359
we haven't really declared in our
4814
03:31:53,520 --> 03:31:57,840
program and you can guess what is going
4815
03:31:57,840 --> 03:32:03,120
and new number for example and putin
4816
03:32:01,040 --> 03:32:05,359
doesn't exist you know it's a number
4817
03:32:03,120 --> 03:32:07,359
that doesn't exist the compiler is not
4818
03:32:05,359 --> 03:32:10,399
going to know what this is because we
4819
03:32:07,359 --> 03:32:12,159
didn't declare a variable called doesn't
4820
03:32:10,398 --> 03:32:13,920
exist if you try to compile this you're
4821
03:32:12,159 --> 03:32:16,639
going to get a problem you see that we
4822
03:32:13,920 --> 03:32:19,359
have a problem before we even compile so
4823
03:32:16,639 --> 03:32:22,079
visual studio code is this smart it can
4824
03:32:19,359 --> 03:32:24,960
analyze our code before we compile it
4825
03:32:22,079 --> 03:32:27,120
and give us hints to problems that might
4826
03:32:24,959 --> 03:32:30,159
come up you see here it is saying
4827
03:32:27,120 --> 03:32:32,479
doesn't exist isn't defined so if we try
4828
03:32:30,159 --> 03:32:34,639
to compile this we're going to get an
4829
03:32:32,478 --> 03:32:36,719
error that we expect it's going to say
4830
03:32:34,639 --> 03:32:38,559
doesn't exist doesn't really exist i
4831
03:32:36,719 --> 03:32:40,478
don't know what that is so you shouldn't
4832
03:32:38,559 --> 03:32:43,600
really do that you shouldn't try to use
4833
03:32:40,478 --> 03:32:45,840
variables you haven't declared this is
4834
03:32:45,840 --> 03:32:50,559
we can also do functional initialization
4835
03:32:50,559 --> 03:32:56,079
okay another thing we can do is store a
4836
03:32:53,200 --> 03:32:57,840
fractional number in an empty variable
4837
03:32:56,079 --> 03:32:59,760
and we're going to see what this does
4838
03:32:57,840 --> 03:33:02,000
we're going to try and compile this code
4839
03:32:59,760 --> 03:33:04,318
you see we have a 2.9 we're trying to
4840
03:33:02,000 --> 03:33:07,760
store this in an integer if we try to
4841
03:33:04,318 --> 03:33:11,278
compile this let's try and use gcc let's
4842
03:33:07,760 --> 03:33:13,840
clear this let's bring up a terminal and
4843
03:33:11,279 --> 03:33:16,880
try to build this we're going to try and
4844
03:33:13,840 --> 03:33:19,359
run our gcc compiler on this program it
4845
03:33:16,879 --> 03:33:21,799
is going to say errol narrowing a
4846
03:33:21,799 --> 03:33:28,079
2.899 from double to integer c plus plus
4847
03:33:25,120 --> 03:33:30,880
20 isn't even going to allow this so
4848
03:33:28,079 --> 03:33:34,079
this is a good thing because you might
4849
03:33:30,879 --> 03:33:36,639
think that you have a 2.9 and some
4850
03:33:34,079 --> 03:33:39,920
compilers are going to chop this off and
4851
03:33:36,639 --> 03:33:42,159
store a 2 instead so this is one of the
4852
03:33:39,920 --> 03:33:44,559
safe things about this way of doing
4853
03:33:42,159 --> 03:33:46,879
thanks so i am going to comment this out
4854
03:33:44,559 --> 03:33:49,519
because otherwise our program wouldn't
4855
03:33:46,879 --> 03:33:51,839
compile now that we know how to use
4856
03:33:49,520 --> 03:33:54,399
these things we can try to print the
4857
03:33:51,840 --> 03:33:57,040
values in here okay i am going to put in
4858
03:33:54,398 --> 03:33:59,278
a piece of code i have lying around on
4859
03:33:57,040 --> 03:34:01,520
my drive i am going to remove these
4860
03:33:59,279 --> 03:34:04,159
spaces inside because it is annoying
4861
03:34:01,520 --> 03:34:06,159
let's do this and if we try and build
4862
03:34:04,159 --> 03:34:08,719
this program it should compile
4863
03:34:06,159 --> 03:34:11,119
successfully and if we run it we should
4864
03:34:08,719 --> 03:34:13,599
see our numbers we're going to go in our
4865
03:34:11,120 --> 03:34:15,760
terminal here and do der and we're going
4866
03:34:13,600 --> 03:34:19,279
to run rooster and we're going to see
4867
03:34:15,760 --> 03:34:21,279
elephant count is one because this is a
4868
03:34:19,279 --> 03:34:22,319
garbage value so it could really be
4869
03:34:26,879 --> 03:34:32,799
cat count should be 15 it is what we
4870
03:34:29,200 --> 03:34:35,840
have and a domesticated animal count is
4871
03:34:32,799 --> 03:34:38,238
25 because we have drug account
4872
03:34:35,840 --> 03:34:41,120
and we add that to cat count and we're
4873
03:34:38,238 --> 03:34:43,279
going to end up with 25. this is what we
4874
03:34:41,120 --> 03:34:45,600
expect now that we know how to work with
4875
03:34:43,279 --> 03:34:48,479
this we can also try and play with
4876
03:34:45,600 --> 03:34:50,720
functional initialization before i put
4877
03:34:48,478 --> 03:34:52,879
in my code i am going to comment all
4878
03:34:50,719 --> 03:34:55,199
this out because i don't want this to
4879
03:34:52,879 --> 03:34:57,679
disturb us as we work with our
4880
03:34:55,200 --> 03:35:00,000
functional initialization code so i am
4881
03:34:57,680 --> 03:35:02,479
going to comment all this out and go all
4882
03:35:00,000 --> 03:35:04,959
the way down and put in my code for
4883
03:35:04,959 --> 03:35:09,839
and you see here we have a variable
4884
03:35:06,879 --> 03:35:12,398
called ethel we initialize this to 5 we
4885
03:35:09,840 --> 03:35:13,920
have orange count which is 10 we have
4886
03:35:13,920 --> 03:35:18,238
and we have a bad initialization that is
4887
03:35:16,000 --> 03:35:21,600
not going to work it doesn't exist 3 and
4888
03:35:18,238 --> 03:35:23,359
doesn't exist 4 don't really exist so so
4889
03:35:21,600 --> 03:35:24,479
this is going to give us a compiler
4890
03:35:24,478 --> 03:35:30,398
and if we do something like we do in
4891
03:35:27,600 --> 03:35:32,960
narrowing the conversion function here
4892
03:35:30,398 --> 03:35:36,238
this is mostly going to compile and this
4893
03:35:32,959 --> 03:35:39,039
is going to chop off data and store a 2
4894
03:35:36,238 --> 03:35:41,520
instead of the 2.9 this is something you
4895
03:35:39,040 --> 03:35:43,920
should really be aware of and you see
4896
03:35:41,520 --> 03:35:46,238
the comment here says information lost
4897
03:35:43,920 --> 03:35:49,040
this is less safe than braced
4898
03:35:46,238 --> 03:35:50,478
initializer because breast initializer
4899
03:35:50,478 --> 03:35:54,799
give you a compiler error if you try to
4900
03:35:52,639 --> 03:35:57,519
do this and that's a good thing
4901
03:35:54,799 --> 03:36:00,238
so we also try and print these out so i
4902
03:35:57,520 --> 03:36:02,399
am going to tidy this up a little bit
4903
03:36:00,238 --> 03:36:05,039
and i am going to try and compile this
4904
03:36:02,398 --> 03:36:08,000
piece of code run task and world with
4905
03:36:05,040 --> 03:36:09,600
gcc the world is going to pass through
4906
03:36:09,600 --> 03:36:16,238
and if we do clear and run rooster we're
4907
03:36:13,120 --> 03:36:18,640
going to see apple count is 5 which is
4908
03:36:16,238 --> 03:36:21,600
what we have in here orange count is
4909
03:36:18,639 --> 03:36:24,000
going to be 10 so this is right fruit
4910
03:36:21,600 --> 03:36:25,279
count is going to be 15 because it is 5
4911
03:36:25,279 --> 03:36:31,680
and what is really worrying is that
4912
03:36:29,120 --> 03:36:34,880
narrowing conversion is 2 but we didn't
4913
03:36:31,680 --> 03:36:38,159
store in a 2 we started in a 2.9
4914
03:36:34,879 --> 03:36:43,119
and because an integer can really store
4915
03:36:38,159 --> 03:36:46,000
4 bytes 2.9 is more than 4 bytes and it
4916
03:36:43,120 --> 03:36:48,960
is going to store what it can and it is
4917
03:36:46,000 --> 03:36:51,439
going to chop off this 2.9 and only
4918
03:36:48,959 --> 03:36:54,238
store in a 2 so this is really something
4919
03:36:51,439 --> 03:36:56,960
you should be aware of sometimes this is
4920
03:36:54,238 --> 03:36:58,079
going to cause problems in your program
4921
03:36:58,079 --> 03:37:03,680
really really if you are trying to store
4922
03:37:00,799 --> 03:37:06,559
fractional numbers in an integer please
4923
03:37:06,559 --> 03:37:11,278
form because the compiler is going to
4924
03:37:08,398 --> 03:37:13,358
stop you from doing this if you try okay
4925
03:37:11,279 --> 03:37:15,279
so this is really the difference between
4926
03:37:13,359 --> 03:37:18,399
functional notation and breast
4927
03:37:15,279 --> 03:37:20,399
initializer notation functional notation
4928
03:37:18,398 --> 03:37:23,278
is not going to give you an arrow if you
4929
03:37:20,398 --> 03:37:25,840
try to store something that can't really
4930
03:37:23,279 --> 03:37:28,960
fit in a net it is going to silently
4931
03:37:25,840 --> 03:37:31,359
chop it off and put in whatever it can
4932
03:37:28,959 --> 03:37:33,278
and braced initializer is going to give
4933
03:37:31,359 --> 03:37:36,000
you a compiler error so this is the
4934
03:37:33,279 --> 03:37:39,040
difference between these two okay i am
4935
03:37:36,000 --> 03:37:41,359
going to comment this out as well and i
4936
03:37:39,040 --> 03:37:43,760
am going to put the starting comment
4937
03:37:41,359 --> 03:37:45,600
here and i am going to go down and show
4938
03:37:43,760 --> 03:37:48,318
you that you can do assignment
4939
03:37:45,600 --> 03:37:50,159
initialization as well i am going to put
4940
03:37:48,318 --> 03:37:52,398
in my code here because i don't want to
4941
03:37:50,159 --> 03:37:54,959
type it really and i am going to print
4942
03:37:52,398 --> 03:37:57,278
all this out and we have a bike account
4943
03:37:54,959 --> 03:37:59,839
variable that we initialize using the
4944
03:37:57,279 --> 03:38:02,319
assignment notation track count is going
4945
03:37:59,840 --> 03:38:04,799
to be seven fake account is going to be
4946
03:38:02,318 --> 03:38:06,639
bike account plus track count and we're
4947
03:38:04,799 --> 03:38:08,799
going to be narrowing conversion here
4948
03:38:06,639 --> 03:38:11,760
and we're going to see if this actually
4949
03:38:08,799 --> 03:38:13,599
works we're going to try and weld this
4950
03:38:11,760 --> 03:38:15,120
we're going to run the task to world
4951
03:38:15,120 --> 03:38:19,600
it is going to pass through you can
4952
03:38:17,120 --> 03:38:21,279
guess what we're going to see if we run
4953
03:38:21,279 --> 03:38:28,079
bike account is 2 track count is 7 which
4954
03:38:24,318 --> 03:38:31,039
is what we expect vehicle count is nine
4955
03:38:28,079 --> 03:38:33,840
and uh the narrowing conversion is also
4956
03:38:31,040 --> 03:38:35,600
chopping off what we have here so this
4957
03:38:33,840 --> 03:38:37,840
is something you need to be careful
4958
03:38:35,600 --> 03:38:39,680
about another thing i want you to see is
4959
03:38:37,840 --> 03:38:42,000
that you can check the size of your
4960
03:38:39,680 --> 03:38:45,120
variables in memory so we're going to
4961
03:38:48,639 --> 03:38:52,238
and i am going to put in a piece of code
4962
03:38:50,719 --> 03:38:55,079
to really play with this i don't want to
4963
03:38:52,238 --> 03:38:57,439
type all this because it's really
4964
03:38:55,079 --> 03:38:59,760
self-explanatory by now we're going to
4965
03:38:57,439 --> 03:39:02,559
print sites of ant and inside we're
4966
03:38:59,760 --> 03:39:04,478
going to say size of ant and this is
4967
03:39:02,559 --> 03:39:07,278
going to give us how much memory is
4968
03:39:04,478 --> 03:39:09,679
really occupied by an end and we can use
4969
03:39:07,279 --> 03:39:12,560
this form here by passing in a variable
4970
03:39:09,680 --> 03:39:15,359
name track count is a variable we have
4971
03:39:12,559 --> 03:39:18,079
declared and initialized here
4972
03:39:15,359 --> 03:39:20,880
so if we build this program
4973
03:39:18,079 --> 03:39:23,120
let's do that with gcc the build is
4974
03:39:20,879 --> 03:39:25,438
going to pass through and if we run
4975
03:39:23,120 --> 03:39:28,160
rooster we're going to see that the size
4976
03:39:25,439 --> 03:39:31,199
of int is four you're going to see that
4977
03:39:28,159 --> 03:39:34,398
this is in bytes and size of track count
4978
03:39:31,199 --> 03:39:37,439
is for as well because track account is
4979
03:39:34,398 --> 03:39:39,920
also an integer so these are all little
4980
03:39:37,439 --> 03:39:42,639
tools you can really use to
4981
03:39:39,920 --> 03:39:45,760
know how much memory is really being
4982
03:39:42,639 --> 03:39:47,278
used and occupied by your program and
4983
03:39:45,760 --> 03:39:49,760
this is really all we set up to do in
4984
03:39:47,279 --> 03:39:53,120
this lecture to learn as much as we can
4985
03:39:49,760 --> 03:39:56,238
about integers integers occupy 4 bytes
4986
03:39:53,120 --> 03:39:58,880
in memory for the most part and we have
4987
03:39:56,238 --> 03:40:01,920
seen different ways we can initialize
4988
03:39:58,879 --> 03:40:04,799
our integer variables we can use breast
4989
03:40:01,920 --> 03:40:07,120
initializers which is going to use curly
4990
03:40:07,120 --> 03:40:12,960
initialization using parentheses like
4991
03:40:09,439 --> 03:40:15,439
this we can also do assignment notation
4992
03:40:12,959 --> 03:40:18,559
using the from like this and we can use
4993
03:40:15,439 --> 03:40:21,359
size of to check the size of our integer
4994
03:40:18,559 --> 03:40:24,079
variables i have to say that these kinds
4995
03:40:21,359 --> 03:40:27,040
of initialization also work on other
4996
03:40:24,079 --> 03:40:29,520
variables but we took the chance to
4997
03:40:27,040 --> 03:40:31,439
introduce all these concepts using
4998
03:40:29,520 --> 03:40:33,120
integers this is really all we set out
4999
03:40:31,439 --> 03:40:35,840
to do in this lecture i hope you found
5000
03:40:33,120 --> 03:40:37,680
it interesting we are going to stop here
5001
03:40:35,840 --> 03:40:40,318
in this lecture the next one we're going
5002
03:40:37,680 --> 03:40:43,120
to start and learn about integer
5003
03:40:40,318 --> 03:40:44,559
modifiers go ahead and finish up here
5004
03:40:44,559 --> 03:40:49,359
in this lecture we're going to learn
5005
03:40:46,000 --> 03:40:51,439
about integer modifiers and these are
5006
03:40:49,359 --> 03:40:54,238
little things you can sprinkle around
5007
03:40:51,439 --> 03:40:56,880
your integer types to modify their
5008
03:40:54,238 --> 03:40:58,398
behavior a little bit but before we dive
5009
03:40:58,398 --> 03:41:03,920
let's talk about how we can store
5010
03:41:00,959 --> 03:41:06,799
positive or negative numbers in integers
5011
03:41:03,920 --> 03:41:10,398
and we can do something like this if we
5012
03:41:06,799 --> 03:41:12,079
put a tan inside our value 1 variable
5013
03:41:12,079 --> 03:41:18,000
it's going to work we can also put in a
5014
03:41:14,559 --> 03:41:20,159
negative number like minus 300
5015
03:41:18,000 --> 03:41:21,520
and it is going to work so what's the
5016
03:41:22,478 --> 03:41:28,398
this is signed by default and this is a
5017
03:41:24,879 --> 03:41:31,198
modifier we can apply to our variable
5018
03:41:28,398 --> 03:41:33,920
to signal that we have the possibility
5019
03:41:31,199 --> 03:41:36,319
to store in negative or positive numbers
5020
03:41:33,920 --> 03:41:38,559
and it is going to work if you only want
5021
03:41:36,318 --> 03:41:41,119
to store positive numbers in your end
5022
03:41:38,559 --> 03:41:44,478
variables you can use another
5023
03:41:41,120 --> 03:41:46,319
modifier called unsigned and if you put
5024
03:41:44,478 --> 03:41:48,000
in a negative number you're going to get
5025
03:41:46,318 --> 03:41:50,478
a compiler error we're going to see how
5026
03:41:48,000 --> 03:41:53,199
this works in a minute okay regardless
5027
03:41:50,478 --> 03:41:56,079
of whether your integer variables are
5028
03:41:53,199 --> 03:41:58,720
unsigned or signed they are going to
5029
03:41:56,079 --> 03:42:01,039
still occupy 4 bytes in memory so this
5030
03:41:58,719 --> 03:42:03,358
is how it's going to look in memory and
5031
03:42:01,040 --> 03:42:04,720
here is a simple formula we can use to
5032
03:42:04,719 --> 03:42:08,959
the range of values we can store in our
5033
03:42:08,959 --> 03:42:14,639
if they are unsigned or signed if the
5034
03:42:12,159 --> 03:42:17,279
number is inside you can use this
5035
03:42:14,639 --> 03:42:19,358
unsigned range formula and plug in the
5036
03:42:19,359 --> 03:42:24,399
in your data type if you are using a
5037
03:42:24,398 --> 03:42:28,719
this is what you're going to use and
5038
03:42:26,398 --> 03:42:31,278
here is a simple example for example if
5039
03:42:28,719 --> 03:42:33,519
we have an unsigned and this is the
5040
03:42:31,279 --> 03:42:36,079
range of values we can store we can
5041
03:42:33,520 --> 03:42:38,640
basically go from 0 all the way to 4
5042
03:42:36,079 --> 03:42:40,799
billion if the number is signed the
5043
03:42:38,639 --> 03:42:42,879
range is going to basically be divided
5044
03:42:40,799 --> 03:42:45,198
into half the half is going to go on the
5045
03:42:42,879 --> 03:42:47,278
left and store negative numbers and the
5046
03:42:45,199 --> 03:42:49,840
other half is going to go to the right
5047
03:42:47,279 --> 03:42:52,238
and store positive numbers and you can
5048
03:42:49,840 --> 03:42:55,680
see that we can basically go from minus
5049
03:42:52,238 --> 03:42:58,159
two billion to two billion if the number
5050
03:42:55,680 --> 03:43:01,520
is signed okay by now we have seen two
5051
03:42:58,159 --> 03:43:04,318
modifiers unsigned and designed but
5052
03:43:01,520 --> 03:43:07,920
there are others for example you can
5053
03:43:04,318 --> 03:43:11,278
flag your integer types as short or long
5054
03:43:07,920 --> 03:43:14,079
what does this do well this is a table
5055
03:43:11,279 --> 03:43:15,920
that i put together to try and come up
5056
03:43:14,079 --> 03:43:19,120
with all the combinations you can come
5057
03:43:15,920 --> 03:43:21,279
up with if you have a short variable it
5058
03:43:19,120 --> 03:43:23,600
is going to be two bytes in memory this
5059
03:43:21,279 --> 03:43:26,399
is the modification that this modifier
5060
03:43:23,600 --> 03:43:28,640
does to your type if you have short and
5061
03:43:26,398 --> 03:43:30,719
it's going to be two bytes if you have a
5062
03:43:28,639 --> 03:43:33,439
signed short and it's going to be two
5063
03:43:30,719 --> 03:43:35,920
bytes if you have unsigned shirt and
5064
03:43:33,439 --> 03:43:38,960
it's going to be two bites you can see
5065
03:43:35,920 --> 03:43:43,120
that the effect of short is really
5066
03:43:38,959 --> 03:43:46,318
shortening the original size in memory
5067
03:43:43,120 --> 03:43:48,640
for whatever type you applied this on
5068
03:43:46,318 --> 03:43:51,119
this is really working on an editor even
5069
03:43:48,639 --> 03:43:53,039
if we don't specify int here for example
5070
03:43:51,120 --> 03:43:55,600
short short here it's going to
5071
03:43:55,600 --> 03:44:01,359
we have two bytes because it's basically
5072
03:43:58,000 --> 03:44:04,398
an end that we have split into here in
5073
03:44:01,359 --> 03:44:07,199
the second column we have ant which is
5074
03:44:04,398 --> 03:44:09,519
going to be 4 bytes if it is assigned
5075
03:44:07,199 --> 03:44:11,279
and it's going to be 4 bytes this is
5076
03:44:09,520 --> 03:44:14,880
really the sizes you're going to come up
5077
03:44:11,279 --> 03:44:17,920
with if you use these combinations of
5078
03:44:14,879 --> 03:44:19,519
modifiers on your integer types one
5079
03:44:17,920 --> 03:44:22,559
thing i really want you to be careful
5080
03:44:19,520 --> 03:44:26,479
about is that these modifiers only work
5081
03:44:22,559 --> 03:44:28,799
for integral types so they work for data
5082
03:44:26,478 --> 03:44:31,438
types in which you can store
5083
03:44:28,799 --> 03:44:34,238
decimal or whole numbers you can't use
5084
03:44:31,439 --> 03:44:37,359
this on types in which you can store
5085
03:44:34,238 --> 03:44:39,520
fractional numbers like 2.9 that's going
5086
03:44:37,359 --> 03:44:42,079
to give you a compiler error now that
5087
03:44:39,520 --> 03:44:44,560
you have an idea about this why don't we
5088
03:44:42,079 --> 03:44:47,359
go in visual studio code and actually
5089
03:44:44,559 --> 03:44:50,159
play with us okay here we are in our
5090
03:44:47,359 --> 03:44:53,040
folder that contains our projects we're
5091
03:44:50,159 --> 03:44:55,760
going to do the usual and copy the files
5092
03:44:53,040 --> 03:44:58,960
from our template project and we're
5093
03:44:55,760 --> 03:45:02,159
going to put those files in our integer
5094
03:44:58,959 --> 03:45:04,238
modifiers project here let's open it up
5095
03:45:02,159 --> 03:45:06,478
and paste in the files we're going to go
5096
03:45:04,238 --> 03:45:08,639
up again and we're going to open this up
5097
03:45:06,478 --> 03:45:10,799
in visual studio code the first thing i
5098
03:45:08,639 --> 03:45:13,039
want to play with is storing positive
5099
03:45:10,799 --> 03:45:15,198
and negative numbers in our integer
5100
03:45:13,040 --> 03:45:17,920
types so we're going to say end value
5101
03:45:15,199 --> 03:45:20,479
one and we're going to store in a 10 for
5102
03:45:17,920 --> 03:45:21,439
example and we're going to do any value
5103
03:45:21,439 --> 03:45:25,760
and we're going to put in a minus 300. i
5104
03:45:24,238 --> 03:45:27,760
think this is what we had you know a
5105
03:45:25,760 --> 03:45:29,920
slide so we're going to keep this
5106
03:45:27,760 --> 03:45:31,920
if you try to print this out so we're
5107
03:45:29,920 --> 03:45:33,760
going to say value 1 and we're going to
5108
03:45:33,760 --> 03:45:38,398
and we're going to try and build this so
5109
03:45:36,639 --> 03:45:40,478
we're going to open our terminal so that
5110
03:45:38,398 --> 03:45:42,719
we can play with it right away
5111
03:45:40,478 --> 03:45:44,879
and we're going to run the task to world
5112
03:45:42,719 --> 03:45:48,159
with gcc the world is going to be
5113
03:45:44,879 --> 03:45:49,519
successful if we run our program we're
5114
03:45:48,159 --> 03:45:52,478
going to see that it's going to say
5115
03:45:52,478 --> 03:45:57,840
is -3 300 this is really cool we can
5116
03:45:55,760 --> 03:46:00,318
store positive numbers and negative
5117
03:45:57,840 --> 03:46:01,760
numbers in our end times and this is
5118
03:46:01,760 --> 03:46:06,159
4 bytes in memory we can prove this by
5119
03:46:04,000 --> 03:46:08,879
printing the size of value 1 and value
5120
03:46:06,159 --> 03:46:12,879
2. let's do that so we're going to say
5121
03:46:08,879 --> 03:46:16,719
size of value 1 is size of value 1. we
5122
03:46:12,879 --> 03:46:21,599
can also do it for value 2 size of value
5123
03:46:16,719 --> 03:46:24,318
2 and it's going to be size of value two
5124
03:46:21,600 --> 03:46:26,318
std and yeah if we build this again
5125
03:46:24,318 --> 03:46:30,079
we're going to run the test world with
5126
03:46:26,318 --> 03:46:31,920
gcc and uh we run our application it's
5127
03:46:30,079 --> 03:46:34,000
going to save four bytes so it doesn't
5128
03:46:31,920 --> 03:46:36,159
really matter if we store in a positive
5129
03:46:34,000 --> 03:46:38,799
number or a negative number it's going
5130
03:46:36,159 --> 03:46:41,600
to be 4 bytes this is the point i want
5131
03:46:38,799 --> 03:46:43,119
to make here another thing you can do is
5132
03:46:43,120 --> 03:46:49,359
very clear that you have signed numbers
5133
03:46:46,079 --> 03:46:52,159
in here and you can use the signed
5134
03:46:49,359 --> 03:46:55,199
integer modifier here so this is going
5135
03:46:52,159 --> 03:46:56,959
to give us the same result and if we try
5136
03:46:56,959 --> 03:47:02,719
run the task to build with gcc the world
5137
03:47:00,159 --> 03:47:04,799
is going to be successful if we run the
5138
03:47:02,719 --> 03:47:07,840
program we're going to get the same
5139
03:47:04,799 --> 03:47:09,920
result so if you don't put aside or if
5140
03:47:07,840 --> 03:47:12,000
you put it here it's going to be exactly
5141
03:47:09,920 --> 03:47:14,960
the same thing another thing you can do
5142
03:47:12,000 --> 03:47:16,159
is make it very clear that you want to
5143
03:47:16,159 --> 03:47:21,920
positive numbers in your variables we
5144
03:47:18,959 --> 03:47:24,000
can do that by using the unsigned
5145
03:47:21,920 --> 03:47:25,439
integer modifier so we're going to say
5146
03:47:25,439 --> 03:47:30,238
and value three for example and we're
5147
03:47:30,238 --> 03:47:37,119
this is going to be fine but if you do
5148
03:47:32,719 --> 03:47:38,719
unsigned and value 4 and put in a minus
5149
03:47:38,719 --> 03:47:43,198
this is going to give you a compiler
5150
03:47:40,478 --> 03:47:45,519
error because you save this is unsigned
5151
03:47:43,199 --> 03:47:48,560
and this really means that you want to
5152
03:47:45,520 --> 03:47:51,120
store in only positive numbers but you
5153
03:47:48,559 --> 03:47:53,519
are trying to put in a negative number
5154
03:47:51,120 --> 03:47:55,199
if you try to build this let's try this
5155
03:47:53,520 --> 03:47:58,079
we're going to run the task to build
5156
03:47:55,199 --> 03:48:02,000
with gcc we are going to get a compiler
5157
03:47:58,079 --> 03:48:03,600
arrow saying conversion from -5 to ant
5158
03:48:02,000 --> 03:48:05,760
this is not allowed you're going to get
5159
03:48:03,600 --> 03:48:08,238
a compiler arrow your program is not
5160
03:48:05,760 --> 03:48:10,880
going to compile so this is a compiler
5161
03:48:08,238 --> 03:48:13,119
error let's say this here and this is
5162
03:48:10,879 --> 03:48:15,839
really all i had to share about these
5163
03:48:15,840 --> 03:48:19,600
signed is going to mean that you can
5164
03:48:17,520 --> 03:48:22,159
store negative and positive numbers
5165
03:48:19,600 --> 03:48:25,040
unsigned is going to mean that you can
5166
03:48:22,159 --> 03:48:26,719
only put in positive numbers and if you
5167
03:48:25,040 --> 03:48:29,439
try to put in a negative number you're
5168
03:48:26,719 --> 03:48:32,159
going to get a compiler error now that
5169
03:48:29,439 --> 03:48:34,720
this is commented out if you try to run
5170
03:48:34,719 --> 03:48:39,198
the world is going to be good and we
5171
03:48:36,719 --> 03:48:40,799
will be able to run our program
5172
03:48:39,199 --> 03:48:44,079
and it's going to do whatever it was
5173
03:48:40,799 --> 03:48:46,719
doing before as we see here we also saw
5174
03:48:44,079 --> 03:48:49,199
that we could use the short and
5175
03:48:46,719 --> 03:48:51,039
long modifiers and we're going to put a
5176
03:48:49,199 --> 03:48:53,199
piece of code here that is going to
5177
03:48:51,040 --> 03:48:56,080
allow us to play with them so i don't
5178
03:48:53,199 --> 03:48:58,319
want to type this and if you don't want
5179
03:48:56,079 --> 03:49:00,559
to type this as well you can get this
5180
03:48:58,318 --> 03:49:03,039
code from the resource section it's
5181
03:49:00,559 --> 03:49:05,119
going to be left you can open the link
5182
03:49:03,040 --> 03:49:07,040
use the code copy the code and paste it
5183
03:49:05,120 --> 03:49:09,279
in here and really play with it because
5184
03:49:07,040 --> 03:49:11,439
the point is really not to type all this
5185
03:49:09,279 --> 03:49:13,279
the point is to understand what these
5186
03:49:13,279 --> 03:49:17,199
to your variables what we are going to
5187
03:49:15,279 --> 03:49:20,159
do we're going to try to print them out
5188
03:49:17,199 --> 03:49:22,319
and print the size they actually have in
5189
03:49:20,159 --> 03:49:24,398
memory we're going to do this in four
5190
03:49:22,318 --> 03:49:26,799
groups we're going to do one for short
5191
03:49:24,398 --> 03:49:29,519
and long we're going to do one for ant
5192
03:49:26,799 --> 03:49:31,358
here we're going to do one for long and
5193
03:49:29,520 --> 03:49:33,600
we're going to do one for long long
5194
03:49:31,359 --> 03:49:35,600
these are things you can do and we're
5195
03:49:33,600 --> 03:49:38,559
going to see how much memory is actually
5196
03:49:35,600 --> 03:49:41,520
being used by all these variables we are
5197
03:49:38,559 --> 03:49:43,840
going to start with the first group here
5198
03:49:41,520 --> 03:49:47,680
so we're going to go down and print the
5199
03:49:43,840 --> 03:49:50,238
size is out and this may be really hard
5200
03:49:47,680 --> 03:49:51,840
to wrap your brain around but they are
5201
03:49:51,840 --> 03:49:56,719
see out statements that we have been
5202
03:49:53,840 --> 03:49:59,040
doing all along i am going to split this
5203
03:49:56,719 --> 03:50:01,278
on different lines so that you can
5204
03:50:01,279 --> 03:50:07,279
we have an output statement for a short
5205
03:50:04,639 --> 03:50:09,519
var which is what we have here so we
5206
03:50:07,279 --> 03:50:11,279
expect this to take two bytes and all
5207
03:50:09,520 --> 03:50:13,760
these things are probably going to take
5208
03:50:11,279 --> 03:50:16,399
two bytes let's try and build the
5209
03:50:13,760 --> 03:50:18,639
program with gcc the bullet is going to
5210
03:50:16,398 --> 03:50:20,639
be successful we are going to run
5211
03:50:18,639 --> 03:50:23,840
rooster and you're going to see that
5212
03:50:20,639 --> 03:50:26,159
short end is two bytes signed short is
5213
03:50:23,840 --> 03:50:27,359
two bytes and everything is basically
5214
03:50:27,359 --> 03:50:32,159
in this group here and we did guess
5215
03:50:30,398 --> 03:50:35,198
right the next thing we want to try out
5216
03:50:35,199 --> 03:50:39,600
we are going to go down and give
5217
03:50:37,199 --> 03:50:41,680
ourselves some breathing room
5218
03:50:39,600 --> 03:50:43,680
and we're going to paste this in and
5219
03:50:41,680 --> 03:50:45,840
we're going to separate these again so
5220
03:50:43,680 --> 03:50:48,800
that we can see what is really happening
5221
03:50:45,840 --> 03:50:51,520
here and i think this is really enough
5222
03:50:48,799 --> 03:50:54,478
so we're going to see the sizes for the
5223
03:50:51,520 --> 03:50:57,520
thanks we have in this group here and we
5224
03:50:54,478 --> 03:51:00,559
expect this to take four bytes so let's
5225
03:50:57,520 --> 03:51:03,040
try and run the world task to build with
5226
03:51:00,559 --> 03:51:05,760
gcc the world is going to be good we can
5227
03:51:03,040 --> 03:51:08,239
run the program like we usually do and
5228
03:51:05,760 --> 03:51:11,600
you're going to see that ant variable is
5229
03:51:08,238 --> 03:51:15,439
4 bytes and everything in that group is
5230
03:51:11,600 --> 03:51:19,680
4 bytes and this tells you that
5231
03:51:15,439 --> 03:51:22,479
regardless of the side and unside
5232
03:51:19,680 --> 03:51:25,279
modifiers you put here it's going to
5233
03:51:22,478 --> 03:51:27,840
really use the size of it here okay it's
5234
03:51:25,279 --> 03:51:30,399
going to take four bytes in memory let's
5235
03:51:27,840 --> 03:51:33,040
try this group here we are going to go
5236
03:51:30,398 --> 03:51:34,639
down and put in the code to print the
5237
03:51:34,639 --> 03:51:40,398
and this is what we should use
5238
03:51:38,238 --> 03:51:43,439
let's split this on different lines so
5239
03:51:40,398 --> 03:51:44,959
that it is easier on the eyes and again
5240
03:51:43,439 --> 03:51:46,960
if you don't really want to type this
5241
03:51:44,959 --> 03:51:49,278
you can get the code from the length
5242
03:51:46,959 --> 03:51:51,519
resource section you're going to find
5243
03:51:49,279 --> 03:51:53,680
the code here and you can copy and paste
5244
03:51:51,520 --> 03:51:56,238
and really play with us but it is
5245
03:51:53,680 --> 03:51:58,960
helpful to really type these things out
5246
03:51:56,238 --> 03:52:00,959
and really bring these things in muscle
5247
03:51:58,959 --> 03:52:03,599
memory because it's going to help okay
5248
03:52:00,959 --> 03:52:06,959
so we have this and we're going to try
5249
03:52:03,600 --> 03:52:09,199
and run the world task with gcc the
5250
03:52:06,959 --> 03:52:10,719
build is good we're going to go in here
5251
03:52:10,719 --> 03:52:16,079
and it is going to say long variable is
5252
03:52:13,279 --> 03:52:19,279
four bytes and everything in this group
5253
03:52:16,079 --> 03:52:22,559
is basically going to be four bytes
5254
03:52:19,279 --> 03:52:23,439
in here the last one is this long long
5255
03:52:23,439 --> 03:52:26,398
it is going to really give you a huge
5256
03:52:26,398 --> 03:52:31,519
for your values you can store in the
5257
03:52:28,559 --> 03:52:33,359
variable but don't really trust my world
5258
03:52:31,520 --> 03:52:35,680
let's try this out so that you can see
5259
03:52:33,359 --> 03:52:38,000
for yourself we are going to go down and
5260
03:52:35,680 --> 03:52:40,720
really put this in so we're going to
5261
03:52:38,000 --> 03:52:42,959
give ourselves some breathing room
5262
03:52:47,439 --> 03:52:53,760
and what we are really doing is printing
5263
03:52:50,398 --> 03:52:55,519
the sizes for the variables that we have
5264
03:52:59,680 --> 03:53:04,000
the world is going to be good
5265
03:53:04,000 --> 03:53:09,199
and we're going to see that long long is
5266
03:53:06,159 --> 03:53:12,559
eight bytes eight bytes gives us a
5267
03:53:09,199 --> 03:53:14,159
really huge range of values okay this is
5268
03:53:12,559 --> 03:53:16,079
really all we set out to do in this
5269
03:53:14,159 --> 03:53:18,639
lecture to learn about these integer
5270
03:53:16,079 --> 03:53:20,879
modifiers they modify the way your
5271
03:53:18,639 --> 03:53:23,358
integer variables behave for example we
5272
03:53:20,879 --> 03:53:26,000
can specify that we only want positive
5273
03:53:23,359 --> 03:53:28,079
numbers all that we want to both store
5274
03:53:26,000 --> 03:53:30,719
positive and negative numbers for that
5275
03:53:28,079 --> 03:53:33,359
you're going to use designed or unsigned
5276
03:53:30,719 --> 03:53:35,920
modifiers you can also shorten or
5277
03:53:33,359 --> 03:53:38,318
lengthen the range of values you can
5278
03:53:35,920 --> 03:53:41,120
store in your variable by using the
5279
03:53:38,318 --> 03:53:43,920
modifiers short and long and from the
5280
03:53:41,120 --> 03:53:46,239
output of a program here you can really
5281
03:53:43,920 --> 03:53:48,318
see all these effects here this is
5282
03:53:46,238 --> 03:53:50,559
really all we set out to do in this
5283
03:53:48,318 --> 03:53:52,079
lecture i hope you found it interesting
5284
03:53:50,559 --> 03:53:53,760
we are going to stop here in this
5285
03:53:52,079 --> 03:53:56,959
lecture in the next one we're going to
5286
03:53:53,760 --> 03:53:59,600
start and learn about fractional numbers
5287
03:53:56,959 --> 03:54:01,198
go ahead and finish up here and meet me
5288
03:53:59,600 --> 03:54:04,399
there in this lecture we're going to
5289
03:54:01,199 --> 03:54:06,000
learn about fractional numbers and as we
5290
03:54:04,398 --> 03:54:08,238
work with these numbers i want you to
5291
03:54:06,000 --> 03:54:11,279
keep in mind that any piece of data you
5292
03:54:08,238 --> 03:54:13,760
work with in your c plus program
5293
03:54:11,279 --> 03:54:17,120
is ultimately going to be stored in the
5294
03:54:13,760 --> 03:54:18,880
form of ones and zeros in memory
5295
03:54:17,120 --> 03:54:22,079
functional number are also called
5296
03:54:18,879 --> 03:54:24,478
floating types in technical terms they
5297
03:54:22,079 --> 03:54:27,520
are used to represent numbers with
5298
03:54:24,478 --> 03:54:30,159
fractional parts in c plus plus and many
5299
03:54:27,520 --> 03:54:32,319
other languages and we have three types
5300
03:54:30,159 --> 03:54:33,279
that we can use in c plus plus we have
5301
03:54:33,279 --> 03:54:39,040
double and long double and the main
5302
03:54:35,920 --> 03:54:41,920
difference is in the size they occupy in
5303
03:54:39,040 --> 03:54:44,399
memory a float takes four bytes a double
5304
03:54:41,920 --> 03:54:47,760
takes eight bytes and the long double
5305
03:54:44,398 --> 03:54:50,000
takes 12 bytes typically so as the size
5306
03:54:47,760 --> 03:54:52,398
goes up you can also notice that the
5307
03:54:50,000 --> 03:54:54,879
precision goes up so what is the
5308
03:54:52,398 --> 03:54:58,238
precision the precision is basically the
5309
03:54:54,879 --> 03:55:01,039
number of bits you can represent with
5310
03:54:58,238 --> 03:55:03,039
that type starting from the number in
5311
03:55:01,040 --> 03:55:05,359
front of the decimal point so if we look
5312
03:55:03,040 --> 03:55:07,840
at this number here we can try and
5313
03:55:05,359 --> 03:55:13,920
figure out its precision so we're going
5314
03:55:07,840 --> 03:55:16,398
to count 1 2 3 4 5 6 7 8 9 10 11 12. the
5315
03:55:19,040 --> 03:55:24,319
we're really not able to represent a
5316
03:55:21,359 --> 03:55:26,399
number like this with a float
5317
03:55:24,318 --> 03:55:28,719
the smallest thing we can use to
5318
03:55:28,719 --> 03:55:34,318
is a double because the precision is 15
5319
03:55:32,079 --> 03:55:36,478
and it is more than what we need for
5320
03:55:34,318 --> 03:55:38,559
this number which is 12. one thing you
5321
03:55:36,478 --> 03:55:40,478
should remember is that the number in
5322
03:55:38,559 --> 03:55:42,639
front of the decimal point is also
5323
03:55:40,478 --> 03:55:44,639
counted then when you are trying to
5324
03:55:42,639 --> 03:55:48,000
figure out the precision for your
5325
03:55:44,639 --> 03:55:50,799
floating point numbers in c plus plus so
5326
03:55:48,000 --> 03:55:53,359
here we have an example of how we can
5327
03:55:50,799 --> 03:55:56,159
declare and initialize floating point
5328
03:55:53,359 --> 03:55:58,960
numbers in our c plus plus program
5329
03:55:56,159 --> 03:56:01,119
number one is a really huge number so
5330
03:55:58,959 --> 03:56:03,438
you can guess that this is more than we
5331
03:56:01,120 --> 03:56:06,640
can handle with the float we're going to
5332
03:56:03,439 --> 03:56:10,800
see how this is handled by our compiler
5333
03:56:06,639 --> 03:56:12,959
a double has a precision of 15 so we
5334
03:56:10,799 --> 03:56:15,599
should expect to store more numbers than
5335
03:56:12,959 --> 03:56:18,398
we did in a float a long double should
5336
03:56:15,600 --> 03:56:21,439
be able to handle this without a problem
5337
03:56:18,398 --> 03:56:23,680
because if we go back to our table here
5338
03:56:21,439 --> 03:56:26,960
our long double here should be able to
5339
03:56:23,680 --> 03:56:29,279
handle this better than double but it is
5340
03:56:26,959 --> 03:56:31,679
possible that it is the same thing as
5341
03:56:29,279 --> 03:56:33,920
double depending on the compiler
5342
03:56:31,680 --> 03:56:35,600
implementation and if we try to print
5343
03:56:33,920 --> 03:56:37,760
out the sizes here we're going to see
5344
03:56:35,600 --> 03:56:40,079
what the compiler gives us we're going
5345
03:56:37,760 --> 03:56:42,478
to do this when we try this in visual
5346
03:56:40,079 --> 03:56:44,879
studio code okay and here we are trying
5347
03:56:42,478 --> 03:56:49,840
to print out the precision of these
5348
03:56:44,879 --> 03:56:53,198
numbers we can use a special setting on
5349
03:56:49,840 --> 03:56:55,359
our stream to control the maximum
5350
03:56:53,199 --> 03:56:57,439
precision that we can see here you see
5351
03:56:55,359 --> 03:56:59,359
that we are trying to show the precision
5352
03:56:57,439 --> 03:57:02,720
for each number there is a special
5353
03:56:59,359 --> 03:57:04,880
setting we can put on stdc out to make
5354
03:57:02,719 --> 03:57:07,519
it control the precision to a given
5355
03:57:04,879 --> 03:57:09,278
number here we are using 20 and we're
5356
03:57:07,520 --> 03:57:12,079
going to see that for number one this is
5357
03:57:09,279 --> 03:57:14,479
going to be seven digits for number two
5358
03:57:12,079 --> 03:57:16,799
it should be 15 digits or something
5359
03:57:14,478 --> 03:57:19,438
close to that the specifics are really
5360
03:57:16,799 --> 03:57:22,238
dependent on the compiler implementation
5361
03:57:19,439 --> 03:57:24,960
and for long double it should at least
5362
03:57:22,238 --> 03:57:27,520
be the same as double or even more in
5363
03:57:24,959 --> 03:57:30,318
some cases okay here we want to see that
5364
03:57:27,520 --> 03:57:32,800
we can also have narrowing errors
5365
03:57:30,318 --> 03:57:35,760
if we try to store something back in a
5366
03:57:32,799 --> 03:57:38,398
float and a float can't really handle it
5367
03:57:35,760 --> 03:57:41,840
here we have a number with a lot of
5368
03:57:38,398 --> 03:57:44,639
digits one two three four five six seven
5369
03:57:41,840 --> 03:57:47,439
eight nine and we know that the float
5370
03:57:44,639 --> 03:57:48,959
can only handle seven digits so
5371
03:57:47,439 --> 03:57:51,880
this is probably going to give us a
5372
03:57:48,959 --> 03:57:54,799
compiler error as we've seen for breast
5373
03:57:51,879 --> 03:57:56,959
initialization if we use functional
5374
03:57:54,799 --> 03:58:00,079
initialization this problem is not going
5375
03:57:56,959 --> 03:58:02,398
to be code at compile time so we're
5376
03:58:00,079 --> 03:58:04,398
going to end up with a chunked piece of
5377
03:58:02,398 --> 03:58:06,879
data and we're going to see this when we
5378
03:58:04,398 --> 03:58:09,039
play with this with visual studio code
5379
03:58:06,879 --> 03:58:11,920
and another format we can use with
5380
03:58:09,040 --> 03:58:15,279
floating points is that we can use
5381
03:58:11,920 --> 03:58:18,478
scientific notation and it is basically
5382
03:58:15,279 --> 03:58:22,000
a way we can use a power of 10
5383
03:58:18,478 --> 03:58:24,478
multiplier to multiply with our floating
5384
03:58:22,000 --> 03:58:28,159
point number so for example here number
5385
03:58:24,478 --> 03:58:31,920
5 is going to be this number 1 9 2 4 0 0
5386
03:58:28,159 --> 03:58:34,879
0 23 we can use a floating point
5387
03:58:31,920 --> 03:58:36,559
scientific notation to represent this
5388
03:58:34,879 --> 03:58:40,318
so what we're going to do we're going to
5389
03:58:36,559 --> 03:58:42,959
say 1.9 and we're going to multiply this
5390
03:58:40,318 --> 03:58:47,760
with 10 to the power of 8. this is what
5391
03:58:42,959 --> 03:58:50,478
this means this 8 here means to multiply
5392
03:58:47,760 --> 03:58:52,880
with 10 to the power of 8. and if we
5393
03:58:50,478 --> 03:58:55,840
multiply with that that basically means
5394
03:58:52,879 --> 03:58:59,839
moving the decimal point 8 digits to the
5395
03:58:55,840 --> 03:59:02,639
right so we can go one two three four
5396
03:58:59,840 --> 03:59:05,439
five six seven eight and it is going to
5397
03:59:02,639 --> 03:59:07,439
end at these three here and it is going
5398
03:59:05,439 --> 03:59:09,920
to be basically the same number number
5399
03:59:07,439 --> 03:59:12,159
seven is also another one and if we do
5400
03:59:09,920 --> 03:59:14,799
this we're going to pad with zeros after
5401
03:59:12,159 --> 03:59:17,439
these four and we're going to end up at
5402
03:59:14,799 --> 03:59:18,959
this same location as the three but it
5403
03:59:17,439 --> 03:59:21,760
is going to be a zero we're going to see
5404
03:59:18,959 --> 03:59:24,159
about that in a minute and number eight
5405
03:59:21,760 --> 03:59:27,359
is another floating point number and we
5406
03:59:24,159 --> 03:59:30,559
can use scientific notation to represent
5407
03:59:27,359 --> 03:59:32,159
it just like you see with number nine
5408
03:59:30,559 --> 03:59:34,478
we're basically going to have the same
5409
03:59:32,159 --> 03:59:37,119
thing when we have a minus in here it
5410
03:59:34,478 --> 03:59:40,318
means we're going to multiply with 10 to
5411
03:59:37,120 --> 03:59:43,520
the power of minus 11 and this is going
5412
03:59:40,318 --> 03:59:45,840
to give us a number below one thing zero
5413
03:59:43,520 --> 03:59:48,479
point zero zero seven or something like
5414
03:59:45,840 --> 03:59:51,840
that so we're going to go 11 digits
5415
03:59:48,478 --> 03:59:57,599
after the zero here and if we count one
5416
03:59:51,840 --> 04:00:00,478
two three four 5 6 7 8 9 10 11 and the
5417
03:59:57,600 --> 04:00:02,318
decimal point is going to go after three
5418
04:00:00,478 --> 04:00:04,159
and we're going to basically end up with
5419
04:00:02,318 --> 04:00:05,519
the same thing here we're going to play
5420
04:00:04,159 --> 04:00:07,680
with this in a minute and you're going
5421
04:00:05,520 --> 04:00:09,920
to see that all this makes sense and
5422
04:00:07,680 --> 04:00:12,159
don't forget that any piece of data we
5423
04:00:09,920 --> 04:00:15,600
store in a computer is going to be
5424
04:00:12,159 --> 04:00:18,318
ultimately represented by ones and zeros
5425
04:00:15,600 --> 04:00:20,720
in memory and for floating points we
5426
04:00:18,318 --> 04:00:22,799
don't use the number systems like we've
5427
04:00:20,719 --> 04:00:25,679
done for integers there is a special
5428
04:00:22,799 --> 04:00:27,759
system that is used to do that but it is
5429
04:00:25,680 --> 04:00:29,920
a little bit complicated to cover in a
5430
04:00:27,760 --> 04:00:32,238
course like this i am just going to
5431
04:00:29,920 --> 04:00:34,000
point you to it if you are interested
5432
04:00:32,238 --> 04:00:36,318
and when you are done with this course
5433
04:00:34,000 --> 04:00:38,398
you can come up and read on this the
5434
04:00:36,318 --> 04:00:40,559
main point is that any piece of data
5435
04:00:38,398 --> 04:00:43,119
that you represent in your c plus plus
5436
04:00:40,559 --> 04:00:46,478
program is going to be represented in
5437
04:00:43,120 --> 04:00:48,399
terms of ones and zeros in the memory of
5438
04:00:46,478 --> 04:00:50,719
your computer okay there are a few
5439
04:00:48,398 --> 04:00:53,039
things you can do with floating points
5440
04:00:50,719 --> 04:00:56,079
that you can't really do with integers
5441
04:00:53,040 --> 04:00:58,239
for example you can divide with zero if
5442
04:00:56,079 --> 04:01:00,478
you take a floating point number and
5443
04:00:58,238 --> 04:01:03,279
divide that with zero you're going to
5444
04:01:00,478 --> 04:01:05,039
get what we call infinity if the number
5445
04:01:03,279 --> 04:01:06,800
is positive you're going to get positive
5446
04:01:05,040 --> 04:01:09,199
infinity if the number is negative
5447
04:01:06,799 --> 04:01:11,358
you're going to get negative infinity
5448
04:01:09,199 --> 04:01:14,239
and you can take two floating point
5449
04:01:11,359 --> 04:01:15,680
numbers that are zeros and divide them
5450
04:01:14,238 --> 04:01:18,159
and what you're going to get really is
5451
04:01:15,680 --> 04:01:20,398
not a number it's something called nan
5452
04:01:18,159 --> 04:01:23,119
which stands for naughty number
5453
04:01:20,398 --> 04:01:25,599
and uh your program is going to not
5454
04:01:23,120 --> 04:01:27,040
crash but very few things you can't do
5455
04:01:25,600 --> 04:01:29,040
with these things for example you can't
5456
04:01:27,040 --> 04:01:31,520
add them up you shouldn't really do this
5457
04:01:29,040 --> 04:01:34,640
it's probably going to end up bad for
5458
04:01:31,520 --> 04:01:37,040
your program here we have a few examples
5459
04:01:34,639 --> 04:01:39,358
we have three numbers declared they are
5460
04:01:37,040 --> 04:01:42,560
doubles they must be occupying eight
5461
04:01:39,359 --> 04:01:46,079
bytes in memory number 10 is initialized
5462
04:01:42,559 --> 04:01:48,879
to 5.6 11 is initialized to zero because
5463
04:01:46,079 --> 04:01:50,879
we are using the braced initialization
5464
04:01:50,879 --> 04:01:56,478
and infinity here is the result of
5465
04:01:53,680 --> 04:01:59,359
dividing a number by zero so it's going
5466
04:01:56,478 --> 04:02:01,920
to be positive infinity because number
5467
04:01:59,359 --> 04:02:04,159
10 is a positive number if you go down
5468
04:02:01,920 --> 04:02:06,478
we're going to print number 10 divided
5469
04:02:04,159 --> 04:02:08,639
by number 11 and we're going to say
5470
04:02:06,478 --> 04:02:10,879
yields we're going to put the result out
5471
04:02:08,639 --> 04:02:12,559
we're going to see that down here on the
5472
04:02:10,879 --> 04:02:14,719
second line you see that we are trying
5473
04:02:12,559 --> 04:02:17,600
to add something to infinity and this is
5474
04:02:14,719 --> 04:02:21,119
also going to yield infinity because
5475
04:02:17,600 --> 04:02:23,120
think of infinity as something super big
5476
04:02:21,120 --> 04:02:24,800
and if you add something small to
5477
04:02:23,120 --> 04:02:26,640
something big it's still going to be
5478
04:02:24,799 --> 04:02:29,198
something big down here you see that
5479
04:02:26,639 --> 04:02:31,760
result equals number 11 divided by
5480
04:02:29,199 --> 04:02:33,520
number 12 and these two are zeros so
5481
04:02:31,760 --> 04:02:35,520
we're going to end up with none and
5482
04:02:33,520 --> 04:02:37,120
that's what we're going to print in this
5483
04:02:37,120 --> 04:02:41,600
down to the bottom okay you should
5484
04:02:39,520 --> 04:02:44,000
really remember to put in the suffixes
5485
04:02:41,600 --> 04:02:46,880
when you are initializing your floating
5486
04:02:44,000 --> 04:02:49,040
point numbers otherwise the default is
5487
04:02:46,879 --> 04:02:51,599
going to be double this is what we mean
5488
04:02:49,040 --> 04:02:54,319
by this you see this floating number we
5489
04:02:51,600 --> 04:02:56,399
have a suffix that is f to mean that it
5490
04:02:54,318 --> 04:02:58,639
is a floating number if you don't put
5491
04:02:56,398 --> 04:03:00,879
that in this is going to be interpreted
5492
04:02:58,639 --> 04:03:03,278
as double and the compiler is going to
5493
04:03:00,879 --> 04:03:05,198
try and turn that into a float by
5494
04:03:03,279 --> 04:03:07,439
chopping off things that can't really
5495
04:03:05,199 --> 04:03:09,359
fit in a float so to really make it
5496
04:03:07,439 --> 04:03:12,238
clear that you are stirring in and
5497
04:03:09,359 --> 04:03:13,920
loading number please put this f suffix
5498
04:03:12,238 --> 04:03:16,879
here for double you don't need to put
5499
04:03:13,920 --> 04:03:19,520
anything because it is the default
5500
04:03:16,879 --> 04:03:22,159
assumed by the compiler but for a long
5501
04:03:19,520 --> 04:03:24,560
double you have to suffix this with l
5502
04:03:22,159 --> 04:03:26,318
just like this so that's what we really
5503
04:03:24,559 --> 04:03:29,119
mean here we have seen that the
5504
04:03:26,318 --> 04:03:31,600
precision for float isn't really enough
5505
04:03:29,120 --> 04:03:33,840
for many of the computations we might
5506
04:03:31,600 --> 04:03:36,479
want to do in our c plus plus
5507
04:03:33,840 --> 04:03:39,040
applications okay we have talked a lot
5508
04:03:36,478 --> 04:03:41,358
about floating point numbers let's head
5509
04:03:39,040 --> 04:03:44,319
to visual studio code and actually play
5510
04:03:41,359 --> 04:03:46,318
with them okay here we are in our folder
5511
04:03:44,318 --> 04:03:48,159
that is going to contain our project the
5512
04:03:46,318 --> 04:03:51,600
project is going to be called fractional
5513
04:03:48,159 --> 04:03:53,279
numbers so we're going to copy our files
5514
04:03:53,279 --> 04:03:58,159
and put those in and i'm going to go up
5515
04:03:55,760 --> 04:04:00,000
again and open this in visual studio
5516
04:03:58,159 --> 04:04:02,719
code we're going to close whatever it is
5517
04:04:00,000 --> 04:04:04,719
we have opened now we're going to close
5518
04:04:02,719 --> 04:04:07,278
folder and we're going to open our
5519
04:04:04,719 --> 04:04:09,198
project in visual studio code and we're
5520
04:04:07,279 --> 04:04:11,439
going to do the usual and remove things
5521
04:04:09,199 --> 04:04:14,159
we don't need in here the first thing we
5522
04:04:11,439 --> 04:04:16,639
want to do is to store a few floats in
5523
04:04:14,159 --> 04:04:18,879
our program we're going to declare and
5524
04:04:16,639 --> 04:04:20,959
initialize a few floating point numbers
5525
04:04:18,879 --> 04:04:23,679
we have number one number two and number
5526
04:04:20,959 --> 04:04:26,159
three and we want to make it clear that
5527
04:04:23,680 --> 04:04:28,479
the sizes are what we expect we are
5528
04:04:26,159 --> 04:04:31,119
going to open a terminal window here and
5529
04:04:28,478 --> 04:04:34,000
we're going to build with gcc run the
5530
04:04:31,120 --> 04:04:36,160
task to weld with gcc the world is going
5531
04:04:34,000 --> 04:04:37,920
to be successful we're going to come to
5532
04:04:36,159 --> 04:04:39,600
our terminal click a little bit and
5533
04:04:37,920 --> 04:04:42,238
we're going to type dir we're going to
5534
04:04:39,600 --> 04:04:44,479
see that a program is in place if we run
5535
04:04:42,238 --> 04:04:48,398
it we are going to see that size of
5536
04:04:44,478 --> 04:04:51,760
float is 4 size of double is eight and
5537
04:04:48,398 --> 04:04:54,159
size of long double is 16. this is what
5538
04:04:51,760 --> 04:04:57,040
we expected another thing we can do is
5539
04:04:54,159 --> 04:04:59,600
try and play with the precision of these
5540
04:04:57,040 --> 04:05:01,439
numbers and see what we can really go
5541
04:04:59,600 --> 04:05:04,079
away with okay so we're going to
5542
04:05:01,439 --> 04:05:06,238
actually put in a piece of code to play
5543
04:05:04,079 --> 04:05:09,279
with this we're going to add a setting
5544
04:05:06,238 --> 04:05:11,520
to our sddc out stream so that we can
5545
04:05:09,279 --> 04:05:14,000
control the precision but for this to
5546
04:05:11,520 --> 04:05:17,040
work we need to bring in a library that
5547
04:05:14,000 --> 04:05:20,398
is called i o manip so we're going to
5548
04:05:17,040 --> 04:05:22,640
include that i o manip and how do i know
5549
04:05:20,398 --> 04:05:25,599
this i usually consult the c plus plus
5550
04:05:22,639 --> 04:05:27,198
standard library documentation and you
5551
04:05:25,600 --> 04:05:29,600
are not at the point where you can
5552
04:05:27,199 --> 04:05:32,720
really understand it right now so we're
5553
04:05:29,600 --> 04:05:35,040
going to be putting in these things here
5554
04:05:32,719 --> 04:05:38,318
and explaining them as we go and i made
5555
04:05:35,040 --> 04:05:39,120
the type here it is io manip and you see
5556
04:05:39,120 --> 04:05:43,680
now this is recognized our program
5557
04:05:41,120 --> 04:05:45,520
should compile so we're going to try and
5558
04:05:43,680 --> 04:05:47,840
weld it so that we can try this out
5559
04:05:45,520 --> 04:05:49,920
we're going to build with gcc the world
5560
04:05:47,840 --> 04:05:52,478
is going to go through we can run our
5561
04:05:49,920 --> 04:05:55,040
program we're going to do dur and clear
5562
04:05:52,478 --> 04:05:57,840
and rooster to run you see that things
5563
04:05:55,040 --> 04:06:01,120
start to go off at sex and if we count
5564
04:05:57,840 --> 04:06:03,520
what we have here it is one two three
5565
04:06:01,120 --> 04:06:07,040
four five six seven we can only
5566
04:06:03,520 --> 04:06:09,120
represent seven numbers accurately with
5567
04:06:07,040 --> 04:06:11,120
a float and after that we're just going
5568
04:06:09,120 --> 04:06:13,199
to have garbage because the computer
5569
04:06:11,120 --> 04:06:15,120
can't really make sense of whatever we
5570
04:06:15,120 --> 04:06:19,199
seven digits that we can legally
5571
04:06:17,359 --> 04:06:21,359
represent with the flood so the
5572
04:06:19,199 --> 04:06:23,920
precision for our floating point number
5573
04:06:21,359 --> 04:06:26,479
here is seven i really hope this makes
5574
04:06:23,920 --> 04:06:29,279
sense let's check out number two
5575
04:06:26,478 --> 04:06:32,639
we are using double so precision should
5576
04:06:29,279 --> 04:06:35,279
be around something like 15. so we are
5577
04:06:32,639 --> 04:06:37,439
putting in a number one through nine and
5578
04:06:35,279 --> 04:06:40,479
we are starting over zero one two three
5579
04:06:37,439 --> 04:06:43,439
four five up to zero again if we look at
5580
04:06:40,478 --> 04:06:45,599
what we have in the output here we have
5581
04:06:43,439 --> 04:06:47,040
one two three four five six seven eight
5582
04:06:48,719 --> 04:06:54,879
four five six and here things start
5583
04:06:52,000 --> 04:06:59,760
falling off after our sixth year and if
5584
04:06:54,879 --> 04:07:07,039
we count we're going to have 1 2 3 4 5 6
5585
04:06:59,760 --> 04:07:09,120
7 8 9 10 11 12 13 14 15 16 17 digits
5586
04:07:07,040 --> 04:07:12,160
this is the precision we are having this
5587
04:07:09,120 --> 04:07:14,960
compiler for double 17 so it is
5588
04:07:12,159 --> 04:07:17,439
something around 15 and we should expect
5589
04:07:14,959 --> 04:07:20,318
to have something more than that or at
5590
04:07:17,439 --> 04:07:23,040
least the same thing as double with long
5591
04:07:20,318 --> 04:07:25,359
double so if we look at this you see
5592
04:07:23,040 --> 04:07:28,239
that it is one two three four five six
5593
04:07:25,359 --> 04:07:32,238
seven eight nine zero one two three four
5594
04:07:28,238 --> 04:07:36,000
five six seven eight nine we are able to
5595
04:07:32,238 --> 04:07:38,158
represent up to 20 and you can see that
5596
04:07:36,000 --> 04:07:41,680
long double leaves up to even the
5597
04:07:38,158 --> 04:07:44,238
precision of 20 that we have set with
5598
04:07:41,680 --> 04:07:46,479
std set precision here okay i really
5599
04:07:44,238 --> 04:07:48,639
hope now that you have an idea about
5600
04:07:46,478 --> 04:07:51,679
these precisions we have with our
5601
04:07:48,639 --> 04:07:54,559
floating point types in c plus plus
5602
04:07:51,680 --> 04:07:55,359
programs another thing i want you to see
5603
04:07:55,359 --> 04:08:01,199
what kind of narrowing errors we can get
5604
04:07:58,238 --> 04:08:03,439
if we try to initialize with something
5605
04:08:01,199 --> 04:08:05,760
that can't really be represented by a
5606
04:08:03,439 --> 04:08:08,318
floating point number and here we have a
5607
04:08:05,760 --> 04:08:10,158
float it is called number four and we
5608
04:08:08,318 --> 04:08:12,559
are trying to put in something that is
5609
04:08:10,158 --> 04:08:15,520
bigger than we can really fit in it has
5610
04:08:12,559 --> 04:08:18,799
more than seven digits so one two three
5611
04:08:15,520 --> 04:08:21,120
four five six seven eight nine it is
5612
04:08:18,799 --> 04:08:23,039
more than seven digits and we would
5613
04:08:21,120 --> 04:08:24,840
expect to have a problem with this
5614
04:08:24,840 --> 04:08:30,719
initialization let's try and build this
5615
04:08:27,920 --> 04:08:32,799
with gcc we're going to do that and this
5616
04:08:30,719 --> 04:08:35,760
is going to work successfully so this is
5617
04:08:32,799 --> 04:08:37,438
going to silently chop off our number if
5618
04:08:35,760 --> 04:08:40,960
we try to print it out we're going to
5619
04:08:37,439 --> 04:08:43,120
say sddc out number four and we're going
5620
04:08:40,959 --> 04:08:45,759
to world again run the test tube world
5621
04:08:43,120 --> 04:08:47,920
so that our changes are taken into
5622
04:08:45,760 --> 04:08:49,840
effect i'm going to do dur and do
5623
04:08:47,920 --> 04:08:52,000
rooster and this is going to print our
5624
04:08:49,840 --> 04:08:53,359
number you're going to see that after
5625
04:08:53,359 --> 04:08:57,760
we have junk our number has been
5626
04:08:55,199 --> 04:08:59,680
basically chopped off and this is junk
5627
04:08:57,760 --> 04:09:02,000
because we can't really represent this
5628
04:08:59,680 --> 04:09:03,760
with the double the 16 here has been
5629
04:09:02,000 --> 04:09:05,840
chopped off because we can't basically
5630
04:09:03,760 --> 04:09:08,000
represent this with the floating point
5631
04:09:05,840 --> 04:09:10,238
number if we change this to double this
5632
04:09:08,000 --> 04:09:13,279
is going to probably give us what we
5633
04:09:10,238 --> 04:09:15,198
expect so let's run again world with gcc
5634
04:09:13,279 --> 04:09:17,760
the world is going to be good if we run
5635
04:09:15,199 --> 04:09:19,840
the program it is going to show us the
5636
04:09:17,760 --> 04:09:22,079
same thing okay this is a really good
5637
04:09:19,840 --> 04:09:24,238
learning change why are we having the
5638
04:09:24,238 --> 04:09:29,920
before even if we changed the type to
5639
04:09:27,439 --> 04:09:34,000
double try to think about it the reason
5640
04:09:29,920 --> 04:09:36,238
is the suffix here is still saying f and
5641
04:09:34,000 --> 04:09:38,719
this is going to be stored as float in
5642
04:09:36,238 --> 04:09:41,198
memory so if we want this to really be
5643
04:09:38,719 --> 04:09:42,478
treated like a double we can take out
5644
04:09:42,478 --> 04:09:46,478
and if we build again and run the
5645
04:09:44,559 --> 04:09:49,519
application now you're going to see that
5646
04:09:46,478 --> 04:09:52,318
we see the 23 this is basically being
5647
04:09:49,520 --> 04:09:53,840
correctly stored as a double this is a
5648
04:09:52,318 --> 04:09:56,799
really good thing you should keep in
5649
04:09:53,840 --> 04:09:58,398
mind if you don't put in your suffixes
5650
04:09:56,799 --> 04:10:00,559
here the number is going to be
5651
04:10:00,559 --> 04:10:06,398
by now i hope you see that if you really
5652
04:10:03,439 --> 04:10:07,920
try to put more than your floating point
5653
04:10:07,920 --> 04:10:12,398
the number is going to be chopped off
5654
04:10:09,920 --> 04:10:14,639
and only the precision that it can
5655
04:10:12,398 --> 04:10:16,959
handle is going to be stored in i hope
5656
04:10:14,639 --> 04:10:19,278
this makes sense and you see that the
5657
04:10:16,959 --> 04:10:22,079
behavior for numbers is really different
5658
04:10:19,279 --> 04:10:24,720
we got the compiler error when we try to
5659
04:10:22,079 --> 04:10:27,199
do narrowing conversion with integers
5660
04:10:24,719 --> 04:10:29,679
but now it is silently chopping off our
5661
04:10:27,199 --> 04:10:31,520
number if we try and use functional
5662
04:10:29,680 --> 04:10:34,559
notation i think we're going to get the
5663
04:10:31,520 --> 04:10:37,520
same result and change this back to a
5664
04:10:34,559 --> 04:10:40,639
float and uh use float here and if we
5665
04:10:37,520 --> 04:10:43,920
both again let's go to terminal run task
5666
04:10:40,639 --> 04:10:46,238
use gcc we're going to run this
5667
04:10:43,920 --> 04:10:49,279
let's run rooster and you see that we
5668
04:10:46,238 --> 04:10:52,079
get the same results our 23 is chopped
5669
04:10:49,279 --> 04:10:54,079
off here we can also use the assignment
5670
04:10:52,079 --> 04:10:57,199
notation here just like we did with
5671
04:10:54,079 --> 04:10:59,039
integers and this is going to do exactly
5672
04:10:57,199 --> 04:11:01,520
the same thing it is going to chop off
5673
04:10:59,040 --> 04:11:04,479
the 23 here and we're going to have some
5674
04:11:01,520 --> 04:11:06,319
garbage which is 16 in this case if we
5675
04:11:04,478 --> 04:11:08,799
weld the gun the world is going to go
5676
04:11:06,318 --> 04:11:10,879
through and if we run we're going to see
5677
04:11:08,799 --> 04:11:12,879
as it's in here okay narrowing
5678
04:11:10,879 --> 04:11:15,438
conversions are something you should be
5679
04:11:12,879 --> 04:11:17,278
aware of when storing your floating
5680
04:11:15,439 --> 04:11:19,680
point numbers and you should really
5681
04:11:17,279 --> 04:11:21,920
remember to put in your suffixes here
5682
04:11:19,680 --> 04:11:24,158
and other thing we have seen that we
5683
04:11:21,920 --> 04:11:25,439
should really play with is scientific
5684
04:11:25,439 --> 04:11:31,199
as the comment here says what we have
5685
04:11:27,359 --> 04:11:33,920
seen so far in floating point numbers is
5686
04:11:31,199 --> 04:11:37,040
fixed notation it is what we have here
5687
04:11:33,920 --> 04:11:39,199
but we can also use scientific notation
5688
04:11:37,040 --> 04:11:41,680
which is exactly what we described in
5689
04:11:39,199 --> 04:11:45,600
the slides and what we have here for
5690
04:11:41,680 --> 04:11:48,398
example is e8 and it means that we are
5691
04:11:45,600 --> 04:11:51,279
going to multiply this number here
5692
04:11:48,398 --> 04:11:53,680
with 10 to the power of 8. if you go
5693
04:11:51,279 --> 04:11:56,479
down here we have number 9 so we have
5694
04:11:56,478 --> 04:12:02,879
and we have e minus 11 and what this is
5695
04:12:00,000 --> 04:12:05,840
going to do is multiply with 10 to the
5696
04:12:02,879 --> 04:12:08,079
power of minus 11. this is how i can
5697
04:12:05,840 --> 04:12:10,000
represent this here and we can print
5698
04:12:08,079 --> 04:12:12,238
these numbers out to really play with
5699
04:12:10,000 --> 04:12:14,559
them to make a difference with what we
5700
04:12:12,238 --> 04:12:18,318
have been doing before we're going to do
5701
04:12:14,559 --> 04:12:20,158
sddc out and put a dividing line here
5702
04:12:18,318 --> 04:12:22,559
this is one way we can do this so we're
5703
04:12:22,559 --> 04:12:27,519
we're going to weld this so we're going
5704
04:12:24,398 --> 04:12:29,599
to run the attached world with gcc 10
5705
04:12:27,520 --> 04:12:32,158
the world is going to go through if we
5706
04:12:29,600 --> 04:12:35,120
do rooster we're going to see that our
5707
04:12:32,158 --> 04:12:39,279
number here number five is what we
5708
04:12:35,120 --> 04:12:42,399
expect number six is the same thing but
5709
04:12:39,279 --> 04:12:44,079
we used scientific notation to do this
5710
04:12:42,398 --> 04:12:46,879
because we took this number and
5711
04:12:44,079 --> 04:12:48,799
multiplied by 10 to the power of eight
5712
04:12:46,879 --> 04:12:51,839
number seven should be almost the same
5713
04:12:48,799 --> 04:12:54,079
thing but the lower 23 here is going to
5714
04:12:51,840 --> 04:12:56,238
be chopped off because we haven't
5715
04:12:54,079 --> 04:12:58,559
specified it we're just multiplying with
5716
04:12:56,238 --> 04:13:01,920
10 to the power of 8 so that's why we
5717
04:12:58,559 --> 04:13:04,158
have 0 0 here i hope that makes sense
5718
04:13:01,920 --> 04:13:06,158
and if you look at number 8 you see that
5719
04:13:04,158 --> 04:13:08,559
we stored it like this without using
5720
04:13:06,158 --> 04:13:11,119
scientific notation we used fixed
5721
04:13:08,559 --> 04:13:13,920
notation but on the terminal it's going
5722
04:13:11,120 --> 04:13:15,920
to be printed out in scientific notation
5723
04:13:13,920 --> 04:13:19,520
and this may be pretty cool the main
5724
04:13:15,920 --> 04:13:22,478
usage for scientific notation is to make
5725
04:13:19,520 --> 04:13:24,238
sense of numbers that are really huge so
5726
04:13:22,478 --> 04:13:25,358
the way you interpret this you're going
5727
04:13:25,359 --> 04:13:30,238
move these numbers after the decimal
5728
04:13:27,840 --> 04:13:32,000
points with 0 in front and it's
5729
04:13:30,238 --> 04:13:33,920
basically going to be like this so if
5730
04:13:32,000 --> 04:13:36,398
you count the zeros you have here we're
5731
04:13:36,398 --> 04:13:44,318
3 4 5 6 7 8 9 10 and 11 is going to be
5732
04:13:42,238 --> 04:13:46,559
directly after three and you're going to
5733
04:13:44,318 --> 04:13:49,760
get the number here this is what we mean
5734
04:13:46,559 --> 04:13:52,079
and number nine was explicitly stored in
5735
04:13:49,760 --> 04:13:54,079
using scientific notation and you see
5736
04:13:52,079 --> 04:13:56,238
that we have the same thing you can play
5737
04:13:54,079 --> 04:13:59,520
with these things and really make sense
5738
04:13:56,238 --> 04:14:01,680
of them and again we didn't specify any
5739
04:13:59,520 --> 04:14:04,319
suffix here so these are going to be
5740
04:14:01,680 --> 04:14:06,639
interpreted as doubles but this is not a
5741
04:14:04,318 --> 04:14:08,639
problem because they are doubles here
5742
04:14:06,639 --> 04:14:11,119
okay we are making some progress with
5743
04:14:08,639 --> 04:14:13,039
this lecture which is a little lengthy
5744
04:14:11,120 --> 04:14:15,359
the last thing we want to do is to play
5745
04:14:15,359 --> 04:14:18,960
we're going to put a message here to say
5746
04:14:17,040 --> 04:14:20,479
what we want to do and we're going to
5747
04:14:18,959 --> 04:14:22,318
have number 10 which is going to be
5748
04:14:20,478 --> 04:14:24,799
positive we're going to have number 11
5749
04:14:22,318 --> 04:14:26,559
which is going to be zero number 12 is
5750
04:14:26,559 --> 04:14:32,238
if we take 10 and divide that with 11
5751
04:14:30,000 --> 04:14:35,359
we're going to get infinity because we
5752
04:14:32,238 --> 04:14:37,039
are dividing a floating number with zero
5753
04:14:35,359 --> 04:14:38,559
if we try to print that out we're going
5754
04:14:38,559 --> 04:14:42,478
and we're going to get infinity for this
5755
04:14:40,398 --> 04:14:44,879
result here because we are trying to add
5756
04:14:42,478 --> 04:14:47,198
something small to infinity which is
5757
04:14:44,879 --> 04:14:49,278
something really big and if we all
5758
04:14:47,199 --> 04:14:50,479
trying to divide zero with zero in
5759
04:14:50,478 --> 04:14:54,079
we're going to get what is called
5760
04:14:52,079 --> 04:14:55,920
naughty number and if we print that out
5761
04:14:54,079 --> 04:14:59,920
we're going to see this in a minute
5762
04:14:55,920 --> 04:15:02,318
let's build this with gcc we're going to
5763
04:14:59,920 --> 04:15:05,439
weld successfully let's clear this out
5764
04:15:02,318 --> 04:15:07,600
so that we don't have noise in here and
5765
04:15:05,439 --> 04:15:11,199
we're going to run rooster and you see
5766
04:15:07,600 --> 04:15:12,720
here it says infinity and none which is
5767
04:15:12,719 --> 04:15:17,920
and if we go down here it is saying
5768
04:15:14,719 --> 04:15:20,719
number 10 divided by number 11 and
5769
04:15:17,920 --> 04:15:23,760
number 11 is zero you see that here it's
5770
04:15:20,719 --> 04:15:26,639
going to yield infinity if we add five
5771
04:15:23,760 --> 04:15:29,120
to infinity we're going to get infinity
5772
04:15:26,639 --> 04:15:31,599
and if we try to divide a zero by a zero
5773
04:15:29,120 --> 04:15:33,199
we're going to get none which is really
5774
04:15:31,600 --> 04:15:34,960
a way to tell you that you're doing
5775
04:15:33,199 --> 04:15:35,920
something wrong you should really be
5776
04:15:35,920 --> 04:15:40,318
one other thing i want you to see is
5777
04:15:37,600 --> 04:15:42,640
that if you turn this five into a minus
5778
04:15:40,318 --> 04:15:45,278
five and build again we're going to
5779
04:15:42,639 --> 04:15:46,959
build with gcc and we're going to run
5780
04:15:46,959 --> 04:15:52,238
we're going to get minus infinity so if
5781
04:15:49,520 --> 04:15:54,319
you divide a positive number with zero
5782
04:15:52,238 --> 04:15:56,478
you're going to get positive infinity
5783
04:15:54,318 --> 04:15:58,318
and if you divide a negative number with
5784
04:15:56,478 --> 04:16:00,799
infinity you're going to get negative
5785
04:15:58,318 --> 04:16:02,398
infinity and this is what we see here
5786
04:16:00,799 --> 04:16:03,920
this is really all we set out to do in
5787
04:16:02,398 --> 04:16:06,398
this lecture i hope you found it
5788
04:16:03,920 --> 04:16:08,478
interesting and again the big message is
5789
04:16:06,398 --> 04:16:11,439
that any data type you're going to be
5790
04:16:08,478 --> 04:16:13,920
handling in your c plus plus program is
5791
04:16:11,439 --> 04:16:16,000
going to ultimately be stored as ones
5792
04:16:13,920 --> 04:16:17,920
and zeros in memory and we have learned
5793
04:16:16,000 --> 04:16:20,079
about floating point numbers float
5794
04:16:17,920 --> 04:16:22,079
double and long and they have these
5795
04:16:20,079 --> 04:16:24,478
properties you see here and you should
5796
04:16:22,079 --> 04:16:26,318
use them with this in mind otherwise
5797
04:16:24,478 --> 04:16:28,559
you're going to have problems with your
5798
04:16:26,318 --> 04:16:30,639
precision make sure you are using the
5799
04:16:28,559 --> 04:16:32,639
correct precision that you need in your
5800
04:16:30,639 --> 04:16:34,559
program we are going to stop here in
5801
04:16:32,639 --> 04:16:37,519
this lecture the next one we're going to
5802
04:16:34,559 --> 04:16:40,158
try and learn about booleans go ahead
5803
04:16:37,520 --> 04:16:41,840
and finish up here and meet me there in
5804
04:16:40,158 --> 04:16:44,879
this lecture we're going to learn about
5805
04:16:41,840 --> 04:16:47,600
booleans booleans are types that can
5806
04:16:44,879 --> 04:16:51,039
store two states in c plus plots it can
5807
04:16:47,600 --> 04:16:53,359
store either true or false and we can
5808
04:16:51,040 --> 04:16:55,279
use this to really do decisions in our
5809
04:16:53,359 --> 04:16:57,680
program if you look in the program we
5810
04:16:55,279 --> 04:16:59,840
have here we have two variables declared
5811
04:16:59,840 --> 04:17:03,760
and one is called red light the other is
5812
04:17:03,760 --> 04:17:09,120
and we have true and false inside one
5813
04:17:06,719 --> 04:17:12,238
thing we can do in c plus plus is make
5814
04:17:09,120 --> 04:17:13,439
decisions we can say if the red light is
5815
04:17:13,439 --> 04:17:19,199
print a message that says stop and if
5816
04:17:16,318 --> 04:17:21,600
it's not red we can print a message that
5817
04:17:19,199 --> 04:17:24,079
says go through we can do that and
5818
04:17:21,600 --> 04:17:26,399
booleans are really used in this way to
5819
04:17:24,079 --> 04:17:29,039
make decisions in your c plus plus
5820
04:17:26,398 --> 04:17:31,760
program we haven't really learned about
5821
04:17:29,040 --> 04:17:33,920
if statements in this course but i am
5822
04:17:31,760 --> 04:17:36,079
throwing this in here to really drive
5823
04:17:33,920 --> 04:17:38,639
the point home that we can use this to
5824
04:17:36,079 --> 04:17:40,639
make decisions in our program down here
5825
04:17:38,639 --> 04:17:42,879
we have another way we can do this we
5826
04:17:40,639 --> 04:17:46,238
can actually use the variable itself
5827
04:17:42,879 --> 04:17:48,478
without checking if it is equal to true
5828
04:17:46,238 --> 04:17:50,959
or false and we are going to get the
5829
04:17:48,478 --> 04:17:53,039
same message the point here is that if
5830
04:17:50,959 --> 04:17:55,358
green light is true we're going to say
5831
04:17:53,040 --> 04:17:57,279
the light is green if it's not we're
5832
04:17:55,359 --> 04:17:59,600
going to say the light is not green you
5833
04:17:57,279 --> 04:18:02,079
can do something like this and again the
5834
04:17:59,600 --> 04:18:05,199
big point here is that booleans data
5835
04:18:02,079 --> 04:18:07,760
types are used to store two states true
5836
04:18:05,199 --> 04:18:11,120
or false in your c plus plus program
5837
04:18:07,760 --> 04:18:13,520
okay by default if you print a boolean
5838
04:18:11,120 --> 04:18:15,680
that has two in it you're going to get
5839
04:18:13,520 --> 04:18:18,640
true and this is what you see here and
5840
04:18:15,680 --> 04:18:20,800
if you print one that has zero in it
5841
04:18:18,639 --> 04:18:22,719
you're going to get false we can change
5842
04:18:20,799 --> 04:18:25,840
that with a special setting that we can
5843
04:18:22,719 --> 04:18:28,719
apply to our std out stream and you do
5844
04:18:25,840 --> 04:18:29,840
that like this with std bull alpha and
5845
04:18:28,719 --> 04:18:31,278
we're going to play with this in a
5846
04:18:31,279 --> 04:18:35,920
if we try to print with this setting
5847
04:18:33,359 --> 04:18:38,880
applied we're going to see true on false
5848
04:18:35,920 --> 04:18:40,079
and not c 0 and 1 like we did before
5849
04:18:38,879 --> 04:18:42,158
we're going to play with this in a
5850
04:18:40,079 --> 04:18:44,318
minute and you're going to see another
5851
04:18:42,158 --> 04:18:45,680
thing you should know is that booleans
5852
04:18:45,680 --> 04:18:50,800
8 bits in memory they take up an entire
5853
04:18:48,719 --> 04:18:53,519
bite so you may think that this is
5854
04:18:50,799 --> 04:18:55,840
wasteful and it is but with the amount
5855
04:18:53,520 --> 04:18:58,479
of memory that we have today this is
5856
04:18:55,840 --> 04:19:00,960
really not a big problem but if you are
5857
04:18:58,478 --> 04:19:03,119
working on a device where memory is
5858
04:19:00,959 --> 04:19:05,438
really a problem there are techniques
5859
04:19:03,120 --> 04:19:07,600
you can use to pack even more data in a
5860
04:19:05,439 --> 04:19:10,079
byte and we're going to learn about that
5861
04:19:07,600 --> 04:19:12,880
later in the course okay so this is
5862
04:19:10,079 --> 04:19:14,959
really all i have to say about booleans
5863
04:19:12,879 --> 04:19:17,679
we're going to go to visual studio code
5864
04:19:14,959 --> 04:19:20,639
and play with them in code okay here i
5865
04:19:17,680 --> 04:19:22,559
am in the folder for my project here i
5866
04:19:20,639 --> 04:19:23,760
am going to do the usual and copy the
5867
04:19:23,760 --> 04:19:28,800
and i am going to go in my project on
5868
04:19:26,000 --> 04:19:31,040
booleans i am going to go up and open
5869
04:19:28,799 --> 04:19:33,519
this up in visual studio code i am going
5870
04:19:31,040 --> 04:19:35,920
to close the current folder open the new
5871
04:19:33,520 --> 04:19:38,319
one and browse to my project this is
5872
04:19:35,920 --> 04:19:40,238
going to open up in visual studio code
5873
04:19:38,318 --> 04:19:42,559
and i am going to close the welcome
5874
04:19:40,238 --> 04:19:45,279
screen here i don't need it anymore
5875
04:19:42,559 --> 04:19:48,000
so i'm going to remove what i don't need
5876
04:19:45,279 --> 04:19:50,720
and we are going to play with the exact
5877
04:19:48,000 --> 04:19:52,879
code that we had in the slides we're
5878
04:19:50,719 --> 04:19:54,879
going to declare two variables one is
5879
04:19:52,879 --> 04:19:56,799
going to be red light the other is going
5880
04:19:54,879 --> 04:19:59,198
to be green light they are going to be
5881
04:19:56,799 --> 04:20:02,158
booleans and in red light we're going to
5882
04:19:59,199 --> 04:20:04,239
store a true and story false in green
5883
04:20:02,158 --> 04:20:06,719
light and we can make a decision like
5884
04:20:04,238 --> 04:20:09,600
this so try to guess what we're going to
5885
04:20:06,719 --> 04:20:12,639
plant in this program we're going to try
5886
04:20:09,600 --> 04:20:14,800
and decide and say if the red light is
5887
04:20:12,639 --> 04:20:16,799
true we're going to print stop
5888
04:20:14,799 --> 04:20:19,119
if it's not true we're going to fall in
5889
04:20:19,120 --> 04:20:25,520
go through if we look at our program in
5890
04:20:22,318 --> 04:20:27,760
red light we have a true so this should
5891
04:20:25,520 --> 04:20:30,319
really win and we should get in this
5892
04:20:27,760 --> 04:20:32,478
block here i hope this makes sense so
5893
04:20:30,318 --> 04:20:34,799
let's try and build this program to see
5894
04:20:32,478 --> 04:20:36,959
that it actually works so we're going to
5895
04:20:34,799 --> 04:20:39,599
build with the gcc we're going to run
5896
04:20:36,959 --> 04:20:41,759
our program and our terminal just went
5897
04:20:39,600 --> 04:20:43,120
away we're going to create a new one no
5898
04:20:43,120 --> 04:20:48,560
and uh if we do dir we're going to see
5899
04:20:48,559 --> 04:20:54,799
we run it it's going to say stop okay so
5900
04:20:51,600 --> 04:20:56,640
in red light we have true the test is
5901
04:20:54,799 --> 04:20:59,198
going to succeed here and we're going to
5902
04:20:56,639 --> 04:21:01,519
fall in this block and say stop i hope
5903
04:20:59,199 --> 04:21:03,120
this makes sense you can try to store a
5904
04:21:03,120 --> 04:21:09,439
and both again going to world with gcc
5905
04:21:06,799 --> 04:21:12,158
if we run this program now it's going to
5906
04:21:09,439 --> 04:21:14,398
say go through because red light is not
5907
04:21:12,158 --> 04:21:16,879
true anymore this is really what we mean
5908
04:21:14,398 --> 04:21:19,840
when we say that we can make decisions
5909
04:21:16,879 --> 04:21:22,879
based on booleans in our c plus plus
5910
04:21:19,840 --> 04:21:26,000
code we can also try another example
5911
04:21:22,879 --> 04:21:26,879
we're going to say if green light is
5912
04:21:26,879 --> 04:21:30,559
we're going to say the light is green if
5913
04:21:28,879 --> 04:21:32,398
it's not we're going to say the light is
5914
04:21:30,559 --> 04:21:35,680
not green and this is another form we
5915
04:21:32,398 --> 04:21:36,559
can use instead of typing the entire
5916
04:21:36,559 --> 04:21:40,799
comparing red light to true here and
5917
04:21:39,359 --> 04:21:43,040
again we're going to learn about all
5918
04:21:43,040 --> 04:21:48,000
it is just because i thought that
5919
04:21:45,760 --> 04:21:50,559
talking about bulls without showing
5920
04:21:48,000 --> 04:21:53,439
tests like this is really not going to
5921
04:21:50,559 --> 04:21:55,519
drive the point home for you so try to
5922
04:21:53,439 --> 04:21:57,920
understand this as simple tests you can
5923
04:21:55,520 --> 04:21:59,920
do in math if one value is true i am
5924
04:21:57,920 --> 04:22:01,840
going to do something if it's not true
5925
04:21:59,920 --> 04:22:04,000
i'm going to do something else this is
5926
04:22:01,840 --> 04:22:06,158
what we are doing here okay this program
5927
04:22:04,000 --> 04:22:08,559
here is going to check if the green
5928
04:22:06,158 --> 04:22:11,119
light is true so we're going to look
5929
04:22:08,559 --> 04:22:14,158
here green light is not true so we
5930
04:22:11,120 --> 04:22:16,319
should fall here and print this message
5931
04:22:14,158 --> 04:22:18,559
that the light is not green
5932
04:22:16,318 --> 04:22:20,719
let's build the program the world is
5933
04:22:18,559 --> 04:22:21,519
going to go through we're going to run
5934
04:22:21,520 --> 04:22:25,760
and you're going to see go through and
5935
04:22:23,520 --> 04:22:27,359
the light is not green this is what we
5936
04:22:25,760 --> 04:22:30,318
have here another thing we can actually
5937
04:22:27,359 --> 04:22:33,439
try to see is the amount of memory that
5938
04:22:30,318 --> 04:22:36,238
a boolean takes up so we can use sizeof
5939
04:22:33,439 --> 04:22:39,040
to do that we have seen this before if
5940
04:22:36,238 --> 04:22:39,920
we build with gcc we're going to go
5941
04:22:39,920 --> 04:22:43,840
and we can run our program to actually
5942
04:22:42,000 --> 04:22:46,318
this message and you're going to see
5943
04:22:43,840 --> 04:22:48,639
that bull is actually going to take up
5944
04:22:46,318 --> 04:22:50,959
one byte in memory this is what we saw
5945
04:22:48,639 --> 04:22:53,760
in the slides another thing that can be
5946
04:22:50,959 --> 04:22:56,639
really confusing is printing out boolean
5947
04:22:53,760 --> 04:22:59,439
values for example here we are trying to
5948
04:22:56,639 --> 04:23:01,278
print great light and green light let's
5949
04:22:59,439 --> 04:23:04,398
go up and actually change them a little
5950
04:23:01,279 --> 04:23:06,079
bit for example take green light here
5951
04:23:06,079 --> 04:23:11,359
and we're going to go down again and
5952
04:23:08,559 --> 04:23:13,680
here we are trying to print them out red
5953
04:23:11,359 --> 04:23:15,920
light is going to print whatever value
5954
04:23:13,680 --> 04:23:17,520
we have stored then and green light is
5955
04:23:15,920 --> 04:23:19,920
going to store whatever value we have
5956
04:23:17,520 --> 04:23:21,760
stored in and again true is going to be
5957
04:23:21,760 --> 04:23:26,639
and false is going to be printed out as
5958
04:23:24,079 --> 04:23:29,840
a zero let's try and build this we're
5959
04:23:26,639 --> 04:23:31,599
going to build with our gcc compiler the
5960
04:23:29,840 --> 04:23:33,680
world is going to be good we're going to
5961
04:23:31,600 --> 04:23:36,640
run this and you're going to see that
5962
04:23:33,680 --> 04:23:38,318
red light is zero because we have a full
5963
04:23:38,318 --> 04:23:44,719
and green light is going to be one
5964
04:23:41,040 --> 04:23:47,199
because we haven't a true here if you
5965
04:23:44,719 --> 04:23:48,959
try to print out boolean variables
5966
04:23:47,199 --> 04:23:51,600
you're going to get one and zero by
5967
04:23:48,959 --> 04:23:53,438
default if you really want to see true
5968
04:23:51,600 --> 04:23:56,399
and false there is a special setting you
5969
04:23:53,439 --> 04:24:01,040
can apply to htdc out and you do that by
5970
04:24:01,040 --> 04:24:06,479
alpha and you do it like this
5971
04:24:03,600 --> 04:24:08,479
and if you try to print again we are
5972
04:24:06,478 --> 04:24:10,799
going to get true and false right now
5973
04:24:08,478 --> 04:24:13,840
okay let's try and print again and we're
5974
04:24:10,799 --> 04:24:15,278
going to work this with gcc and we're
5975
04:24:15,279 --> 04:24:20,399
and now you see that we see red light is
5976
04:24:20,398 --> 04:24:25,760
this is really all i had to share about
5977
04:24:22,639 --> 04:24:28,398
booleans in this lecture i really hope
5978
04:24:25,760 --> 04:24:30,880
it drives the point home that booleans
5979
04:24:28,398 --> 04:24:32,639
are mostly used in making decisions in
5980
04:24:30,879 --> 04:24:35,358
your program and that's what you're
5981
04:24:32,639 --> 04:24:37,519
going to be mostly using them for and
5982
04:24:35,359 --> 04:24:40,479
another thing is that they take up one
5983
04:24:37,520 --> 04:24:42,319
bite in your memory we are going to stop
5984
04:24:40,478 --> 04:24:44,879
here in this lecture the next one we're
5985
04:24:42,318 --> 04:24:46,318
going to try and learn about characters
5986
04:24:46,318 --> 04:24:50,478
go ahead and finish up here and meet me
5987
04:24:48,719 --> 04:24:53,278
there in this lecture we're going to
5988
04:24:50,478 --> 04:24:56,079
learn about characters and text and we
5989
04:24:53,279 --> 04:24:58,479
use a data type called car in c plus
5990
04:24:56,079 --> 04:25:00,238
plus to represent characters and this is
5991
04:24:58,478 --> 04:25:02,959
basically how you use it you store in
5992
04:25:00,238 --> 04:25:05,198
characters like abc and here you see
5993
04:25:05,199 --> 04:25:10,560
o w and you put your characters in
5994
04:25:08,318 --> 04:25:12,559
single quotes like this to mean that
5995
04:25:10,559 --> 04:25:14,238
they are characters if you don't do that
5996
04:25:12,559 --> 04:25:16,799
you're going to get a compiler error
5997
04:25:14,238 --> 04:25:19,760
after you have your characters declared
5998
04:25:16,799 --> 04:25:22,559
and defined like this you can print them
5999
04:25:19,760 --> 04:25:26,398
out with stdc out and we're going to see
6000
04:25:22,559 --> 04:25:28,478
them on the terminal car occupies one
6001
04:25:26,398 --> 04:25:31,278
byte in memory so it's going to take up
6002
04:25:28,478 --> 04:25:35,760
eight bits okay so one thing we can do
6003
04:25:31,279 --> 04:25:38,319
is map each value in these 256 possible
6004
04:25:35,760 --> 04:25:40,158
values to a character and we can do
6005
04:25:38,318 --> 04:25:41,519
something like this for example we can
6006
04:25:41,520 --> 04:25:47,840
33 represents the exclamation mark
6007
04:25:44,799 --> 04:25:50,559
48 represents the character 0 49
6008
04:25:47,840 --> 04:25:53,600
represents the character 1 50 represents
6009
04:25:50,559 --> 04:25:56,719
the character 2 and we can keep going up
6010
04:25:53,600 --> 04:25:58,318
and say for example 70 represents f 71
6011
04:25:59,000 --> 04:26:05,158
112 represents p you can really use a
6012
04:26:02,398 --> 04:26:07,840
mapping like this and come up with
6013
04:26:05,158 --> 04:26:10,000
representations of your characters in
6014
04:26:07,840 --> 04:26:12,559
memory and this is what we do you can
6015
04:26:10,000 --> 04:26:15,120
learn about this encoding and on the
6016
04:26:12,559 --> 04:26:18,719
link here this is a real thing and it is
6017
04:26:15,120 --> 04:26:21,600
called the ascii encoding that takes
6018
04:26:18,719 --> 04:26:23,519
characters and stores them in one byte
6019
04:26:21,600 --> 04:26:26,640
and the data type to store these
6020
04:26:23,520 --> 04:26:28,720
characters in c plus plus is car if this
6021
04:26:26,639 --> 04:26:30,559
doesn't make sense please bear with me
6022
04:26:28,719 --> 04:26:32,799
we're going to play with this in visual
6023
04:26:30,559 --> 04:26:35,278
studio code and it is most probably
6024
04:26:32,799 --> 04:26:38,959
going to make sense okay it is possible
6025
04:26:35,279 --> 04:26:41,680
to assign a valid ascii code to
6026
04:26:38,959 --> 04:26:44,000
a car variable and the corresponding
6027
04:26:41,680 --> 04:26:46,559
character will be stored in that piece
6028
04:26:44,000 --> 04:26:48,478
of memory so once you have that you can
6029
04:26:46,559 --> 04:26:51,119
choose to interpret that either as a
6030
04:26:48,478 --> 04:26:53,039
character or as a number that is
6031
04:26:51,120 --> 04:26:55,680
something like an integer this is what
6032
04:26:53,040 --> 04:26:59,199
we really mean if we declare a variable
6033
04:26:55,680 --> 04:27:02,238
called value which is of car type 65 is
6034
04:26:59,199 --> 04:27:04,800
going to be stored in memory but the c
6035
04:27:02,238 --> 04:27:07,840
plus plus program is going to interpret
6036
04:27:04,799 --> 04:27:10,879
this as a character if we go back to our
6037
04:27:07,840 --> 04:27:12,238
table and see what is represented by 65
6038
04:27:10,879 --> 04:27:15,839
this is what we're going to find we're
6039
04:27:12,238 --> 04:27:18,079
going to find that 65 represents a
6040
04:27:15,840 --> 04:27:20,158
and if we print this out by default it's
6041
04:27:18,079 --> 04:27:22,799
going to print a it's not going to print
6042
04:27:20,158 --> 04:27:26,000
65 but there is a way you can take this
6043
04:27:22,799 --> 04:27:28,879
character value and turn that into an
6044
04:27:26,000 --> 04:27:32,000
integer and print it out and you see
6045
04:27:28,879 --> 04:27:34,158
that here we are saying value and and we
6046
04:27:34,158 --> 04:27:38,959
and and in the parents we have a value
6047
04:27:36,879 --> 04:27:42,318
this is basically a way to say we wanted
6048
04:27:38,959 --> 04:27:44,079
to take the value and interpret that as
6049
04:27:42,318 --> 04:27:46,398
an integer and we're going to learn a
6050
04:27:44,079 --> 04:27:48,799
little more about static cast later in
6051
04:27:46,398 --> 04:27:51,198
the course but it is basically a way to
6052
04:27:48,799 --> 04:27:54,000
transform between data types and in this
6053
04:27:51,199 --> 04:27:56,399
case we are trying to transform from car
6054
04:27:54,000 --> 04:27:59,120
to end and we're going to print this out
6055
04:27:56,398 --> 04:28:01,680
okay what we just described is the ascii
6056
04:27:59,120 --> 04:28:05,279
encoding a technique by which we can map
6057
04:28:05,279 --> 04:28:10,000
a byte two characters and use that to
6058
04:28:08,000 --> 04:28:13,040
represent characters this technique
6059
04:28:10,000 --> 04:28:15,680
doesn't work well if you have languages
6060
04:28:13,040 --> 04:28:18,319
like arabic japanese and chinese because
6061
04:28:15,680 --> 04:28:19,680
they are completely different beasts
6062
04:28:18,318 --> 04:28:21,920
there are better ways to represent
6063
04:28:19,680 --> 04:28:24,800
characters in your c plus program and
6064
04:28:21,920 --> 04:28:27,120
that's usually unicode but that's really
6065
04:28:24,799 --> 04:28:29,198
out of scope for a course like this so
6066
04:28:27,120 --> 04:28:30,880
i'm not going to describe that anymore
6067
04:28:29,199 --> 04:28:32,800
okay this is really all we need to learn
6068
04:28:30,879 --> 04:28:35,198
about characters we're going to head to
6069
04:28:32,799 --> 04:28:38,559
visual studio code and play with them
6070
04:28:35,199 --> 04:28:40,640
okay here i am in my working folder i am
6071
04:28:38,559 --> 04:28:43,119
going to go in my template project i am
6072
04:28:40,639 --> 04:28:45,760
going to copy things over i am going to
6073
04:28:43,120 --> 04:28:48,560
put that in my characters and text
6074
04:28:45,760 --> 04:28:50,238
project and i am going to go up and open
6075
04:28:48,559 --> 04:28:52,079
this up in visual studio code we're
6076
04:28:50,238 --> 04:28:54,639
going to close the welcome screen here
6077
04:28:52,079 --> 04:28:57,279
we're going to open up main cpp and
6078
04:28:54,639 --> 04:28:59,599
we're going to put in the code to play
6079
04:28:59,600 --> 04:29:05,120
the first thing we can do is declare
6080
04:29:02,000 --> 04:29:08,158
characters like this we can put in a r
6081
04:29:05,120 --> 04:29:10,800
r o w here and we're going to see this
6082
04:29:08,158 --> 04:29:12,959
printed out if we run this program we
6083
04:29:10,799 --> 04:29:14,559
are going to put in some code to play
6084
04:29:14,559 --> 04:29:19,760
we have a few variables declared that
6085
04:29:19,760 --> 04:29:24,000
we go from character 1 through character
6086
04:29:22,079 --> 04:29:25,840
5 and these are the characters we are
6087
04:29:24,000 --> 04:29:27,760
storing and this is and this is the
6088
04:29:25,840 --> 04:29:30,398
format you're really going to use to
6089
04:29:27,760 --> 04:29:33,199
declare your characters after we have
6090
04:29:30,398 --> 04:29:36,238
them declared we can print them out like
6091
04:29:33,199 --> 04:29:38,239
we print any other variable and we can
6092
04:29:36,238 --> 04:29:40,398
try and compile this program and see
6093
04:29:38,238 --> 04:29:42,559
what we're going to get but before we do
6094
04:29:40,398 --> 04:29:44,959
that i would invite you to try and guess
6095
04:29:44,959 --> 04:29:50,398
and we're going to build with our gcc
6096
04:29:48,238 --> 04:29:52,639
task we're going to world the build is
6097
04:29:50,398 --> 04:29:54,719
going to go through and if we run
6098
04:29:52,639 --> 04:29:56,158
rooster we're going to see that we are
6099
04:29:56,158 --> 04:30:02,959
a r o w we are storing our characters
6100
04:30:00,238 --> 04:30:04,639
and and we are able to print them out
6101
04:30:02,959 --> 04:30:06,879
this is really how you work with these
6102
04:30:04,639 --> 04:30:10,639
guys another thing i want you to see is
6103
04:30:06,879 --> 04:30:13,759
the size that a character occupies
6104
04:30:10,639 --> 04:30:16,238
in memory by that i mean card type it's
6105
04:30:13,760 --> 04:30:19,559
going to occupy one byte in memory and
6106
04:30:16,238 --> 04:30:23,039
that means that we can only have
6107
04:30:19,559 --> 04:30:26,799
256 different values that go between 0
6108
04:30:23,040 --> 04:30:28,720
and 255 if we have decided to store in
6109
04:30:26,799 --> 04:30:30,879
positive numbers we are using the
6110
04:30:28,719 --> 04:30:33,278
knowledge we learned from the integers
6111
04:30:30,879 --> 04:30:35,679
lecture if these calculations we are
6112
04:30:33,279 --> 04:30:38,319
doing here don't make sense please go
6113
04:30:35,680 --> 04:30:41,040
back and check that out so down here we
6114
04:30:38,318 --> 04:30:44,158
are declaring a character type the name
6115
04:30:41,040 --> 04:30:46,720
is value and we are putting in a 65. the
6116
04:30:44,158 --> 04:30:48,959
thing is if you try to print this value
6117
04:30:46,719 --> 04:30:51,920
here it's not going to print 65 it's
6118
04:30:48,959 --> 04:30:54,959
going to print a which is a character
6119
04:30:51,920 --> 04:30:58,478
representation of 65. if you remember
6120
04:30:54,959 --> 04:31:01,519
from our ascii table we had these
6121
04:30:58,478 --> 04:31:05,599
mappings between characters and integers
6122
04:31:01,520 --> 04:31:08,479
and 65 mapped to the character a
6123
04:31:05,600 --> 04:31:10,800
upper case so if we print this out this
6124
04:31:08,478 --> 04:31:12,318
is going to give us a but we have the
6125
04:31:12,318 --> 04:31:18,000
interpret this as a number and we can
6126
04:31:14,959 --> 04:31:20,238
pass this through a static cast and it
6127
04:31:18,000 --> 04:31:22,079
is going to take a value turn this into
6128
04:31:20,238 --> 04:31:24,799
an integer and we're going to be
6129
04:31:22,079 --> 04:31:26,879
printing this integer on the console and
6130
04:31:24,799 --> 04:31:28,799
we're going to see it we're going to try
6131
04:31:26,879 --> 04:31:31,438
this out so we're going to run the task
6132
04:31:28,799 --> 04:31:34,398
to build with gcc the build is going to
6133
04:31:31,439 --> 04:31:36,880
go through we're going to run rooster
6134
04:31:34,398 --> 04:31:39,039
and you're going to see that value is a
6135
04:31:39,040 --> 04:31:46,000
and the value and is 65 because we
6136
04:31:42,799 --> 04:31:48,719
decided to interpret whatever is in this
6137
04:31:46,000 --> 04:31:51,359
value as an integer and not as a
6138
04:31:48,719 --> 04:31:52,799
character as it is done by default this
6139
04:31:51,359 --> 04:31:55,120
is really all we set out to do in this
6140
04:31:52,799 --> 04:31:56,799
lecture i hope you found it interesting
6141
04:31:55,120 --> 04:31:58,399
we are going to stop here in this
6142
04:31:56,799 --> 04:32:01,599
lecture in the next one we're going to
6143
04:31:58,398 --> 04:32:03,278
try and learn about the auto key world
6144
04:32:03,279 --> 04:32:07,199
go ahead and finish up here and meet me
6145
04:32:05,520 --> 04:32:10,238
there in this lecture we're going to
6146
04:32:07,199 --> 04:32:11,279
learn about the auto keyword in c plus
6147
04:32:11,279 --> 04:32:16,640
this is a keyword that is going to let
6148
04:32:14,158 --> 04:32:18,799
the compiler deduce the type for you and
6149
04:32:16,639 --> 04:32:22,238
this is going to come in handy when you
6150
04:32:18,799 --> 04:32:24,799
have longer type names that are really
6151
04:32:22,238 --> 04:32:27,359
hard to type we can't really give you an
6152
04:32:24,799 --> 04:32:31,358
example of that because that requires to
6153
04:32:27,359 --> 04:32:34,000
have a good number of concepts mastered
6154
04:32:31,359 --> 04:32:35,920
in clause plus but we are measuring this
6155
04:32:34,000 --> 04:32:38,398
here for completeness because we are
6156
04:32:35,920 --> 04:32:40,559
talking about variables and data types
6157
04:32:38,398 --> 04:32:42,799
so let's hear how we can use this here
6158
04:32:40,559 --> 04:32:46,238
we have an example where we are saying
6159
04:32:42,799 --> 04:32:49,198
autovar one and what we initialize this
6160
04:32:46,238 --> 04:32:51,920
with is an integer so the compiler is
6161
04:32:49,199 --> 04:32:54,079
really going to try and guess the type
6162
04:32:51,920 --> 04:32:56,559
of this thing and that's the type it's
6163
04:32:54,079 --> 04:32:59,840
going to assign to variable one this is
6164
04:32:56,559 --> 04:33:01,439
what ocho is really used for if we pass
6165
04:33:01,439 --> 04:33:04,958
inside and it is a double because we
6166
04:33:06,638 --> 04:33:12,159
so it is going to deduce a double if we
6167
04:33:09,520 --> 04:33:15,118
pass a suffix of f it is going to
6168
04:33:12,159 --> 04:33:17,359
interpret this as a fluid if we pass l
6169
04:33:15,118 --> 04:33:19,680
it is going to interpret this as long
6170
04:33:17,359 --> 04:33:21,920
double and if we pass in a character
6171
04:33:19,680 --> 04:33:24,159
it's going to interpret this as a
6172
04:33:21,919 --> 04:33:27,519
character and this is really the essence
6173
04:33:24,159 --> 04:33:30,879
of what auto is used for it is used when
6174
04:33:27,520 --> 04:33:33,439
you don't really want to explicitly type
6175
04:33:30,879 --> 04:33:36,959
the type of your variable and you want
6176
04:33:33,438 --> 04:33:38,798
the compiler to fill in that for you or
6177
04:33:36,958 --> 04:33:40,399
it gets it for you down here you see
6178
04:33:38,798 --> 04:33:43,118
that we have a few examples with
6179
04:33:40,400 --> 04:33:45,439
integers so we can make this unsigned
6180
04:33:43,118 --> 04:33:48,079
lung through this suffixes and the
6181
04:33:45,438 --> 04:33:51,118
compiler is going to deduce the type
6182
04:33:48,080 --> 04:33:52,879
based on what we pass in our initializer
6183
04:33:51,118 --> 04:33:55,520
here down here you see that we have a
6184
04:33:52,879 --> 04:33:57,920
few examples with integers if we pass a
6185
04:33:55,520 --> 04:34:01,039
suffix of u this means that we are
6186
04:33:57,919 --> 04:34:03,438
storing an an unsigned integer so that's
6187
04:34:01,039 --> 04:34:06,638
what the compiler is going to deduce if
6188
04:34:03,438 --> 04:34:09,358
we pass ul it is going to be unsigned
6189
04:34:06,638 --> 04:34:11,359
long if we pass in ll this is going to
6190
04:34:09,359 --> 04:34:13,600
be long long and that's what the
6191
04:34:11,359 --> 04:34:15,840
compiler is going to deduce here you see
6192
04:34:13,599 --> 04:34:19,198
that we are trying to print the sizes of
6193
04:34:15,840 --> 04:34:21,039
these variables and we trying to
6194
04:34:21,039 --> 04:34:26,080
that the compiler deduced the right type
6195
04:34:24,080 --> 04:34:28,639
and we are going to go to visual studio
6196
04:34:26,080 --> 04:34:32,480
code and actually try this out
6197
04:34:28,638 --> 04:34:34,719
okay here i am in my working folder i am
6198
04:34:32,479 --> 04:34:36,239
going to open my template project i'm
6199
04:34:37,840 --> 04:34:44,159
save my files in the auto project here
6200
04:34:41,919 --> 04:34:47,118
so i am going to go in and put in my
6201
04:34:44,159 --> 04:34:49,680
files i'm going to go up again and i am
6202
04:34:47,118 --> 04:34:51,278
going to close whatever it is i have in
6203
04:34:49,680 --> 04:34:53,599
visual studio code because we're going
6204
04:34:51,278 --> 04:34:55,680
to create a new project i am going to
6205
04:34:53,599 --> 04:34:57,599
open my new folder we're going to close
6206
04:34:55,680 --> 04:34:59,760
the welcome screen here and we're going
6207
04:34:57,599 --> 04:35:01,599
to remove whatever it is we don't need
6208
04:35:01,599 --> 04:35:07,198
and we are going to put in the code we
6209
04:35:03,919 --> 04:35:10,079
basically had in the slides i am pasting
6210
04:35:07,199 --> 04:35:11,760
this code in to save on some time
6211
04:35:10,080 --> 04:35:13,520
because i don't want you to see me type
6212
04:35:11,759 --> 04:35:14,798
these things we're going to save some
6213
04:35:14,798 --> 04:35:20,560
so the first statement here declares a
6214
04:35:17,520 --> 04:35:22,638
variable var1 the type we don't really
6215
04:35:20,561 --> 04:35:24,319
know but we're going to let the compiler
6216
04:35:24,319 --> 04:35:28,479
and we can try and actually hover over
6217
04:35:26,798 --> 04:35:30,958
this and we're going to see that the
6218
04:35:28,479 --> 04:35:33,919
compiler already deduced that this is an
6219
04:35:30,958 --> 04:35:36,399
integer if we go to vira 2 this is a
6220
04:35:33,919 --> 04:35:40,079
double if we go to var3 you see it's a
6221
04:35:36,400 --> 04:35:42,319
float if you go to var4 it's long double
6222
04:35:40,080 --> 04:35:45,119
if you go to wire 5 it's a character you
6223
04:35:42,319 --> 04:35:47,759
can see that visual studio code can even
6224
04:35:45,118 --> 04:35:50,319
see what the compiler is going to deduce
6225
04:35:47,759 --> 04:35:52,958
before we even compile the code this is
6226
04:35:50,319 --> 04:35:55,118
the beauty of visual studio code we're
6227
04:35:52,958 --> 04:35:57,599
going to look at virus 6 you're going to
6228
04:35:55,118 --> 04:35:59,680
see that it's going to be unsigned and
6229
04:35:57,599 --> 04:36:03,278
if we go to var 7 it's going to be
6230
04:35:59,680 --> 04:36:05,680
unsigned long if we go to var 8 it's
6231
04:36:03,278 --> 04:36:07,919
going to be long long this is really
6232
04:36:05,680 --> 04:36:10,719
cool and you can see that our types are
6233
04:36:07,919 --> 04:36:13,679
correctly deduced visuals video code was
6234
04:36:10,719 --> 04:36:16,561
really helpful in showing us these types
6235
04:36:13,680 --> 04:36:19,520
but we want to be sure by running this
6236
04:36:16,561 --> 04:36:22,879
piece of code and seeing whatever size
6237
04:36:19,520 --> 04:36:25,199
the deduced type is for example for var1
6238
04:36:22,879 --> 04:36:28,080
we guessed that it's going to deduce an
6239
04:36:28,080 --> 04:36:33,439
in size we're going to try and run this
6240
04:36:30,879 --> 04:36:35,359
we're going to open our terminal here
6241
04:36:33,438 --> 04:36:38,638
and we're going to go to terminal and
6242
04:36:35,359 --> 04:36:40,719
run task we're going to build with gcc
6243
04:36:38,638 --> 04:36:43,759
and by the way if you want you can build
6244
04:36:40,719 --> 04:36:46,000
with the compiler from microsoft by
6245
04:36:43,759 --> 04:36:49,519
coming to terminal here and choose it
6246
04:36:46,000 --> 04:36:51,840
with world with msvc but gcc is my
6247
04:36:49,520 --> 04:36:55,039
favorite compiler and i am going to use
6248
04:36:51,840 --> 04:36:58,359
it if i can so we're going to hit enter
6249
04:36:55,039 --> 04:37:01,680
and enter we're going to see that our
6250
04:36:58,359 --> 04:37:04,479
rooster.exe file is in place if we run
6251
04:37:01,680 --> 04:37:07,680
it we're going to see our sizes so var
6252
04:37:04,479 --> 04:37:11,199
one occupies four bytes in memory
6253
04:37:07,680 --> 04:37:13,039
var2 occupies for eight bytes in memory
6254
04:37:13,039 --> 04:37:18,879
double fire 3 occupies 3 bytes because
6255
04:37:15,840 --> 04:37:20,958
it is a float var4 occupies 16 bytes
6256
04:37:18,879 --> 04:37:24,080
because it is a long double
6257
04:37:20,958 --> 04:37:26,079
and var 5 better occupy 1 byte because
6258
04:37:24,080 --> 04:37:27,520
it is a character and we see the same
6259
04:37:27,520 --> 04:37:33,840
vera 6 virus 7 and var 8 and this proves
6260
04:37:30,958 --> 04:37:36,878
that the auto keyword is really doing
6261
04:37:33,840 --> 04:37:40,080
its job it is deducing the types for our
6262
04:37:36,879 --> 04:37:42,959
variables without us explicitly
6263
04:37:40,080 --> 04:37:45,279
specifying the variable type we didn't
6264
04:37:42,958 --> 04:37:47,680
have to do something like and or double
6265
04:37:45,278 --> 04:37:50,479
or whatever we can let the compiler do
6266
04:37:47,680 --> 04:37:53,039
that for us and this will come in handy
6267
04:37:50,479 --> 04:37:54,719
many times this is really all we set out
6268
04:37:53,039 --> 04:37:56,719
to do in this lecture and i hope you
6269
04:37:54,719 --> 04:37:58,719
found it interesting in the next one
6270
04:37:56,719 --> 04:38:01,359
we're going to look at how we can do
6271
04:37:58,719 --> 04:38:04,319
assignments and assign data to our
6272
04:38:01,359 --> 04:38:07,199
variables in a unified way go ahead and
6273
04:38:04,319 --> 04:38:08,879
finish up here and we'd be there in this
6274
04:38:07,199 --> 04:38:12,240
lecture we're going to learn about
6275
04:38:08,879 --> 04:38:15,600
assignments and the basic idea i really
6276
04:38:12,240 --> 04:38:18,320
want to drive home here is that after a
6277
04:38:15,599 --> 04:38:21,438
variable is initialized like we've been
6278
04:38:18,319 --> 04:38:24,561
doing all along you can later assign a
6279
04:38:21,438 --> 04:38:27,038
new value to it for example here we have
6280
04:38:24,561 --> 04:38:28,719
our one declared it is an integer we can
6281
04:38:27,039 --> 04:38:31,600
print it out and it is going to print
6282
04:38:28,719 --> 04:38:33,520
one two three but later in the program
6283
04:38:31,599 --> 04:38:36,079
we can put in another value for example
6284
04:38:33,520 --> 04:38:39,760
here we are putting in a 55 and if we
6285
04:38:36,080 --> 04:38:42,400
print var1 it's going to be 55 this time
6286
04:38:39,759 --> 04:38:44,798
the same idea can be extended to doubles
6287
04:38:42,400 --> 04:38:46,719
you see here we are doing the same thing
6288
04:38:44,798 --> 04:38:49,759
booleans we are doing the same thing
6289
04:38:46,719 --> 04:38:51,760
here the state is declared force and we
6290
04:38:49,759 --> 04:38:54,239
are printing that and after we are
6291
04:38:51,759 --> 04:38:56,878
changing this to a true value and if we
6292
04:38:54,240 --> 04:38:58,320
print that it's going to be true one
6293
04:38:56,879 --> 04:39:01,119
thing you really need to be careful
6294
04:38:58,319 --> 04:39:04,000
about is if you are doing auto type
6295
04:39:01,118 --> 04:39:06,319
deduction the type is not very apparent
6296
04:39:04,000 --> 04:39:08,479
by looking at the declaration of the
6297
04:39:06,319 --> 04:39:12,400
variable here for example here by
6298
04:39:08,479 --> 04:39:15,199
looking at o2 var 3 we don't really know
6299
04:39:12,400 --> 04:39:17,439
what that is and it is very easy to try
6300
04:39:15,199 --> 04:39:20,719
and put in a value that is illegal for
6301
04:39:17,438 --> 04:39:23,519
example here we have deduced an unsigned
6302
04:39:20,719 --> 04:39:26,000
integer which is only going to store
6303
04:39:23,520 --> 04:39:28,240
positive numbers but we are putting in a
6304
04:39:26,000 --> 04:39:30,080
minus 22 and this is going to be a
6305
04:39:28,240 --> 04:39:33,439
disaster we're going to get a compiler
6306
04:39:30,080 --> 04:39:35,520
error and this is going to be bad so be
6307
04:39:33,438 --> 04:39:38,239
careful when you are doing a type
6308
04:39:35,520 --> 04:39:40,637
deduction in your assignments that you
6309
04:39:38,240 --> 04:39:43,040
do to your variables this is really all
6310
04:39:40,637 --> 04:39:45,520
we have to share in this lecture let's
6311
04:39:43,040 --> 04:39:48,718
hop over to visual studio and show you
6312
04:39:45,520 --> 04:39:50,637
this in action okay here i am in my
6313
04:39:48,718 --> 04:39:52,718
working folder the project we're going
6314
04:39:50,637 --> 04:39:55,119
to be working on is four nine here
6315
04:39:52,718 --> 04:39:57,920
assignments i am going to grab my
6316
04:39:55,119 --> 04:40:00,399
template files and put that in this
6317
04:39:57,919 --> 04:40:02,877
folder here and i am going to open this
6318
04:40:00,400 --> 04:40:05,840
up in visual studio code so let's close
6319
04:40:05,840 --> 04:40:10,878
and open the folder and we're going to
6320
04:40:08,797 --> 04:40:13,279
close the welcome screen here we don't
6321
04:40:10,878 --> 04:40:16,000
want it and remove whatever we don't
6322
04:40:13,279 --> 04:40:18,637
want from this file here the first thing
6323
04:40:16,000 --> 04:40:21,840
we want to do is put in the code for our
6324
04:40:18,637 --> 04:40:22,957
integer variable var1 and show you that
6325
04:40:22,957 --> 04:40:27,919
assign a new value to it after it was
6326
04:40:25,599 --> 04:40:31,680
initialized and if we run this code
6327
04:40:27,919 --> 04:40:34,559
we're going to see var1 to b123 and the
6328
04:40:31,680 --> 04:40:35,920
second statement is going to say var1
6329
04:40:35,919 --> 04:40:40,957
55. that's what we're going to see let's
6330
04:40:38,400 --> 04:40:44,798
bring up our terminal and we are going
6331
04:40:40,957 --> 04:40:48,399
to run the task to build with gcc
6332
04:40:44,797 --> 04:40:49,919
and if we hop over here in the terminal
6333
04:40:49,919 --> 04:40:55,839
we're going to see that our rooster.exe
6334
04:40:52,637 --> 04:40:59,039
file is in here if we run it we're going
6335
04:40:55,840 --> 04:41:01,680
to see var one one two three var 155
6336
04:40:59,040 --> 04:41:05,280
exactly what we expect we have stored in
6337
04:41:01,680 --> 04:41:08,319
a one two three at initialization using
6338
04:41:05,279 --> 04:41:11,759
braced initialization here but after
6339
04:41:08,319 --> 04:41:14,159
later on in our program we have decided
6340
04:41:11,759 --> 04:41:15,519
to put a different value in this
6341
04:41:15,520 --> 04:41:20,080
essentially reusing it to store
6342
04:41:17,759 --> 04:41:22,239
something else this is the basic idea
6343
04:41:20,080 --> 04:41:24,480
here we can do the same things with
6344
04:41:22,240 --> 04:41:27,600
doubles but before we do that let's put
6345
04:41:24,479 --> 04:41:30,957
in a separation line so that we can see
6346
04:41:27,599 --> 04:41:32,717
these vents clearly in the terminal and
6347
04:41:30,957 --> 04:41:34,159
we're going to go down and put in our
6348
04:41:34,159 --> 04:41:40,560
so we have a double variable called var2
6349
04:41:40,560 --> 04:41:46,479
in and then we're going to assign a new
6350
04:41:43,040 --> 04:41:48,319
value to it and that's going to be 99.99
6351
04:41:46,479 --> 04:41:49,279
if we print that out we're going to see
6352
04:41:49,279 --> 04:41:54,000
let's work and see this in action we're
6353
04:41:56,000 --> 04:42:01,439
run the program now it's going to save
6354
04:41:58,560 --> 04:42:03,600
r1 is one two three four one fifty five
6355
04:42:01,439 --> 04:42:06,877
but we're also going to see that viral
6356
04:42:09,240 --> 04:42:15,120
99.99 it's going to show up here okay
6357
04:42:12,000 --> 04:42:16,878
let's put in another separation line
6358
04:42:15,119 --> 04:42:18,319
because we're going to need that in a
6359
04:42:18,319 --> 04:42:24,000
we can do the same things with booleans
6360
04:42:21,040 --> 04:42:26,560
here we are using this as just an
6361
04:42:26,560 --> 04:42:31,840
essentially extends to any other kind of
6362
04:42:29,520 --> 04:42:34,560
variable you're going to have in your c
6363
04:42:31,840 --> 04:42:37,200
plus plus code if you initialize it with
6364
04:42:34,560 --> 04:42:40,638
some value you have the option to change
6365
04:42:37,200 --> 04:42:42,958
that value later on in your program by
6366
04:42:40,637 --> 04:42:45,279
assigning that value to that variable
6367
04:42:42,957 --> 04:42:47,599
essentially what we are doing here the
6368
04:42:45,279 --> 04:42:50,239
variable state which is a bull
6369
04:42:47,599 --> 04:42:52,479
was initialized to false we're going to
6370
04:42:50,240 --> 04:42:54,878
print that out and notice that we have
6371
04:42:52,479 --> 04:42:57,200
this setting to allow us to see true or
6372
04:42:54,878 --> 04:43:00,240
false instead of ones and zeros we have
6373
04:42:57,200 --> 04:43:02,958
seen this in a few lectures back
6374
04:43:00,240 --> 04:43:05,520
and later on we are assigning true to
6375
04:43:02,957 --> 04:43:07,520
this state and we are printing that so
6376
04:43:05,520 --> 04:43:11,840
if we print these things out we're going
6377
04:43:07,520 --> 04:43:13,680
to see false and true for the state here
6378
04:43:16,000 --> 04:43:19,520
and the world is good if we run the
6379
04:43:19,520 --> 04:43:24,479
we're going to see false and true and it
6380
04:43:22,080 --> 04:43:26,400
is exactly what we expect again you
6381
04:43:24,479 --> 04:43:29,040
really need to be careful when you are
6382
04:43:26,400 --> 04:43:31,280
using auto type deduction because you
6383
04:43:29,040 --> 04:43:33,760
might have some serious problems if you
6384
04:43:31,279 --> 04:43:36,239
are not paying attention let's put in
6385
04:43:33,759 --> 04:43:39,119
the code so that we can play with it
6386
04:43:36,240 --> 04:43:41,920
here we have a variable called var 3 and
6387
04:43:39,119 --> 04:43:44,319
the type of it is not specified
6388
04:43:41,919 --> 04:43:47,519
explicitly we are letting the compiler
6389
04:43:44,319 --> 04:43:50,479
deduce this and because our initializer
6390
04:43:47,520 --> 04:43:53,040
here is an unsigned integer the compiler
6391
04:43:50,479 --> 04:43:55,759
is going to deduce that it is an
6392
04:43:53,040 --> 04:43:58,638
unsigned integer the problem will come
6393
04:43:55,759 --> 04:44:00,637
if you try to store in a negative number
6394
04:43:58,637 --> 04:44:03,200
the compiler is not going to give you a
6395
04:44:00,637 --> 04:44:05,439
compiler arrow it is going to silently
6396
04:44:05,439 --> 04:44:11,119
that we don't really want in there we
6397
04:44:07,599 --> 04:44:13,519
want a minus 22 and you can see that
6398
04:44:11,119 --> 04:44:16,878
this is what the compiler is turning our
6399
04:44:13,520 --> 04:44:19,520
value into we want a minus 22 in this
6400
04:44:16,878 --> 04:44:22,159
for three but if you hover over this
6401
04:44:19,520 --> 04:44:23,600
minus sign here in visual studio code
6402
04:44:22,159 --> 04:44:26,000
you're going to see that the value that
6403
04:44:23,599 --> 04:44:29,119
we have in is not what we put in we put
6404
04:44:26,000 --> 04:44:32,000
in a minus 22 and we are getting a
6405
04:44:29,119 --> 04:44:34,239
really large number close to 4 billion
6406
04:44:32,000 --> 04:44:36,637
so this is really something that can go
6407
04:44:34,240 --> 04:44:37,840
silently wrong in your code and you're
6408
04:44:37,840 --> 04:44:41,680
a hard time trying to figure out why
6409
04:44:39,919 --> 04:44:44,319
your code is not doing whatever it is
6410
04:44:41,680 --> 04:44:46,319
you want so be careful about this let's
6411
04:44:44,319 --> 04:44:48,000
try and weld this so we're going to
6412
04:44:48,000 --> 04:44:50,957
the world is going to be good you're
6413
04:44:49,360 --> 04:44:54,159
going to see that we're not even going
6414
04:44:50,957 --> 04:44:56,877
to get a compiler arrow if we run this
6415
04:44:54,159 --> 04:44:59,520
and we're going to see that viral 3 is
6416
04:44:56,878 --> 04:45:02,400
exactly what visual studio could guess
6417
04:44:59,520 --> 04:45:04,718
and it is not good it is this value here
6418
04:45:02,400 --> 04:45:07,520
and the problem is that the compiler is
6419
04:45:04,718 --> 04:45:10,637
silently putting in a garbage value and
6420
04:45:07,520 --> 04:45:12,637
not what we want here because virus 3 is
6421
04:45:10,637 --> 04:45:14,637
basically not capable of storing
6422
04:45:12,637 --> 04:45:16,637
negative numbers so the compiler is
6423
04:45:14,637 --> 04:45:18,957
going to do its best and put in a
6424
04:45:16,637 --> 04:45:21,680
garbage value and this is not what you
6425
04:45:18,957 --> 04:45:23,199
want and you need to be aware of this
6426
04:45:21,680 --> 04:45:25,119
this is really all we set out to do in
6427
04:45:23,200 --> 04:45:28,000
this lecture i hope you know about
6428
04:45:25,119 --> 04:45:30,399
assignments and be careful when you are
6429
04:45:28,000 --> 04:45:33,599
doing assignments on variables whose
6430
04:45:30,400 --> 04:45:35,200
types are deduced with auto and we're
6431
04:45:33,599 --> 04:45:36,637
going to stop here in this lecture in
6432
04:45:35,200 --> 04:45:39,520
the next one we're going to try and
6433
04:45:36,637 --> 04:45:41,439
recap what we saw in this chapter go
6434
04:45:41,439 --> 04:45:46,399
and meet me there in this lecture we're
6435
04:45:43,599 --> 04:45:48,877
going to recap what we saw in this
6436
04:45:46,400 --> 04:45:52,000
chapter and this chapter was really all
6437
04:45:48,878 --> 04:45:54,000
about variables and data types we had a
6438
04:45:52,000 --> 04:45:56,560
chance to look at different types that
6439
04:45:54,000 --> 04:45:58,797
we can use in c plus plus we saw that we
6440
04:45:56,560 --> 04:46:01,840
have fundamental types we can use to
6441
04:45:58,797 --> 04:46:05,199
represent integers floating points
6442
04:46:01,840 --> 04:46:08,159
booleans and we also saw that we can do
6443
04:46:05,200 --> 04:46:10,400
type deduction with auto we had a chance
6444
04:46:08,159 --> 04:46:13,439
to make it clear that data is
6445
04:46:10,400 --> 04:46:15,520
represented in memory as zeros and ones
6446
04:46:13,439 --> 04:46:18,159
and that there are some kinds of
6447
04:46:15,520 --> 04:46:21,279
transformations we do on these pieces of
6448
04:46:18,159 --> 04:46:24,637
data to turn them into a form that is
6449
04:46:21,279 --> 04:46:27,680
easily usable and manipulable by humans
6450
04:46:24,637 --> 04:46:30,319
and we saw that for integral types or
6451
04:46:27,680 --> 04:46:32,797
integers we could do that through number
6452
04:46:30,319 --> 04:46:35,759
systems and we had a chance to look at a
6453
04:46:32,797 --> 04:46:38,239
few number systems like binary octal and
6454
04:46:35,759 --> 04:46:41,359
hexadecimal and we had a chance to play
6455
04:46:38,240 --> 04:46:44,320
with all these variable types in visual
6456
04:46:41,360 --> 04:46:46,718
studio code and see the nuances of how
6457
04:46:44,319 --> 04:46:49,520
you really work with them i would like
6458
04:46:46,718 --> 04:46:51,440
to welcome you in this new chapter and
6459
04:46:49,520 --> 04:46:55,200
this one we're going to be looking at
6460
04:46:51,439 --> 04:46:57,119
operations we can do on our data and
6461
04:46:55,200 --> 04:46:59,280
there is a bunch of them we can add
6462
04:46:57,119 --> 04:47:01,360
things up we can subtract numbers we can
6463
04:46:59,279 --> 04:47:04,399
divide numbers we're going to see all
6464
04:47:01,360 --> 04:47:06,958
kinds of crazy operations we can do
6465
04:47:04,400 --> 04:47:10,319
on the data all the variables that we
6466
04:47:06,957 --> 04:47:11,919
have in our c plus plus program we are
6467
04:47:10,319 --> 04:47:14,239
also going to have a chance to look at
6468
04:47:11,919 --> 04:47:17,439
how we can format stuff when we print
6469
04:47:14,240 --> 04:47:20,000
them out to stdc out and we are going to
6470
04:47:17,439 --> 04:47:22,159
be using some utilities from the c plus
6471
04:47:20,000 --> 04:47:25,040
plus standard library to do some
6472
04:47:22,159 --> 04:47:27,200
operations on our variables this is
6473
04:47:25,040 --> 04:47:29,440
going to be a fun chapter i can't wait
6474
04:47:27,200 --> 04:47:31,920
to get started let's go in the next
6475
04:47:31,919 --> 04:47:35,839
in this lecture we're going to be
6476
04:47:33,279 --> 04:47:36,717
looking at some basic operations you can
6477
04:47:36,718 --> 04:47:41,520
on the data in your c plus plus program
6478
04:47:39,680 --> 04:47:44,240
and we are going to be specifically
6479
04:47:41,520 --> 04:47:46,957
looking at addition subtraction dividing
6480
04:47:44,240 --> 04:47:49,600
numbers the modulus operator and
6481
04:47:46,957 --> 04:47:50,559
multiplying stuff we have seen addition
6482
04:47:50,560 --> 04:47:55,840
here we have a simple example we have a
6483
04:47:53,279 --> 04:47:58,637
variable called sum and we are
6484
04:47:55,840 --> 04:48:00,878
initializing it with two numbers that we
6485
04:47:58,637 --> 04:48:02,797
are adding up number one and number two
6486
04:48:00,878 --> 04:48:05,760
this is something you can do in your c
6487
04:48:02,797 --> 04:48:07,599
plus bus program you can also do
6488
04:48:05,759 --> 04:48:10,239
some other things for example we have
6489
04:48:07,599 --> 04:48:12,877
another one called other sum and we are
6490
04:48:10,240 --> 04:48:15,600
adding up some other numbers and we are
6491
04:48:12,878 --> 04:48:16,958
going to collect the result into this
6492
04:48:16,957 --> 04:48:21,919
variable and we're going to print these
6493
04:48:19,200 --> 04:48:24,319
things out so that you can see them on
6494
04:48:21,919 --> 04:48:25,919
your command prompt this is how you can
6495
04:48:24,319 --> 04:48:27,599
do addition and we're going to have a
6496
04:48:25,919 --> 04:48:30,559
chance to play with this in visual
6497
04:48:27,599 --> 04:48:33,439
studio code in a minute we can also do
6498
04:48:30,560 --> 04:48:35,600
subtraction we can take a number and do
6499
04:48:33,439 --> 04:48:37,840
minus another number like we are doing
6500
04:48:35,599 --> 04:48:40,479
here we're going to store the results in
6501
04:48:37,840 --> 04:48:41,599
this div variable and we can do some
6502
04:48:41,599 --> 04:48:46,717
and down here you see another example in
6503
04:48:44,637 --> 04:48:49,599
other diff here we're going to subtract
6504
04:48:46,718 --> 04:48:52,080
numbers and store the result in other
6505
04:48:49,599 --> 04:48:54,399
def and we are also going to print this
6506
04:48:52,080 --> 04:48:56,240
out you can also multiply stuff this is
6507
04:48:54,400 --> 04:48:59,760
how you can do this you use this
6508
04:48:56,240 --> 04:49:01,840
operator here it is the star operator
6509
04:48:59,759 --> 04:49:03,759
and this is an operator that many
6510
04:49:01,840 --> 04:49:06,878
programming languages use to do
6511
04:49:03,759 --> 04:49:09,279
multiplication you should get familiar
6512
04:49:06,878 --> 04:49:11,440
with this and again we print out the
6513
04:49:09,279 --> 04:49:15,119
result so that you can see that this is
6514
04:49:11,439 --> 04:49:17,919
actually working we can also do division
6515
04:49:15,119 --> 04:49:19,840
division for integers is a little tricky
6516
04:49:17,919 --> 04:49:20,877
if you are seeing this for the first
6517
04:49:26,159 --> 04:49:30,240
we're not going to get fractional
6518
04:49:27,759 --> 04:49:33,840
numbers c plus plus is going to try and
6519
04:49:30,240 --> 04:49:37,440
figure out how many times it can fit 10
6520
04:49:33,840 --> 04:49:41,439
in 31 and we are visualizing this here
6521
04:49:37,439 --> 04:49:44,239
so in 31 we can only fit 10 three times
6522
04:49:41,439 --> 04:49:46,000
so the result of 31 is going to be three
6523
04:49:46,000 --> 04:49:50,080
okay with integer division you're not
6524
04:49:47,919 --> 04:49:51,679
going to be getting fractional numbers
6525
04:49:50,080 --> 04:49:54,798
this is something you should really
6526
04:49:51,680 --> 04:49:57,680
understand we have another operator that
6527
04:49:54,797 --> 04:49:59,680
is called modulus operator and this
6528
04:49:57,680 --> 04:50:02,319
operator is represented by this
6529
04:49:59,680 --> 04:50:04,479
percentage symbol that we are doing here
6530
04:50:02,319 --> 04:50:06,878
and the result of this operation here is
6531
04:50:06,878 --> 04:50:12,560
after you have done the division of 31
6532
04:50:10,000 --> 04:50:14,878
and 10. and here the result is going to
6533
04:50:12,560 --> 04:50:16,958
be one and you might be wondering why
6534
04:50:14,878 --> 04:50:18,479
this is useful it is going to be useful
6535
04:50:18,479 --> 04:50:22,000
and i think we're going to have a chance
6536
04:50:19,840 --> 04:50:24,080
to play with this later in the course
6537
04:50:22,000 --> 04:50:27,040
but right now you just need to be aware
6538
04:50:24,080 --> 04:50:28,560
of this operation and what it does okay
6539
04:50:27,040 --> 04:50:30,878
these are the operations we're going to
6540
04:50:28,560 --> 04:50:33,680
be learning about and playing with in
6541
04:50:30,878 --> 04:50:36,560
this lecture let's head to visual studio
6542
04:50:33,680 --> 04:50:39,599
code and actually play with this okay
6543
04:50:36,560 --> 04:50:41,280
here we are in our working folder for
6544
04:50:39,599 --> 04:50:43,119
this chapter you see that i have
6545
04:50:41,279 --> 04:50:46,399
prepared all the lectures we're going to
6546
04:50:43,119 --> 04:50:49,360
do in this chapter and i have my c plus
6547
04:50:46,400 --> 04:50:52,319
20 template project in place i am going
6548
04:50:49,360 --> 04:50:54,637
to do what we have been doing all along
6549
04:50:52,319 --> 04:50:55,759
so i am going to take these files and
6550
04:50:55,759 --> 04:50:59,279
in the current lecture which is basic
6551
04:50:59,279 --> 04:51:04,159
and i am going to paste those in and i
6552
04:51:02,240 --> 04:51:06,400
am going to open this folder in visual
6553
04:51:04,159 --> 04:51:08,637
studio code so let's do that pretty
6554
04:51:06,400 --> 04:51:10,560
quick we are going to close the welcome
6555
04:51:08,637 --> 04:51:14,239
screen here and we are going to open our
6556
04:51:10,560 --> 04:51:16,240
main cpp file and we are going to remove
6557
04:51:14,240 --> 04:51:18,240
things we don't need here the first
6558
04:51:16,240 --> 04:51:20,480
thing we want to play with is addition
6559
04:51:18,240 --> 04:51:23,280
so we're going to say that and we're
6560
04:51:20,479 --> 04:51:25,119
going to declare two end variables we're
6561
04:51:23,279 --> 04:51:27,680
going to call this number one and we're
6562
04:51:25,119 --> 04:51:30,718
going to put in a two for example
6563
04:51:27,680 --> 04:51:32,797
and we're going to do a number two
6564
04:51:30,718 --> 04:51:35,600
and we're going to put in a seven why
6565
04:51:32,797 --> 04:51:39,439
not and what we can do we can say
6566
04:51:35,599 --> 04:51:41,199
result equals number one plus number two
6567
04:51:39,439 --> 04:51:44,000
and we're going to store the result of
6568
04:51:41,200 --> 04:51:47,520
this operation and the result variable
6569
04:51:44,000 --> 04:51:50,000
here so what we can do is say sddcl and
6570
04:51:47,520 --> 04:51:53,040
we're going to print the result we can
6571
04:51:50,000 --> 04:51:55,439
try and compile this and see the result
6572
04:51:55,439 --> 04:51:59,840
and we're going to build with gcc as we
6573
04:51:59,840 --> 04:52:04,319
the world is going to go through and if
6574
04:52:02,000 --> 04:52:08,159
we run rooster here we're going to see
6575
04:52:04,319 --> 04:52:10,479
that the result of our operation is 9.
6576
04:52:08,159 --> 04:52:13,360
so this is how you can do addition
6577
04:52:10,479 --> 04:52:15,200
you can also do subtraction and here we
6578
04:52:13,360 --> 04:52:17,119
know to declare a new variable we're
6579
04:52:17,919 --> 04:52:23,279
our result variable here so what we're
6580
04:52:20,319 --> 04:52:25,279
going to do here is say subtraction and
6581
04:52:25,279 --> 04:52:31,599
equals for example let's take number two
6582
04:52:28,878 --> 04:52:34,319
minus number one this is the operation
6583
04:52:31,599 --> 04:52:36,559
we want to do this is number two what we
6584
04:52:34,319 --> 04:52:39,439
are going to be storing in this result
6585
04:52:36,560 --> 04:52:42,878
here is going to be a 5 because we are
6586
04:52:39,439 --> 04:52:46,479
taking 7 and subtracting 2. i hope this
6587
04:52:42,878 --> 04:52:48,958
makes sense so if we grab this line here
6588
04:52:46,479 --> 04:52:51,040
and paste it in here so that we save on
6589
04:52:57,599 --> 04:53:02,877
and we're going to run rooster again it
6590
04:53:00,000 --> 04:53:03,599
is going to say result is 5 because we
6591
04:53:03,599 --> 04:53:09,199
taking 7 minus two here the result is
6592
04:53:06,319 --> 04:53:11,840
going to be five we can also do a
6593
04:53:09,200 --> 04:53:14,319
subtraction operation that is going to
6594
04:53:11,840 --> 04:53:18,080
result in a negative number so for
6595
04:53:14,319 --> 04:53:20,878
example we can say result equals
6596
04:53:20,878 --> 04:53:24,637
and this is going to give us a negative
6597
04:53:22,637 --> 04:53:27,200
number because two minus seven is going
6598
04:53:27,200 --> 04:53:31,600
we're going to print that here i'm going
6599
04:53:29,680 --> 04:53:33,520
to paste this end because i still have
6600
04:53:33,520 --> 04:53:40,797
if i bolt with gcc and run my program
6601
04:53:37,279 --> 04:53:43,039
we're going to get -5 as a result of
6602
04:53:40,797 --> 04:53:45,039
this operation here this is how you can
6603
04:53:43,040 --> 04:53:47,520
do subtraction we can also do
6604
04:53:45,040 --> 04:53:50,479
multiplication so let's go down here and
6605
04:53:47,520 --> 04:53:53,760
say that and we're going to say result
6606
04:53:50,479 --> 04:53:56,319
equals number one multiplied by number
6607
04:53:53,759 --> 04:53:58,319
two and this is the operator we used to
6608
04:53:56,319 --> 04:54:00,560
do multiplication in programming
6609
04:53:58,319 --> 04:54:02,797
languages we're going to put in our
6610
04:54:02,797 --> 04:54:08,717
and we're going to world with gcc
6611
04:54:05,919 --> 04:54:12,000
and if we run rooster now we're going to
6612
04:54:08,718 --> 04:54:14,798
get 14 because we are taking
6613
04:54:12,000 --> 04:54:17,200
2 and multiplying that with 7. this is
6614
04:54:14,797 --> 04:54:20,000
how you can do multiplication
6615
04:54:20,000 --> 04:54:24,718
seven and divide that with two try to
6616
04:54:22,718 --> 04:54:26,637
give this a guess based on what we saw
6617
04:54:24,718 --> 04:54:28,878
in the slides we're going to go down
6618
04:54:26,637 --> 04:54:32,399
here and do division and we're going to
6619
04:54:28,878 --> 04:54:34,479
say result equals number two divided by
6620
04:54:34,479 --> 04:54:38,718
we're going to try and print this out if
6621
04:54:36,637 --> 04:54:41,039
we build this the world is going to go
6622
04:54:38,718 --> 04:54:43,920
through and if we run this we're going
6623
04:54:43,919 --> 04:54:47,519
so to really make sense of this let's
6624
04:54:45,919 --> 04:54:49,679
look at these numbers we are taking
6625
04:54:47,520 --> 04:54:51,760
number two and dividing that with number
6626
04:54:53,439 --> 04:54:58,877
and because we can't store fractional
6627
04:54:55,840 --> 04:55:01,040
numbers in an integer the fractional
6628
04:54:58,878 --> 04:55:03,600
part is going to be basically chopped
6629
04:55:01,040 --> 04:55:04,718
off and we're going to store a three
6630
04:55:06,637 --> 04:55:10,319
only three times i really hope this
6631
04:55:08,479 --> 04:55:12,399
makes sense the last operation we're
6632
04:55:12,400 --> 04:55:18,159
and it is a way to capture the reminder
6633
04:55:15,200 --> 04:55:20,718
of a division operation so we're going
6634
04:55:20,718 --> 04:55:25,600
and we're going to say number two and
6635
04:55:23,040 --> 04:55:27,920
we're going to say modulus using the
6636
04:55:25,599 --> 04:55:29,519
percentage operator here and we're going
6637
04:55:29,520 --> 04:55:33,680
and we're going to print the result of
6638
04:55:33,680 --> 04:55:37,200
take a look at this here and try to
6639
04:55:35,520 --> 04:55:39,520
guess what we're going to be doing what
6640
04:55:43,200 --> 04:55:46,878
and we're going to take seven divide
6641
04:55:46,878 --> 04:55:52,000
and the reminder of that is going to be
6642
04:55:49,360 --> 04:55:54,560
one and that's what we're going to store
6643
04:55:52,000 --> 04:55:57,520
in this results variable here and if we
6644
04:55:54,560 --> 04:56:00,479
print that we expect to get a one here
6645
04:55:57,520 --> 04:56:03,439
this is what modulus does let's build
6646
04:56:00,479 --> 04:56:06,079
and build with gcc the world is going to
6647
04:56:03,439 --> 04:56:08,717
go through if we run rooster here we're
6648
04:56:06,080 --> 04:56:10,878
going to get a one let's do what we used
6649
04:56:08,718 --> 04:56:13,520
in the slide so that this really makes
6650
04:56:10,878 --> 04:56:14,400
sense we're going to go down here and i
6651
04:56:14,400 --> 04:56:20,000
equals 31 modulus 10. this is what we
6652
04:56:20,000 --> 04:56:24,878
so we're going to print the result here
6653
04:56:22,319 --> 04:56:27,040
and here we are really asking
6654
04:56:24,878 --> 04:56:30,159
what is going to be the reminder if we
6655
04:56:27,040 --> 04:56:32,080
take 31 and divide that by 10 and that
6656
04:56:30,159 --> 04:56:34,319
reminder is going to be stored in this
6657
04:56:32,080 --> 04:56:37,600
research variable so here we're also
6658
04:56:34,319 --> 04:56:40,718
going to get a one so let's weld with
6659
04:56:37,599 --> 04:56:43,680
gcc and we're going to run the program
6660
04:56:40,718 --> 04:56:46,878
and we are also going to get a one down
6661
04:56:43,680 --> 04:56:49,520
here again the modulus operator can be
6662
04:56:46,878 --> 04:56:51,920
hard to understand for beginners but it
6663
04:56:49,520 --> 04:56:54,637
is really capturing the reminder of the
6664
04:56:51,919 --> 04:56:58,239
division again we can see that here we
6665
04:56:54,637 --> 04:57:01,039
are asking how many times can 10 fit in
6666
04:56:58,240 --> 04:57:04,159
31 and we visualize this here it can
6667
04:57:01,040 --> 04:57:06,080
only fit in three times and the reminder
6668
04:57:04,159 --> 04:57:08,400
is going to be this red thing you see
6669
04:57:06,080 --> 04:57:10,480
here it's going to be one and when we do
6670
04:57:08,400 --> 04:57:12,798
a modulus operation here we are
6671
04:57:10,479 --> 04:57:14,637
interested in that reminder and that's
6672
04:57:12,797 --> 04:57:16,637
what we're going to be storing in
6673
04:57:14,637 --> 04:57:20,239
whatever variable that is capturing the
6674
04:57:16,637 --> 04:57:22,878
result of this modules operation
6675
04:57:20,240 --> 04:57:24,480
and that's what we basically have here
6676
04:57:22,878 --> 04:57:26,718
and this is really all we set out to do
6677
04:57:24,479 --> 04:57:28,637
in this lecture now i hope you have a
6678
04:57:26,718 --> 04:57:31,520
good understanding of these operations
6679
04:57:28,637 --> 04:57:34,000
you can do on integers we have used
6680
04:57:31,520 --> 04:57:37,040
integers here but you can really do
6681
04:57:34,000 --> 04:57:39,360
these operations on numbers except for
6682
04:57:37,040 --> 04:57:42,319
the modulus operator which is really
6683
04:57:39,360 --> 04:57:43,040
going to make sense for integral types
6684
04:57:43,040 --> 04:57:48,240
you can't really do modulus on floating
6685
04:57:45,759 --> 04:57:50,159
points or fractional numbers that's not
6686
04:57:48,240 --> 04:57:52,080
going to make any sense at all we're
6687
04:57:50,159 --> 04:57:53,759
going to stop here in this lecture in
6688
04:57:52,080 --> 04:57:56,480
the next one we're going to learn about
6689
04:57:53,759 --> 04:57:59,119
precedence and associativity a very
6690
04:57:56,479 --> 04:58:01,439
important concept for your operations in
6691
04:58:01,439 --> 04:58:05,599
in this lecture we're going to learn
6692
04:58:02,878 --> 04:58:07,600
about precedence and associativity so
6693
04:58:05,599 --> 04:58:10,000
what do we mean by precedence and
6694
04:58:07,599 --> 04:58:12,479
associativity really what we mean by
6695
04:58:10,000 --> 04:58:13,520
this is a set of rules that we can
6696
04:58:15,680 --> 04:58:19,760
when we have multiple operators in the
6697
04:58:19,759 --> 04:58:24,797
like in the example we have here if they
6698
04:58:22,240 --> 04:58:26,080
tell you to evaluate the result of this
6699
04:58:26,080 --> 04:58:31,280
if we don't have clear rules to follow
6700
04:58:28,560 --> 04:58:33,600
we might have multiple answers and we
6701
04:58:31,279 --> 04:58:36,637
want to know which one is right or wrong
6702
04:58:33,599 --> 04:58:39,599
for example one might want to do a and b
6703
04:58:36,637 --> 04:58:43,360
first and then do c and then do d but
6704
04:58:39,599 --> 04:58:46,239
one might want to do e minus f
6705
04:58:43,360 --> 04:58:48,319
and do b multiply by c and then do
6706
04:58:46,240 --> 04:58:49,920
things in different ways and get
6707
04:58:49,919 --> 04:58:54,797
hopefully you are saying that this may
6708
04:58:52,080 --> 04:58:57,120
be a big problem what we get from
6709
04:58:54,797 --> 04:58:59,360
precedence and associativity is the
6710
04:58:57,119 --> 04:59:02,399
rules we can follow to know which
6711
04:58:59,360 --> 04:59:04,000
operator we have to do first for example
6712
04:59:04,000 --> 04:59:10,000
the multiplication and division operator
6713
04:59:07,439 --> 04:59:12,717
have to be done before you do addition
6714
04:59:10,000 --> 04:59:15,040
and subtraction and if you want to
6715
04:59:12,718 --> 04:59:18,000
evaluate this expression here you're
6716
04:59:15,040 --> 04:59:21,120
going to have to do b and c first and
6717
04:59:18,000 --> 04:59:23,919
then do d and e once you have those
6718
04:59:21,119 --> 04:59:26,559
results then you can do addition and
6719
04:59:23,919 --> 04:59:27,679
subtraction but the question remains
6720
04:59:27,680 --> 04:59:32,797
what do we do first if we have only
6721
04:59:30,797 --> 04:59:35,439
addition and subtraction in an
6722
04:59:32,797 --> 04:59:38,637
expiration and we solve that problem
6723
04:59:35,439 --> 04:59:41,119
with associativity associativity defines
6724
04:59:38,637 --> 04:59:42,637
if you do the operations from the left
6725
04:59:42,637 --> 04:59:47,039
and again these things might not make
6726
04:59:44,637 --> 04:59:49,599
sense yet we're going to do an example
6727
04:59:47,040 --> 04:59:50,958
and you're going to really see what is
6728
04:59:50,957 --> 04:59:56,399
to summarize precedence tells you which
6729
04:59:53,680 --> 04:59:58,560
operation you can do first and
6730
04:59:56,400 --> 05:00:00,400
associativity is going to tell you in
6731
04:59:58,560 --> 05:00:02,479
which direction you're going to go from
6732
05:00:00,400 --> 05:00:04,000
the left or from the right and some
6733
05:00:02,479 --> 05:00:06,479
operators are going to be left
6734
05:00:04,000 --> 05:00:08,797
associative and that means that you're
6735
05:00:06,479 --> 05:00:11,200
going to start evaluating them from the
6736
05:00:08,797 --> 05:00:13,360
left some operations are going to be
6737
05:00:11,200 --> 05:00:16,479
right associative and you're going to
6738
05:00:13,360 --> 05:00:18,637
start evaluating them from the right and
6739
05:00:16,479 --> 05:00:20,797
i am not making these things up there is
6740
05:00:18,637 --> 05:00:24,479
actually a c plus plus operator
6741
05:00:20,797 --> 05:00:26,399
precedence table that you can consult to
6742
05:00:26,400 --> 05:00:31,760
you should do first if you really are
6743
05:00:29,279 --> 05:00:33,680
evaluating this thing with your mind
6744
05:00:31,759 --> 05:00:35,919
okay for example if you look in this
6745
05:00:33,680 --> 05:00:37,840
table there are many operators we
6746
05:00:35,919 --> 05:00:40,399
haven't seen yet but that's not the
6747
05:00:37,840 --> 05:00:42,159
problem the most important thing here is
6748
05:00:42,159 --> 05:00:47,599
associativity are and when we get to
6749
05:00:45,040 --> 05:00:50,400
learn about these new operators you can
6750
05:00:47,599 --> 05:00:52,877
come here and know where they sit in
6751
05:00:50,400 --> 05:00:56,319
this precedence table for example we
6752
05:00:52,878 --> 05:00:57,920
know how to do addition multiplication
6753
05:00:57,919 --> 05:01:03,359
we see that the precedence for
6754
05:01:00,159 --> 05:01:06,240
multiplication division and modulus
6755
05:01:03,360 --> 05:01:07,520
is higher than for addition and
6756
05:01:07,520 --> 05:01:11,360
and we can use this in our operators to
6757
05:01:11,360 --> 05:01:16,797
which one is going to be evaluated by
6758
05:01:13,919 --> 05:01:18,797
our compiler first another thing i want
6759
05:01:16,797 --> 05:01:21,680
you to notice in this table is this
6760
05:01:18,797 --> 05:01:24,319
column here on associativity if you go
6761
05:01:21,680 --> 05:01:25,840
back to our familiar operators here
6762
05:01:25,840 --> 05:01:31,920
these operators are left to right so you
6763
05:01:28,957 --> 05:01:35,199
should start evaluating things from left
6764
05:01:31,919 --> 05:01:38,319
to right but some operators have right
6765
05:01:35,200 --> 05:01:40,319
to left associativity and when we get to
6766
05:01:38,319 --> 05:01:42,957
these operators you will start doing
6767
05:01:40,319 --> 05:01:45,040
things from right to the left okay i
6768
05:01:42,957 --> 05:01:47,119
think it is time we went to visual
6769
05:01:45,040 --> 05:01:49,920
studio code and actually played with
6770
05:01:47,119 --> 05:01:53,119
this thanks here we are in visual studio
6771
05:01:49,919 --> 05:01:55,199
code we are in our working folder we are
6772
05:01:53,119 --> 05:01:57,840
going to grab our template projects
6773
05:01:55,200 --> 05:02:00,000
we're going to copy this and put that in
6774
05:01:57,840 --> 05:02:02,479
our lecture on precedence and
6775
05:02:00,000 --> 05:02:05,279
associativity we're going to put that in
6776
05:02:02,479 --> 05:02:07,759
here we are going to open this project
6777
05:02:05,279 --> 05:02:09,919
in visual studio code we are going to
6778
05:02:07,759 --> 05:02:12,877
get rid of things we don't need and
6779
05:02:09,919 --> 05:02:15,919
remove this here in the body and we are
6780
05:02:12,878 --> 05:02:18,400
going to put in our test code so that we
6781
05:02:15,919 --> 05:02:21,599
don't have to type this and save on time
6782
05:02:18,400 --> 05:02:24,159
we have a few variables here a through g
6783
05:02:21,599 --> 05:02:25,519
and we have an expression here or a
6784
05:02:25,520 --> 05:02:31,760
that is combining multiplication
6785
05:02:28,319 --> 05:02:34,000
division addition and subtraction and we
6786
05:02:31,759 --> 05:02:35,679
have to figure out which operation we're
6787
05:02:35,680 --> 05:02:40,479
i would challenge you to do this in your
6788
05:02:38,319 --> 05:02:43,680
mind and try to guess what the result is
6789
05:02:40,479 --> 05:02:46,399
going to be before we run this in our
6790
05:02:43,680 --> 05:02:49,360
compiler we're going to compile this
6791
05:02:46,400 --> 05:02:50,718
with gcc and we are going to open our
6792
05:02:50,718 --> 05:02:55,840
and if we do durham we're going to see
6793
05:02:55,840 --> 05:03:01,119
if we run it we're going to see that the
6794
05:02:58,159 --> 05:03:03,759
result is 30. how did we come up with
6795
05:03:10,797 --> 05:03:16,559
before addition and subtraction we are
6796
05:03:14,000 --> 05:03:19,040
going to take b and c and multiply those
6797
05:03:16,560 --> 05:03:21,600
so b and c multiplied we're going to get
6798
05:03:19,040 --> 05:03:24,080
a 24 we're going to try and do this in
6799
05:03:21,599 --> 05:03:25,039
our brain d divided by a we're going to
6800
05:03:25,040 --> 05:03:31,040
so d divided by e we're going to get a 3
6801
05:03:28,319 --> 05:03:33,119
so we're going to have a 3 here and
6802
05:03:31,040 --> 05:03:36,400
after we have this we're going to do
6803
05:03:33,119 --> 05:03:39,680
addition and subtraction so we're going
6804
05:03:36,400 --> 05:03:42,480
to take a and add that to the result of
6805
05:03:39,680 --> 05:03:46,637
b and c so we're going to say
6806
05:03:42,479 --> 05:03:48,718
6 plus 24 which is the result of b and c
6807
05:03:46,637 --> 05:03:51,919
we're going to minus the results of d
6808
05:03:48,718 --> 05:03:53,760
and e and we're going to do minus here i
6809
05:03:51,919 --> 05:03:56,797
hope you are following and then we're
6810
05:03:53,759 --> 05:03:59,519
going to minus f and plus g we're going
6811
05:04:01,599 --> 05:04:07,599
which is 5. okay so this is our
6812
05:04:05,520 --> 05:04:09,439
expression here and now that we have
6813
05:04:07,599 --> 05:04:11,599
this we have to think about how we're
6814
05:04:09,439 --> 05:04:14,957
going to do this we can try to do this
6815
05:04:11,599 --> 05:04:18,399
from the right do two plus five and then
6816
05:04:14,957 --> 05:04:21,439
do three minus two plus five and go from
6817
05:04:18,400 --> 05:04:25,280
right to left but our associativity
6818
05:04:21,439 --> 05:04:28,000
table says that addition and subtraction
6819
05:04:25,279 --> 05:04:30,559
have left to right associativity so we
6820
05:04:28,000 --> 05:04:34,080
will start from the left so we're going
6821
05:04:30,560 --> 05:04:36,560
to do 6 plus 24 we're going to get 30
6822
05:04:34,080 --> 05:04:38,798
we're going to minus 3 and we're going
6823
05:04:36,560 --> 05:04:41,680
to get 27 we're going to minus 2 we're
6824
05:04:38,797 --> 05:04:43,439
going to get 25 we're going to add 5
6825
05:04:41,680 --> 05:04:45,760
we're going to get 30. i hope you are
6826
05:04:43,439 --> 05:04:48,479
following and we are really following
6827
05:04:45,759 --> 05:04:50,957
the rules from our c plus plus operator
6828
05:04:48,479 --> 05:04:53,919
precedence table here okay so this is
6829
05:04:50,957 --> 05:04:56,239
really how you would use this precedence
6830
05:04:53,919 --> 05:05:00,000
and the search activity rules to
6831
05:04:56,240 --> 05:05:03,600
evaluate your expressions okay here i
6832
05:05:00,000 --> 05:05:05,840
have another example for you so try to
6833
05:05:03,599 --> 05:05:07,519
evaluate what we're going to get from
6834
05:05:07,520 --> 05:05:13,439
we have a divided by b divided by c plus
6835
05:05:10,718 --> 05:05:15,680
d minus e plus f try to do this in your
6836
05:05:13,439 --> 05:05:18,559
brain and try to guess what we're going
6837
05:05:15,680 --> 05:05:20,000
to get from the compiler if we print
6838
05:05:20,000 --> 05:05:24,797
we're going to put in our htdc out
6839
05:05:22,797 --> 05:05:28,399
statement here and we're going to try
6840
05:05:24,797 --> 05:05:30,239
and build this with gcc of course we're
6841
05:05:28,400 --> 05:05:33,200
going to run the rooster and you're
6842
05:05:30,240 --> 05:05:35,600
going to get a 24. so how did we come up
6843
05:05:33,200 --> 05:05:39,600
with that we're going to start by
6844
05:05:35,599 --> 05:05:42,797
division and multiplication and again
6845
05:05:39,599 --> 05:05:46,159
where do we start do we do b and c first
6846
05:05:42,797 --> 05:05:48,957
or do we do a and b first well we can
6847
05:05:46,159 --> 05:05:50,079
check our precedence table here
6848
05:05:48,957 --> 05:05:53,359
and we're going to check the
6849
05:05:50,080 --> 05:05:56,080
associativity of multiplication and
6850
05:05:53,360 --> 05:05:59,279
division we're going to go to this entry
6851
05:05:56,080 --> 05:06:02,560
here 13 and we see that it is left to
6852
05:05:59,279 --> 05:06:05,439
right associative these operations here
6853
05:06:02,560 --> 05:06:06,878
are left to right associative so what
6854
05:06:05,439 --> 05:06:09,439
we're going to do we're going to start
6855
05:06:06,878 --> 05:06:12,319
from left and go to right so we are
6856
05:06:09,439 --> 05:06:14,559
going to take a and divide by b if we
6857
05:06:12,319 --> 05:06:17,680
take a divided by b we're going to get a
6858
05:06:14,560 --> 05:06:20,159
2 so let's type that here then the
6859
05:06:17,680 --> 05:06:22,319
result of that is going to be multiplied
6860
05:06:20,159 --> 05:06:24,560
by c and if we go up we're going to see
6861
05:06:22,319 --> 05:06:26,319
that c is eight so we're going to
6862
05:06:26,319 --> 05:06:30,957
and get six so we can replace this with
6863
05:06:32,718 --> 05:06:38,400
then we're going to add d d is nine then
6864
05:06:40,797 --> 05:06:47,279
three then we're going to add f which is
6865
05:06:44,479 --> 05:06:50,560
a five so we have 16 plus nine this is
6866
05:06:47,279 --> 05:06:52,717
going to give us 25 minus three
6867
05:06:50,560 --> 05:06:54,240
okay by checking this out i see that i
6868
05:06:55,680 --> 05:07:01,200
five it is a two we have here
6869
05:06:58,637 --> 05:07:03,360
and if we do this from left to right
6870
05:07:01,200 --> 05:07:05,920
because addition and subtraction are
6871
05:07:03,360 --> 05:07:08,400
left associative we have to do them from
6872
05:07:05,919 --> 05:07:11,439
left to the right we're going to take 16
6873
05:07:08,400 --> 05:07:14,718
and add a 9 we're going to get at 25
6874
05:07:11,439 --> 05:07:17,199
minus 3 we're going to get 22 plus 2 we
6875
05:07:14,718 --> 05:07:19,840
are going to get 24 and that's what we
6876
05:07:17,200 --> 05:07:22,319
have here i really hope this makes sense
6877
05:07:19,840 --> 05:07:24,000
okay so we have seen how we can use this
6878
05:07:24,000 --> 05:07:29,279
but sometimes you want to make it really
6879
05:07:26,560 --> 05:07:30,240
clear which operations should be done
6880
05:07:30,240 --> 05:07:36,000
and you can do that by using parentheses
6881
05:07:33,119 --> 05:07:38,559
around your expressions let's grab the
6882
05:07:36,000 --> 05:07:40,319
first expression here and do it again
6883
05:07:41,919 --> 05:07:48,637
and put that in place and we're going to
6884
05:07:44,400 --> 05:07:51,120
store the result in our result variable
6885
05:07:48,637 --> 05:07:53,680
and notice that we are reassigning these
6886
05:07:51,119 --> 05:07:55,680
things to the result variable so that we
6887
05:07:53,680 --> 05:07:56,957
don't have to declare another variable i
6888
05:07:56,957 --> 05:08:02,559
clean and that's what we're doing here
6889
05:07:59,680 --> 05:08:05,439
so what we can do here is make it clear
6890
05:08:02,560 --> 05:08:07,440
that we want multiplication done first
6891
05:08:08,319 --> 05:08:13,360
make it clear that we want the
6892
05:08:13,360 --> 05:08:16,878
and when you do this the compiler is
6893
05:08:15,360 --> 05:08:19,360
going to see that you want this
6894
05:08:16,878 --> 05:08:22,560
operation here done first and that's
6895
05:08:19,360 --> 05:08:25,360
what it is going to do and if we print
6896
05:08:22,560 --> 05:08:28,958
result again we're going to get exactly
6897
05:08:25,360 --> 05:08:30,479
the same thing we had before stdc out
6898
05:08:30,479 --> 05:08:35,040
and we're going to put result out and
6899
05:08:32,878 --> 05:08:37,119
let's make it clear that we are using
6900
05:08:37,119 --> 05:08:42,957
signal which operation we want to be
6901
05:08:39,439 --> 05:08:45,680
done first we can compile this with gcc
6902
05:08:42,957 --> 05:08:47,919
we're going to run the task to
6903
05:08:50,878 --> 05:08:56,878
we're going to see that the result is 30
6904
05:08:53,680 --> 05:08:59,200
exactly what we had before but now it is
6905
05:08:56,878 --> 05:09:02,560
very clear to the reader of this piece
6906
05:08:59,200 --> 05:09:04,400
of code that we want b and c done first
6907
05:09:02,560 --> 05:09:06,718
they don't have to go through the
6908
05:09:04,400 --> 05:09:09,040
precedence table to really try and
6909
05:09:06,718 --> 05:09:11,040
figure this out potentially wasting
6910
05:09:09,040 --> 05:09:14,319
precious time another thing you can do
6911
05:09:11,040 --> 05:09:16,479
with this is for example what if the
6912
05:09:14,319 --> 05:09:19,200
precedence table is not working
6913
05:09:16,479 --> 05:09:21,360
according to your needs for example you
6914
05:09:21,360 --> 05:09:26,319
done first you can specify this with
6915
05:09:23,840 --> 05:09:28,560
parents here and what this is basically
6916
05:09:26,319 --> 05:09:31,279
going to do is going to force the
6917
05:09:28,560 --> 05:09:33,920
compiler to do this first it's no longer
6918
05:09:31,279 --> 05:09:37,119
going to do b multiply by c and d
6919
05:09:33,919 --> 05:09:39,359
divided by e it's going to evaluate this
6920
05:09:37,119 --> 05:09:41,840
first then it's going to follow the
6921
05:09:39,360 --> 05:09:44,240
order in the precedence table that we
6922
05:09:41,840 --> 05:09:46,479
have seen before so try to guess what
6923
05:09:44,240 --> 05:09:48,718
we're going to get now and i am going to
6924
05:09:46,479 --> 05:09:51,360
run the code and we're going to
6925
05:09:48,718 --> 05:09:54,479
go through this together so let's run
6926
05:09:51,360 --> 05:09:57,520
task and we're going to run rooster now
6927
05:09:54,479 --> 05:10:00,159
you see that the result is 72. what is
6928
05:09:57,520 --> 05:10:03,520
happening here well let's go through
6929
05:10:00,159 --> 05:10:05,520
this line by line we are doing a plus b
6930
05:10:05,520 --> 05:10:09,840
9 so we're going to get a nine here
6931
05:10:08,000 --> 05:10:11,520
we're going to put that here as a
6932
05:10:09,840 --> 05:10:13,119
comment then we're going to multiply
6933
05:10:13,119 --> 05:10:20,159
so we're going to do 9 multiply by 8 and
6934
05:10:20,159 --> 05:10:26,957
and by that time we're going to be here
6935
05:10:23,439 --> 05:10:28,559
and we're going to do the division first
6936
05:10:28,560 --> 05:10:33,040
then we're going to take nine and divide
6937
05:10:30,878 --> 05:10:35,119
by three that's going to yield the three
6938
05:10:33,040 --> 05:10:36,718
so we're going to have a three here
6939
05:10:36,718 --> 05:10:42,798
we're going to minus f which is a 2 and
6940
05:10:39,759 --> 05:10:44,957
we're going to do plus g which is a 5.
6941
05:10:44,957 --> 05:10:50,877
we're going to get 72 minus 3 which is
6942
05:10:47,439 --> 05:10:54,957
going to be 69 minus 2 it's going to be
6943
05:10:50,878 --> 05:10:57,040
67 plus 2 it's going to be 72 and that's
6944
05:10:54,957 --> 05:11:00,079
what we have here hopefully you can see
6945
05:10:57,040 --> 05:11:02,479
that using the parents not only can you
6946
05:11:00,080 --> 05:11:04,400
make it very clear which operation you
6947
05:11:02,479 --> 05:11:07,680
want to be done first you can also
6948
05:11:04,400 --> 05:11:10,080
define the rules that are prescribed by
6949
05:11:07,680 --> 05:11:12,878
the precedence tables that are defined
6950
05:11:10,080 --> 05:11:14,400
in c plus plus i hope this makes sense
6951
05:11:12,878 --> 05:11:16,479
and this is really all we set up to do
6952
05:11:14,400 --> 05:11:19,200
in this lecture to learn a little more
6953
05:11:16,479 --> 05:11:22,000
about precedence and associativity
6954
05:11:19,200 --> 05:11:24,958
and my advice to beginning programmers
6955
05:11:22,000 --> 05:11:27,759
is not to rely on the president's table
6956
05:11:24,957 --> 05:11:30,957
too much it is to try and make your
6957
05:11:27,759 --> 05:11:32,559
intent very clear using parenthesis and
6958
05:11:30,957 --> 05:11:35,199
anyone reading your code you want to
6959
05:11:32,560 --> 05:11:37,680
have to go check these rules in
6960
05:11:35,200 --> 05:11:39,840
the reference c plus plus documentation
6961
05:11:37,680 --> 05:11:42,159
they are going to directly understand
6962
05:11:39,840 --> 05:11:44,718
what your expression is going to do and
6963
05:11:42,159 --> 05:11:46,718
that's a good thing readability of your
6964
05:11:44,718 --> 05:11:48,798
code is really something you should
6965
05:11:46,718 --> 05:11:50,878
strive for this is really all we set out
6966
05:11:48,797 --> 05:11:54,079
to do in this lecture i hope you have a
6967
05:11:50,878 --> 05:11:56,560
better idea about precedence
6968
05:11:54,080 --> 05:11:58,480
and associativity we are going to stop
6969
05:11:56,560 --> 05:12:00,000
here in this lecture and the next one
6970
05:11:58,479 --> 05:12:02,319
we're going to learn about some cool
6971
05:12:00,000 --> 05:12:03,840
things we can do with addition and
6972
05:12:03,840 --> 05:12:07,840
go ahead and finish up here and meet me
6973
05:12:06,080 --> 05:12:10,400
there in this lecture we're going to be
6974
05:12:07,840 --> 05:12:13,119
learning about prefix and postfix
6975
05:12:10,400 --> 05:12:15,600
addition and subtraction we have an
6976
05:12:13,119 --> 05:12:18,718
example here and it is a simple example
6977
05:12:15,599 --> 05:12:21,359
we've seen a lot of times by now we have
6978
05:12:18,718 --> 05:12:25,440
a variable value it is an integer and we
6979
05:12:21,360 --> 05:12:28,000
have a 5 inside we can add a 1 to it or
6980
05:12:25,439 --> 05:12:30,000
we can increment it by one this is
6981
05:12:28,000 --> 05:12:31,840
another term we use in programming
6982
05:12:31,840 --> 05:12:36,797
incrementing a value we are adding
6983
05:12:34,560 --> 05:12:40,159
something to it in this case we are
6984
05:12:36,797 --> 05:12:42,559
incrementing it by one and we are
6985
05:12:40,159 --> 05:12:45,040
basically going to store a six and this
6986
05:12:42,560 --> 05:12:47,440
value here so if we print this out we're
6987
05:12:47,439 --> 05:12:51,840
this is what we would expect we are
6988
05:12:49,599 --> 05:12:54,717
resetting the value to five and that we
6989
05:12:51,840 --> 05:12:57,119
are going to minus one or decrement by
6990
05:12:54,718 --> 05:13:00,400
one and the result is going to be saved
6991
05:12:57,119 --> 05:13:03,599
in value again so the second stdc out
6992
05:13:00,400 --> 05:13:06,080
statement here is going to print a 4.
6993
05:13:03,599 --> 05:13:08,559
this is something you should expect
6994
05:13:06,080 --> 05:13:11,680
now another thing we can do in c plus
6995
05:13:08,560 --> 05:13:13,040
plus is do something like value plus
6996
05:13:13,040 --> 05:13:17,200
and what do we mean by that when you use
6997
05:13:19,360 --> 05:13:23,279
the first thing you should know is that
6998
05:13:21,040 --> 05:13:25,120
this is going to increment by one it's
6999
05:13:23,279 --> 05:13:28,239
not going to increment by any other
7000
05:13:25,119 --> 05:13:30,718
value c plus plus doesn't provide a way
7001
05:13:28,240 --> 05:13:33,840
for you to specify another number to
7002
05:13:30,718 --> 05:13:36,159
increment by so value plus plus here is
7003
05:13:33,840 --> 05:13:37,599
going to increment by one but another
7004
05:13:37,599 --> 05:13:41,919
is that it's not going to increment
7005
05:13:39,840 --> 05:13:44,000
directly what's going to happen here if
7006
05:13:41,919 --> 05:13:47,919
you look to the top here we have a value
7007
05:13:44,000 --> 05:13:49,119
5 when execution hits this stdcl
7008
05:13:49,119 --> 05:13:54,797
we are going to grab the value here so
7009
05:13:52,159 --> 05:13:57,599
here we're going to really print a 5 but
7010
05:13:54,797 --> 05:14:00,239
as soon as this statement is done the
7011
05:13:57,599 --> 05:14:02,159
value is going to increment by one so
7012
05:14:00,240 --> 05:14:04,718
the next time somebody is going to use
7013
05:14:02,159 --> 05:14:07,439
this value here is he's going to find in
7014
05:14:04,718 --> 05:14:09,119
a 6 and that's what we have here so the
7015
05:14:07,439 --> 05:14:11,439
first one is going to print a five
7016
05:14:09,119 --> 05:14:14,878
because we're going to grab the value
7017
05:14:11,439 --> 05:14:17,359
in here as is but as soon as we have our
7018
05:14:14,878 --> 05:14:19,520
value this is going to increment by one
7019
05:14:17,360 --> 05:14:21,920
this is what we mean by this value plus
7020
05:14:19,520 --> 05:14:24,957
plus here and the second statement is
7021
05:14:21,919 --> 05:14:27,839
going to print sx because it is already
7022
05:14:24,957 --> 05:14:30,957
incremented and we call this postfix
7023
05:14:27,840 --> 05:14:33,680
increment because plus plus is after the
7024
05:14:30,957 --> 05:14:36,239
value here and this is really what this
7025
05:14:33,680 --> 05:14:38,319
operator does and sometimes it is going
7026
05:14:36,240 --> 05:14:40,718
to come in handy in your c plus plus
7027
05:14:38,319 --> 05:14:43,439
applications we can also do the same
7028
05:14:40,718 --> 05:14:45,600
thing with minus minus it is going to
7029
05:14:43,439 --> 05:14:47,840
grab whatever value we have in this
7030
05:14:45,599 --> 05:14:49,919
variable so we have in a five so that's
7031
05:14:47,840 --> 05:14:52,878
what we're going to print here
7032
05:14:49,919 --> 05:14:55,279
and the next statement is going to find
7033
05:14:52,878 --> 05:14:57,360
it already decremented by one because
7034
05:14:55,279 --> 05:14:59,279
after we have our five we're going to
7035
05:14:57,360 --> 05:15:01,440
decrement by one that's what we are
7036
05:14:59,279 --> 05:15:05,360
saying here and we're going to find the
7037
05:15:01,439 --> 05:15:08,399
nf4 because 5 decremented by 1 becomes a
7038
05:15:05,360 --> 05:15:11,279
4. i really hope this makes sense ok so
7039
05:15:08,400 --> 05:15:14,240
what we have seen here is postfix
7040
05:15:11,279 --> 05:15:17,199
increment and decrement but we can also
7041
05:15:14,240 --> 05:15:19,200
do a prefix version of this thing if you
7042
05:15:17,200 --> 05:15:20,319
look at the example we have here we have
7043
05:15:20,319 --> 05:15:25,759
and we are saying plus plus value so
7044
05:15:23,279 --> 05:15:28,957
this is going to increment the value
7045
05:15:25,759 --> 05:15:31,519
directly so as soon as this statement is
7046
05:15:28,957 --> 05:15:35,039
executed the plus plus value statement
7047
05:15:31,520 --> 05:15:37,119
here we're going to have a 6 inside and
7048
05:15:35,040 --> 05:15:39,040
if we print it we're going to get a 6
7049
05:15:37,119 --> 05:15:41,759
and this is what you see here if we go
7050
05:15:39,040 --> 05:15:42,958
down we are resetting our value and we
7051
05:15:45,759 --> 05:15:51,359
so in here we are going to increment the
7052
05:15:48,400 --> 05:15:54,080
value before we actually print it here
7053
05:15:51,360 --> 05:15:56,479
and we are also going to get a six year
7054
05:15:54,080 --> 05:15:58,878
i hope this makes sense and if you have
7055
05:15:56,479 --> 05:16:01,119
any problem with this i think if we go
7056
05:15:58,878 --> 05:16:02,718
in visual studio code you're going to
7057
05:16:01,119 --> 05:16:04,399
have a better way to say this you're
7058
05:16:02,718 --> 05:16:07,520
going to see the code running and make
7059
05:16:04,400 --> 05:16:09,360
sense of it okay so i think that
7060
05:16:07,520 --> 05:16:11,920
now you understand why we're going to
7061
05:16:09,360 --> 05:16:13,440
have these numbers printed if we go down
7062
05:16:11,919 --> 05:16:15,679
we can do the same thing with
7063
05:16:13,439 --> 05:16:16,559
decrementing we have a value here it's
7064
05:16:17,599 --> 05:16:22,559
prefix decrement it it's going to be a
7065
05:16:20,159 --> 05:16:23,919
four here and if we print it we're going
7066
05:16:23,919 --> 05:16:29,279
if you go down here we are resetting
7067
05:16:25,680 --> 05:16:32,000
that to five and we are going to prefix
7068
05:16:29,279 --> 05:16:34,319
decrement in place and this is also
7069
05:16:32,000 --> 05:16:37,599
going to print a four because we have a
7070
05:16:34,319 --> 05:16:38,957
five here and if we decrement it by one
7071
05:16:37,599 --> 05:16:41,199
we're going to get a four and that's
7072
05:16:38,957 --> 05:16:44,239
what we're going to get here okay this
7073
05:16:41,200 --> 05:16:46,637
is really all these prefix and postfix
7074
05:16:44,240 --> 05:16:49,040
increment and decrement operators are
7075
05:16:46,637 --> 05:16:51,279
about we are going to go in visual
7076
05:16:49,040 --> 05:16:54,159
studio code and actually see this
7077
05:16:51,279 --> 05:16:56,000
running okay here we are in our working
7078
05:16:54,159 --> 05:16:57,919
directory we're going to do the usual
7079
05:16:56,000 --> 05:17:00,240
we're going to copy code from our
7080
05:16:57,919 --> 05:17:02,559
template project we're going to put that
7081
05:17:00,240 --> 05:17:05,200
in here we're going to go up and open
7082
05:17:02,560 --> 05:17:08,080
this up in visual studio code so we're
7083
05:17:05,200 --> 05:17:09,680
going to remove things we don't need and
7084
05:17:09,680 --> 05:17:15,200
and we are going to put in the code we
7085
05:17:11,840 --> 05:17:18,637
exactly saw in the slides here we have a
7086
05:17:15,200 --> 05:17:20,798
value it is an integer and it is five
7087
05:17:18,637 --> 05:17:24,319
if we increment it by one we're going to
7088
05:17:20,797 --> 05:17:26,159
get a six here okay and if we print it
7089
05:17:24,319 --> 05:17:28,718
that's what we're going to get we are
7090
05:17:26,159 --> 05:17:30,957
resetting this to five and if we
7091
05:17:28,718 --> 05:17:32,400
decrement it by one we're going to get a
7092
05:17:32,400 --> 05:17:37,840
so if we run this piece of code we
7093
05:17:35,040 --> 05:17:39,680
should have a six here printed out
7094
05:17:40,957 --> 05:17:47,119
we're going to bring up our terminal
7095
05:17:43,919 --> 05:17:48,559
and build this with gcc the weld is
7096
05:17:48,560 --> 05:17:54,638
and if we run the program we're going to
7097
05:17:51,279 --> 05:17:57,360
get the value a6 and it is four and this
7098
05:17:54,637 --> 05:17:59,200
is really what we expect here okay now
7099
05:17:57,360 --> 05:18:02,159
that this is really clear we're going to
7100
05:17:59,200 --> 05:18:04,718
go down and play with post fix
7101
05:18:04,718 --> 05:18:10,637
i am going to put in a separator here so
7102
05:18:07,599 --> 05:18:13,759
that we can clearly see in our terminal
7103
05:18:10,637 --> 05:18:16,000
here and we are going to put in our test
7104
05:18:13,759 --> 05:18:19,039
code that we are going to use
7105
05:18:16,000 --> 05:18:20,797
to play with this let's bring this down
7106
05:18:19,040 --> 05:18:23,680
a little bit so that you can see
7107
05:18:20,797 --> 05:18:26,319
everything we can remove these things we
7108
05:18:23,680 --> 05:18:28,000
don't need them anymore okay we are
7109
05:18:26,319 --> 05:18:29,840
going to take the value we had we're
7110
05:18:32,000 --> 05:18:37,119
and if we value plus plus here
7111
05:18:34,957 --> 05:18:40,079
this is going to be a five because we're
7112
05:18:37,119 --> 05:18:41,919
going to capture the value as is so here
7113
05:18:41,919 --> 05:18:46,319
but next time we get this value it's
7114
05:18:44,159 --> 05:18:49,680
going to already be a sex because we
7115
05:18:46,319 --> 05:18:52,079
increment immediately after capturing
7116
05:18:49,680 --> 05:18:55,520
the value here so here we're going to
7117
05:18:52,080 --> 05:18:57,600
get a 5 and here we're going to get a 6.
7118
05:18:57,599 --> 05:19:03,199
and if we go down here we are resetting
7119
05:19:00,560 --> 05:19:04,798
our value to 5 before we do any
7120
05:19:04,797 --> 05:19:09,439
we are going to capture the value as is
7121
05:19:07,599 --> 05:19:10,717
because we are doing post fixed
7122
05:19:10,718 --> 05:19:15,840
and here we are going to get a 5 because
7123
05:19:13,040 --> 05:19:18,080
we are capturing the value as s
7124
05:19:15,840 --> 05:19:20,560
but as soon as we capture our value
7125
05:19:18,080 --> 05:19:22,958
we're going to decrement it and the
7126
05:19:20,560 --> 05:19:25,680
other statement here is going to get a
7127
05:19:22,957 --> 05:19:29,439
decremented value and that's going to be
7128
05:19:25,680 --> 05:19:30,560
a 4. so here we're going to print 5 6 5
7129
05:19:30,560 --> 05:19:36,638
let's try and build this with gcc
7130
05:19:34,718 --> 05:19:39,360
to see that we have no problems we have
7131
05:19:36,637 --> 05:19:41,200
no problems the world is good if we try
7132
05:19:47,439 --> 05:19:53,199
but uh for this code we just put in here
7133
05:19:51,040 --> 05:19:55,040
the value is going to be a 5 and that's
7134
05:19:55,040 --> 05:19:58,638
and we're going to get a 6 which is
7135
05:19:58,637 --> 05:20:03,759
after we are going to decrement and we
7136
05:20:01,279 --> 05:20:06,479
are going to capture the value as is
7137
05:20:03,759 --> 05:20:08,399
we're going to get this 5 here and for
7138
05:20:06,479 --> 05:20:11,520
the last statement we're going to get a
7139
05:20:08,400 --> 05:20:14,240
4 because the value is already
7140
05:20:11,520 --> 05:20:15,520
decremented and that's the for we are
7141
05:20:15,520 --> 05:20:19,600
i really hope this makes sense and this
7142
05:20:19,599 --> 05:20:24,797
the postfix increment and decrement
7143
05:20:22,319 --> 05:20:28,239
operators the last thing we want to see
7144
05:20:24,797 --> 05:20:31,680
in this lecture is that we can also do
7145
05:20:28,240 --> 05:20:34,159
prefix increment and decrementation
7146
05:20:31,680 --> 05:20:35,840
we're going to go down here and
7147
05:20:34,159 --> 05:20:37,680
set up a place where we're going to be
7148
05:20:35,840 --> 05:20:39,439
playing with this so we're going to say
7149
05:20:39,439 --> 05:20:43,439
and we are going to put in our code
7150
05:20:41,360 --> 05:20:46,319
because i don't want to type all this
7151
05:20:43,439 --> 05:20:48,239
that would waste your valuable time but
7152
05:20:46,319 --> 05:20:49,680
i do encourage you to type these things
7153
05:20:49,680 --> 05:20:53,760
drill them in your brain because that's
7154
05:20:51,919 --> 05:20:55,359
how you're going to learn okay let's
7155
05:20:53,759 --> 05:20:58,319
bring this down so that we can
7156
05:20:55,360 --> 05:21:01,600
understand this piece of code so we are
7157
05:20:58,319 --> 05:21:04,319
starting by resetting our value to 5 and
7158
05:21:01,599 --> 05:21:06,877
notice here that we do plus plus value
7159
05:21:04,319 --> 05:21:08,957
this is going to increment value right
7160
05:21:06,878 --> 05:21:12,240
away by this time the value is going to
7161
05:21:08,957 --> 05:21:14,557
be six and if we print it out here we're
7162
05:21:12,240 --> 05:21:16,718
going to have a six printed down we're
7163
05:21:14,558 --> 05:21:19,680
going to reset it to five and then we're
7164
05:21:16,718 --> 05:21:22,319
going to implement that in place this is
7165
05:21:19,680 --> 05:21:23,920
also going to be printing six and if you
7166
05:21:22,319 --> 05:21:25,840
go down we're going to do the same
7167
05:21:23,919 --> 05:21:27,679
version of the same thing but we are
7168
05:21:25,840 --> 05:21:30,000
going to be decrementing so we're going
7169
05:21:27,680 --> 05:21:31,279
to decrement the value that we just
7170
05:21:31,279 --> 05:21:35,599
here it's going to become a 4 and that's
7171
05:21:33,279 --> 05:21:38,239
what we're going to print and if we go
7172
05:21:35,599 --> 05:21:41,599
down here we reset it again to a 5 and
7173
05:21:38,240 --> 05:21:44,878
we prefix decrement it in place
7174
05:21:41,599 --> 05:21:46,637
so the 5 here is going to become a 4
7175
05:21:44,878 --> 05:21:48,958
in here and that's what we're going to
7176
05:21:46,637 --> 05:21:50,399
print out if we build and run that's
7177
05:21:48,957 --> 05:21:53,199
what we're going to get we're going to
7178
05:21:53,200 --> 05:22:00,000
the build is good and if we run our
7179
05:21:56,400 --> 05:22:01,920
rooster application the results for the
7180
05:22:00,000 --> 05:22:03,360
code we just put in here are just going
7181
05:22:03,360 --> 05:22:06,958
and you see that we get a six six this
7182
05:22:06,957 --> 05:22:11,279
the other six and for the last two
7183
05:22:09,599 --> 05:22:13,840
statements we're going to be getting
7184
05:22:11,279 --> 05:22:15,680
fours and that's what we have here i
7185
05:22:13,840 --> 05:22:18,637
really hope that now you have a better
7186
05:22:15,680 --> 05:22:21,520
idea of this prefix and postfix
7187
05:22:18,637 --> 05:22:24,079
increment and decrement operators and
7188
05:22:21,520 --> 05:22:26,159
you're going to make use of them when
7189
05:22:24,080 --> 05:22:28,480
they really helped you design your
7190
05:22:26,159 --> 05:22:31,279
applications better okay so these are
7191
05:22:28,479 --> 05:22:33,040
your tools use them when they make sense
7192
05:22:31,279 --> 05:22:35,199
another thing that i want to emphasize
7193
05:22:33,040 --> 05:22:38,558
here is that these operators only
7194
05:22:35,200 --> 05:22:40,400
increment or a decrement by one you
7195
05:22:40,400 --> 05:22:45,840
do things in increments of five or seven
7196
05:22:43,200 --> 05:22:48,159
or ten they are going to work in
7197
05:22:45,840 --> 05:22:50,000
increments or decrements of one we are
7198
05:22:48,159 --> 05:22:52,319
going to see a way we can do that with
7199
05:22:50,000 --> 05:22:55,119
other operators in the last lecture but
7200
05:22:52,319 --> 05:22:58,079
these prefix and postfix operators can't
7201
05:22:55,119 --> 05:23:00,797
do that and another thing that some of
7202
05:22:58,080 --> 05:23:03,440
you might be wondering about is if we
7203
05:23:00,797 --> 05:23:06,079
have the same kind of operators with
7204
05:23:03,439 --> 05:23:08,479
multiplication or division and we don't
7205
05:23:06,080 --> 05:23:10,000
have those operators in c plus plus
7206
05:23:08,479 --> 05:23:12,239
maybe we're going to have them in the
7207
05:23:10,000 --> 05:23:14,797
future when they make sense but in the
7208
05:23:12,240 --> 05:23:16,638
current version of c plus plus we don't
7209
05:23:14,797 --> 05:23:18,557
have them we are going to stop here in
7210
05:23:16,637 --> 05:23:21,200
this lecture in the next one we're going
7211
05:23:18,558 --> 05:23:23,520
to learn about compound assignment
7212
05:23:21,200 --> 05:23:26,000
operators in this lecture we're going to
7213
05:23:23,520 --> 05:23:27,360
learn about compound assignment
7214
05:23:27,360 --> 05:23:33,119
and these are operators that allow you
7215
05:23:30,080 --> 05:23:35,920
to do an arithmetic operation like
7216
05:23:33,119 --> 05:23:39,360
addition subtraction multiplication
7217
05:23:35,919 --> 05:23:43,039
division and modulus and assign the
7218
05:23:39,360 --> 05:23:45,360
result to a value in one go let's look
7219
05:23:43,040 --> 05:23:48,159
at an example here we have value here
7220
05:23:45,360 --> 05:23:49,920
which is 45 it is an integer and we're
7221
05:23:48,159 --> 05:23:54,079
going to print that out but if you go
7222
05:23:49,919 --> 05:23:56,399
down here we are doing value plus equal
7223
05:23:54,080 --> 05:23:59,440
five and if you look at the comment here
7224
05:23:56,400 --> 05:24:02,080
this is equivalent to if you did value
7225
05:23:59,439 --> 05:24:03,919
equals value plus five so what this is
7226
05:24:02,080 --> 05:24:06,320
going to do it's going to take whatever
7227
05:24:03,919 --> 05:24:08,479
value is in this value here it's going
7228
05:24:06,319 --> 05:24:10,797
to increment that by five so that's
7229
05:24:08,479 --> 05:24:14,159
going to become a 50 and we're going to
7230
05:24:10,797 --> 05:24:16,399
store that 50 results back in this
7231
05:24:14,159 --> 05:24:17,840
variable here so by this time if we
7232
05:24:16,400 --> 05:24:20,319
printed this out we're going to get a
7233
05:24:17,840 --> 05:24:23,200
50. again we're going to take the value
7234
05:24:20,319 --> 05:24:25,360
it is a 45 we're going to add a 5 it's
7235
05:24:23,200 --> 05:24:28,718
going to become a 50 and we're going to
7236
05:24:25,360 --> 05:24:31,600
store that result back in this value
7237
05:24:28,718 --> 05:24:33,440
variable here it's going to become 50
7238
05:24:31,599 --> 05:24:36,479
and if we print here we're going to get
7239
05:24:33,439 --> 05:24:39,520
a 50. this is the addition version of
7240
05:24:36,479 --> 05:24:42,239
the compound assignment operator we also
7241
05:24:39,520 --> 05:24:44,400
have a version for subtraction and we
7242
05:24:42,240 --> 05:24:46,638
have an example of that here so it's
7243
05:24:44,400 --> 05:24:48,798
going to take whatever value is in this
7244
05:24:46,637 --> 05:24:51,919
value variable it is going to find in a
7245
05:24:48,797 --> 05:24:54,479
50 we're going to subtract 5 we're going
7246
05:24:51,919 --> 05:24:56,877
to get a 45 and that's what we're going
7247
05:24:56,878 --> 05:25:03,200
and by the time we hit this stdc out
7248
05:25:00,558 --> 05:25:05,120
statement we're going to print a 45.
7249
05:25:03,200 --> 05:25:07,280
again we have another version for the
7250
05:25:05,119 --> 05:25:09,680
multiplication here so that we can
7251
05:25:07,279 --> 05:25:11,520
really play with all these things
7252
05:25:09,680 --> 05:25:14,000
we're going to take whatever value is in
7253
05:25:11,520 --> 05:25:16,878
here we're going to multiply that by 2
7254
05:25:14,000 --> 05:25:18,637
here we're going to get a 90 and that's
7255
05:25:16,878 --> 05:25:20,958
what we're going to store back in this
7256
05:25:18,637 --> 05:25:22,718
value and if we print here we're going
7257
05:25:22,718 --> 05:25:27,600
printed out we're going to go down and
7258
05:25:24,637 --> 05:25:30,557
do a version for a division the value is
7259
05:25:27,599 --> 05:25:32,957
90 we're going to divide that by 30 and
7260
05:25:30,558 --> 05:25:36,080
we're going to store the result back in
7261
05:25:32,957 --> 05:25:38,877
value here and we're going to get a 30
7262
05:25:36,080 --> 05:25:41,040
stored in here and if we print out
7263
05:25:38,878 --> 05:25:43,520
that's what we're going to get here
7264
05:25:41,040 --> 05:25:45,440
we also have a modulus version of this
7265
05:25:45,439 --> 05:25:51,199
here we have unit 30 we're going to take
7266
05:25:47,599 --> 05:25:54,239
it and do modulus 11 and what is the
7267
05:25:54,240 --> 05:25:58,240
by 11. the reminder is going to be 8
7268
05:25:58,240 --> 05:26:04,000
11 can only fit in 30 two times and
7269
05:26:02,319 --> 05:26:05,040
we're going to be left with the knight
7270
05:26:05,040 --> 05:26:10,400
30 minus 22 is eight and that's what
7271
05:26:08,240 --> 05:26:12,558
we're going to store in the value here
7272
05:26:10,400 --> 05:26:14,400
and if we print out that's what we're
7273
05:26:14,400 --> 05:26:19,040
if you have trouble understanding this
7274
05:26:16,319 --> 05:26:21,200
modulus operator here please go back in
7275
05:26:19,040 --> 05:26:23,440
a few lectures back we had a chance to
7276
05:26:21,200 --> 05:26:25,760
learn about it make sure you understand
7277
05:26:23,439 --> 05:26:27,439
it and then come back here and this is
7278
05:26:27,439 --> 05:26:32,877
this is really all compound assignment
7279
05:26:30,479 --> 05:26:35,200
is all about we're going to head to
7280
05:26:32,878 --> 05:26:39,040
visual studio code and actually play
7281
05:26:35,200 --> 05:26:41,520
with us okay here we are in our working
7282
05:26:39,040 --> 05:26:44,798
directory we're going to copy our
7283
05:26:41,520 --> 05:26:48,240
template project as we always do
7284
05:26:44,797 --> 05:26:50,797
and we're going to put that in our
7285
05:26:48,240 --> 05:26:52,320
compound assignment operators
7286
05:26:52,319 --> 05:26:56,797
we're going to come up and we are going
7287
05:26:54,558 --> 05:26:58,878
to open this folder in visual studio
7288
05:26:56,797 --> 05:27:01,279
code the project is going to show up in
7289
05:26:58,878 --> 05:27:04,718
here and we're going to open our main
7290
05:27:01,279 --> 05:27:06,557
cpp file and we are going to remove what
7291
05:27:06,558 --> 05:27:12,400
we are going to put in our code so that
7292
05:27:08,718 --> 05:27:14,400
we can start exploring this we have a 45
7293
05:27:12,400 --> 05:27:16,558
and this variable here which is an
7294
05:27:14,400 --> 05:27:18,159
integer if we print it out we're going
7295
05:27:19,919 --> 05:27:25,439
we are doing a compound addition
7296
05:27:23,279 --> 05:27:28,399
so what we are doing here we're going to
7297
05:27:25,439 --> 05:27:30,479
grab whatever value is in this variable
7298
05:27:28,400 --> 05:27:32,480
we're going to add a five we're going to
7299
05:27:30,479 --> 05:27:34,239
get a 50 and that's what is going to be
7300
05:27:34,240 --> 05:27:40,638
and if we print this out we're going to
7301
05:27:36,240 --> 05:27:42,878
get a 50. let's put in a terminal here
7302
05:27:40,637 --> 05:27:45,039
so that we can see this running and
7303
05:27:42,878 --> 05:27:48,400
we're going to run the task to build
7304
05:27:50,840 --> 05:27:56,797
executable we're going to get the value
7305
05:27:53,360 --> 05:27:58,718
is 50 and that's what we expect here
7306
05:27:58,718 --> 05:28:04,400
addition version of our compound
7307
05:28:01,520 --> 05:28:07,760
assignment operator and it is really
7308
05:28:04,400 --> 05:28:10,319
equivalent to doing this in two steps
7309
05:28:07,759 --> 05:28:12,079
saying value equals value plus five
7310
05:28:10,319 --> 05:28:14,400
you're going to get the same result if
7311
05:28:12,080 --> 05:28:17,360
you do that here actually let's do this
7312
05:28:14,400 --> 05:28:20,240
so that you don't think that i am making
7313
05:28:17,360 --> 05:28:22,159
this up so let's comment this out and we
7314
05:28:22,159 --> 05:28:29,040
equals value plus five and if we build
7315
05:28:31,279 --> 05:28:37,039
we're going to see the same thing we can
7316
05:28:33,599 --> 05:28:40,000
also go down and run the subtraction
7317
05:28:37,040 --> 05:28:42,000
version of this example here here we are
7318
05:28:40,000 --> 05:28:43,599
taking the value that we have in here
7319
05:28:43,599 --> 05:28:49,439
we are subtracting 5 we're going to get
7320
05:28:45,680 --> 05:28:51,200
a 45 and 45 is what we're going to store
7321
05:28:51,200 --> 05:28:54,718
that's what we're going to see if we
7322
05:28:54,718 --> 05:29:01,200
let's run the test world with gcc
7323
05:28:57,840 --> 05:29:03,360
so that our changes are reflected in our
7324
05:29:01,200 --> 05:29:06,558
output we're going to run this and we're
7325
05:29:03,360 --> 05:29:08,797
going to get a 45 this is what we expect
7326
05:29:06,558 --> 05:29:11,360
we are going to go down and do a
7327
05:29:08,797 --> 05:29:14,239
multiplication version of this
7328
05:29:11,360 --> 05:29:16,718
here we have our compound assignment
7329
05:29:14,240 --> 05:29:18,798
statement we are taking whatever value
7330
05:29:16,718 --> 05:29:21,520
we have in here which is a 45 we're
7331
05:29:18,797 --> 05:29:24,239
going to multiply that by 2 and the
7332
05:29:21,520 --> 05:29:26,479
result of that is going to be 90 and
7333
05:29:24,240 --> 05:29:28,320
we're going to store that back in value
7334
05:29:26,479 --> 05:29:31,040
here and if we print value here we're
7335
05:29:28,319 --> 05:29:33,840
going to get a 19. let's build this run
7336
05:29:31,040 --> 05:29:35,520
the gcc task and we're going to run our
7337
05:29:33,840 --> 05:29:37,759
program and we're going to see that
7338
05:29:35,520 --> 05:29:40,080
we're going to see this 90 here we can
7339
05:29:37,759 --> 05:29:42,797
go down by a few lines and put in the
7340
05:29:40,080 --> 05:29:43,600
code to play with a division version of
7341
05:29:43,599 --> 05:29:48,159
again this is going to do really the
7342
05:29:46,000 --> 05:29:50,240
same thing only it's going to be doing
7343
05:29:48,159 --> 05:29:52,159
this for division we're going to take
7344
05:29:50,240 --> 05:29:54,798
whatever value we have in here which is
7345
05:29:52,159 --> 05:29:57,840
going to be a 90 we're going to divide
7346
05:29:54,797 --> 05:30:01,039
that by 3 we're going to get a 30 and
7347
05:29:57,840 --> 05:30:04,000
that 30 results is going to be stored
7348
05:30:01,040 --> 05:30:06,479
back in value here and if we print this
7349
05:30:04,000 --> 05:30:08,797
out that's what we're going to get
7350
05:30:06,479 --> 05:30:11,040
let's build again and the build is going
7351
05:30:11,040 --> 05:30:15,840
our program we're going to get a 30. we
7352
05:30:13,680 --> 05:30:19,040
are going to go down by a few lines and
7353
05:30:15,840 --> 05:30:21,040
put in a modulus version of this we're
7354
05:30:19,040 --> 05:30:23,600
going to grab whatever value we have and
7355
05:30:21,040 --> 05:30:27,360
this variable here which is going to be
7356
05:30:23,599 --> 05:30:28,319
30 we're going to do modulus 11 on that
7357
05:30:28,319 --> 05:30:33,759
and that's going to be basically 30
7358
05:30:30,878 --> 05:30:35,200
modulus 11. the result of that is going
7359
05:30:35,200 --> 05:30:40,637
and we're going to store that result in
7360
05:30:37,759 --> 05:30:42,479
value here and if we print that out
7361
05:30:40,637 --> 05:30:45,599
that's what we're going to see in this
7362
05:30:42,479 --> 05:30:49,439
output statement here we can build again
7363
05:30:45,599 --> 05:30:52,479
run with gcc and if we run our rooster
7364
05:30:49,439 --> 05:30:55,039
program we're going to get an 8 printed
7365
05:30:55,040 --> 05:31:00,159
these compound assignments are about and
7366
05:31:00,159 --> 05:31:04,079
why go through the trouble to do
7367
05:31:01,919 --> 05:31:06,479
something like this if i can do this
7368
05:31:04,080 --> 05:31:08,718
like this well c plus plus gives you
7369
05:31:06,479 --> 05:31:11,119
different way to do things different
7370
05:31:08,718 --> 05:31:14,159
people have different preferences and
7371
05:31:11,119 --> 05:31:16,399
some people me included like to do
7372
05:31:14,159 --> 05:31:18,479
things this way because it is compact
7373
05:31:16,400 --> 05:31:20,159
and once you use this you're going to
7374
05:31:18,479 --> 05:31:22,637
get used to this you're not even going
7375
05:31:20,159 --> 05:31:25,279
to think about it in this lecture here i
7376
05:31:22,637 --> 05:31:27,759
just wanted you to be aware of this
7377
05:31:25,279 --> 05:31:30,797
possibility because you are definitely
7378
05:31:27,759 --> 05:31:31,679
going to see it in c plus plus code out
7379
05:31:31,680 --> 05:31:34,957
this is really all we set out to do in
7380
05:31:33,360 --> 05:31:37,279
this lecture i hope you found it
7381
05:31:34,957 --> 05:31:39,119
interesting we are going to stop here in
7382
05:31:37,279 --> 05:31:42,557
this lecture in the next one we're going
7383
05:31:39,119 --> 05:31:44,637
to learn about relational operators in c
7384
05:31:42,558 --> 05:31:47,760
plus plus in this lecture we're going to
7385
05:31:44,637 --> 05:31:49,919
learn about relational operators in c
7386
05:31:47,759 --> 05:31:53,279
plus plus and these are basically
7387
05:31:49,919 --> 05:31:56,159
operators you use to compare stuff let's
7388
05:31:53,279 --> 05:32:00,239
look at a piece of code here we have two
7389
05:31:56,159 --> 05:32:03,040
numbers one is 45 and another is 60 they
7390
05:32:00,240 --> 05:32:04,958
are stored in integer variables number
7391
05:32:04,957 --> 05:32:10,557
we can print them out and we're going to
7392
05:32:06,718 --> 05:32:13,200
see them on the console or our terminal
7393
05:32:10,558 --> 05:32:16,319
and if we go down we can really compare
7394
05:32:13,200 --> 05:32:19,119
them we can use the less than operator
7395
05:32:19,119 --> 05:32:24,957
greater than greater or equal operator
7396
05:32:22,080 --> 05:32:27,840
we can check and see if two numbers are
7397
05:32:24,957 --> 05:32:30,079
equal by using two equal signs here be
7398
05:32:27,840 --> 05:32:32,319
careful about these two equal signs
7399
05:32:30,080 --> 05:32:34,798
because if you use one you're not going
7400
05:32:32,319 --> 05:32:36,637
to be comparing numbers you're going to
7401
05:32:34,797 --> 05:32:39,360
be taking the thing on the right and
7402
05:32:36,637 --> 05:32:41,599
assigning that to the thing on the left
7403
05:32:39,360 --> 05:32:44,479
so if you want to compare you're going
7404
05:32:41,599 --> 05:32:47,279
to have to type two equal signs another
7405
05:32:44,479 --> 05:32:50,079
operator we can use to compare stuff is
7406
05:32:47,279 --> 05:32:52,797
exclamation mark and equal which is
7407
05:32:50,080 --> 05:32:54,000
going to basically test if two numbers
7408
05:32:54,000 --> 05:32:59,119
and we're going to get the result one
7409
05:32:56,400 --> 05:33:02,958
thing you should notice here is that we
7410
05:32:59,119 --> 05:33:05,919
are wrapping our comparison expression
7411
05:33:02,957 --> 05:33:07,680
into parenthesis that's because if we
7412
05:33:05,919 --> 05:33:10,159
don't we're going to get a weird
7413
05:33:07,680 --> 05:33:12,718
compiler error that i am going to show
7414
05:33:10,159 --> 05:33:15,040
you when we get in visual studio code
7415
05:33:12,718 --> 05:33:17,040
but we don't have enough tools to really
7416
05:33:17,040 --> 05:33:22,159
at this moment so what we are going to
7417
05:33:19,680 --> 05:33:24,878
do is avoid that problem by putting
7418
05:33:22,159 --> 05:33:26,957
parenthesis around our comparison
7419
05:33:24,878 --> 05:33:29,520
expression here we're going to go to
7420
05:33:26,957 --> 05:33:32,957
visual studio code and actually see this
7421
05:33:29,520 --> 05:33:35,040
in action here we are in our working
7422
05:33:32,957 --> 05:33:37,279
directory we're going to grab the code
7423
05:33:35,040 --> 05:33:39,840
from our template here and we're going
7424
05:33:37,279 --> 05:33:40,840
to put that in the current project which
7425
05:33:40,840 --> 05:33:46,000
relational operators we're going to go
7426
05:33:42,957 --> 05:33:48,159
in and put in our code and we are going
7427
05:33:46,000 --> 05:33:50,159
to open this up in visual studio code
7428
05:33:48,159 --> 05:33:52,797
we're going to get rid of things we
7429
05:33:50,159 --> 05:33:55,040
don't need here we are going to put in
7430
05:33:52,797 --> 05:33:57,759
our code so that we can explore these
7431
05:33:55,040 --> 05:34:00,878
things we have two variables in one we
7432
05:33:57,759 --> 05:34:02,877
have a 45 in another we have a 60 and
7433
05:34:00,878 --> 05:34:05,840
these are integers the name for these
7434
05:34:02,878 --> 05:34:07,600
variables are number one and number two
7435
05:34:05,840 --> 05:34:10,240
we're going to print them out and we're
7436
05:34:07,599 --> 05:34:11,919
going to see them on the console now we
7437
05:34:11,919 --> 05:34:18,797
one thing i haven't told you yet is that
7438
05:34:14,400 --> 05:34:21,600
these comparison operators evaluate to
7439
05:34:18,797 --> 05:34:24,479
booleans in other words they are going
7440
05:34:21,599 --> 05:34:25,759
to return true all false if you look
7441
05:34:25,759 --> 05:34:31,599
we want to know if number one is less
7442
05:34:28,957 --> 05:34:33,759
than number two and the result of that
7443
05:34:31,599 --> 05:34:35,279
is whether that's true or false and this
7444
05:34:35,279 --> 05:34:42,797
so because of that we are using std bull
7445
05:34:39,279 --> 05:34:45,840
alpha here to force sddc out to print
7446
05:34:42,797 --> 05:34:48,717
this boolean value here as a true or
7447
05:34:45,840 --> 05:34:51,599
false instead of a one or a zero and we
7448
05:34:48,718 --> 05:34:54,718
have seen this before so if we try to
7449
05:34:51,599 --> 05:34:56,637
build this and run this let's bring up a
7450
05:34:56,637 --> 05:35:02,159
and we're going to run the test to build
7451
05:34:58,558 --> 05:35:04,319
with gcc if we go down here and run our
7452
05:35:02,159 --> 05:35:07,759
rooster program we're going to get our
7453
05:35:04,319 --> 05:35:10,479
two numbers 45 and six and we want to
7454
05:35:07,759 --> 05:35:14,079
know if number one is less than number
7455
05:35:10,479 --> 05:35:16,239
two and that's true 45 is less than 60
7456
05:35:14,080 --> 05:35:18,638
so the result of this expression is
7457
05:35:16,240 --> 05:35:20,958
going to be true now you know how to use
7458
05:35:18,637 --> 05:35:23,439
this operator one thing i want you to
7459
05:35:24,718 --> 05:35:30,159
didn't use this parenthesis around this
7460
05:35:27,680 --> 05:35:32,159
expression here let's try this out we're
7461
05:35:30,159 --> 05:35:34,718
going to remove this parenthesis and
7462
05:35:32,159 --> 05:35:37,919
we're going to try and world we're going
7463
05:35:34,718 --> 05:35:40,319
to run the task to world with gcc and
7464
05:35:37,919 --> 05:35:41,759
we're going to get a really weird error
7465
05:35:41,759 --> 05:35:47,119
the compiler is going to try and
7466
05:35:43,840 --> 05:35:49,759
evaluate this operator first if we go
7467
05:35:47,119 --> 05:35:51,360
back to our c plus plus operator
7468
05:35:51,360 --> 05:35:57,200
and look at the operators we are trying
7469
05:35:53,919 --> 05:35:59,359
to use in the sddc out statement we're
7470
05:35:59,360 --> 05:36:05,680
operator to print fans on the console
7471
05:36:02,240 --> 05:36:08,718
has high precedence than our comparison
7472
05:36:05,680 --> 05:36:11,680
operators here so the precedence for our
7473
05:36:08,718 --> 05:36:15,200
operator to print things to sdd out is
7474
05:36:15,200 --> 05:36:21,360
precedence for our comparison operators
7475
05:36:18,240 --> 05:36:23,920
is nine and eight so the compiler is
7476
05:36:21,360 --> 05:36:26,000
going to try and do this operator first
7477
05:36:23,919 --> 05:36:27,759
if we come back in visual studio code
7478
05:36:26,000 --> 05:36:30,319
the compiler is going to try and think
7479
05:36:27,759 --> 05:36:32,239
that you are printing number one but
7480
05:36:30,319 --> 05:36:34,797
then again it's going to see this less
7481
05:36:32,240 --> 05:36:37,120
than sign and things are going to blow
7482
05:36:34,797 --> 05:36:39,199
up we don't really have enough tools to
7483
05:36:37,119 --> 05:36:41,680
understand what is going on right now
7484
05:36:39,200 --> 05:36:46,080
but i just don't want you to see this
7485
05:36:41,680 --> 05:36:48,400
arrow and show you a way to go around it
7486
05:36:46,080 --> 05:36:51,280
and move on with your life by comparing
7487
05:36:48,400 --> 05:36:53,360
stuff in your c plus plus programs if
7488
05:36:51,279 --> 05:36:55,199
you put parentheses around here the
7489
05:36:53,360 --> 05:36:56,718
problem is going to go away let's try
7490
05:36:56,718 --> 05:37:01,280
we're going to build with gcc
7491
05:36:59,360 --> 05:37:04,080
and everything is going to go back to
7492
05:37:01,279 --> 05:37:07,599
normal and we're going to see our output
7493
05:37:04,080 --> 05:37:10,000
if we run our rooster program here
7494
05:37:07,599 --> 05:37:11,759
this is how you can do this okay now
7495
05:37:10,000 --> 05:37:14,637
that we have a basic understanding of
7496
05:37:11,759 --> 05:37:17,759
this we can try the other operators and
7497
05:37:14,637 --> 05:37:20,479
it is going to be a walk in the park we
7498
05:37:17,759 --> 05:37:24,399
are going to go down here and put in our
7499
05:37:20,479 --> 05:37:28,079
remaining operators we can use less or
7500
05:37:24,400 --> 05:37:31,120
eco operator to test and see if number
7501
05:37:28,080 --> 05:37:33,440
one is less or equal to number two we
7502
05:37:31,119 --> 05:37:36,079
can use the greater than operator to
7503
05:37:33,439 --> 05:37:38,637
test and see if number one is greater
7504
05:37:36,080 --> 05:37:40,400
than number two we can use the greater
7505
05:37:40,400 --> 05:37:44,718
we can use the equal equal operator to
7506
05:37:42,479 --> 05:37:47,439
test that number one is equal to number
7507
05:37:44,718 --> 05:37:50,400
two and we can use this operator here
7508
05:37:47,439 --> 05:37:53,599
which is made up of the exclamation mark
7509
05:37:50,400 --> 05:37:56,000
and an equal sign to test and see
7510
05:37:56,000 --> 05:38:00,718
and all these operators are going to
7511
05:38:00,718 --> 05:38:06,637
basically saying if what you are testing
7512
05:38:03,520 --> 05:38:08,878
for is true or false and we can print
7513
05:38:06,637 --> 05:38:11,200
this out and notice that we have this
7514
05:38:08,878 --> 05:38:14,240
parenthesis around to avoid the problem
7515
05:38:11,200 --> 05:38:16,159
i just showed you a few minutes earlier
7516
05:38:14,240 --> 05:38:17,920
and if we run this we're going to see
7517
05:38:17,919 --> 05:38:24,957
let's weld this with gcc as usual
7518
05:38:22,637 --> 05:38:27,200
we're going to run our program and
7519
05:38:24,957 --> 05:38:30,159
you're going to see that number one is
7520
05:38:27,200 --> 05:38:32,637
less than number two this is true
7521
05:38:30,159 --> 05:38:34,240
number one less or equal to number two
7522
05:38:34,240 --> 05:38:40,558
number one greater than a number two 45
7523
05:38:37,599 --> 05:38:43,199
is not greater than 60 so this is false
7524
05:38:40,558 --> 05:38:44,718
it's not greater than equal so this is
7525
05:38:44,718 --> 05:38:49,200
number one equals to number two this is
7526
05:38:46,957 --> 05:38:51,680
going to be false and uh the last
7527
05:38:49,200 --> 05:38:54,878
statement that is going to test and see
7528
05:38:51,680 --> 05:38:57,680
if number one is not equal to number two
7529
05:38:54,878 --> 05:39:00,319
is going to evaluate to true because
7530
05:38:57,680 --> 05:39:02,637
number one is not equal to number two if
7531
05:39:00,319 --> 05:39:05,040
this is not making sense yet please go
7532
05:39:02,637 --> 05:39:07,919
through it a couple of times and if you
7533
05:39:05,040 --> 05:39:10,319
have a problem please do ask me i will
7534
05:39:07,919 --> 05:39:12,319
do the best i can to help you out
7535
05:39:10,319 --> 05:39:13,599
another thing i want you to see before i
7536
05:39:13,599 --> 05:39:20,319
is that you can store the results of
7537
05:39:16,718 --> 05:39:22,637
these operators into a variable and use
7538
05:39:20,319 --> 05:39:24,637
that later in your program for example
7539
05:39:22,637 --> 05:39:25,840
here we can take our expression to
7540
05:39:25,840 --> 05:39:31,200
number one and number two the result of
7541
05:39:29,200 --> 05:39:32,558
that is going to be installed in this
7542
05:39:32,558 --> 05:39:36,400
and we can print it out later
7543
05:39:37,759 --> 05:39:42,479
we're going to build with gcc and we're
7544
05:39:42,479 --> 05:39:49,520
we're going to see that 45 equals to 60
7545
05:39:46,400 --> 05:39:51,840
is false and it is coming from this
7546
05:39:49,520 --> 05:39:54,080
statement here you can try and change
7547
05:39:51,840 --> 05:39:57,920
these numbers for example change this to
7548
05:39:54,080 --> 05:40:00,400
a 20 and see the results that we get and
7549
05:39:57,919 --> 05:40:03,199
you can try and run these in your mind
7550
05:40:00,400 --> 05:40:05,520
and see that they really make sense if
7551
05:40:03,200 --> 05:40:07,520
we run rooster now we're going to get to
7552
05:40:05,520 --> 05:40:12,558
different results because we are now
7553
05:40:07,520 --> 05:40:14,400
comparing 45 and 20 and here at the last
7554
05:40:12,558 --> 05:40:16,558
statement you see that they are not
7555
05:40:14,400 --> 05:40:19,840
equal if we put into equal numbers we're
7556
05:40:16,558 --> 05:40:22,400
going to get a true there let's try this
7557
05:40:19,840 --> 05:40:25,920
out we're going to run the task to build
7558
05:40:22,400 --> 05:40:29,120
with gcc and if we clear so that we get
7559
05:40:25,919 --> 05:40:30,557
rid of all this noise and run rooster
7560
05:40:30,558 --> 05:40:35,680
20 is equal to 20 and this is true this
7561
05:40:34,080 --> 05:40:38,160
is really all we set out to do in this
7562
05:40:35,680 --> 05:40:40,558
lecture i hope you have a better idea of
7563
05:40:38,159 --> 05:40:41,439
these relational operators in z plus
7564
05:40:41,439 --> 05:40:45,359
we're going to stop here in this lecture
7565
05:40:43,759 --> 05:40:48,797
in the next lecture we're going to learn
7566
05:40:45,360 --> 05:40:51,200
about logical operators in c plus plus
7567
05:40:48,797 --> 05:40:53,119
go ahead and finish up here and meet me
7568
05:40:51,200 --> 05:40:56,000
there in this lecture we're going to
7569
05:40:53,119 --> 05:40:59,360
learn about logical operators these
7570
05:40:56,000 --> 05:41:01,279
operators will work on boolean operands
7571
05:40:59,360 --> 05:41:03,760
we're going to look at end first to
7572
05:41:01,279 --> 05:41:06,637
really make sense of how they work here
7573
05:41:03,759 --> 05:41:09,039
is a simple table we can use to try out
7574
05:41:06,637 --> 05:41:12,079
the end operation it is going to be
7575
05:41:09,040 --> 05:41:14,798
working on two operands a and b
7576
05:41:12,080 --> 05:41:18,000
and in the third column here we're going
7577
05:41:14,797 --> 05:41:21,599
to have the result so if a is false and
7578
05:41:21,599 --> 05:41:27,279
the result is going to be false if a is
7579
05:41:24,319 --> 05:41:31,119
false and b is true the result is going
7580
05:41:27,279 --> 05:41:34,159
to be false if a is true and b is false
7581
05:41:31,119 --> 05:41:37,119
the result is going to be false if a is
7582
05:41:34,159 --> 05:41:39,599
true and b is true the result is going
7583
05:41:37,119 --> 05:41:42,797
to be true the way you can think about
7584
05:41:42,797 --> 05:41:49,439
if any of the operands is false the
7585
05:41:47,040 --> 05:41:52,000
result is going to be false and if you
7586
05:41:49,439 --> 05:41:54,399
really use this way of understanding
7587
05:41:52,000 --> 05:41:56,400
this it is going to be really easy and
7588
05:41:54,400 --> 05:41:58,638
the first line here we have a false so
7589
05:41:56,400 --> 05:42:00,319
the result is going to be false and the
7590
05:41:58,637 --> 05:42:02,718
second line we have a force it's going
7591
05:42:00,319 --> 05:42:04,957
to be force in the third line we have a
7592
05:42:02,718 --> 05:42:08,000
false the result is going to be false
7593
05:42:04,957 --> 05:42:10,637
but in the line number four here we
7594
05:42:08,000 --> 05:42:13,200
don't have a false a is true and b is
7595
05:42:10,637 --> 05:42:16,159
true so the result is going to be true
7596
05:42:16,159 --> 05:42:24,079
and it is going to evaluate to true
7597
05:42:20,400 --> 05:42:26,400
if any of the operands is true let's
7598
05:42:24,080 --> 05:42:29,440
look at the first line here a is false
7599
05:42:26,400 --> 05:42:31,600
and b is false so we don't have a true
7600
05:42:29,439 --> 05:42:33,439
the result is going to be false on the
7601
05:42:31,599 --> 05:42:35,919
second line we have a true the research
7602
05:42:33,439 --> 05:42:37,840
is going to be true on the third line we
7603
05:42:35,919 --> 05:42:41,119
have a true the research is going to be
7604
05:42:37,840 --> 05:42:43,599
true on line number four we have a true
7605
05:42:41,119 --> 05:42:45,919
the result is going to be true and you
7606
05:42:43,599 --> 05:42:49,039
don't really have to memorize these
7607
05:42:45,919 --> 05:42:51,199
tables if you use these operators long
7608
05:42:49,040 --> 05:42:53,760
enough these things are going to be
7609
05:42:51,200 --> 05:42:56,479
drilled in your memory if you have any
7610
05:42:53,759 --> 05:42:58,637
problem with these operators just look
7611
05:42:56,479 --> 05:43:00,797
up tables like this and you can find
7612
05:42:58,637 --> 05:43:03,680
whatever it is you need without really
7613
05:43:00,797 --> 05:43:06,319
memorizing these things another operator
7614
05:43:03,680 --> 05:43:09,360
is the not operator which is going to
7615
05:43:06,319 --> 05:43:11,279
negate whatever you give it so if a is
7616
05:43:09,360 --> 05:43:14,319
true and we negate that we're going to
7617
05:43:11,279 --> 05:43:16,319
get a false if a is false and when you
7618
05:43:14,319 --> 05:43:19,439
get to that we're going to get it true
7619
05:43:16,319 --> 05:43:21,680
and we use this exfoliation mark to say
7620
05:43:19,439 --> 05:43:25,759
that we are negating something if you go
7621
05:43:21,680 --> 05:43:29,040
back to or it is denoted by these two
7622
05:43:25,759 --> 05:43:31,919
vertical bars and the end operator is
7623
05:43:29,040 --> 05:43:34,400
denoted by these two ampersand
7624
05:43:31,919 --> 05:43:36,957
symbols here okay now that we know about
7625
05:43:34,400 --> 05:43:39,440
these logical tables for these logical
7626
05:43:36,957 --> 05:43:41,359
operators we can actually try to use
7627
05:43:41,360 --> 05:43:45,520
here we have three boolean variables we
7628
05:43:45,520 --> 05:43:51,520
a is true b is false c is true we can
7629
05:43:49,599 --> 05:43:54,079
print them out and you see that we are
7630
05:43:51,520 --> 05:43:57,119
setting up sddc out to give us the
7631
05:43:54,080 --> 05:43:59,360
results in the format of true and false
7632
05:43:59,360 --> 05:44:04,878
and down here you see that we are trying
7633
05:44:01,680 --> 05:44:08,957
to use the and logical operator
7634
05:44:04,878 --> 05:44:11,440
down here you have a and b a and c and
7635
05:44:08,957 --> 05:44:13,680
we are doing this on three operators and
7636
05:44:11,439 --> 05:44:17,359
chaining these things up so we are
7637
05:44:13,680 --> 05:44:19,520
saying a and b and c and let's try and
7638
05:44:17,360 --> 05:44:22,080
do this in our mind to see that we
7639
05:44:19,520 --> 05:44:25,040
really understand this we have seen that
7640
05:44:22,080 --> 05:44:27,920
the end operator evaluates to true
7641
05:44:25,040 --> 05:44:30,718
when all operands are true another way
7642
05:44:27,919 --> 05:44:33,279
to say this is the end operator
7643
05:44:30,718 --> 05:44:36,000
evaluates to false if any of the
7644
05:44:33,279 --> 05:44:39,360
operands is false so we're going to end
7645
05:44:36,000 --> 05:44:41,599
a and b a is true b is false so the
7646
05:44:39,360 --> 05:44:44,558
result is going to be false because we
7647
05:44:41,599 --> 05:44:47,439
have a false in here a and c is going to
7648
05:44:44,558 --> 05:44:50,878
evaluate to true because a and c are
7649
05:44:47,439 --> 05:44:53,840
true a and b and c is going to evaluate
7650
05:44:50,878 --> 05:44:57,040
to false because we have a false in here
7651
05:44:53,840 --> 05:44:59,759
even if you have 1 000 tools and you end
7652
05:44:57,040 --> 05:45:03,040
that with one false that's going to be
7653
05:44:59,759 --> 05:45:05,679
dragged down to evaluate to false that's
7654
05:45:03,040 --> 05:45:08,878
what we are seeing here we can also do
7655
05:45:05,680 --> 05:45:11,840
all operations on these things and
7656
05:45:08,878 --> 05:45:13,520
this is going to give you a true if any
7657
05:45:13,520 --> 05:45:19,119
is true we know that a is true and b is
7658
05:45:16,957 --> 05:45:21,919
false so this is going to evaluate to
7659
05:45:19,119 --> 05:45:24,000
true a and c is also going to evaluate
7660
05:45:24,000 --> 05:45:29,759
a and b and c is going to evaluate the
7661
05:45:29,759 --> 05:45:34,000
so let's go back and see this these are
7662
05:45:31,840 --> 05:45:36,878
the values we're going to be using here
7663
05:45:34,000 --> 05:45:38,718
we can also try out the nut operator and
7664
05:45:36,878 --> 05:45:41,200
it is going to negate whatever we gave
7665
05:45:38,718 --> 05:45:43,760
it so if a is true we're going to get a
7666
05:45:41,200 --> 05:45:46,400
false b is false we're going to get it
7667
05:45:43,759 --> 05:45:48,239
true c is true we're going to get a
7668
05:45:46,400 --> 05:45:51,840
false another thing you can do is
7669
05:45:48,240 --> 05:45:54,400
combine this logical operators so we can
7670
05:45:51,840 --> 05:45:55,680
do something like a and b and all of
7671
05:45:55,680 --> 05:46:00,479
and you should notice that we are
7672
05:45:57,840 --> 05:46:02,718
wrapping our expressions here in
7673
05:46:00,479 --> 05:46:04,957
parenthesis so that we don't have the
7674
05:46:02,718 --> 05:46:07,360
same problem we experienced and
7675
05:46:04,957 --> 05:46:09,279
explained in the last lecture and one
7676
05:46:07,360 --> 05:46:12,718
thing you should know is that for the
7677
05:46:09,279 --> 05:46:15,199
compiler to evaluate these things we are
7678
05:46:12,718 --> 05:46:18,080
going to follow the rules in our table
7679
05:46:15,200 --> 05:46:20,080
for precedence and associativity but we
7680
05:46:18,080 --> 05:46:23,680
used parentheses to really make this
7681
05:46:20,080 --> 05:46:24,718
easy to follow so we are going to end a
7682
05:46:24,718 --> 05:46:29,760
and the result of that is going to be
7683
05:46:26,797 --> 05:46:31,279
ored with c and you can try and do this
7684
05:46:29,759 --> 05:46:33,359
in your mind and you're going to figure
7685
05:46:31,279 --> 05:46:35,119
this out but we're also going to go to
7686
05:46:33,360 --> 05:46:37,680
visual studio code in a minute and we're
7687
05:46:35,119 --> 05:46:40,000
going to see all these things in action
7688
05:46:37,680 --> 05:46:43,040
the last thing you can do is combine
7689
05:46:40,000 --> 05:46:46,080
logical and relational operators into
7690
05:46:43,040 --> 05:46:48,878
expressions for example here we have d e
7691
05:46:46,080 --> 05:46:51,440
and f they are integers and we can print
7692
05:46:48,878 --> 05:46:53,040
them out like we are doing here but we
7693
05:46:55,200 --> 05:47:00,958
and we're going to end the result of
7694
05:47:00,957 --> 05:47:07,840
and we know that these relational
7695
05:47:03,919 --> 05:47:10,000
operators evaluate to booleans so we can
7696
05:47:07,840 --> 05:47:12,718
use these booleans with logical
7697
05:47:10,000 --> 05:47:15,360
operators like we have been doing all
7698
05:47:12,718 --> 05:47:17,760
along in this lecture so for example
7699
05:47:15,360 --> 05:47:20,558
let's evaluate the first one here in
7700
05:47:17,759 --> 05:47:22,319
mind so that you really see what this is
7701
05:47:22,319 --> 05:47:29,599
d is 45 e is 20 so d greater than e is
7702
05:47:31,360 --> 05:47:35,760
that's also going to evaluate to true so
7703
05:47:35,759 --> 05:47:39,759
that's going to evaluate to true and
7704
05:47:41,439 --> 05:47:46,000
we are going to go to visual studio code
7705
05:47:43,599 --> 05:47:48,079
and actually play with this thanks
7706
05:47:46,000 --> 05:47:50,080
okay here we are in our working
7707
05:47:48,080 --> 05:47:52,638
directory we're going to jump into our
7708
05:47:50,080 --> 05:47:55,840
template project and copy the files we
7709
05:47:52,637 --> 05:47:58,557
need and we're going to put them in our
7710
05:47:55,840 --> 05:48:00,558
lecture on logical operators we're going
7711
05:48:00,558 --> 05:48:04,558
we're going to open up this folder in
7712
05:48:02,637 --> 05:48:06,797
visual studio code and it is going to
7713
05:48:04,558 --> 05:48:08,958
show up here in visual studio code we're
7714
05:48:06,797 --> 05:48:10,957
going to get rid of what we don't need
7715
05:48:08,957 --> 05:48:14,079
and we are going to put in the code to
7716
05:48:10,957 --> 05:48:18,797
play with these things we have three
7717
05:48:14,080 --> 05:48:20,080
boolean variables a is true b is false c
7718
05:48:20,080 --> 05:48:23,440
and we can print them out and we're
7719
05:48:21,680 --> 05:48:26,718
going to see their values and you see
7720
05:48:23,439 --> 05:48:29,599
the setup here so that sddc out is going
7721
05:48:26,718 --> 05:48:33,680
to show thanks in the format of true and
7722
05:48:29,599 --> 05:48:36,957
false and down here we are ending a few
7723
05:48:33,680 --> 05:48:39,920
values we are using the and operator and
7724
05:48:36,957 --> 05:48:41,039
it is denoted by these two ampersand
7725
05:48:41,759 --> 05:48:48,877
a is true and b is false and c is true
7726
05:48:48,878 --> 05:48:53,680
to false because we have a false in here
7727
05:48:51,599 --> 05:48:56,479
and again if this doesn't make sense
7728
05:48:53,680 --> 05:48:58,718
please do consult the tables for all
7729
05:48:56,479 --> 05:49:00,399
these logical operators and all these
7730
05:48:58,718 --> 05:49:02,718
things are going to make sense this is
7731
05:49:00,400 --> 05:49:06,718
going to evaluate to false because we
7732
05:49:02,718 --> 05:49:08,958
have a false in here and a and c we have
7733
05:49:06,718 --> 05:49:11,440
true and true so this is going to
7734
05:49:11,439 --> 05:49:16,797
a and b and c this is going to evaluate
7735
05:49:14,558 --> 05:49:19,760
to false because we have a false in here
7736
05:49:16,797 --> 05:49:23,199
remember as soon as you have a false in
7737
05:49:19,759 --> 05:49:26,239
your and logical operation you're going
7738
05:49:23,200 --> 05:49:28,637
to get a false in your result so we're
7739
05:49:26,240 --> 05:49:30,878
going to have a false here we can try
7740
05:49:28,637 --> 05:49:33,200
and compile this and see if this is
7741
05:49:30,878 --> 05:49:35,119
actually what we expect we're going to
7742
05:49:33,200 --> 05:49:37,680
bring up a terminal we're going to use
7743
05:49:35,119 --> 05:49:39,599
here and we're going to run the tasks to
7744
05:49:39,599 --> 05:49:46,557
and if we run our rooster program we're
7745
05:49:43,040 --> 05:49:48,479
going to see that a and b is false
7746
05:49:48,479 --> 05:49:54,159
a and c is true this is what we expect
7747
05:49:54,159 --> 05:49:58,878
is false and this is what we expect
7748
05:49:56,957 --> 05:50:02,000
this is how you can really play with
7749
05:49:58,878 --> 05:50:04,718
your and logical operator if you want
7750
05:50:02,000 --> 05:50:07,680
you can change things up to really
7751
05:50:04,718 --> 05:50:09,200
try and see if they live up to your
7752
05:50:09,200 --> 05:50:15,520
now we have changed a to false let's try
7753
05:50:12,240 --> 05:50:18,480
and build again we build with gcc
7754
05:50:15,520 --> 05:50:20,878
and we're going to run our program
7755
05:50:18,479 --> 05:50:23,599
and we're going to get a and b is false
7756
05:50:20,878 --> 05:50:27,119
because they are all false a and b are
7757
05:50:23,599 --> 05:50:28,079
false so false and false evaluates to
7758
05:50:28,080 --> 05:50:34,638
a and c is false because a is false so
7759
05:50:31,840 --> 05:50:37,200
we're going to get a false as the result
7760
05:50:34,637 --> 05:50:40,399
a and b and c is also going to evaluate
7761
05:50:37,200 --> 05:50:42,718
to false okay we have this tension here
7762
05:50:40,400 --> 05:50:45,440
let's bring this back to what it was
7763
05:50:42,718 --> 05:50:48,000
before so a is going to be true b is
7764
05:50:45,439 --> 05:50:50,479
going to be false c is going to be true
7765
05:50:48,000 --> 05:50:53,360
and we're going to try and play with the
7766
05:50:50,479 --> 05:50:57,200
or operator we are going to go down and
7767
05:50:53,360 --> 05:50:59,440
put in code to actually play with this
7768
05:50:57,200 --> 05:51:01,840
and it is really nothing special we are
7769
05:50:59,439 --> 05:51:04,319
just using the or operator here which is
7770
05:51:04,319 --> 05:51:08,239
symbols and or is going to evaluate to
7771
05:51:08,240 --> 05:51:14,159
when at least one of the operands is
7772
05:51:11,360 --> 05:51:17,760
true okay so we have our values here a
7773
05:51:14,159 --> 05:51:20,319
is true b is false c is true a or b is
7774
05:51:17,759 --> 05:51:21,279
going to evaluate to true because a is
7775
05:51:21,279 --> 05:51:25,520
a or c is going to evaluate to true
7776
05:51:25,520 --> 05:51:32,240
a or b or c is going to evaluate to true
7777
05:51:29,759 --> 05:51:34,319
because one of these things is true and
7778
05:51:34,319 --> 05:51:38,558
we can try and run this we're going to
7779
05:51:38,558 --> 05:51:46,159
with gcc and if we run this
7780
05:51:43,439 --> 05:51:48,079
we're going to go down here and run
7781
05:51:48,080 --> 05:51:52,400
and you're going to see that all these
7782
05:51:49,840 --> 05:51:55,520
things are true here because one of
7783
05:51:52,400 --> 05:51:59,280
these things is shown and as long as you
7784
05:51:55,520 --> 05:52:02,479
have one true operand your or operation
7785
05:51:59,279 --> 05:52:04,557
is going to evaluate to true and again
7786
05:52:02,479 --> 05:52:07,200
this is following the precedence and
7787
05:52:04,558 --> 05:52:10,159
associativity rules we have if we go
7788
05:52:07,200 --> 05:52:13,280
back to our table in our browser we're
7789
05:52:10,159 --> 05:52:14,319
going to try and look at logical or
7790
05:52:14,319 --> 05:52:19,439
left associative so we're going to try
7791
05:52:16,637 --> 05:52:22,957
and evaluate this from left to right so
7792
05:52:19,439 --> 05:52:26,159
we're going to or a and b and the result
7793
05:52:22,957 --> 05:52:29,279
of this is going to be ord with c we
7794
05:52:26,159 --> 05:52:32,479
have also seen the not operator which is
7795
05:52:29,279 --> 05:52:34,878
denoted by the exclamation mark here and
7796
05:52:32,479 --> 05:52:37,360
what it is going to do is basically
7797
05:52:34,878 --> 05:52:39,440
flip off or negate whatever it is you
7798
05:52:37,360 --> 05:52:42,240
have if you have it true in your
7799
05:52:39,439 --> 05:52:44,319
variable the result is going to be false
7800
05:52:42,240 --> 05:52:45,440
if you have uniforms the result is going
7801
05:52:45,439 --> 05:52:51,680
and not a is going to be false because a
7802
05:52:49,040 --> 05:52:53,440
is true not b is going to be true
7803
05:52:56,319 --> 05:53:01,919
is going to be false because c is true
7804
05:52:59,279 --> 05:53:04,159
as we can see here so let's run the
7805
05:53:01,919 --> 05:53:05,439
application and see if this is what we
7806
05:53:05,439 --> 05:53:11,359
we're going to run and build with gcc
7807
05:53:08,718 --> 05:53:14,878
and we're going to run rooster and we're
7808
05:53:11,360 --> 05:53:18,718
going to see that note a is false not b
7809
05:53:14,878 --> 05:53:21,119
is true and not c is false and this is
7810
05:53:18,718 --> 05:53:24,080
what we expect we have also seen that we
7811
05:53:21,119 --> 05:53:26,399
can do combinations of these operators
7812
05:53:24,080 --> 05:53:28,558
so for example we can look at the
7813
05:53:29,840 --> 05:53:36,159
take a and b this is going to evaluate
7814
05:53:36,159 --> 05:53:40,479
we're going to negate this and we're
7815
05:53:38,319 --> 05:53:42,159
going to get a true and we're going to
7816
05:53:44,000 --> 05:53:48,878
we know that the result of ordering this
7817
05:53:46,400 --> 05:53:52,000
with anything is going to be true so we
7818
05:53:48,878 --> 05:53:55,040
expect this expression here to evaluate
7819
05:53:55,040 --> 05:53:59,680
we're going to see that this is going to
7820
05:53:57,200 --> 05:54:00,958
evaluate to true and it is what we
7821
05:54:00,957 --> 05:54:05,199
the last thing we want to see in this
7822
05:54:02,558 --> 05:54:08,000
lecture is that we can combine
7823
05:54:05,200 --> 05:54:10,798
these logical operators with the
7824
05:54:08,000 --> 05:54:13,439
relational operators we have seen in the
7825
05:54:10,797 --> 05:54:16,878
last lecture we are going to put in a
7826
05:54:13,439 --> 05:54:19,279
piece of code to play with this this is
7827
05:54:16,878 --> 05:54:22,718
lengthy but you can play with this and
7828
05:54:19,279 --> 05:54:24,637
see what this is going to evaluate to to
7829
05:54:22,718 --> 05:54:28,558
start you off we are going to do the
7830
05:54:24,637 --> 05:54:31,200
first one together so it does test if d
7831
05:54:28,558 --> 05:54:33,920
is greater than e and if you look here
7832
05:54:31,200 --> 05:54:36,000
45 is greater than 20 so this is going
7833
05:54:36,000 --> 05:54:40,718
and we're going to enter that with d
7834
05:54:40,718 --> 05:54:46,558
the result of this is going to be true
7835
05:54:43,840 --> 05:54:48,957
so we're going to be ending a true and a
7836
05:54:46,558 --> 05:54:51,360
true and the result of this is going to
7837
05:54:48,957 --> 05:54:53,439
be a true and again you notice that we
7838
05:54:51,360 --> 05:54:55,119
are wrapping this in parenthesis to
7839
05:54:55,119 --> 05:55:00,479
with the compiler being confused with
7840
05:54:58,558 --> 05:55:03,040
what we are trying to print this is
7841
05:55:00,479 --> 05:55:05,439
going to get rid of the otherwise ugly
7842
05:55:03,040 --> 05:55:07,840
problems we might have to deal with if
7843
05:55:05,439 --> 05:55:10,319
we didn't wrap this into parentheses
7844
05:55:07,840 --> 05:55:13,040
like this so we expect to see a true
7845
05:55:13,040 --> 05:55:19,040
and run the task to build with gcc
7846
05:55:16,319 --> 05:55:21,680
and we're going to run rooster and if we
7847
05:55:19,040 --> 05:55:24,159
look at the first thing here this is
7848
05:55:21,680 --> 05:55:26,558
going to be true and you can try and do
7849
05:55:24,159 --> 05:55:29,119
the other ones in your mind as an
7850
05:55:26,558 --> 05:55:31,680
exercise and if you have a problem don't
7851
05:55:29,119 --> 05:55:34,079
hesitate to ask me i am going to do the
7852
05:55:34,080 --> 05:55:37,920
this is really all we set out to do in
7853
05:55:35,759 --> 05:55:41,039
this lecture i hope you have a better
7854
05:55:37,919 --> 05:55:43,359
understanding of these logical operators
7855
05:55:41,040 --> 05:55:46,319
again you don't have to really memorize
7856
05:55:43,360 --> 05:55:48,558
them all you have to do is consult the
7857
05:55:46,319 --> 05:55:51,279
tables and you're going to basically
7858
05:55:48,558 --> 05:55:53,920
know the result of your two operands
7859
05:55:51,279 --> 05:55:57,759
depending on the values you have inside
7860
05:55:53,919 --> 05:56:00,000
for and or and the not operator we are
7861
05:55:57,759 --> 05:56:01,519
going to stop here in this lecture in
7862
05:56:00,000 --> 05:56:05,200
the next one we're going to see how we
7863
05:56:01,520 --> 05:56:08,080
can format our output to make it really
7864
05:56:05,200 --> 05:56:10,319
look better go ahead and finish up here
7865
05:56:08,080 --> 05:56:13,360
and meet me there in this lecture we're
7866
05:56:10,319 --> 05:56:15,759
going to look at output formatting and c
7867
05:56:13,360 --> 05:56:18,080
plus and this is the way we can format
7868
05:56:15,759 --> 05:56:21,519
stuff we send it to the terminal through
7869
05:56:18,080 --> 05:56:24,080
sddc out and make them show up better as
7870
05:56:21,520 --> 05:56:27,439
an example let's say we have a table
7871
05:56:27,439 --> 05:56:32,637
and you see that they are cramped and
7872
05:56:30,240 --> 05:56:35,600
through output formatting we can take
7873
05:56:32,637 --> 05:56:38,000
this and turn this into this
7874
05:56:35,599 --> 05:56:38,877
and hopefully we agree that this is
7875
05:56:38,878 --> 05:56:43,680
there are a set of tools we can use in c
7876
05:56:41,360 --> 05:56:46,558
plus plus and those we're going to be
7877
05:56:43,680 --> 05:56:49,520
using in this lecture are going to be
7878
05:56:46,558 --> 05:56:53,040
coming from these two libraries ios and
7879
05:56:49,520 --> 05:56:56,637
io manip and there are a lot of things
7880
05:56:53,040 --> 05:57:00,400
in these two libraries here is a a set
7881
05:56:56,637 --> 05:57:01,840
of cards that show a lot of them we are
7882
05:57:00,400 --> 05:57:03,840
going to play with a lot of these in
7883
05:57:01,840 --> 05:57:06,400
this lecture so you don't have to worry
7884
05:57:06,400 --> 05:57:11,200
right now before we start looking at
7885
05:57:08,797 --> 05:57:13,439
them i want to bring to your attention
7886
05:57:11,200 --> 05:57:15,680
that there is a piece of documentation
7887
05:57:13,439 --> 05:57:17,479
on these things the link is here the
7888
05:57:19,040 --> 05:57:23,200
and you can open this up and look at
7889
05:57:21,599 --> 05:57:25,680
some of the things we're going to talk
7890
05:57:23,200 --> 05:57:29,440
about in this lecture okay the first one
7891
05:57:25,680 --> 05:57:31,840
we're going to look at is stdendl
7892
05:57:29,439 --> 05:57:34,399
this is not new we have been using it
7893
05:57:31,840 --> 05:57:38,000
all day long to print out a new line
7894
05:57:34,400 --> 05:57:40,718
character so that our htdcl statements
7895
05:57:38,000 --> 05:57:43,279
print things on different lines and if
7896
05:57:40,718 --> 05:57:46,240
we don't have this manipulator you see
7897
05:57:43,279 --> 05:57:48,079
here on the top we have hello and world
7898
05:57:46,240 --> 05:57:50,480
and if we print them out they are going
7899
05:57:48,080 --> 05:57:53,600
to show up on one line because we are
7900
05:57:50,479 --> 05:57:56,637
not separating the lines with std e and
7901
05:57:53,599 --> 05:57:59,759
dl down below here we have another way
7902
05:57:56,637 --> 05:58:02,718
we can do this we can post a backslash n
7903
05:57:59,759 --> 05:58:06,319
after our text and that's going to add a
7904
05:58:02,718 --> 05:58:10,958
new line character just like std endl
7905
05:58:06,319 --> 05:58:13,599
does okay stdndl and slash n in here
7906
05:58:10,957 --> 05:58:15,759
seemingly do the same thing
7907
05:58:13,599 --> 05:58:17,599
but they are different but we don't have
7908
05:58:15,759 --> 05:58:20,399
enough tools to really understand the
7909
05:58:17,599 --> 05:58:23,359
differences right now for now just think
7910
05:58:20,400 --> 05:58:26,319
of them as two things that do the same
7911
05:58:23,360 --> 05:58:28,400
thing they print out a new character
7912
05:58:26,319 --> 05:58:31,200
that allows your text to show up on
7913
05:58:28,400 --> 05:58:34,400
different lines like we have hello and
7914
05:58:31,200 --> 05:58:36,558
world here okay stdndl is the first
7915
05:58:34,400 --> 05:58:38,240
manipulator we're going to play with in
7916
05:58:36,558 --> 05:58:40,479
this lecture the next one we're going to
7917
05:58:40,479 --> 05:58:46,159
and this is going to send whatever is in
7918
05:58:43,040 --> 05:58:48,878
the output buffer to the terminal
7919
05:58:46,159 --> 05:58:51,439
and what the heck is an output buffer
7920
05:58:48,878 --> 05:58:54,240
let's look at an example suppose we have
7921
05:58:51,439 --> 05:58:56,797
sddc out here and we want to print on
7922
05:58:54,240 --> 05:59:00,400
this terminal and the message we want to
7923
05:58:56,797 --> 05:59:03,360
print is hello world how are you so what
7924
05:59:00,400 --> 05:59:06,000
is going to happen if the sddc out
7925
05:59:03,360 --> 05:59:07,760
statement is executed things are not
7926
05:59:06,000 --> 05:59:10,400
going to be directly sent to the
7927
05:59:07,759 --> 05:59:12,717
terminal they are going to go into an
7928
05:59:10,400 --> 05:59:15,120
intermediary buffer you can think of
7929
05:59:12,718 --> 05:59:18,319
this as some kind of storage in which
7930
05:59:15,119 --> 05:59:20,000
data goes before it goes to the terminal
7931
05:59:18,319 --> 05:59:21,919
and this is what's going to happen we
7932
05:59:20,000 --> 05:59:23,759
print out hello hello is not going to go
7933
05:59:25,759 --> 05:59:30,319
it's not going to go to the terminal we
7934
05:59:30,319 --> 05:59:34,558
it's not going to go to the terminal and
7935
05:59:34,558 --> 05:59:39,920
the data is going to be sent to the
7936
05:59:36,637 --> 05:59:42,878
terminal in one go and this may come in
7937
05:59:39,919 --> 05:59:45,599
handy in some situations so if you want
7938
05:59:42,878 --> 05:59:48,400
the data to go to the terminal directly
7939
05:59:45,599 --> 05:59:52,000
you're going to add an sdd flash
7940
05:59:48,400 --> 05:59:54,159
after your hddc out statement and we are
7941
05:59:52,000 --> 05:59:55,759
going to play with this in a minute in
7942
05:59:54,159 --> 05:59:58,000
visual studio code and you're going to
7943
05:59:55,759 --> 06:00:01,519
see how this works another manipulator
7944
05:59:58,000 --> 06:00:05,680
we have which is really cool is set with
7945
06:00:01,520 --> 06:00:09,600
and it is std set w here and what it
7946
06:00:05,680 --> 06:00:12,479
does it specifies a width for whatever
7947
06:00:09,599 --> 06:00:15,919
text you want to print here we have two
7948
06:00:12,479 --> 06:00:18,319
examples the first one is our table that
7949
06:00:15,919 --> 06:00:20,319
is not formatted well and you see we
7950
06:00:18,319 --> 06:00:23,680
just print out the data and it is going
7951
06:00:20,319 --> 06:00:27,840
to show up like we see here on the right
7952
06:00:23,680 --> 06:00:30,479
we can use std set with to set the width
7953
06:00:27,840 --> 06:00:32,957
of the text here and for example the
7954
06:00:30,479 --> 06:00:36,479
last name here is going to show up in a
7955
06:00:32,957 --> 06:00:38,717
field which is 10 characters white this
7956
06:00:36,479 --> 06:00:41,919
is what we mean here and we do the same
7957
06:00:38,718 --> 06:00:43,040
for the first name and the age and if we
7958
06:00:43,040 --> 06:00:48,558
data is going to show up nicely as we
7959
06:00:45,439 --> 06:00:51,119
see here and again i hope we agreed that
7960
06:00:48,558 --> 06:00:53,760
what we have down below here is much
7961
06:00:51,119 --> 06:00:56,878
better than what we had here
7962
06:00:53,759 --> 06:00:59,119
which was not formatted with set width
7963
06:00:56,878 --> 06:01:01,119
and this is how you use this manipulator
7964
06:00:59,119 --> 06:01:03,200
here we can also use what we call
7965
06:01:01,119 --> 06:01:06,079
justification to control whether our
7966
06:01:03,200 --> 06:01:06,958
data shows up on the right or on the
7967
06:01:06,957 --> 06:01:11,840
in the width that is allocated to it for
7968
06:01:11,840 --> 06:01:16,957
justification is sdd right so the data
7969
06:01:14,878 --> 06:01:19,840
is going to show up to the right in its
7970
06:01:16,957 --> 06:01:23,039
respective cells we can also use what we
7971
06:01:19,840 --> 06:01:25,759
call internal justification by which if
7972
06:01:23,040 --> 06:01:28,240
we are showing a negative number the
7973
06:01:25,759 --> 06:01:30,637
sign is going to be left justified so it
7974
06:01:28,240 --> 06:01:33,200
is going to show up on the left but the
7975
06:01:30,637 --> 06:01:35,200
data is going to be right justified and
7976
06:01:33,200 --> 06:01:37,600
this may come in handy if you want to
7977
06:01:37,599 --> 06:01:44,000
in your terminal we can also use std set
7978
06:01:41,439 --> 06:01:47,039
field to specify the field character in
7979
06:01:44,000 --> 06:01:49,680
our empty spaces for example here we set
7980
06:01:47,040 --> 06:01:52,878
the dash as a field character and the
7981
06:01:49,680 --> 06:01:56,240
result is what you see down below here
7982
06:01:52,878 --> 06:01:58,319
we have seen std ball alpha and its
7983
06:01:58,319 --> 06:02:05,919
stdc out to show boolean output in the
7984
06:02:02,479 --> 06:02:08,479
form of true and false if you don't put
7985
06:02:05,919 --> 06:02:11,439
this manipulator in you're going to see
7986
06:02:08,479 --> 06:02:12,878
those pieces of data as ones and zeros
7987
06:02:11,439 --> 06:02:15,439
so for example here we have two
7988
06:02:12,878 --> 06:02:17,200
variables condition and other condition
7989
06:02:15,439 --> 06:02:19,840
if we print them out they are going to
7990
06:02:17,200 --> 06:02:22,240
show up as one and zero we are going to
7991
06:02:19,840 --> 06:02:24,957
set our manipulator here so the data is
7992
06:02:22,240 --> 06:02:28,240
going to show up as true and false we
7993
06:02:24,957 --> 06:02:31,599
can disable this manipulator here with
7994
06:02:28,240 --> 06:02:34,638
std noble alpha and the data is going to
7995
06:02:31,599 --> 06:02:37,359
go back to be shown in the form of one
7996
06:02:34,637 --> 06:02:39,520
and zero this is what this manipulator
7997
06:02:37,360 --> 06:02:42,319
does we also have one to show the
7998
06:02:39,520 --> 06:02:43,200
positive sign for positive numbers
7999
06:02:43,200 --> 06:02:48,080
if we don't enable it the data here is
8000
06:02:45,279 --> 06:02:50,878
going to show up like this 34 and minus
8001
06:02:48,080 --> 06:02:53,760
45 you see that the minus sign is going
8002
06:02:50,878 --> 06:02:56,958
to be shown regardless of the setting
8003
06:02:53,759 --> 06:02:59,759
you have for this manipulator but if we
8004
06:02:59,759 --> 06:03:04,319
we're going to show the positive number
8005
06:03:02,159 --> 06:03:06,479
and this may make sense for whatever
8006
06:03:04,319 --> 06:03:09,520
application you might be doing
8007
06:03:06,479 --> 06:03:12,319
we can disable this with std no show
8008
06:03:09,520 --> 06:03:15,520
posts and after we do this the data is
8009
06:03:12,319 --> 06:03:17,840
going to show up in its default format
8010
06:03:15,520 --> 06:03:20,797
that we have seen before this is how you
8011
06:03:17,840 --> 06:03:23,119
use std show posts we also have
8012
06:03:23,119 --> 06:03:28,797
the base in which the data is shown and
8013
06:03:26,080 --> 06:03:31,760
we can show the data either in a decimal
8014
06:03:28,797 --> 06:03:34,079
in octo or in hexodecimal if you look at
8015
06:03:31,759 --> 06:03:35,919
the data here we have an integer which
8016
06:03:34,080 --> 06:03:38,718
is positive we have an integer which is
8017
06:03:35,919 --> 06:03:41,359
negative and we have a double variable
8018
06:03:38,718 --> 06:03:43,040
here and we have some data n for us to
8019
06:03:41,360 --> 06:03:45,840
play with we're going to show our
8020
06:03:43,040 --> 06:03:48,558
positive integer in these three bases
8021
06:03:48,558 --> 06:03:53,520
and the result is what you see here and
8022
06:03:51,200 --> 06:03:54,479
this should be no surprise you already
8023
06:03:54,479 --> 06:03:59,840
these number systems and how they work
8024
06:03:57,680 --> 06:04:02,159
we can take the negative number and also
8025
06:03:59,840 --> 06:04:05,279
show it in different bases decimal
8026
06:04:02,159 --> 06:04:08,400
hexadecimal and octo and it is what you
8027
06:04:05,279 --> 06:04:10,957
have on the right here in our terminal
8028
06:04:10,957 --> 06:04:17,039
a double or a floating point number in
8029
06:04:14,319 --> 06:04:20,159
these bases the result is not going to
8030
06:04:17,040 --> 06:04:22,958
change because these number systems have
8031
06:04:20,159 --> 06:04:25,360
no effect on floating point numbers if
8032
06:04:22,957 --> 06:04:26,877
you remember we have seen that floating
8033
06:04:26,878 --> 06:04:32,319
are represented in memory following
8034
06:04:29,520 --> 06:04:33,200
another protocol that is really advanced
8035
06:04:33,200 --> 06:04:37,600
a course like this so we are just going
8036
06:04:35,840 --> 06:04:39,840
to use this but we're not going to try
8037
06:04:37,599 --> 06:04:42,479
and understand it because it is out of
8038
06:04:39,840 --> 06:04:45,439
scope for what we are doing here we can
8039
06:04:45,439 --> 06:04:50,877
to show the base of our output
8040
06:04:48,718 --> 06:04:54,637
so here we have a positive number which
8041
06:04:50,878 --> 06:04:57,200
is an integer and we can show it in
8042
06:04:54,637 --> 06:05:00,079
decimal hex and act and we're going to
8043
06:04:57,200 --> 06:05:03,200
see what we see here to the right but we
8044
06:05:00,080 --> 06:05:05,440
can choose to also show the base of
8045
06:05:03,200 --> 06:05:08,479
whatever it is we output if we want to
8046
06:05:05,439 --> 06:05:11,039
specify that the output is in decimal
8047
06:05:08,479 --> 06:05:13,439
we're going to say that here but we can
8048
06:05:11,040 --> 06:05:18,240
also decide to show the base and we
8049
06:05:13,439 --> 06:05:20,239
enable that with std show base like this
8050
06:05:18,240 --> 06:05:22,159
and if we do this we're going to see
8051
06:05:20,240 --> 06:05:25,840
decimal is not going to have anything in
8052
06:05:22,159 --> 06:05:29,279
front hex is going to have a 0x in front
8053
06:05:25,840 --> 06:05:31,680
oct is going to have a zero in front and
8054
06:05:29,279 --> 06:05:32,557
by this it is going to be very easy to
8055
06:05:32,558 --> 06:05:38,159
the base in which your data is displayed
8056
06:05:35,759 --> 06:05:40,159
we can also use std upper case for the
8057
06:05:38,159 --> 06:05:43,119
data we print out to be shown in
8058
06:05:40,159 --> 06:05:44,878
uppercase where it makes sense for
8059
06:05:43,119 --> 06:05:47,520
example here we are trying to print
8060
06:05:44,878 --> 06:05:50,319
numbers in hexadecimal here in the
8061
06:05:47,520 --> 06:05:51,920
middle so if we don't use uppercase
8062
06:05:51,919 --> 06:05:57,759
the number is going to show up like this
8063
06:05:53,840 --> 06:06:00,080
you see a and f are lowercase but if we
8064
06:05:57,759 --> 06:06:02,717
enable uppercase we're going to see this
8065
06:06:00,080 --> 06:06:05,280
in uppercase and sometimes this is going
8066
06:06:02,718 --> 06:06:08,400
to be helpful for whatever application
8067
06:06:05,279 --> 06:06:10,637
you are using the sun we also have a few
8068
06:06:08,400 --> 06:06:13,440
manipulators to control how floating
8069
06:06:10,637 --> 06:06:16,159
point data is shown on the terminal and
8070
06:06:13,439 --> 06:06:19,439
the two of these are std scientific and
8071
06:06:16,159 --> 06:06:20,878
sdd fixed by default stdc out is going
8072
06:06:20,878 --> 06:06:26,558
in scientific format where necessary and
8073
06:06:23,680 --> 06:06:28,240
it is going to use fixed by default so
8074
06:06:31,119 --> 06:06:36,079
and if we just print them out they are
8075
06:06:33,360 --> 06:06:38,319
going to show up in this format here if
8076
06:06:36,080 --> 06:06:40,878
we use fixed we're going to force the
8077
06:06:38,319 --> 06:06:43,119
output to be in fixed format and you're
8078
06:06:40,878 --> 06:06:46,797
going to see that the third number in c
8079
06:06:43,119 --> 06:06:49,840
here is going to show up as 0.0 and a
8080
06:06:46,797 --> 06:06:52,079
few zeros after that because in the
8081
06:06:49,840 --> 06:06:55,439
precision that we have now we can't
8082
06:06:52,080 --> 06:06:57,840
really show a number that is as low as
8083
06:06:55,439 --> 06:07:00,319
we have here in c again we have seen
8084
06:06:57,840 --> 06:07:03,119
this scientific format this is
8085
06:07:03,119 --> 06:07:08,479
multiplied by 10 to the power of minus
8086
06:07:06,080 --> 06:07:10,840
10 and this is a really really low
8087
06:07:10,840 --> 06:07:16,797
0.000 up to 10 and that's when this
8088
06:07:14,479 --> 06:07:19,119
decimal point is going to show so it's a
8089
06:07:16,797 --> 06:07:21,759
number that is really close to zero
8090
06:07:19,119 --> 06:07:24,637
that's why we are showing it like 0.0
8091
06:07:21,759 --> 06:07:27,519
here i hope this makes sense we can also
8092
06:07:24,637 --> 06:07:30,319
use scientific notation if we want that
8093
06:07:27,520 --> 06:07:32,000
and if we force scientific notation
8094
06:07:30,319 --> 06:07:34,878
everything is going to be shown in
8095
06:07:32,000 --> 06:07:37,520
scientific notation another thing that i
8096
06:07:34,878 --> 06:07:40,958
really want you to be aware of is that
8097
06:07:37,520 --> 06:07:41,760
there is no official way to set
8098
06:07:41,759 --> 06:07:48,079
floating point output to its defaults
8099
06:07:45,599 --> 06:07:50,557
and here is a hack i actually learned
8100
06:07:48,080 --> 06:07:52,798
about when i was making this course the
8101
06:07:50,558 --> 06:07:55,680
explanation of this is really out of
8102
06:07:52,797 --> 06:07:57,360
scope for this course but just use this
8103
06:07:57,360 --> 06:08:02,159
the floating point output format to the
8104
06:08:00,479 --> 06:08:04,079
defaults and if you do this you're going
8105
06:08:04,080 --> 06:08:08,558
here with the defaults you're going to
8106
06:08:06,637 --> 06:08:10,957
see that it is the same things the next
8107
06:08:08,558 --> 06:08:13,360
thing we're going to look at is std set
8108
06:08:10,957 --> 06:08:16,159
precision which we have seen before and
8109
06:08:13,360 --> 06:08:18,558
this is going to set the precision
8110
06:08:16,159 --> 06:08:20,957
with which the data is going to show up
8111
06:08:18,558 --> 06:08:23,120
on the terminal if you use a precision
8112
06:08:20,957 --> 06:08:26,000
of 10 that's what you're going to get
8113
06:08:23,119 --> 06:08:29,439
here here you see that we have a double
8114
06:08:26,000 --> 06:08:32,000
number it is a number that has a lot of
8115
06:08:29,439 --> 06:08:33,759
numbers after the decimal point if we
8116
06:08:32,000 --> 06:08:35,520
show it by default it's going to show up
8117
06:08:33,759 --> 06:08:38,079
like this the precision is going to be
8118
06:08:35,520 --> 06:08:41,439
sex we can increase the precision to 10
8119
06:08:38,080 --> 06:08:43,680
to 20 and 50 and it is going to show up
8120
06:08:41,439 --> 06:08:44,557
at whatever precision that you specify
8121
06:08:44,558 --> 06:08:49,520
please know that this precision is going
8122
06:08:46,878 --> 06:08:50,558
to be limited by the type of this a
8123
06:08:50,558 --> 06:08:55,040
if it is a floating point the precision
8124
06:08:52,878 --> 06:08:57,040
is going to be something like 7 we have
8125
06:08:55,040 --> 06:08:59,440
seen that if it is a double the
8126
06:08:57,040 --> 06:09:02,479
precision is going to basically double
8127
06:08:59,439 --> 06:09:04,957
to something like 15 and if you have a
8128
06:09:02,479 --> 06:09:07,279
long double the precision is going to be
8129
06:09:04,957 --> 06:09:10,319
something bigger than double but it
8130
06:09:07,279 --> 06:09:12,957
can't go below that of a double we have
8131
06:09:10,319 --> 06:09:15,040
seen this before we also have show point
8132
06:09:15,040 --> 06:09:21,440
showing the decimal point for floating
8133
06:09:17,599 --> 06:09:23,279
point values you see here we have a 12.0
8134
06:09:21,439 --> 06:09:24,557
this is the most important piece of data
8135
06:09:24,558 --> 06:09:31,280
if we don't do show point this is going
8136
06:09:27,360 --> 06:09:34,558
to show up as 12 in the output here but
8137
06:09:31,279 --> 06:09:36,797
we can use show point to force for the
8138
06:09:34,558 --> 06:09:37,638
decimal point to be shown and you see
8139
06:09:37,637 --> 06:09:43,200
12.00 here is shown another side effect
8140
06:09:43,200 --> 06:09:48,159
show point is going to force the showing
8141
06:09:45,439 --> 06:09:51,359
of trailing zeros and it is what we see
8142
06:09:48,159 --> 06:09:53,520
here in d e and f we have seen a lot of
8143
06:09:51,360 --> 06:09:55,680
manipulators here is a table that is
8144
06:09:53,520 --> 06:09:58,878
going to show where many of these are
8145
06:09:55,680 --> 06:10:01,520
going to be living so if you need to use
8146
06:09:58,878 --> 06:10:05,200
set width this is going to be living
8147
06:10:01,520 --> 06:10:07,760
in the i o manip header and here we have
8148
06:10:05,200 --> 06:10:10,080
a few other ones so if you want to use a
8149
06:10:07,759 --> 06:10:12,319
few of these things these are the
8150
06:10:10,080 --> 06:10:14,878
libraries that you will need to include
8151
06:10:12,319 --> 06:10:17,520
with pound include as we have been
8152
06:10:14,878 --> 06:10:19,920
including i o stream and again the
8153
06:10:17,520 --> 06:10:20,600
documentation for these things is shown
8154
06:10:20,599 --> 06:10:26,000
cppreference.com this is the exact link
8155
06:10:23,520 --> 06:10:26,957
and you can check this out if it helps
8156
06:10:26,957 --> 06:10:30,637
now that we have an idea about these
8157
06:10:28,797 --> 06:10:33,439
things we're going to go in visual
8158
06:10:30,637 --> 06:10:36,399
studio code and actually see these in
8159
06:10:33,439 --> 06:10:37,919
action okay here we are in visual studio
8160
06:10:36,400 --> 06:10:41,120
code the project we're going to be
8161
06:10:37,919 --> 06:10:42,637
working on here is output formatting so
8162
06:10:45,919 --> 06:10:51,279
and put those in our project here
8163
06:10:49,119 --> 06:10:53,439
and we're going to go up again and open
8164
06:10:51,279 --> 06:10:55,199
up this folder in visual studio code
8165
06:10:53,439 --> 06:10:57,520
let's do that we're going to close the
8166
06:10:55,200 --> 06:10:59,680
welcome screen here and we're going to
8167
06:10:57,520 --> 06:11:01,520
remove whatever it is we don't need
8168
06:11:01,520 --> 06:11:05,920
and we are going to put in the first
8169
06:11:03,520 --> 06:11:07,680
code we want to play with and this is
8170
06:11:07,680 --> 06:11:11,360
you don't really need a lot of
8171
06:11:09,200 --> 06:11:13,119
explanations for this because we've used
8172
06:11:13,119 --> 06:11:17,039
if you don't put it out the data is
8173
06:11:14,718 --> 06:11:19,280
going to show up on one line and uh
8174
06:11:17,040 --> 06:11:20,159
you're going to have hello world on one
8175
06:11:20,159 --> 06:11:25,040
if we put stdndl like this we're going
8176
06:11:23,119 --> 06:11:27,039
to have the data show up on different
8177
06:11:25,040 --> 06:11:29,760
lines so we're going to have hello and
8178
06:11:27,040 --> 06:11:33,120
world on different lines and it is
8179
06:11:29,759 --> 06:11:35,919
possible to use a backslash n to achieve
8180
06:11:33,119 --> 06:11:38,557
the same thing but these work very
8181
06:11:35,919 --> 06:11:40,399
differently underground and we don't
8182
06:11:38,558 --> 06:11:43,440
have enough tools to really understand
8183
06:11:40,400 --> 06:11:45,920
the difference so for now just take this
8184
06:11:43,439 --> 06:11:48,479
as the truth and i know that there are
8185
06:11:45,919 --> 06:11:50,877
differences and the most important thing
8186
06:11:48,479 --> 06:11:53,759
is that you recognize these things if
8187
06:11:50,878 --> 06:11:56,718
you see them in code out there we are
8188
06:11:53,759 --> 06:11:59,279
going to bring up our terminum and build
8189
06:11:56,718 --> 06:12:01,040
this with our task that is going to
8190
06:12:01,040 --> 06:12:04,000
you're going to see that the world is
8191
06:12:04,000 --> 06:12:09,840
and that we can run our rooster
8192
06:12:06,637 --> 06:12:12,479
binary to see the output you see that we
8193
06:12:09,840 --> 06:12:14,957
have hello world on one line
8194
06:12:12,479 --> 06:12:17,119
we have hello and world on different
8195
06:12:14,957 --> 06:12:19,557
lines and this is a result of these
8196
06:12:17,119 --> 06:12:22,399
events we have here you see we have
8197
06:12:19,558 --> 06:12:24,638
stdndl this is going to force
8198
06:12:22,400 --> 06:12:26,878
the terminal to go to the next line and
8199
06:12:24,637 --> 06:12:29,200
print world and after that we're going
8200
06:12:26,878 --> 06:12:31,680
to force the terminal to go to the next
8201
06:12:29,200 --> 06:12:34,080
line and that's where the next text is
8202
06:12:31,680 --> 06:12:36,319
going to show up after that we have
8203
06:12:34,080 --> 06:12:39,760
hello and world down here in the
8204
06:12:36,319 --> 06:12:42,400
terminal and it is the output generated
8205
06:12:39,759 --> 06:12:44,479
by the statements that we have in here
8206
06:12:42,400 --> 06:12:47,680
and you can see that it is going to
8207
06:12:44,479 --> 06:12:50,239
basically do the same thing as stdendl
8208
06:12:47,680 --> 06:12:52,878
but again they work very differently
8209
06:12:50,240 --> 06:12:56,718
under the hood okay so this is really
8210
06:12:52,878 --> 06:12:59,520
how std endl works and you get access to
8211
06:12:56,718 --> 06:13:01,520
it by including the i o stream
8212
06:12:59,520 --> 06:13:04,319
library here the next thing we're going
8213
06:13:04,319 --> 06:13:09,759
this is going to flash the output buffer
8214
06:13:07,599 --> 06:13:10,877
to its final destination and that's
8215
06:13:10,878 --> 06:13:16,159
the terminal in this case and if we add
8216
06:13:18,797 --> 06:13:24,479
this is going to be directly sent to the
8217
06:13:22,080 --> 06:13:27,120
terminal and this may come in handy in
8218
06:13:24,479 --> 06:13:30,000
some applications if we run this we're
8219
06:13:27,119 --> 06:13:32,718
not going to really see a difference but
8220
06:13:30,000 --> 06:13:35,119
underground under the hood the data is
8221
06:13:32,718 --> 06:13:37,280
directly sent to the terminal and we had
8222
06:13:35,119 --> 06:13:40,637
the chance to explain this in the slides
8223
06:13:37,279 --> 06:13:43,119
earlier we can work this program and i
8224
06:13:40,637 --> 06:13:45,200
see it running the world is going to go
8225
06:13:43,119 --> 06:13:47,200
through if we run the rooster we're
8226
06:13:45,200 --> 06:13:48,479
going to see that this is a nice message
8227
06:13:48,479 --> 06:13:52,878
to the terminal the next thing we're
8228
06:13:50,637 --> 06:13:54,957
going to look at is set with i am going
8229
06:13:52,878 --> 06:13:57,840
to put in the code here because i don't
8230
06:13:54,957 --> 06:14:00,239
want to type all this and again you can
8231
06:14:00,240 --> 06:14:04,958
in the results section of this lecture
8232
06:14:03,279 --> 06:14:06,878
you don't really have to type all these
8233
06:14:04,957 --> 06:14:09,279
things the most important thing is that
8234
06:14:06,878 --> 06:14:11,840
you really understand how they work okay
8235
06:14:09,279 --> 06:14:14,479
you see here we are going to use set
8236
06:14:11,840 --> 06:14:16,957
with but we haven't really included the
8237
06:14:14,479 --> 06:14:18,637
library that is going to give us access
8238
06:14:16,957 --> 06:14:20,717
to this and if you don't know which
8239
06:14:18,637 --> 06:14:22,718
library you will need to include to get
8240
06:14:20,718 --> 06:14:25,680
access to this well you can check the
8241
06:14:22,718 --> 06:14:28,000
documentation and to get access to the
8242
06:14:25,680 --> 06:14:30,479
documentation you might want to consult
8243
06:14:28,000 --> 06:14:34,718
your favorite search engine i am going
8244
06:14:30,479 --> 06:14:38,558
to go in google here and type in std
8245
06:14:34,718 --> 06:14:40,479
set w and i am going to search and this
8246
06:14:38,558 --> 06:14:42,520
is going to come up with a few entries i
8247
06:14:40,479 --> 06:14:44,797
am going to click on the one from
8248
06:14:42,520 --> 06:14:47,920
cppreference.com because this is
8249
06:14:44,797 --> 06:14:49,840
reliable in my opinion and if we open
8250
06:14:47,919 --> 06:14:52,957
this up we're going to see that to work
8251
06:14:49,840 --> 06:14:55,360
with us you need to include i o my net
8252
06:14:52,957 --> 06:14:57,840
so this is what we need to put in visual
8253
06:14:55,360 --> 06:15:00,637
studio code to get rid of this problem
8254
06:14:57,840 --> 06:15:02,878
let's do that i really wanted you to see
8255
06:15:00,637 --> 06:15:05,520
this process you can go through
8256
06:15:02,878 --> 06:15:07,760
to know what you need to include we're
8257
06:15:05,520 --> 06:15:10,240
going to put this in and hopefully the
8258
06:15:07,759 --> 06:15:13,199
arrow is going to go away and we can
8259
06:15:10,240 --> 06:15:15,600
focus on studying the effects of these
8260
06:15:13,200 --> 06:15:17,680
things here this is going to print and
8261
06:15:15,599 --> 06:15:20,637
formatted so the data is going to be
8262
06:15:17,680 --> 06:15:23,840
cropped close to each other but we can
8263
06:15:20,637 --> 06:15:25,759
format this using set width and if we
8264
06:15:23,840 --> 06:15:28,957
pass in a 10 here we are basically
8265
06:15:25,759 --> 06:15:31,919
saying last name is going to take the
8266
06:15:28,957 --> 06:15:34,479
width of 10 characters even if we don't
8267
06:15:31,919 --> 06:15:36,797
really have 10 characters in this so so
8268
06:15:34,479 --> 06:15:39,759
you're going to have spaces fill the
8269
06:15:36,797 --> 06:15:42,557
remaining spaces so that the data shows
8270
06:15:39,759 --> 06:15:44,479
up nicely this is really hard to say in
8271
06:15:42,558 --> 06:15:46,400
world so i am going to run this in a
8272
06:15:44,479 --> 06:15:48,797
minute so that you can see this but
8273
06:15:46,400 --> 06:15:51,440
before we run i want you to see that you
8274
06:15:48,797 --> 06:15:53,919
can also store the width information in
8275
06:15:51,439 --> 06:15:56,637
a variable like this and i use that
8276
06:15:53,919 --> 06:15:59,359
instead in your std statements the
8277
06:15:56,637 --> 06:16:01,919
benefit with that is that it is really
8278
06:15:59,360 --> 06:16:04,479
easy to change this with if you happen
8279
06:16:01,919 --> 06:16:06,717
to change your mind otherwise you would
8280
06:16:04,479 --> 06:16:08,957
have to change a lot of things and this
8281
06:16:06,718 --> 06:16:11,360
is really bad design i did this to show
8282
06:16:08,957 --> 06:16:14,000
you how you can use this but in real
8283
06:16:11,360 --> 06:16:14,958
code you are most probably going to
8284
06:16:14,957 --> 06:16:20,079
your weft information in a variable and
8285
06:16:17,599 --> 06:16:22,717
that way it's going to be really easy to
8286
06:16:20,080 --> 06:16:26,638
change and update if you happen to need
8287
06:16:22,718 --> 06:16:28,958
that we can build this program with gcc
8288
06:16:26,637 --> 06:16:30,797
and if we run it let's bring this up a
8289
06:16:28,957 --> 06:16:32,717
little bit we're going to have our data
8290
06:16:30,797 --> 06:16:35,599
that is unformatted and you see that it
8291
06:16:32,718 --> 06:16:38,080
is really ugly but down below here we
8292
06:16:35,599 --> 06:16:40,319
have our formatted table and it is
8293
06:16:38,080 --> 06:16:43,200
really nice we have last name first name
8294
06:16:40,319 --> 06:16:45,360
and age and it is easier to see these
8295
06:16:43,200 --> 06:16:46,718
things we're going to see that it is
8296
06:16:46,718 --> 06:16:51,440
force the data to show on the left or to
8297
06:16:49,119 --> 06:16:53,919
the right with justification and we're
8298
06:16:51,439 --> 06:16:55,039
going to look at code that does that
8299
06:16:55,040 --> 06:16:59,360
if we go down here and put in the next
8300
06:16:57,200 --> 06:17:01,680
piece of code we want to play with we're
8301
06:16:59,360 --> 06:17:03,840
going to see that data is right
8302
06:17:01,680 --> 06:17:06,479
justified by default but we have seen
8303
06:17:03,840 --> 06:17:08,718
this also you see that gray is cramped
8304
06:17:06,479 --> 06:17:10,797
to the right of the width of the cell
8305
06:17:08,718 --> 06:17:13,200
for the first name so data is right
8306
06:17:10,797 --> 06:17:14,000
justified by default and it is the same
8307
06:17:18,080 --> 06:17:23,280
data here and trying to run we're going
8308
06:17:20,797 --> 06:17:25,199
to have a better visualization of that
8309
06:17:23,279 --> 06:17:27,199
so let's run a little bit we're going to
8310
06:17:25,200 --> 06:17:29,360
build the world is going to go through
8311
06:17:27,200 --> 06:17:31,440
and if we run this we're going to see
8312
06:17:29,360 --> 06:17:33,920
that data is going to show up to the
8313
06:17:31,439 --> 06:17:36,239
right gray is to the right woods is to
8314
06:17:33,919 --> 06:17:38,159
the right and this is the default
8315
06:17:38,159 --> 06:17:43,680
when you set with like this you can also
8316
06:17:40,878 --> 06:17:47,119
cause for the data to be left justified
8317
06:17:43,680 --> 06:17:49,840
and you do that by coming here and
8318
06:17:47,119 --> 06:17:52,878
changing this to left you can do that
8319
06:17:49,840 --> 06:17:55,119
but let's keep this in here instead
8320
06:17:52,878 --> 06:17:57,119
for your reference and let's put in
8321
06:17:55,119 --> 06:18:00,159
another piece of code to justify the
8322
06:17:57,119 --> 06:18:02,557
data to the left okay let's go down and
8323
06:18:00,159 --> 06:18:05,759
do that we're going to justify the data
8324
06:18:02,558 --> 06:18:08,319
to the left and if we print this out the
8325
06:18:05,759 --> 06:18:10,797
data here gray should come to the left
8326
06:18:08,319 --> 06:18:12,479
and be aligned with the first name here
8327
06:18:10,797 --> 06:18:16,159
i hope this makes sense we're going to
8328
06:18:12,479 --> 06:18:19,759
run we build with gcc and if we run
8329
06:18:16,159 --> 06:18:23,360
rooster gray is going to be justified to
8330
06:18:19,759 --> 06:18:26,637
the left this is the meaning of std left
8331
06:18:23,360 --> 06:18:29,279
and std right that we just saw and know
8332
06:18:26,637 --> 06:18:31,840
that data is justified to the right by
8333
06:18:29,279 --> 06:18:33,680
default and it is important to keep the
8334
06:18:33,680 --> 06:18:38,479
data is going to be justified to the
8335
06:18:35,919 --> 06:18:41,439
right by default the next thing we can
8336
06:18:38,479 --> 06:18:43,919
do is to make our data internal
8337
06:18:41,439 --> 06:18:47,119
justified and what this is going to do
8338
06:18:43,919 --> 06:18:50,000
is make the sign left justified and the
8339
06:18:47,119 --> 06:18:52,000
data is going to be right justified and
8340
06:18:50,000 --> 06:18:53,520
the best way to save this is really to
8341
06:18:53,520 --> 06:18:58,637
so here we have the data it's a negative
8342
06:18:55,919 --> 06:19:01,439
floating point number the width is set
8343
06:18:58,637 --> 06:19:03,759
to 10 it's going to be right justified
8344
06:19:01,439 --> 06:19:06,399
but we are also going to set the
8345
06:19:03,759 --> 06:19:07,439
justification to internal and see the
8346
06:19:07,439 --> 06:19:12,557
let's weld and run this we're going to
8347
06:19:09,840 --> 06:19:15,599
world with gcc and we are going to run
8348
06:19:12,558 --> 06:19:18,798
our rooster program and if we look at
8349
06:19:15,599 --> 06:19:20,797
the output here you see that if we have
8350
06:19:20,797 --> 06:19:27,279
the sign is going to go with the data
8351
06:19:23,680 --> 06:19:29,040
whereas if we do internal justification
8352
06:19:27,279 --> 06:19:31,680
the sign is going to go to the left and
8353
06:19:29,040 --> 06:19:34,240
the data is going to go to the right and
8354
06:19:31,680 --> 06:19:36,080
sometimes this is useful depending on
8355
06:19:34,240 --> 06:19:38,718
the application that you are welded
8356
06:19:36,080 --> 06:19:41,840
especially in applications where you
8357
06:19:38,718 --> 06:19:44,400
have to display tabular data on the
8358
06:19:41,840 --> 06:19:47,279
console or of the terminal we can also
8359
06:19:44,400 --> 06:19:48,319
specify the field character using set
8360
06:19:48,319 --> 06:19:53,360
and this is really how it works the data
8361
06:19:50,957 --> 06:19:55,039
is going to be left justified but we are
8362
06:19:55,040 --> 06:20:01,120
spaces with a dash here and we can bring
8363
06:19:58,878 --> 06:20:02,797
this up so that you see the entire thing
8364
06:20:01,119 --> 06:20:05,360
but you don't really have to type this
8365
06:20:02,797 --> 06:20:08,239
out you can use the code i have provided
8366
06:20:05,360 --> 06:20:10,637
in the resources section of this lecture
8367
06:20:08,240 --> 06:20:12,798
you can just copy it paste it in here
8368
06:20:10,637 --> 06:20:15,279
and use it to play with these things
8369
06:20:12,797 --> 06:20:18,079
okay with this our empty spaces are
8370
06:20:15,279 --> 06:20:19,199
going to be filled with this dash
8371
06:20:19,200 --> 06:20:24,878
let's world and build with gcc we are
8372
06:20:22,957 --> 06:20:27,359
going to run this and you're going to
8373
06:20:24,878 --> 06:20:29,200
see that we have a field character here
8374
06:20:27,360 --> 06:20:31,520
and you can change this basically to
8375
06:20:29,200 --> 06:20:34,798
whatever you want if i want i can change
8376
06:20:31,520 --> 06:20:37,279
this to a star let's do that and i can
8377
06:20:34,797 --> 06:20:39,360
build again if i run this it's going to
8378
06:20:37,279 --> 06:20:41,919
be filled with stars right now the next
8379
06:20:39,360 --> 06:20:44,958
thing we're going to look at is std bull
8380
06:20:41,919 --> 06:20:46,957
alpha we have seen this before but what
8381
06:20:44,957 --> 06:20:49,680
it's really going to do is force the
8382
06:20:46,957 --> 06:20:50,557
output to be in the format of true and
8383
06:20:50,558 --> 06:20:56,477
and the default is in the form of one
8384
06:20:52,957 --> 06:20:59,119
and zero here we have a few variables
8385
06:20:56,477 --> 06:21:02,477
and that they are of bull type
8386
06:20:59,119 --> 06:21:04,399
the first set of stdcl statements here
8387
06:21:02,477 --> 06:21:07,360
is going to print in the format of one
8388
06:21:04,400 --> 06:21:09,360
and zero we are going to set the output
8389
06:21:07,360 --> 06:21:12,319
to both alpha and it is going to be in
8390
06:21:09,360 --> 06:21:14,958
the format of true and false and then we
8391
06:21:12,319 --> 06:21:18,400
can disable the bull alpha with this
8392
06:21:14,957 --> 06:21:21,759
setting here which says hdd no pull
8393
06:21:18,400 --> 06:21:24,319
alpha we can vote this and see the
8394
06:21:21,759 --> 06:21:26,319
effect of this so we're going to run
8395
06:21:24,319 --> 06:21:29,439
rooster again and you're going to see
8396
06:21:26,319 --> 06:21:33,040
that condition 1 0 condition true false
8397
06:21:29,439 --> 06:21:36,079
condition 1 0 we are able to modify how
8398
06:21:33,040 --> 06:21:39,280
our boolean data is displayed on the
8399
06:21:36,080 --> 06:21:41,760
console using these two settings here
8400
06:21:39,279 --> 06:21:43,439
use them if they make sense for your
8401
06:21:41,759 --> 06:21:46,079
application the next thing we're going
8402
06:21:43,439 --> 06:21:48,079
to look at is show pose and we're going
8403
06:21:48,080 --> 06:21:52,718
we have two numbers positive number
8404
06:21:50,558 --> 06:21:56,240
which is 34 a negative number which is
8405
06:21:52,718 --> 06:21:57,280
minus 45 and we can decide if we want to
8406
06:21:57,279 --> 06:22:02,399
the plus sign for positive numbers by
8407
06:22:00,240 --> 06:22:04,718
default the plus sign is going to be
8408
06:22:02,400 --> 06:22:07,840
hidden it's not going to be shown if you
8409
06:22:04,718 --> 06:22:10,798
want it shown you can use the show pose
8410
06:22:07,840 --> 06:22:13,680
manipulator and if you want to disable
8411
06:22:10,797 --> 06:22:15,599
that when it was enabled you can use no
8412
06:22:13,680 --> 06:22:19,040
show pose and this is going to do what
8413
06:22:15,599 --> 06:22:20,957
you want we can build this again and if
8414
06:22:19,040 --> 06:22:23,360
we look at the output we're going to see
8415
06:22:20,957 --> 06:22:26,159
that post num doesn't have a plus sign
8416
06:22:23,360 --> 06:22:29,920
in front because by default the show
8417
06:22:26,159 --> 06:22:31,919
pause is disabled and we set the setting
8418
06:22:29,919 --> 06:22:34,797
here and we're going to see the plus
8419
06:22:31,919 --> 06:22:36,717
sign and if we disable that we're not
8420
06:22:34,797 --> 06:22:39,840
going to see the plus sign again this is
8421
06:22:36,718 --> 06:22:42,878
the effect of std show posts and std
8422
06:22:39,840 --> 06:22:45,520
neutral pose manipulators we can also
8423
06:22:42,878 --> 06:22:48,080
affect the base in which the data is
8424
06:22:45,520 --> 06:22:51,279
displayed on the terminal and we do this
8425
06:22:48,080 --> 06:22:55,440
by setting the output base system
8426
06:22:51,279 --> 06:22:56,878
we can set std deck to force the output
8427
06:22:56,878 --> 06:23:02,637
std hex to force the output to be in
8428
06:22:59,360 --> 06:23:06,797
hexadecimal and std act to force the
8429
06:23:02,637 --> 06:23:09,520
output in octal and this is only to take
8430
06:23:06,797 --> 06:23:12,239
effect for integral types this is not
8431
06:23:09,520 --> 06:23:14,159
going to have effect for floating point
8432
06:23:12,240 --> 06:23:16,240
numbers for example here we have a few
8433
06:23:14,159 --> 06:23:18,957
variables a positive integer and
8434
06:23:16,240 --> 06:23:20,878
negative integer and a floating point
8435
06:23:20,878 --> 06:23:26,319
and we're going to try and print these
8436
06:23:22,957 --> 06:23:27,359
things in all these base systems we're
8437
06:23:27,360 --> 06:23:31,279
print these things in the default format
8438
06:23:29,439 --> 06:23:33,039
we're going to see how they look we are
8439
06:23:31,279 --> 06:23:36,000
going to take the positive number and
8440
06:23:33,040 --> 06:23:37,680
show that in these different number
8441
06:23:36,000 --> 06:23:39,599
systems we're going to do the same for
8442
06:23:37,680 --> 06:23:40,797
the negative number and we're going to
8443
06:23:40,797 --> 06:23:46,717
this doesn't have effect on floating
8444
06:23:43,759 --> 06:23:48,877
point numbers because these number
8445
06:23:46,718 --> 06:23:52,240
systems don't really work for floating
8446
06:23:48,878 --> 06:23:54,797
points we can run this and see the
8447
06:23:52,240 --> 06:23:57,360
output we are going to run the task that
8448
06:23:54,797 --> 06:24:00,239
is going to build with gcc and we're
8449
06:23:57,360 --> 06:24:03,040
going to clear and run rooster and what
8450
06:24:00,240 --> 06:24:04,798
we're going to see is that by default
8451
06:24:03,040 --> 06:24:06,878
positive number is going to be this
8452
06:24:04,797 --> 06:24:09,199
negative number is going to be this and
8453
06:24:06,878 --> 06:24:10,958
our double var is going to be this and
8454
06:24:09,200 --> 06:24:13,119
we are going to take the positive number
8455
06:24:10,957 --> 06:24:15,199
show it in different base systems in
8456
06:24:13,119 --> 06:24:18,000
decimal it's going to be like this in
8457
06:24:15,200 --> 06:24:20,637
hex it's going to be like this in act
8458
06:24:18,000 --> 06:24:22,637
it's going to be like this the negative
8459
06:24:22,637 --> 06:24:27,680
in this format here so if we show it in
8460
06:24:25,119 --> 06:24:29,919
decimal it's going to be like this hex
8461
06:24:27,680 --> 06:24:32,637
it's going to be like this and octo it's
8462
06:24:29,919 --> 06:24:35,279
going to be like this you can see that
8463
06:24:32,637 --> 06:24:37,039
the double var which is a floating point
8464
06:24:35,279 --> 06:24:39,840
is not really affected it's going to be
8465
06:24:37,040 --> 06:24:42,159
showing in the same format regardless of
8466
06:24:39,840 --> 06:24:44,797
the base that we set here one thing you
8467
06:24:42,159 --> 06:24:47,279
should know is that this base setting
8468
06:24:44,797 --> 06:24:49,919
here is going to stick so here for
8469
06:24:47,279 --> 06:24:51,199
example you see that we have set output
8470
06:24:51,200 --> 06:24:56,637
so any other thing that we're going to
8471
06:24:53,279 --> 06:24:58,797
print out is going to be shown in octo
8472
06:24:56,637 --> 06:25:00,957
and we have to be sure that's what we
8473
06:24:58,797 --> 06:25:02,399
want if that's not what we want we will
8474
06:25:03,759 --> 06:25:08,000
number system and it's going to take
8475
06:25:06,000 --> 06:25:09,520
effect this is how you can use these
8476
06:25:09,520 --> 06:25:14,878
different number systems for output in
8477
06:25:12,159 --> 06:25:17,040
your terminal we have seen that you can
8478
06:25:14,878 --> 06:25:19,520
also force things to show up in
8479
06:25:17,040 --> 06:25:21,680
uppercase if that's important for your
8480
06:25:19,520 --> 06:25:24,477
application for example here we have a
8481
06:25:21,680 --> 06:25:26,000
positive number if we show that in hex
8482
06:25:24,477 --> 06:25:27,200
this is going to contain a few
8483
06:25:27,200 --> 06:25:32,718
and if we don't set uppercase
8484
06:25:30,477 --> 06:25:34,878
it is going to show up in lowercase and
8485
06:25:32,718 --> 06:25:37,040
if we want it in uppercase we can set
8486
06:25:34,878 --> 06:25:40,080
this setting and it is going to show up
8487
06:25:37,040 --> 06:25:42,319
in uppercase this may be helpful in some
8488
06:25:40,080 --> 06:25:44,718
applications and i just want you to be
8489
06:25:42,319 --> 06:25:48,637
aware of these things we're going to
8490
06:25:44,718 --> 06:25:50,240
world and run our application
8491
06:25:50,240 --> 06:25:55,520
let's bring this up a little bit so that
8492
06:25:52,080 --> 06:25:57,600
we have some breathing room our positive
8493
06:25:55,520 --> 06:26:00,718
integer here is going to show up in
8494
06:25:57,599 --> 06:26:03,359
lowercase here in hex because this is
8495
06:26:00,718 --> 06:26:05,360
going to contain characters and if we
8496
06:26:03,360 --> 06:26:08,159
set uppercase you're going to see that
8497
06:26:05,360 --> 06:26:11,200
the characters are going to show up in
8498
06:26:08,159 --> 06:26:13,680
uppercase and this is the effect of this
8499
06:26:11,200 --> 06:26:15,600
setting here we can also affect how
8500
06:26:19,040 --> 06:26:23,280
for example here we have a few variables
8501
06:26:23,279 --> 06:26:28,557
and by default they are going to show up
8502
06:26:25,759 --> 06:26:31,759
with decimal points and use scientific
8503
06:26:28,558 --> 06:26:33,440
notation where necessary but we can
8504
06:26:33,439 --> 06:26:39,039
fixed for example if that's what we need
8505
06:26:35,919 --> 06:26:41,679
in our application and the output is
8506
06:26:39,040 --> 06:26:44,080
going to be shown using fixed notation
8507
06:26:41,680 --> 06:26:46,477
with decimal points if we want we can
8508
06:26:44,080 --> 06:26:49,440
force the scientific format and we do it
8509
06:26:46,477 --> 06:26:52,319
like this and all output is going to be
8510
06:26:49,439 --> 06:26:54,797
in scientific format and we can disable
8511
06:26:52,319 --> 06:26:56,079
all these settings and reset this to the
8512
06:26:56,080 --> 06:27:01,440
with this piece of command here there is
8513
06:27:01,439 --> 06:27:07,599
set floating point output to the
8514
06:27:04,558 --> 06:27:09,760
defaults and this is a hack i actually
8515
06:27:07,599 --> 06:27:12,557
learned about when i was preparing the
8516
06:27:09,759 --> 06:27:15,279
code for this course and the proper
8517
06:27:12,558 --> 06:27:17,760
explanations for this are really out of
8518
06:27:15,279 --> 06:27:20,717
scope for this course so if you want to
8519
06:27:17,759 --> 06:27:23,599
reset the floating point output format
8520
06:27:20,718 --> 06:27:25,840
to the default you're going to use this
8521
06:27:23,599 --> 06:27:29,199
but we don't really have enough tools to
8522
06:27:25,840 --> 06:27:31,520
understand this yet so just take it by
8523
06:27:29,200 --> 06:27:33,600
faith and you're going to see that if we
8524
06:27:31,520 --> 06:27:36,319
run this it's going to work let's try
8525
06:27:33,599 --> 06:27:38,399
and run this through the compiler and
8526
06:27:36,319 --> 06:27:40,637
that the world is going to go through if
8527
06:27:38,400 --> 06:27:43,120
we run this and i bring this up a little
8528
06:27:40,637 --> 06:27:45,039
bit so that we have a little bit of
8529
06:27:43,119 --> 06:27:48,477
breathing room we're going to see that
8530
06:27:45,040 --> 06:27:51,440
our double values are a b and c and
8531
06:27:48,477 --> 06:27:53,200
that's what we have in our code here and
8532
06:27:51,439 --> 06:27:55,199
by default it's not going to be able to
8533
06:27:53,200 --> 06:27:57,920
show these things because of the
8534
06:27:55,200 --> 06:28:00,319
precision limits so we're going to have
8535
06:28:00,319 --> 06:28:04,878
it's going to go up to here and the rest
8536
06:28:02,477 --> 06:28:07,119
is going to be chopped off if we use
8537
06:28:04,878 --> 06:28:10,240
fixed formats you're going to see that
8538
06:28:07,119 --> 06:28:13,200
whatever we had in scientific format
8539
06:28:10,240 --> 06:28:15,600
it's going to show up in fixed format
8540
06:28:13,200 --> 06:28:18,477
and again this is a really low number
8541
06:28:19,439 --> 06:28:23,840
we can force the output to be scientific
8542
06:28:25,360 --> 06:28:29,440
and all output is going to be in
8543
06:28:29,439 --> 06:28:33,119
down below here we use our hack to set
8544
06:28:33,119 --> 06:28:39,039
the defaults and you see that it's going
8545
06:28:35,759 --> 06:28:42,557
to go back to the initial format that we
8546
06:28:39,040 --> 06:28:44,878
had before this is how you use std fixed
8547
06:28:45,680 --> 06:28:51,279
manipulate how your floating point
8548
06:28:48,080 --> 06:28:53,600
numbers are printed to the terminal we
8549
06:28:51,279 --> 06:28:57,680
have also seen that we can set the
8550
06:28:53,599 --> 06:29:00,399
precision of our output in the terminal
8551
06:28:57,680 --> 06:29:02,957
here we have a variable a it is of type
8552
06:29:00,400 --> 06:29:05,120
double as you can see in a visual studio
8553
06:29:02,957 --> 06:29:07,359
code here if you hover over a variable
8554
06:29:05,119 --> 06:29:09,680
you're going to be able to see its type
8555
06:29:07,360 --> 06:29:12,637
we can choose to see this in whatever
8556
06:29:09,680 --> 06:29:15,680
precision we want 6 is the default in
8557
06:29:12,637 --> 06:29:18,957
our case here but we can choose to set
8558
06:29:15,680 --> 06:29:20,797
the precision to 10 20 or whatever it is
8559
06:29:20,797 --> 06:29:24,878
please note that this is going to be
8560
06:29:22,637 --> 06:29:27,279
limited by the precision that your type
8561
06:29:24,878 --> 06:29:30,558
supports so for example we know that a
8562
06:29:27,279 --> 06:29:33,439
double has a precision of 15 and if we
8563
06:29:30,558 --> 06:29:35,760
have more than 15 digits in here the
8564
06:29:33,439 --> 06:29:38,000
rest is going to be garbage just be
8565
06:29:35,759 --> 06:29:40,877
aware of that we're going to try and
8566
06:29:38,000 --> 06:29:44,319
build this and we're going to use gcc as
8567
06:29:44,319 --> 06:29:48,319
we're going to get our numbers in
8568
06:29:46,159 --> 06:29:50,400
different precisions the first one is
8569
06:29:48,319 --> 06:29:51,360
using the default which is going to be
8570
06:29:51,360 --> 06:29:54,958
if we use 10 we're going to get 10
8571
06:29:53,119 --> 06:29:57,759
digits if we use 20 we're going to get
8572
06:29:54,957 --> 06:30:00,637
20 digits but if we go over the
8573
06:29:57,759 --> 06:30:02,957
precision that our type here supports
8574
06:30:00,637 --> 06:30:04,957
we're going to get garbage i hope this
8575
06:30:02,957 --> 06:30:07,840
makes sense the last thing we're going
8576
06:30:04,957 --> 06:30:08,717
to see is show point and we have seen
8577
06:30:11,200 --> 06:30:16,798
outputting the decimal point let's say
8578
06:30:13,680 --> 06:30:18,319
that here and a good example for that is
8579
06:30:19,840 --> 06:30:25,840
here we're not going to get the decimal
8580
06:30:22,797 --> 06:30:28,957
point by default it's going to print 12
8581
06:30:25,840 --> 06:30:31,200
but if we go down and force output of
8582
06:30:28,957 --> 06:30:34,717
the decimal point here we're going to
8583
06:30:34,718 --> 06:30:40,558
and another effect of this is that it's
8584
06:30:37,360 --> 06:30:43,119
going to add trailing zeros to fill
8585
06:30:40,558 --> 06:30:45,920
whatever space is allocated for your
8586
06:30:43,119 --> 06:30:48,159
output variable in the terminal
8587
06:30:45,919 --> 06:30:50,399
let's try and run this so that we can
8588
06:30:48,159 --> 06:30:54,240
actually see this running we're going to
8589
06:30:50,400 --> 06:30:56,958
run our rooster executable and in the
8590
06:30:54,240 --> 06:30:59,760
first group here we don't have the
8591
06:30:56,957 --> 06:31:02,477
setting for show point and if you look
8592
06:30:59,759 --> 06:31:05,359
at the numbers that we had in our code
8593
06:31:02,477 --> 06:31:07,439
the first number is 34.1 and you see
8594
06:31:05,360 --> 06:31:10,400
that we are padding a lot of numbers
8595
06:31:07,439 --> 06:31:13,039
because we had set our precision to a
8596
06:31:10,400 --> 06:31:15,440
really big number in the last example
8597
06:31:13,040 --> 06:31:16,798
that we have run let's actually go there
8598
06:31:15,439 --> 06:31:19,039
and show you that that's why we're
8599
06:31:19,040 --> 06:31:24,080
it is really huge but no big deal we can
8600
06:31:21,680 --> 06:31:26,240
reset this to whatever we want if this
8601
06:31:26,240 --> 06:31:32,958
the important thing here is that we have
8602
06:31:29,797 --> 06:31:36,520
34.1 and that's what we are seeing and
8603
06:31:32,957 --> 06:31:40,957
if you go to our 12 here you see we have
8604
06:31:36,520 --> 06:31:43,279
12.0 but our output is not showing
8605
06:31:40,957 --> 06:31:45,279
the decimal point here if it is
8606
06:31:43,279 --> 06:31:48,637
important to show the decimal point we
8607
06:31:45,279 --> 06:31:50,717
can do std show point here and it is
8608
06:31:48,637 --> 06:31:53,439
going to show up this is really what is
8609
06:31:50,718 --> 06:31:54,878
important in this piece of code here and
8610
06:31:53,439 --> 06:31:56,637
this is really all we set out to do in
8611
06:31:54,878 --> 06:31:59,520
this lecture we had a chance to play
8612
06:31:56,637 --> 06:32:01,279
with a lot of these manipulators and the
8613
06:31:59,520 --> 06:32:04,159
best way to learn about these things is
8614
06:32:01,279 --> 06:32:06,319
really to try them out in code
8615
06:32:04,159 --> 06:32:09,520
and try to change a few things and see
8616
06:32:06,319 --> 06:32:11,919
how that affects the output you get in
8617
06:32:09,520 --> 06:32:14,159
the terminal and we had a chance to play
8618
06:32:11,919 --> 06:32:17,039
with many of these things in this
8619
06:32:14,159 --> 06:32:19,919
lecture there is a lot of these guys i
8620
06:32:17,040 --> 06:32:22,878
tried to make this lecture as extensive
8621
06:32:19,919 --> 06:32:24,957
as i can that's why it turned out to be
8622
06:32:22,878 --> 06:32:27,119
pretty long but once you've learned
8623
06:32:24,957 --> 06:32:29,680
about these fans and played with them in
8624
06:32:27,119 --> 06:32:32,718
code you're never going to forget them
8625
06:32:29,680 --> 06:32:36,319
one last point i want to emphasize again
8626
06:32:32,718 --> 06:32:39,040
is that the documentation is of utmost
8627
06:32:36,319 --> 06:32:41,279
importance it is really good to come
8628
06:32:39,040 --> 06:32:43,760
here and check things out for example if
8629
06:32:41,279 --> 06:32:46,239
we go to show point here we are going to
8630
06:32:43,759 --> 06:32:48,957
get a nice explanation of what this
8631
06:32:46,240 --> 06:32:50,958
manipulator does enables all disables
8632
06:32:48,957 --> 06:32:53,279
the unconditional inclusion of the
8633
06:32:50,957 --> 06:32:54,319
decimal point character and you can read
8634
06:32:54,319 --> 06:32:58,637
and the nice thing is that if you go
8635
06:32:56,558 --> 06:32:59,520
down you're going to have a piece of
8636
06:32:59,520 --> 06:33:03,520
that you can use to really understand
8637
06:33:01,360 --> 06:33:05,760
whatever it is they are talking about
8638
06:33:03,520 --> 06:33:08,000
and this is priceless if you are
8639
06:33:05,759 --> 06:33:10,957
learning it is a good thing to be able
8640
06:33:08,000 --> 06:33:13,599
to use the documentation this is really
8641
06:33:10,957 --> 06:33:16,319
all we set out to do in this lecture it
8642
06:33:13,599 --> 06:33:18,399
turned out to be really long but i
8643
06:33:16,319 --> 06:33:20,319
really hope it was worth it for you
8644
06:33:18,400 --> 06:33:21,520
we're going to stop here in this lecture
8645
06:33:20,319 --> 06:33:24,718
in the next one we're going to learn
8646
06:33:21,520 --> 06:33:27,200
about numeric limits go ahead and finish
8647
06:33:24,718 --> 06:33:29,200
up here and meet me there in this
8648
06:33:27,200 --> 06:33:31,920
lecture we're going to be playing with a
8649
06:33:29,200 --> 06:33:33,680
few functions from this library
8650
06:33:31,919 --> 06:33:36,239
specifically we're going to be looking
8651
06:33:33,680 --> 06:33:38,000
at the minimum the maximum and the
8652
06:33:38,000 --> 06:33:43,520
and this is really how you use them you
8653
06:33:40,400 --> 06:33:46,080
can think of this t as a placeholder for
8654
06:33:43,520 --> 06:33:48,957
the type for which you want to know the
8655
06:33:46,080 --> 06:33:51,200
minimum the maximum and the lowest point
8656
06:33:48,957 --> 06:33:53,439
respectively i know this might be
8657
06:33:51,200 --> 06:33:56,319
cryptic to some of you so we're going to
8658
06:33:53,439 --> 06:33:58,877
look at a few specific examples here we
8659
06:33:56,319 --> 06:34:00,558
have a simple explanation of what these
8660
06:34:02,878 --> 06:34:07,760
the minimum is going to represent the
8661
06:34:07,759 --> 06:34:12,637
that is representable with that floating
8662
06:34:10,477 --> 06:34:14,477
point type the maximum is going to be
8663
06:34:12,637 --> 06:34:17,279
the maximum floating point number you
8664
06:34:14,477 --> 06:34:20,079
can represent and at the lowest number
8665
06:34:17,279 --> 06:34:22,717
is going to be the lowest negative
8666
06:34:20,080 --> 06:34:24,240
number you can represent with that type
8667
06:34:22,718 --> 06:34:27,200
things change a little bit when you
8668
06:34:24,240 --> 06:34:29,120
start dealing with integers and these
8669
06:34:27,200 --> 06:34:31,280
functions are going to look like this
8670
06:34:29,119 --> 06:34:32,878
the minimum is going to be the minimum
8671
06:34:31,279 --> 06:34:35,680
number you can represent with that
8672
06:34:32,878 --> 06:34:38,958
integer and lowest doesn't really mean
8673
06:34:35,680 --> 06:34:41,040
anything for integral types the maximum
8674
06:34:38,957 --> 06:34:42,957
is going to be the maximum number one
8675
06:34:41,040 --> 06:34:45,520
thing you have to keep in mind is that
8676
06:34:42,957 --> 06:34:49,199
the minimum may be negative
8677
06:34:45,520 --> 06:34:51,279
if you are using a signed integer if you
8678
06:34:49,200 --> 06:34:53,760
are using an unsigned integer for
8679
06:34:51,279 --> 06:34:56,159
example for short minimum is going to be
8680
06:34:53,759 --> 06:34:59,279
zero and the maximum is going to be the
8681
06:34:56,159 --> 06:35:01,840
maximum number representable with that
8682
06:34:59,279 --> 06:35:04,878
integer type here we are looking at
8683
06:35:01,840 --> 06:35:07,759
numbers for short and but the same story
8684
06:35:04,878 --> 06:35:10,000
applies to whatever integer type you are
8685
06:35:07,759 --> 06:35:13,599
using even if you happen to be using
8686
06:35:10,000 --> 06:35:15,680
long end or end without any modifier
8687
06:35:13,599 --> 06:35:19,439
remember that we had to do a lot of
8688
06:35:15,680 --> 06:35:22,080
things to get this range and it was
8689
06:35:19,439 --> 06:35:26,399
really hard to even do this for floating
8690
06:35:22,080 --> 06:35:28,240
point types so this library is helpful
8691
06:35:26,400 --> 06:35:30,718
in getting a sense of what we can
8692
06:35:28,240 --> 06:35:33,440
represent with the given type b8
8693
06:35:30,718 --> 06:35:35,840
floating point or integral let's head to
8694
06:35:33,439 --> 06:35:38,877
visual studio code and play with us here
8695
06:35:35,840 --> 06:35:40,797
we are in our working folder
8696
06:35:38,878 --> 06:35:42,637
we are going to copy code from our
8697
06:35:42,637 --> 06:35:46,718
and we are going to go in the current
8698
06:35:44,718 --> 06:35:49,520
project which is numeric limits we're
8699
06:35:46,718 --> 06:35:52,718
going to go and put in our files
8700
06:35:49,520 --> 06:35:54,558
go up again and open this file up in
8701
06:35:52,718 --> 06:35:57,440
visual studio code we're going to close
8702
06:35:54,558 --> 06:35:59,840
this up open the main cpp file remove
8703
06:35:57,439 --> 06:36:02,239
whatever it is we don't need we are
8704
06:35:59,840 --> 06:36:04,000
going to include the limits library
8705
06:36:02,240 --> 06:36:05,120
remember this is the first thing we need
8706
06:36:05,119 --> 06:36:11,439
if we want to play with these facilities
8707
06:36:09,040 --> 06:36:13,760
that we just looked at in the slides
8708
06:36:11,439 --> 06:36:16,557
and we are going to go down here and put
8709
06:36:13,759 --> 06:36:19,279
in the code we want to play with
8710
06:36:16,558 --> 06:36:21,440
and it is ridiculously simple
8711
06:36:19,279 --> 06:36:23,680
if you have watched the slides we just
8712
06:36:21,439 --> 06:36:25,359
did in a minute so what we're going to
8713
06:36:23,680 --> 06:36:28,000
be doing here we're going to be printing
8714
06:36:25,360 --> 06:36:30,159
out the range for each possible type we
8715
06:36:28,000 --> 06:36:33,520
want to play with here so we're going to
8716
06:36:30,159 --> 06:36:35,919
say the range for short and is from
8717
06:36:33,520 --> 06:36:37,040
and we're going to say std numeric
8718
06:36:37,040 --> 06:36:42,000
short that's what we want to deal with
8719
06:36:39,520 --> 06:36:44,319
now and we're going to call the minimum
8720
06:36:42,000 --> 06:36:46,718
function this is going to give us
8721
06:36:44,319 --> 06:36:49,520
the minimum value we can represent with
8722
06:36:46,718 --> 06:36:51,200
short and we're going to say std numeric
8723
06:36:49,520 --> 06:36:52,159
limits and we're going to call the max
8724
06:36:52,159 --> 06:36:56,797
passing in the type for which we want to
8725
06:36:56,797 --> 06:37:02,477
and the same story applies for
8726
06:37:03,840 --> 06:37:08,797
you see that's the type we are using
8727
06:37:05,680 --> 06:37:10,957
here we are also going to play with ant
8728
06:37:08,797 --> 06:37:12,477
getting the range we're going to use
8729
06:37:12,477 --> 06:37:16,399
to see how these things behave we're
8730
06:37:16,400 --> 06:37:21,840
and get to the range and we are also
8731
06:37:18,797 --> 06:37:24,079
going to be playing with floating point
8732
06:37:21,840 --> 06:37:26,878
types so we're going to compute the
8733
06:37:24,080 --> 06:37:29,440
range using the minimum function and the
8734
06:37:26,878 --> 06:37:32,477
maximum function and we are going to be
8735
06:37:29,439 --> 06:37:35,279
also using the lowest function to see
8736
06:37:32,477 --> 06:37:37,759
that this really is the same thing we
8737
06:37:35,279 --> 06:37:40,079
described in the slides we're going to
8738
06:37:37,759 --> 06:37:41,840
do this for double and long double and
8739
06:37:41,840 --> 06:37:47,040
come up in this program what we're going
8740
06:37:44,000 --> 06:37:50,240
to do is open up a terminal here we are
8741
06:37:47,040 --> 06:37:52,638
going to run the task to build with gcc
8742
06:37:50,240 --> 06:37:56,320
and the build is going to be good
8743
06:37:52,637 --> 06:37:57,919
and we can go down and run rooster and
8744
06:37:56,319 --> 06:38:02,637
we're going to get our values here the
8745
06:37:57,919 --> 06:38:04,119
range for short and is from minus 32 768
8746
06:38:04,119 --> 06:38:09,439
767 and you see that this is exactly the
8747
06:38:07,279 --> 06:38:11,759
same thing we saw in the lecture where
8748
06:38:09,439 --> 06:38:14,319
we talked about number systems we saw a
8749
06:38:11,759 --> 06:38:15,359
way you can do this manually by plugging
8750
06:38:15,360 --> 06:38:20,159
number of digits in some formula that we
8751
06:38:18,000 --> 06:38:22,319
came up you can go back and check that
8752
06:38:20,159 --> 06:38:25,040
out if you want we do the same for
8753
06:38:22,319 --> 06:38:27,279
unsigned short and and then we look at
8754
06:38:25,040 --> 06:38:29,760
floating point types we're going to
8755
06:38:32,000 --> 06:38:37,599
minimum function to get the start of the
8756
06:38:34,797 --> 06:38:40,477
range we're going to get the minimum
8757
06:38:37,599 --> 06:38:42,717
positive number we can represent with a
8758
06:38:40,477 --> 06:38:45,439
float if we use lowest we're going to
8759
06:38:42,718 --> 06:38:47,760
get the lowest minimum number and that
8760
06:38:45,439 --> 06:38:50,000
the maximum is going to be the same if
8761
06:38:47,759 --> 06:38:52,637
you think this is really small you have
8762
06:38:50,000 --> 06:38:56,477
the option to open up this folder in
8763
06:38:52,637 --> 06:38:58,957
file explorer and you can open a command
8764
06:38:56,477 --> 06:39:01,520
prompt or powershell window by hitting
8765
06:38:58,957 --> 06:39:04,319
shift and right clicking and choosing
8766
06:39:01,520 --> 06:39:05,119
this option here open powershell window
8767
06:39:05,119 --> 06:39:08,718
and you're going to get a bigger window
8768
06:39:07,040 --> 06:39:10,638
in which you can type things we're going
8769
06:39:08,718 --> 06:39:13,600
to run rooster and we're going to see
8770
06:39:10,637 --> 06:39:15,919
things in a much easier way here
8771
06:39:13,599 --> 06:39:19,439
this is an option you can use or you can
8772
06:39:15,919 --> 06:39:21,919
even use the integrated terminal inside
8773
06:39:19,439 --> 06:39:24,319
visual studio code here like we've been
8774
06:39:21,919 --> 06:39:27,359
doing all along there are a few other
8775
06:39:24,319 --> 06:39:32,239
facilities you can use in this library
8776
06:39:27,360 --> 06:39:34,797
of limits for example we can try and
8777
06:39:32,240 --> 06:39:37,680
print out if a number is signed or
8778
06:39:34,797 --> 06:39:40,637
unsigned or get the number of digits we
8779
06:39:37,680 --> 06:39:42,878
can represent in an integer type
8780
06:39:40,637 --> 06:39:44,878
these are a few examples i just chose
8781
06:39:42,878 --> 06:39:47,279
because they are easy to understand and
8782
06:39:44,878 --> 06:39:49,360
really helpful but you can find more
8783
06:39:51,119 --> 06:39:56,557
and if you come here at cppreference.com
8784
06:39:54,000 --> 06:39:59,040
the link is here you can really find all
8785
06:39:56,558 --> 06:40:01,200
about this library here this library
8786
06:39:59,040 --> 06:40:04,000
provides a standardized way to carry
8787
06:40:01,200 --> 06:40:06,159
various properties of arithmetic types
8788
06:40:04,000 --> 06:40:08,878
for example the largest possible value
8789
06:40:08,878 --> 06:40:13,680
and we have a bunch of things we can do
8790
06:40:10,637 --> 06:40:14,557
here don't be scared of by this template
8791
06:40:14,558 --> 06:40:19,920
just think of them as placeholders for
8792
06:40:18,000 --> 06:40:22,477
the type for which you are trying to
8793
06:40:19,919 --> 06:40:24,717
query information for there are a few
8794
06:40:22,477 --> 06:40:27,840
functions you can call on these things
8795
06:40:24,718 --> 06:40:29,840
for example there is mean lowest max
8796
06:40:27,840 --> 06:40:32,558
that we just played with in visual
8797
06:40:29,840 --> 06:40:34,637
studio code but uh you can see that
8798
06:40:32,558 --> 06:40:36,798
there are a lot of things you can play
8799
06:40:34,637 --> 06:40:38,957
with especially if you have some math
8800
06:40:36,797 --> 06:40:41,439
background to understand all these
8801
06:40:38,957 --> 06:40:44,159
concepts here you can play with us and
8802
06:40:41,439 --> 06:40:46,159
see if it is helpful for whatever
8803
06:40:44,159 --> 06:40:47,520
application you are doing okay this is
8804
06:40:46,159 --> 06:40:49,919
really all we set out to do in this
8805
06:40:47,520 --> 06:40:53,119
lecture to learn a little bit about the
8806
06:40:49,919 --> 06:40:55,359
limits library it is helpful in
8807
06:40:53,119 --> 06:40:57,279
trying to understand the ranges for your
8808
06:40:55,360 --> 06:40:59,840
types if you happen to need these kinds
8809
06:40:57,279 --> 06:41:01,680
of things this is going to come in handy
8810
06:40:59,840 --> 06:41:03,040
we're going to stop here in this lecture
8811
06:41:01,680 --> 06:41:06,240
in the next one we're going to learn
8812
06:41:03,040 --> 06:41:09,680
about some math functions we can use in
8813
06:41:06,240 --> 06:41:11,760
c plus plus go ahead and finish up here
8814
06:41:09,680 --> 06:41:14,400
and meet me there in this lecture we're
8815
06:41:11,759 --> 06:41:16,717
going to learn about math functions and
8816
06:41:14,400 --> 06:41:19,600
these are functions that are built into
8817
06:41:16,718 --> 06:41:22,159
the z plus plus standard library that we
8818
06:41:19,599 --> 06:41:24,159
can use to do some math if you are doing
8819
06:41:22,159 --> 06:41:25,759
some math operations you're going to
8820
06:41:25,759 --> 06:41:31,439
they live in the c math library and if
8821
06:41:30,000 --> 06:41:33,279
you want to use them you're just going
8822
06:41:31,439 --> 06:41:35,359
to include that and you're going to have
8823
06:41:33,279 --> 06:41:37,759
access to them what you see here is a
8824
06:41:35,360 --> 06:41:40,878
simple summary of some of the things you
8825
06:41:37,759 --> 06:41:45,359
can use in these math functions you can
8826
06:41:40,878 --> 06:41:46,080
use std flower to round down or hdd seal
8827
06:41:46,080 --> 06:41:51,840
round up you can use the abs function to
8828
06:41:49,439 --> 06:41:54,717
compute the absolute value of a number
8829
06:41:51,840 --> 06:41:57,920
you can do trigonometry you can do the
8830
06:41:54,718 --> 06:42:00,080
cosine sign and things like that you can
8831
06:41:57,919 --> 06:42:01,759
compute the exponential of a number
8832
06:42:00,080 --> 06:42:04,798
you're going to see what this means in a
8833
06:42:01,759 --> 06:42:07,199
few lectures you can use std log and
8834
06:42:04,797 --> 06:42:09,199
again if you have some math background
8835
06:42:07,200 --> 06:42:11,440
these concepts are not going to be
8836
06:42:09,200 --> 06:42:14,240
foreign to you many of these functions
8837
06:42:11,439 --> 06:42:17,039
are documented here at cpp reference so
8838
06:42:14,240 --> 06:42:19,440
it might be worthwhile to go there and
8839
06:42:17,040 --> 06:42:21,280
check what functions are available there
8840
06:42:19,439 --> 06:42:23,520
here is an example of something you
8841
06:42:21,279 --> 06:42:25,919
might want to do for example you have a
8842
06:42:23,520 --> 06:42:30,558
variable it's called weight inside we
8843
06:42:25,919 --> 06:42:32,239
have a 7.7 and if you do std floor of
8844
06:42:30,558 --> 06:42:35,200
this variable this is going to be
8845
06:42:32,240 --> 06:42:37,680
rounded down to a 7. if you want to
8846
06:42:35,200 --> 06:42:39,360
round up you're going to use std seal
8847
06:42:37,680 --> 06:42:41,279
and you're going to get that and we're
8848
06:42:39,360 --> 06:42:44,159
going to see what this is going to give
8849
06:42:41,279 --> 06:42:46,399
us in a minute when we hit visual studio
8850
06:42:44,159 --> 06:42:48,718
code here is how you would use the
8851
06:42:46,400 --> 06:42:52,080
absolute value function you have a few
8852
06:42:48,718 --> 06:42:54,798
variables here and if you try to plug
8853
06:42:52,080 --> 06:42:56,638
them in this absolute value function
8854
06:42:54,797 --> 06:43:00,319
you're basically going to get the weight
8855
06:42:56,637 --> 06:43:02,878
of the number without any sign in front
8856
06:43:00,319 --> 06:43:04,797
of the number positive or negative the
8857
06:43:02,878 --> 06:43:07,760
absolute value is the weight of the
8858
06:43:04,797 --> 06:43:10,319
number without caring about the sign if
8859
06:43:07,759 --> 06:43:12,717
i may say it like that okay we also have
8860
06:43:10,319 --> 06:43:15,520
the x function which is going to compute
8861
06:43:12,718 --> 06:43:17,520
the exponential of a number this is a
8862
06:43:15,520 --> 06:43:19,760
math concept so if you don't have a
8863
06:43:17,520 --> 06:43:22,000
background in math this is going to be a
8864
06:43:19,759 --> 06:43:24,239
little hard to wrap your brains around
8865
06:43:22,000 --> 06:43:25,520
but in math we have this number which is
8866
06:43:25,520 --> 06:43:32,558
and its value is approximately 2.7 18 28
8867
06:43:30,477 --> 06:43:35,439
like you see here the exponential
8868
06:43:32,558 --> 06:43:38,400
function is going to do what f x here is
8869
06:43:35,439 --> 06:43:41,759
doing it's going to take e and elevate
8870
06:43:38,400 --> 06:43:44,080
that to the power of x and for example
8871
06:43:41,759 --> 06:43:46,877
in our code here we're going to get the
8872
06:43:44,080 --> 06:43:49,680
exponential of 10 which is going to be e
8873
06:43:46,878 --> 06:43:51,680
elevated to the power of tan and we're
8874
06:43:49,680 --> 06:43:53,200
going to play with this in visual studio
8875
06:43:51,680 --> 06:43:55,680
code and you're going to see the value
8876
06:43:53,200 --> 06:43:57,360
of this we also have the power function
8877
06:43:55,680 --> 06:43:59,840
here which is going to take the first
8878
06:43:57,360 --> 06:44:01,680
parameter and elevate that to the power
8879
06:44:02,878 --> 06:44:08,080
this is going to be 3 to the power of 4
8880
06:44:05,439 --> 06:44:10,399
and 9 to the power of 3 and we're going
8881
06:44:08,080 --> 06:44:13,520
to get the answer if we plug this into
8882
06:44:10,400 --> 06:44:16,080
visual studio code and we have look
8883
06:44:13,520 --> 06:44:18,718
functions which is basically the reverse
8884
06:44:16,080 --> 06:44:20,080
of the power function that we just
8885
06:44:20,080 --> 06:44:27,360
if you do log 8 in base 2 for example
8886
06:44:24,477 --> 06:44:29,919
it is like you are asking to which power
8887
06:44:31,919 --> 06:44:36,477
and the answer here is going to be a 3
8888
06:44:33,840 --> 06:44:39,920
of course but the catch is that the log
8889
06:44:36,477 --> 06:44:42,477
function by default works in base e
8890
06:44:39,919 --> 06:44:46,199
so what we are asking for example if we
8891
06:44:46,400 --> 06:44:52,638
is to which power should we elevate e
8892
06:44:49,919 --> 06:44:54,239
to get this number in here and it is
8893
06:44:52,637 --> 06:44:56,878
going to be computed and you're going to
8894
06:44:54,240 --> 06:44:59,280
see this if you plug this into
8895
06:44:56,878 --> 06:45:01,760
visual studio code or you can try to use
8896
06:44:59,279 --> 06:45:03,360
one of the calculators available to you
8897
06:45:01,759 --> 06:45:06,239
and you're going to see that this makes
8898
06:45:03,360 --> 06:45:08,159
sense we also have a special function
8899
06:45:06,240 --> 06:45:09,680
that is going to do the same thing but
8900
06:45:09,680 --> 06:45:14,000
and this is going to be easier to
8901
06:45:11,599 --> 06:45:16,159
understand for example here we are
8902
06:45:17,200 --> 06:45:22,319
what we are really saying is to which
8903
06:45:22,319 --> 06:45:28,957
to get 10 000 and this is easy because
8904
06:45:25,279 --> 06:45:32,637
the answer is a 4 10 to the power of 4
8905
06:45:28,957 --> 06:45:35,439
is 10 000 i really hope this makes sense
8906
06:45:32,637 --> 06:45:38,239
we also have a square route function we
8907
06:45:35,439 --> 06:45:39,359
can use so square out of 81 is going to
8908
06:45:39,360 --> 06:45:43,840
we have a function called std round
8909
06:45:43,840 --> 06:45:49,200
and uh what it's going to do by default
8910
06:45:46,957 --> 06:45:52,319
halfway points are going to be rounded
8911
06:45:49,200 --> 06:45:55,200
away from zero so if you have a 2.5 it's
8912
06:45:52,319 --> 06:45:58,319
going to be rounded up to a 3 and if you
8913
06:45:55,200 --> 06:46:01,760
have 2.4 it's going to be rounded down
8914
06:45:58,319 --> 06:46:04,400
to a 2. we also have a host of functions
8915
06:46:01,759 --> 06:46:06,477
we can use in trigonometry we have a
8916
06:46:04,400 --> 06:46:08,878
sine function we have a cosine function
8917
06:46:06,477 --> 06:46:11,200
we have a tan function if you know these
8918
06:46:08,878 --> 06:46:14,400
concepts in math this is going to come
8919
06:46:11,200 --> 06:46:16,240
in really handy if you want to do this i
8920
06:46:14,400 --> 06:46:19,760
have to say that what we just talked
8921
06:46:16,240 --> 06:46:23,120
about is a small set of what we can do
8922
06:46:19,759 --> 06:46:26,797
with these functions here in c math and
8923
06:46:23,119 --> 06:46:29,360
uh we are here at cppreference.com
8924
06:46:26,797 --> 06:46:32,079
and we can see all these functions here
8925
06:46:29,360 --> 06:46:34,477
we can do reminder we can do f men and
8926
06:46:32,080 --> 06:46:37,200
if you want you can check this out in
8927
06:46:34,477 --> 06:46:40,399
the documentation for example if you go
8928
06:46:37,200 --> 06:46:42,477
to can here and click on it you are
8929
06:46:40,400 --> 06:46:44,878
going to get the description and
8930
06:46:42,477 --> 06:46:46,159
explanation of what this function does
8931
06:46:44,878 --> 06:46:49,119
and you're going to have a simple
8932
06:46:46,159 --> 06:46:51,439
example of how you can play with us okay
8933
06:46:49,119 --> 06:46:54,000
now i hope you have a better idea of
8934
06:46:51,439 --> 06:46:56,877
what we can do with these functions in
8935
06:46:54,000 --> 06:46:58,400
the cmat library we're going to head to
8936
06:46:58,400 --> 06:47:03,120
and play with some of these functions
8937
06:47:00,558 --> 06:47:05,040
here we are in visual studio code the
8938
06:47:03,119 --> 06:47:07,360
current project we're going to work on
8939
06:47:05,040 --> 06:47:10,080
is math functions we're going to copy
8940
06:47:10,080 --> 06:47:15,680
and we're going to put them in our
8941
06:47:12,957 --> 06:47:17,840
directory here math functions
8942
06:47:15,680 --> 06:47:21,279
and we are going to open this up in
8943
06:47:17,840 --> 06:47:23,759
visual studio code and we are going to
8944
06:47:21,279 --> 06:47:26,399
remove whatever it is we don't need
8945
06:47:23,759 --> 06:47:28,319
and we are going to include our library
8946
06:47:28,319 --> 06:47:32,797
and we are going to put in our code so
8947
06:47:32,797 --> 06:47:36,000
and here we have a variable called
8948
06:47:36,000 --> 06:47:41,040
and we're going to try and use a few
8949
06:47:38,159 --> 06:47:43,360
math functions on it so we can use sdd
8950
06:47:43,360 --> 06:47:49,360
and std seal to round up so weighted
8951
06:47:46,718 --> 06:47:51,920
rounded to floor is going to be printed
8952
06:47:49,360 --> 06:47:53,360
out and way to round it to seal is going
8953
06:47:53,360 --> 06:47:57,440
we're going to have a number here
8954
06:47:55,439 --> 06:47:59,840
in this savings variable it's going to
8955
06:47:57,439 --> 06:48:02,239
be a negative number and we're going to
8956
06:47:59,840 --> 06:48:04,319
try and compute the absolute value of
8957
06:48:02,240 --> 06:48:06,478
this we're going to see it printed out
8958
06:48:06,477 --> 06:48:12,797
compute is the exponential of the value
8959
06:48:12,797 --> 06:48:16,797
and what this is going to do is going to
8960
06:48:16,797 --> 06:48:21,199
and raise it to the power of 10 and
8961
06:48:19,599 --> 06:48:23,119
that's what we're going to get printed
8962
06:48:21,200 --> 06:48:25,040
here the other thing we want to do here
8963
06:48:23,119 --> 06:48:26,957
is compute the power of a number we're
8964
06:48:25,040 --> 06:48:30,400
going to take 3 and raise it to the
8965
06:48:26,957 --> 06:48:33,039
power of 4 and take 9 and raise it to
8966
06:48:30,400 --> 06:48:35,680
the power of 3 and we're going to see
8967
06:48:33,040 --> 06:48:38,638
what these things evaluate to we're
8968
06:48:35,680 --> 06:48:40,957
going to open up our terminal here and
8969
06:48:38,637 --> 06:48:43,919
we're going to run the task to build
8970
06:48:40,957 --> 06:48:46,239
with gcc the world is going to be good
8971
06:48:43,919 --> 06:48:49,599
and if we run rooster we're going to get
8972
06:48:46,240 --> 06:48:51,120
these things here so 7.7 rounded to
8973
06:48:49,599 --> 06:48:54,399
floor is going to be seven so we're
8974
06:48:51,119 --> 06:48:56,477
going to round down 7.7 rounded to sale
8975
06:48:54,400 --> 06:48:59,600
is going to be eight and that's what
8976
06:48:56,477 --> 06:49:02,360
we're going to get and the absolute
8977
06:49:02,360 --> 06:49:09,279
7.7 because it is a positive number and
8978
06:49:06,000 --> 06:49:11,759
the absolute value of minus 5000 is
8979
06:49:09,279 --> 06:49:14,878
going to be 5 000. and again when you
8980
06:49:11,759 --> 06:49:17,919
compute the absolute value of something
8981
06:49:14,878 --> 06:49:21,119
you are interested in the weight of that
8982
06:49:17,919 --> 06:49:23,759
thing without considering the sign
8983
06:49:21,119 --> 06:49:25,599
without really worrying if it is
8984
06:49:23,759 --> 06:49:27,919
positive or negative you just want to
8985
06:49:25,599 --> 06:49:30,000
get the magnitude of a number that's
8986
06:49:27,919 --> 06:49:32,477
what we use in math to mean that
8987
06:49:30,000 --> 06:49:35,200
magnitude okay so if we go down we're
8988
06:49:32,477 --> 06:49:36,477
going to get the exponential of 10 is
8989
06:49:36,477 --> 06:49:42,079
and you're going to get that here and
8990
06:49:38,718 --> 06:49:45,440
again what this function does is take e
8991
06:49:42,080 --> 06:49:47,680
and raise it to the power of 10
8992
06:49:45,439 --> 06:49:50,079
and that's the answer here we can try
8993
06:49:47,680 --> 06:49:52,159
and prove this with a calculator so i am
8994
06:49:50,080 --> 06:49:54,478
going to open my windows calculator you
8995
06:49:52,159 --> 06:49:55,840
can use whatever calculator you have
8996
06:49:55,840 --> 06:50:02,400
i am going to use a scientific
8997
06:49:58,718 --> 06:50:04,718
calculator here and you see that we can
8998
06:50:02,400 --> 06:50:07,360
hit e and we're going to get the value
8999
06:50:04,718 --> 06:50:11,200
of this e number in math here it is
9000
06:50:07,360 --> 06:50:14,797
simplified but if i take it and raise it
9001
06:50:11,200 --> 06:50:18,360
to the power of 10 the answer is going
9002
06:50:19,279 --> 06:50:23,637
and if we look in our program we have 22
9003
06:50:23,637 --> 06:50:29,840
26.5 okay it is rounded up a little bit
9004
06:50:26,957 --> 06:50:32,557
but it is almost the same thing okay we
9005
06:50:29,840 --> 06:50:33,680
also want to play with log functions a
9006
06:50:33,680 --> 06:50:38,400
log is basically the reverse of the
9007
06:50:38,400 --> 06:50:41,520
and we just talked about this in the
9008
06:50:42,558 --> 06:50:48,240
if we do log 18 base 2 we are basically
9009
06:50:45,360 --> 06:50:50,000
asking to which power should we raise 2
9010
06:50:50,000 --> 06:50:53,680
and the answer to that is going to be
9011
06:50:53,680 --> 06:50:58,637
number in base number is going to
9012
06:50:55,840 --> 06:51:02,080
evaluate to the catch is that the log
9013
06:50:58,637 --> 06:51:05,200
function if you use it row like this it
9014
06:51:02,080 --> 06:51:08,320
is going to be using base e and we just
9015
06:51:05,200 --> 06:51:09,680
saw that e is 2 to the power of 7 or
9016
06:51:08,319 --> 06:51:12,558
something let's go back to our
9017
06:51:09,680 --> 06:51:14,718
calculator and see if we can see that
9018
06:51:12,558 --> 06:51:17,280
why not why try to guess when we have a
9019
06:51:14,718 --> 06:51:20,080
good calculator in our hands we are
9020
06:51:17,279 --> 06:51:22,399
using the scientific calculator so if we
9021
06:51:27,040 --> 06:51:31,760
we are basically asking to which power
9022
06:51:33,878 --> 06:51:38,477
54.59 and the answer is going to be
9023
06:51:38,477 --> 06:51:44,319
we have a version of this that is going
9024
06:51:41,119 --> 06:51:46,399
to use base 10 so if we use this
9025
06:51:44,319 --> 06:51:49,279
we are basically saying to which power
9026
06:51:46,400 --> 06:51:51,360
should we raise 10 to get 10 000 and the
9027
06:51:49,279 --> 06:51:53,759
answer is going to be printed out here
9028
06:51:51,360 --> 06:51:57,040
and it is going to be a four because
9029
06:51:53,759 --> 06:52:00,319
this is easy to do in your mind so let's
9030
06:51:57,040 --> 06:52:02,718
run this we're going to build the task
9031
06:52:00,319 --> 06:52:05,680
we are going to run the task to build
9032
06:52:02,718 --> 06:52:08,240
with gcc and we're going to run our
9033
06:52:05,680 --> 06:52:10,840
program and uh we're going to get our
9034
06:52:10,840 --> 06:52:16,957
54.59 you would elevate e to the power
9035
06:52:14,240 --> 06:52:18,638
of this number here this is the answer
9036
06:52:16,957 --> 06:52:20,717
and if you want you can prove this with
9037
06:52:18,637 --> 06:52:22,878
your favorite calculator you're going to
9038
06:52:20,718 --> 06:52:25,040
get something close to this to get 10
9039
06:52:22,878 --> 06:52:27,360
000 you'd need to elevate 10 to the
9040
06:52:25,040 --> 06:52:30,000
power of 4. that's what we're going to
9041
06:52:27,360 --> 06:52:32,558
get in here let's print this out again
9042
06:52:30,000 --> 06:52:35,599
many mistakes sorry but i hope you get
9043
06:52:32,558 --> 06:52:38,638
the point if we build again so that we
9044
06:52:35,599 --> 06:52:40,957
can see things properly and run we're
9045
06:52:38,637 --> 06:52:42,957
going to get proper data and this is
9046
06:52:40,957 --> 06:52:44,957
really what we expected to get we have a
9047
06:52:42,957 --> 06:52:47,759
few more functions we can play with as
9048
06:52:47,759 --> 06:52:53,439
let's play with square root and the std
9049
06:52:51,360 --> 06:52:56,000
round function here we are going to get
9050
06:52:53,439 --> 06:52:58,079
the square root of 81 we're going to get
9051
06:52:56,000 --> 06:53:01,439
it printed down and we're going to see
9052
06:52:58,080 --> 06:53:05,200
what std round does it is going to
9053
06:53:01,439 --> 06:53:08,557
round away from zero if we are at half
9054
06:53:05,200 --> 06:53:10,240
point and if we are not at half point if
9055
06:53:08,558 --> 06:53:12,958
we are below that we're going to round
9056
06:53:10,240 --> 06:53:14,798
down if we are higher than that we're
9057
06:53:12,957 --> 06:53:16,957
going to round up we're going to run
9058
06:53:14,797 --> 06:53:19,439
this so that you can see this running
9059
06:53:16,957 --> 06:53:23,119
and we're going to call rooster and the
9060
06:53:19,439 --> 06:53:26,477
2.5 is rounded to 3. 2.4 is rounded to
9061
06:53:23,119 --> 06:53:30,159
2. 3.6 is rounded to 4. this is what we
9062
06:53:26,477 --> 06:53:32,878
expect and the square root of 81
9063
06:53:30,159 --> 06:53:35,680
is 9. this is really all we set out to
9064
06:53:32,878 --> 06:53:37,760
do in this lecture to play with a few of
9065
06:53:37,759 --> 06:53:43,679
they are not really hard to use once you
9066
06:53:40,477 --> 06:53:46,079
have the basics of math nailed down and
9067
06:53:43,680 --> 06:53:48,319
again if you want to check the full list
9068
06:53:46,080 --> 06:53:50,000
of these functions please come to our
9069
06:53:48,319 --> 06:53:52,239
reference documentation here you're
9070
06:53:52,240 --> 06:53:57,600
and if you want to see how to use one of
9071
06:53:54,797 --> 06:53:59,439
these for example if you click on log 10
9072
06:53:57,599 --> 06:54:00,957
here you're going to come here you're
9073
06:53:59,439 --> 06:54:03,119
going to get an explanation of the
9074
06:54:00,957 --> 06:54:05,359
function and even better you're going to
9075
06:54:03,119 --> 06:54:08,000
go down and get a nice piece of code you
9076
06:54:05,360 --> 06:54:09,760
can play with and really make sense of
9077
06:54:08,000 --> 06:54:11,680
what is happening in these functions
9078
06:54:09,759 --> 06:54:13,199
here this is really all we set out to do
9079
06:54:11,680 --> 06:54:15,360
in this lecture i hope you found it
9080
06:54:13,200 --> 06:54:17,280
interesting we are going to stop here in
9081
06:54:15,360 --> 06:54:21,040
this lecture the next one we're going to
9082
06:54:17,279 --> 06:54:23,439
learn about some weird integral types
9083
06:54:21,040 --> 06:54:25,200
go ahead and finish up here and meet me
9084
06:54:23,439 --> 06:54:28,159
there in this lecture we're going to
9085
06:54:25,200 --> 06:54:30,958
learn about some weird integral types
9086
06:54:28,159 --> 06:54:33,680
and what do i mean by this well if you
9087
06:54:30,957 --> 06:54:36,239
look here integral types less than 4
9088
06:54:33,680 --> 06:54:39,439
bytes in size don't support arithmetic
9089
06:54:36,240 --> 06:54:41,680
operations and these are operations like
9090
06:54:39,439 --> 06:54:44,399
addition subtraction multiplication
9091
06:54:41,680 --> 06:54:45,760
division you can do these operations on
9092
06:54:45,759 --> 06:54:51,840
and here i have an example of some of
9093
06:54:48,400 --> 06:54:54,000
those types we have a car it is one byte
9094
06:54:54,000 --> 06:55:00,400
is two bytes in size on most processors
9095
06:54:57,360 --> 06:55:03,360
so you can't do arithmetic operations if
9096
06:55:00,400 --> 06:55:04,638
your integer value is stored in these
9097
06:55:04,637 --> 06:55:08,477
why is that well this has to do with
9098
06:55:08,477 --> 06:55:12,797
and they decided to choose and as the
9099
06:55:12,797 --> 06:55:17,680
integral type for which they can do
9100
06:55:15,040 --> 06:55:19,760
these arithmetic operations but
9101
06:55:17,680 --> 06:55:22,080
compilers are really smart enough to
9102
06:55:19,759 --> 06:55:24,717
notice if you are trying to do
9103
06:55:22,080 --> 06:55:27,120
arithmetic operations on these types and
9104
06:55:24,718 --> 06:55:28,319
they are going to implicitly convert
9105
06:55:30,957 --> 06:55:35,759
and this is something you need to be
9106
06:55:32,400 --> 06:55:39,200
aware of if we look at this program here
9107
06:55:35,759 --> 06:55:42,239
for example we have var1 and var2 they
9108
06:55:39,200 --> 06:55:43,600
are stored in variables that are of type
9109
06:55:43,599 --> 06:55:50,000
and we have var 3 var 4 which are stored
9110
06:55:46,878 --> 06:55:52,319
in a variable of type car we can try and
9111
06:55:50,000 --> 06:55:54,878
print the resizes and we're going to get
9112
06:55:52,319 --> 06:55:57,200
two two one one for these variables
9113
06:55:57,200 --> 06:56:02,240
occupies two bytes in memory for my
9114
06:55:59,599 --> 06:56:05,919
computer here and the car occupies one
9115
06:56:02,240 --> 06:56:06,878
byte in memory but the catch is down
9116
06:56:08,878 --> 06:56:13,440
the result is not going to be the same
9117
06:56:10,637 --> 06:56:14,797
type as defense you added up and you
9118
06:56:15,840 --> 06:56:20,400
to deduce to the same type as var one
9119
06:56:20,400 --> 06:56:26,000
and it's not resort is going to be an
9120
06:56:22,797 --> 06:56:27,919
integer because and is the smallest type
9121
06:56:26,000 --> 06:56:30,637
for which we can support these
9122
06:56:27,919 --> 06:56:32,557
arithmetic operations so if we print the
9123
06:56:30,637 --> 06:56:34,957
size of result one and reserved two
9124
06:56:32,558 --> 06:56:37,200
we're going to get four but this is the
9125
06:56:34,957 --> 06:56:39,759
behavior you're going to get and we need
9126
06:56:37,200 --> 06:56:42,319
to be aware of it the same behavior can
9127
06:56:39,759 --> 06:56:44,797
be observed on other operators that we
9128
06:56:42,319 --> 06:56:47,200
will have a chance to look at in a few
9129
06:56:44,797 --> 06:56:49,360
chapters ahead and these are called
9130
06:56:47,200 --> 06:56:51,680
shift operators you use them to shift
9131
06:56:49,360 --> 06:56:53,200
bets but i don't want to talk anymore
9132
06:56:51,680 --> 06:56:55,760
about them because we're going to have a
9133
06:56:53,200 --> 06:56:58,400
chance to learn about them in detail
9134
06:56:55,759 --> 06:57:00,557
okay now is time to head to visual
9135
06:56:58,400 --> 06:57:03,600
studio code and actually see this in
9136
06:57:00,558 --> 06:57:05,680
action here we are in our working
9137
06:57:03,599 --> 06:57:07,680
directory we are going to copy our
9138
06:57:05,680 --> 06:57:08,558
template project we're going to copy
9139
06:57:08,558 --> 06:57:14,638
quickly put that in our folder on weird
9140
06:57:12,637 --> 06:57:16,637
integral types this is our current
9141
06:57:14,637 --> 06:57:18,637
project here and we're going to open
9142
06:57:16,637 --> 06:57:20,797
this up in visual studio code we're
9143
06:57:18,637 --> 06:57:23,520
going to open this up and we're going to
9144
06:57:20,797 --> 06:57:25,759
open our main cpp file remove whatever
9145
06:57:23,520 --> 06:57:28,319
it is we don't need and we are going to
9146
06:57:25,759 --> 06:57:30,557
put in our code this must be very
9147
06:57:28,319 --> 06:57:31,919
familiar because it is what we just saw
9148
06:57:31,919 --> 06:57:36,797
so what we are doing here we have four
9149
06:57:34,558 --> 06:57:39,520
variables var one and var two are short
9150
06:57:36,797 --> 06:57:43,039
and so these are going to take two bytes
9151
06:57:39,520 --> 06:57:45,200
in memory on my computer here and uh car
9152
06:57:43,040 --> 06:57:46,798
is going to take up one byte and we're
9153
06:57:45,200 --> 06:57:48,878
going to print their sizes we're going
9154
06:57:46,797 --> 06:57:51,360
to see them printed down and we are
9155
06:57:48,878 --> 06:57:54,000
adding things up here we are taking two
9156
06:57:51,360 --> 06:57:56,159
short end variables and adding them up
9157
06:57:54,000 --> 06:57:58,080
so what the compiler is going to do it's
9158
06:57:56,159 --> 06:58:00,319
going to take this turn it into an end
9159
06:57:58,080 --> 06:58:02,558
and then do addition and the result is
9160
06:58:00,319 --> 06:58:05,360
going to be an end the same story is
9161
06:58:02,558 --> 06:58:09,520
going to happen for reserved 2 here
9162
06:58:05,360 --> 06:58:12,159
var 3 is a car so it is one byte in
9163
06:58:09,520 --> 06:58:14,878
memory but the compiler can't really add
9164
06:58:12,159 --> 06:58:17,279
up integral types which are smaller than
9165
06:58:14,878 --> 06:58:18,797
four bytes in memory so what is going to
9166
06:58:17,279 --> 06:58:22,159
happen var three is going to be
9167
06:58:18,797 --> 06:58:24,878
transformed implicitly behind the scenes
9168
06:58:22,159 --> 06:58:26,637
to a net and var four is going to be
9169
06:58:24,878 --> 06:58:28,797
transformed to a net and then we're
9170
06:58:26,637 --> 06:58:31,039
going to add that up and we're going to
9171
06:58:28,797 --> 06:58:32,477
store that in a neat variable which is
9172
06:58:32,477 --> 06:58:37,279
if we print this up we're going to see
9173
06:58:34,080 --> 06:58:40,400
that size of result 1 and result 2 is a
9174
06:58:37,279 --> 06:58:42,557
4 and this is what we expect here and
9175
06:58:40,400 --> 06:58:44,878
this is a behavior you need to be aware
9176
06:58:42,558 --> 06:58:47,600
of because sometimes your application
9177
06:58:44,878 --> 06:58:50,080
logic is going to depend on the size of
9178
06:58:47,599 --> 06:58:51,119
data if that's the case you need to care
9179
06:58:51,119 --> 06:58:55,360
and if you don't know this you're going
9180
06:58:52,637 --> 06:58:58,718
to be beaten by this and it is really
9181
06:58:55,360 --> 06:59:01,040
hard to find problems like this
9182
06:58:58,718 --> 06:59:03,600
so what we can do is open up our
9183
06:59:01,040 --> 06:59:06,477
terminal and we're going to build this
9184
06:59:03,599 --> 06:59:09,039
with gcc as we usually do and that we
9185
06:59:06,477 --> 06:59:10,957
can run our program rooster and we're
9186
06:59:09,040 --> 06:59:14,477
going to see that this is what we expect
9187
06:59:10,957 --> 06:59:16,797
var1 is two bytes in size var2 is two
9188
06:59:14,477 --> 06:59:19,680
bytes in size wire three and waterfall
9189
06:59:16,797 --> 06:59:21,919
are one byte in size but our result is
9190
06:59:19,680 --> 06:59:24,080
four bytes because the compiler
9191
06:59:24,080 --> 06:59:30,160
our operands here to x to be able to
9192
06:59:27,279 --> 06:59:31,599
carry out this arithmetic operation this
9193
06:59:30,159 --> 06:59:34,000
is really all we setup to do in this
9194
06:59:31,599 --> 06:59:35,359
lecture i hope you found it interesting
9195
06:59:34,000 --> 06:59:37,520
we are going to stop here in this
9196
06:59:35,360 --> 06:59:41,240
lecture the next one we're going to try
9197
06:59:37,520 --> 06:59:43,520
and recap what we saw in the chapter
9198
06:59:41,240 --> 06:59:46,080
congratulations on hitting the end of
9199
06:59:43,520 --> 06:59:47,360
this chapter and this chapter was really
9200
06:59:47,360 --> 06:59:53,040
doing operations and manipulating the
9201
06:59:50,319 --> 06:59:55,279
data that you have stored in your
9202
06:59:53,040 --> 06:59:57,920
variables the first thing we saw was
9203
06:59:55,279 --> 06:59:59,919
that we could do arithmetic operations
9204
06:59:57,919 --> 07:00:02,877
on the data we can add things up
9205
06:59:59,919 --> 07:00:05,039
multiply divide we also saw the modulus
9206
07:00:02,878 --> 07:00:07,119
operator which may seem weird for
9207
07:00:05,040 --> 07:00:09,440
beginners but we had a chance to really
9208
07:00:07,119 --> 07:00:11,759
play with us after that we learned about
9209
07:00:09,439 --> 07:00:13,759
precedence and associativity we saw that
9210
07:00:13,759 --> 07:00:18,557
we have to follow to know which
9211
07:00:16,240 --> 07:00:22,240
operation to do first if we have
9212
07:00:18,558 --> 07:00:24,718
multiple operators in our expression we
9213
07:00:22,240 --> 07:00:26,958
also had a chance to learn about prefix
9214
07:00:24,718 --> 07:00:29,360
and postfix increment and decrement
9215
07:00:26,957 --> 07:00:32,477
operators we had a chance to do compound
9216
07:00:29,360 --> 07:00:35,600
assignments things like plus equal minus
9217
07:00:32,477 --> 07:00:37,840
equal multiply equal modulus equal now
9218
07:00:35,599 --> 07:00:39,919
these things must be making sense to you
9219
07:00:37,840 --> 07:00:42,159
we had a chance to look at how we could
9220
07:00:39,919 --> 07:00:45,119
compare things using relational
9221
07:00:42,159 --> 07:00:47,840
operators like greater than lesser than
9222
07:00:45,119 --> 07:00:50,239
and equal or not equal we also had a
9223
07:00:47,840 --> 07:00:53,680
chance to look at output formatting and
9224
07:00:50,240 --> 07:00:57,360
we saw a host of things we could do to
9225
07:00:53,680 --> 07:00:59,279
make data show up better with sddc out
9226
07:00:57,360 --> 07:01:02,080
after that we learned about numeric
9227
07:00:59,279 --> 07:01:04,477
limits and this is a cool way to know
9228
07:01:02,080 --> 07:01:06,878
the ranges for your data types but there
9229
07:01:04,477 --> 07:01:09,599
are a host of other properties you can
9230
07:01:06,878 --> 07:01:11,600
use in this limits library we learned a
9231
07:01:09,599 --> 07:01:13,840
little bit about math functions and we
9232
07:01:11,599 --> 07:01:16,797
played with things like the power of
9233
07:01:13,840 --> 07:01:18,797
something the exponential the few
9234
07:01:16,797 --> 07:01:21,360
rounding functions that we have in the
9235
07:01:18,797 --> 07:01:24,159
cmat library and now you must have a
9236
07:01:21,360 --> 07:01:26,400
good idea about these functions that you
9237
07:01:24,159 --> 07:01:29,040
can use to manipulate and do math on
9238
07:01:26,400 --> 07:01:32,240
your variables we ended the chapter by
9239
07:01:29,040 --> 07:01:34,718
looking at some weird integral types and
9240
07:01:32,240 --> 07:01:37,840
the main message in that lecture was
9241
07:01:34,718 --> 07:01:41,040
that you can't do arithmetic operations
9242
07:01:37,840 --> 07:01:43,439
on data types whose size is less than 4
9243
07:01:41,040 --> 07:01:45,760
bytes in memory if you try to do that
9244
07:01:43,439 --> 07:01:48,319
the compiler is going to insert
9245
07:01:45,759 --> 07:01:50,717
implicit conversions and if your
9246
07:01:48,319 --> 07:01:51,840
application depends on the size of
9247
07:01:51,840 --> 07:01:55,840
this is something you need to be careful
9248
07:01:53,599 --> 07:01:57,199
about otherwise you're going to have a
9249
07:01:57,200 --> 07:02:02,000
finding these problems i would like to
9250
07:01:59,439 --> 07:02:04,319
welcome you in this new chapter where
9251
07:02:02,000 --> 07:02:06,718
we're going to be learning about a new
9252
07:02:04,319 --> 07:02:09,200
way we can do things in c plus plus and
9253
07:02:06,718 --> 07:02:11,600
we're going to be doing conditional
9254
07:02:09,200 --> 07:02:14,637
programming in other words we're going
9255
07:02:11,599 --> 07:02:17,199
to be able to do different things
9256
07:02:14,637 --> 07:02:19,360
based on the conditions that we have set
9257
07:02:17,200 --> 07:02:21,360
up in our code just to give you an
9258
07:02:19,360 --> 07:02:23,680
example here we have a few variables
9259
07:02:21,360 --> 07:02:26,558
they are booleans and we have a few
9260
07:02:23,680 --> 07:02:29,040
initializers in there red is false green
9261
07:02:26,558 --> 07:02:31,040
is true yellow is false police stop is
9262
07:02:31,040 --> 07:02:35,600
different things based on discipline
9263
07:02:40,000 --> 07:02:44,957
if the light is yellow we might be told
9264
07:02:42,319 --> 07:02:47,439
to slow down if the light is green we
9265
07:02:44,957 --> 07:02:49,199
might be told to go and do whatever it
9266
07:02:47,439 --> 07:02:51,599
is we want to do so we're going to be
9267
07:02:49,200 --> 07:02:53,920
able to do these kinds of things and c
9268
07:02:51,599 --> 07:02:56,477
plus plus provides different constructs
9269
07:02:53,919 --> 07:02:57,599
to be able to do conditional programming
9270
07:02:57,599 --> 07:03:02,957
code we just have one of them in this
9271
07:03:00,080 --> 07:03:05,600
slide which is this if statement here
9272
07:03:02,957 --> 07:03:07,840
this if keyword allows you to do things
9273
07:03:05,599 --> 07:03:09,759
like this we have a few others we have
9274
07:03:07,840 --> 07:03:12,558
the else keyword we have the switch
9275
07:03:09,759 --> 07:03:15,599
keyword we also have a completely
9276
07:03:12,558 --> 07:03:18,080
separate operator that is called ternary
9277
07:03:15,599 --> 07:03:19,680
operator that allows you to do these
9278
07:03:18,080 --> 07:03:22,080
kinds of things and we're going to be
9279
07:03:19,680 --> 07:03:24,000
learning about all these things and more
9280
07:03:22,080 --> 07:03:26,240
in this chapter we are going to start
9281
07:03:24,000 --> 07:03:27,520
and learn about the if statement in the
9282
07:03:27,520 --> 07:03:30,637
go ahead and finish up here and meet me
9283
07:03:30,637 --> 07:03:34,797
in this lecture we're going to learn
9284
07:03:32,080 --> 07:03:36,878
about the if statement and this is a
9285
07:03:34,797 --> 07:03:39,680
statement that is going to allow you to
9286
07:03:36,878 --> 07:03:40,558
do things based on some condition being
9287
07:03:40,558 --> 07:03:45,440
or false here is a simple code example
9288
07:03:43,680 --> 07:03:46,558
we have two variables number one and
9289
07:03:46,558 --> 07:03:51,280
and we have a statement here that is
9290
07:03:48,797 --> 07:03:53,680
going to compare number one and number
9291
07:03:51,279 --> 07:03:56,477
two and we're going to store the result
9292
07:03:56,477 --> 07:04:01,040
that we have on the left then we're
9293
07:03:58,319 --> 07:04:04,159
going to do something based on the value
9294
07:04:01,040 --> 07:04:05,840
that we are storing in this result here
9295
07:04:04,159 --> 07:04:07,200
if the result in there is true we're
9296
07:04:07,200 --> 07:04:11,600
number one is less than number two if
9297
07:04:09,759 --> 07:04:14,477
the result is not true we're going to
9298
07:04:11,599 --> 07:04:17,519
say number one is not less than
9299
07:04:14,477 --> 07:04:20,239
number two and notice in the first if
9300
07:04:17,520 --> 07:04:23,279
close year we are testing for the case
9301
07:04:20,240 --> 07:04:25,520
where the result is true but sometimes
9302
07:04:23,279 --> 07:04:28,557
we need to do something when this
9303
07:04:25,520 --> 07:04:31,040
condition here is not true one way to do
9304
07:04:28,558 --> 07:04:34,159
that is to negate what we have here
9305
07:04:31,040 --> 07:04:37,280
inside the if parenthesis and test for
9306
07:04:34,159 --> 07:04:39,599
the reverse of whatever we have in here
9307
07:04:37,279 --> 07:04:42,319
if that is making any sense if you look
9308
07:04:39,599 --> 07:04:45,759
here we are testing for the case where
9309
07:04:42,319 --> 07:04:47,759
if not the result is a true and in other
9310
07:04:45,759 --> 07:04:50,000
words we are testing for the case where
9311
07:04:47,759 --> 07:04:52,877
the result here is false and we're going
9312
07:04:50,000 --> 07:04:54,718
to say number one is not less than
9313
07:04:52,878 --> 07:04:57,279
number two this is one way we can go
9314
07:04:54,718 --> 07:04:59,600
about this again the if statement is
9315
07:04:57,279 --> 07:05:01,840
used to do conditional programming this
9316
07:04:59,599 --> 07:05:04,159
is the syntax we use to do it in c plus
9317
07:05:01,840 --> 07:05:06,957
plus we say f we put a set of
9318
07:05:04,159 --> 07:05:10,000
parentheses and inside the parenthesis
9319
07:05:06,957 --> 07:05:11,759
we put the condition we want to test for
9320
07:05:10,000 --> 07:05:14,718
and after that we're going to have a
9321
07:05:11,759 --> 07:05:17,359
pair of curly braces and what we have
9322
07:05:14,718 --> 07:05:20,878
inside these curly braces is going to be
9323
07:05:17,360 --> 07:05:22,958
the body of our if statement and it is
9324
07:05:20,878 --> 07:05:26,558
basically going to be the code we want
9325
07:05:22,957 --> 07:05:28,877
to run if the test here is successful we
9326
07:05:26,558 --> 07:05:31,280
can also use an else clause to catch the
9327
07:05:28,878 --> 07:05:33,760
case where the test hasn't been
9328
07:05:31,279 --> 07:05:35,919
successful in this case we can say if
9329
07:05:33,759 --> 07:05:37,119
result equals true we're going to do
9330
07:05:37,119 --> 07:05:42,239
and else we're going to do something
9331
07:05:39,759 --> 07:05:44,797
else in other words if research is true
9332
07:05:42,240 --> 07:05:46,878
we're going to say is less than if it's
9333
07:05:44,797 --> 07:05:49,360
not true we're going to say is not less
9334
07:05:46,878 --> 07:05:52,637
than and this is a more compact way of
9335
07:05:49,360 --> 07:05:54,718
doing what we just did in the slide here
9336
07:05:52,637 --> 07:05:57,680
you can also directly use your
9337
07:05:54,718 --> 07:06:00,558
expression as a condition and the
9338
07:05:57,680 --> 07:06:03,360
requirement here is that the expression
9339
07:06:00,558 --> 07:06:05,680
evaluates to something that we can treat
9340
07:06:03,360 --> 07:06:08,319
like a boolean because the condition has
9341
07:06:05,680 --> 07:06:10,477
to be a boolean it has to be true or
9342
07:06:08,319 --> 07:06:12,319
false okay here is another simple
9343
07:06:10,477 --> 07:06:14,878
example we have seen this in the last
9344
07:06:12,319 --> 07:06:18,000
lecture we have a few variables
9345
07:06:14,878 --> 07:06:20,797
containing our conditions and we are
9346
07:06:18,000 --> 07:06:22,400
saying if the light is red for example
9347
07:06:20,797 --> 07:06:24,239
we're going to do something if it's
9348
07:06:22,400 --> 07:06:26,400
yellow we're going to do something if
9349
07:06:24,240 --> 07:06:29,440
it's green we're going to do something
9350
07:06:26,400 --> 07:06:32,319
we can also nest conditions for example
9351
07:06:32,319 --> 07:06:38,000
if statement and inside that if
9352
07:06:34,878 --> 07:06:40,718
statement set up other if statements and
9353
07:06:38,000 --> 07:06:42,319
if our logic needs something like this
9354
07:06:40,718 --> 07:06:44,400
you can do this and you can take
9355
07:06:42,319 --> 07:06:46,718
advantage of this to achieve whatever it
9356
07:06:44,400 --> 07:06:48,400
is you want to do in this case if the
9357
07:06:46,718 --> 07:06:50,159
light is green we're going to
9358
07:06:48,400 --> 07:06:52,000
fall in here and we're going to do
9359
07:06:50,159 --> 07:06:54,718
another condition so if the light is
9360
07:06:52,000 --> 07:06:57,040
green and if the police officer has
9361
07:06:54,718 --> 07:06:58,637
stopped you you're going to stop and if
9362
07:06:57,040 --> 07:07:00,718
they haven't stopped you you're going to
9363
07:06:58,637 --> 07:07:02,557
go because the light is green and you
9364
07:07:02,558 --> 07:07:06,958
we can also use logical operators to
9365
07:07:04,718 --> 07:07:09,920
kind of achieve the same thing and we
9366
07:07:06,957 --> 07:07:11,599
say if the light is green and the police
9367
07:07:09,919 --> 07:07:14,319
officer hasn't stopped you you're going
9368
07:07:11,599 --> 07:07:16,319
to go else you're going to stop and you
9369
07:07:14,319 --> 07:07:18,477
can do something like this and you see
9370
07:07:16,319 --> 07:07:21,360
that you can combine the logical
9371
07:07:18,477 --> 07:07:23,360
operators we've learned about with the
9372
07:07:21,360 --> 07:07:25,520
conditional programming techniques we
9373
07:07:23,360 --> 07:07:27,119
are learning about here to do really
9374
07:07:25,520 --> 07:07:29,520
powerful stuff and we're going to be
9375
07:07:27,119 --> 07:07:31,759
doing this all over the place in the
9376
07:07:29,520 --> 07:07:34,240
course so we're going to head over to
9377
07:07:31,759 --> 07:07:36,797
visual studio code and play with us here
9378
07:07:34,240 --> 07:07:39,600
we are in our working directory we're
9379
07:07:36,797 --> 07:07:42,637
going to be working on if statements and
9380
07:07:39,599 --> 07:07:45,119
we're going to grab our template project
9381
07:07:42,637 --> 07:07:47,360
the template files i should say and
9382
07:07:45,119 --> 07:07:49,119
we're going to put them in here
9383
07:07:47,360 --> 07:07:51,600
and we're going to open this up in
9384
07:07:49,119 --> 07:07:54,079
visual studio code as we always do so
9385
07:07:51,599 --> 07:07:57,199
let's do that open folder and we should
9386
07:07:54,080 --> 07:07:59,200
fall in here and open our main cpp file
9387
07:07:57,200 --> 07:08:00,477
let's do the usual and remove what we
9388
07:08:00,477 --> 07:08:04,797
and we are going to put in our code so
9389
07:08:02,797 --> 07:08:07,039
that we can really play with us we have
9390
07:08:04,797 --> 07:08:09,840
two variables in here number one and
9391
07:08:07,040 --> 07:08:14,240
number two they are integers and we have
9392
07:08:09,840 --> 07:08:16,957
the values 55 and 60 inside we can do a
9393
07:08:14,240 --> 07:08:18,958
comparison between these two variables
9394
07:08:16,957 --> 07:08:22,000
and what this comparison is going to
9395
07:08:18,957 --> 07:08:24,557
yield is a boolean value that we're
9396
07:08:22,000 --> 07:08:26,637
going to store in our boolean variable
9397
07:08:24,558 --> 07:08:29,200
here which is called result
9398
07:08:26,637 --> 07:08:31,360
and what we can do is use this to do
9399
07:08:29,200 --> 07:08:33,280
some conditional programming so we're
9400
07:08:31,360 --> 07:08:35,760
going to say if the result is true we're
9401
07:08:33,279 --> 07:08:38,079
going to do something and if the result
9402
07:08:35,759 --> 07:08:40,557
is not true we're going to do something
9403
07:08:38,080 --> 07:08:43,440
else and this is how we say it this
9404
07:08:40,558 --> 07:08:47,040
syntax here may be confusing to new
9405
07:08:43,439 --> 07:08:49,520
students but try to think of it if not
9406
07:08:47,040 --> 07:08:53,040
research is true and that's really the
9407
07:08:49,520 --> 07:08:55,040
same thing as saying if result is false
9408
07:08:53,040 --> 07:08:56,240
try to stream this in your mind a little
9409
07:08:55,040 --> 07:08:58,319
bit and you really are going to
9410
07:08:56,240 --> 07:09:00,320
understand okay so now that you have
9411
07:09:01,599 --> 07:09:05,279
guess what we're going to see if we run
9412
07:09:03,599 --> 07:09:07,919
this what are we going to see on the
9413
07:09:05,279 --> 07:09:10,000
console okay give it a try so we're
9414
07:09:07,919 --> 07:09:12,319
going to run this in visual studio code
9415
07:09:10,000 --> 07:09:14,957
let's open up a terminal first
9416
07:09:12,319 --> 07:09:16,319
and we're going to world with gcc as we
9417
07:09:16,319 --> 07:09:20,319
we're going to bring this up a little
9418
07:09:17,840 --> 07:09:22,477
bit so that we have some breathing room
9419
07:09:20,319 --> 07:09:24,319
and we're going to run rooster let's see
9420
07:09:22,477 --> 07:09:27,279
what we have here we have reserved
9421
07:09:24,319 --> 07:09:28,797
equals true and that's coming from this
9422
07:09:28,797 --> 07:09:34,079
and we have freestanding if statement
9423
07:09:34,080 --> 07:09:39,440
here and we have our meat of this
9424
07:09:36,878 --> 07:09:43,840
program what we really are interested in
9425
07:09:39,439 --> 07:09:47,119
we have 55 is less than 60. so our test
9426
07:09:43,840 --> 07:09:50,718
here succeeded and we fell in this body
9427
07:09:47,119 --> 07:09:52,957
and executed this sddc out statement
9428
07:09:50,718 --> 07:09:54,080
that's why we're saying number one is
9429
07:09:54,080 --> 07:10:00,240
number two and number one is 55 which is
9430
07:09:56,878 --> 07:10:02,477
what we see here and number two is 60
9431
07:10:00,240 --> 07:10:05,520
which is what we are seeing here
9432
07:10:05,520 --> 07:10:11,040
the second statement here execute you
9433
07:10:08,319 --> 07:10:13,520
know it is testing for the case where
9434
07:10:11,040 --> 07:10:16,159
not result is true so it's going to
9435
07:10:13,520 --> 07:10:17,520
exactly do the reverse of what this test
9436
07:10:17,520 --> 07:10:22,159
and if this fails this one is going to
9437
07:10:19,680 --> 07:10:23,760
succeed which is what we have now so
9438
07:10:22,159 --> 07:10:26,718
what we can do to really play with this
9439
07:10:23,759 --> 07:10:29,199
we can go up and change for example
9440
07:10:29,200 --> 07:10:34,159
this is going to flip the order of these
9441
07:10:31,599 --> 07:10:37,439
numbers if i may say it like that and if
9442
07:10:34,159 --> 07:10:39,040
we run it we're going to build with gcc
9443
07:10:39,040 --> 07:10:45,200
we're going to see result is false so
9444
07:10:42,240 --> 07:10:47,520
result became false because number one
9445
07:10:45,200 --> 07:10:50,878
is not less than number two so this is
9446
07:10:47,520 --> 07:10:53,119
going to be false and the test here is
9447
07:10:50,878 --> 07:10:56,000
going to fail result is not true so
9448
07:10:53,119 --> 07:10:59,039
we're not going to go in here and look
9449
07:10:56,000 --> 07:11:01,040
at here if not result is true so
9450
07:11:01,040 --> 07:11:06,080
if we negate this this is going to
9451
07:11:03,360 --> 07:11:08,477
become true and this test here is going
9452
07:11:06,080 --> 07:11:10,798
to succeed and we are going to fall in
9453
07:11:08,477 --> 07:11:13,040
here take some time to really understand
9454
07:11:10,797 --> 07:11:14,878
this and if you have a problem ask me i
9455
07:11:13,040 --> 07:11:17,200
am going to do the best i can to help
9456
07:11:14,878 --> 07:11:19,680
you out but make sure you understand
9457
07:11:17,200 --> 07:11:22,000
this because this is really fundamental
9458
07:11:19,680 --> 07:11:24,878
in your journey as a software developer
9459
07:11:22,000 --> 07:11:26,558
not just in c plus plus any career as a
9460
07:11:24,878 --> 07:11:28,718
software developer you're going to need
9461
07:11:26,558 --> 07:11:31,040
to understand this okay what we're going
9462
07:11:31,040 --> 07:11:34,638
what we just did here because we're
9463
07:11:32,718 --> 07:11:37,119
going to see another way to do this and
9464
07:11:34,637 --> 07:11:39,439
we don't want to have noise output in
9465
07:11:37,119 --> 07:11:42,079
our terminal this is going to just make
9466
07:11:39,439 --> 07:11:43,359
things hard for us to see so what we're
9467
07:11:43,360 --> 07:11:47,600
we're going to go down in here and put
9468
07:11:47,599 --> 07:11:51,359
the result was commented out we don't
9469
07:11:49,919 --> 07:11:53,199
want to comment that out so we're going
9470
07:11:51,360 --> 07:11:55,600
to take this out because this is our
9471
07:11:53,200 --> 07:11:58,400
condition we're going to grab it and put
9472
07:11:55,599 --> 07:12:00,717
that outside our comment section this is
9473
07:11:58,400 --> 07:12:02,958
going to do and if we go down again
9474
07:12:00,718 --> 07:12:05,040
we're going to click on this file icon
9475
07:12:02,957 --> 07:12:06,797
and uh give ourselves some more
9476
07:12:05,040 --> 07:12:09,360
breathing room here we don't really need
9477
07:12:06,797 --> 07:12:11,520
to see that main cpp file anyway
9478
07:12:09,360 --> 07:12:12,477
so if we come here we can use the else
9479
07:12:12,477 --> 07:12:15,919
to test for the case where our condition
9480
07:12:15,919 --> 07:12:20,159
and if you look here we are essentially
9481
07:12:18,159 --> 07:12:22,558
saying the same thing we are saying if
9482
07:12:20,159 --> 07:12:25,520
result equals true we're going to fall
9483
07:12:22,558 --> 07:12:27,840
in here and else we're going to fall in
9484
07:12:25,520 --> 07:12:30,240
here so we don't need to do the double
9485
07:12:27,840 --> 07:12:32,797
if statements that we just did
9486
07:12:30,240 --> 07:12:34,798
here and this is much more compact and
9487
07:12:32,797 --> 07:12:37,039
easy to read let's look again at the
9488
07:12:34,797 --> 07:12:39,759
numbers we have here number one is 65
9489
07:12:37,040 --> 07:12:43,360
number 2 is 60. this expression here is
9490
07:12:39,759 --> 07:12:45,840
going to be false because 65 is not less
9491
07:12:43,360 --> 07:12:48,400
than 60 we're going to have a false in
9492
07:12:48,400 --> 07:12:52,319
result is going to be false this is
9493
07:12:50,159 --> 07:12:54,477
going to fail and we are going to fall
9494
07:12:55,840 --> 07:13:02,637
or 65 is not less than 60 which is what
9495
07:12:59,840 --> 07:13:04,957
we have in our values so we're going to
9496
07:13:02,637 --> 07:13:06,878
build this again and we're going to run
9497
07:13:04,957 --> 07:13:08,477
rooster that's clear so that we have
9498
07:13:06,878 --> 07:13:11,520
some breathing room we're going to run
9499
07:13:08,477 --> 07:13:13,200
rooster and you're going to see that 65
9500
07:13:13,200 --> 07:13:17,680
60 which is what we expect again if you
9501
07:13:15,759 --> 07:13:19,919
go up and change these numbers to
9502
07:13:17,680 --> 07:13:22,637
whatever you want try to change these
9503
07:13:19,919 --> 07:13:25,599
numbers to different values to see what
9504
07:13:22,637 --> 07:13:27,279
you get as output if we do this we're
9505
07:13:25,599 --> 07:13:30,000
going to see that number one is less
9506
07:13:27,279 --> 07:13:31,840
than 60 so this is going to be true
9507
07:13:30,000 --> 07:13:34,558
and we're going to have a true in this
9508
07:13:31,840 --> 07:13:37,200
result variable here if we go down
9509
07:13:34,558 --> 07:13:39,360
result is true this test condition here
9510
07:13:37,200 --> 07:13:42,159
is going to succeed and we are going to
9511
07:13:39,360 --> 07:13:44,000
fall in here let's click in our terminal
9512
07:13:42,159 --> 07:13:46,797
and hit enter we're going to run rooster
9513
07:13:44,000 --> 07:13:49,119
we're going to see 55 is less than 60
9514
07:13:46,797 --> 07:13:51,199
which is what we have here okay now i
9515
07:13:49,119 --> 07:13:54,159
hope you have a better idea of how you
9516
07:13:51,200 --> 07:13:56,159
can use the else close to make your if
9517
07:13:54,159 --> 07:13:58,319
statements really compact and this is
9518
07:13:56,159 --> 07:14:00,400
really cool okay another thing i want
9519
07:14:00,400 --> 07:14:05,760
not go through a variable like this and
9520
07:14:03,200 --> 07:14:07,680
use an expression as a condition
9521
07:14:05,759 --> 07:14:09,279
directly c plus plus allows you to do
9522
07:14:07,680 --> 07:14:11,360
this so what we're going to do we're
9523
07:14:09,279 --> 07:14:13,599
going to comment out what we just did
9524
07:14:11,360 --> 07:14:15,600
let's do that i'm going to use a block
9525
07:14:13,599 --> 07:14:16,557
comment i hope you know how to use this
9526
07:14:16,558 --> 07:14:21,040
and we're going to go down and put in
9527
07:14:18,477 --> 07:14:23,520
our code it is exactly the same thing
9528
07:14:21,040 --> 07:14:25,920
but we took the expression and put that
9529
07:14:23,520 --> 07:14:28,718
in the place of our condition variable
9530
07:14:25,919 --> 07:14:31,119
here because this is going to evaluate
9531
07:14:28,718 --> 07:14:33,440
to a boolean anyway so we can use this
9532
07:14:31,119 --> 07:14:36,477
as a condition and this is something
9533
07:14:33,439 --> 07:14:38,159
very legal to do in c plus plus so if we
9534
07:14:36,477 --> 07:14:39,680
run this we're going to see let's see
9535
07:14:38,159 --> 07:14:40,878
what we have in the numbers i have
9536
07:14:40,878 --> 07:14:46,637
by now so 55 number one sixty number two
9537
07:14:44,797 --> 07:14:48,319
number one is less than number two this
9538
07:14:48,319 --> 07:14:52,558
so the test here is going to succeed and
9539
07:14:51,040 --> 07:14:55,120
we are going to fall in here that's what
9540
07:14:52,558 --> 07:14:57,520
we're going to say we're going to weld
9541
07:14:57,520 --> 07:15:02,797
and i'm going to clear and run rooster
9542
07:15:01,279 --> 07:15:05,119
and you're going to see that this is the
9543
07:15:02,797 --> 07:15:07,039
output we expect if we change up the
9544
07:15:05,119 --> 07:15:10,718
numbers again let's take this and make
9545
07:15:07,040 --> 07:15:12,638
it a 75 number one so number one
9546
07:15:10,718 --> 07:15:15,600
is less than number two is going to
9547
07:15:12,637 --> 07:15:18,477
evaluate to false the test here is going
9548
07:15:15,599 --> 07:15:20,159
to fail and we are going to fall in this
9549
07:15:18,477 --> 07:15:23,520
block here we're going to fall in the
9550
07:15:20,159 --> 07:15:24,477
else close of our test here we're going
9551
07:15:27,279 --> 07:15:32,079
55 is that what we have in there it's a
9552
07:15:29,599 --> 07:15:34,239
60 but this block here is going to
9553
07:15:32,080 --> 07:15:36,080
execute that's the most important thing
9554
07:15:34,240 --> 07:15:39,360
so we're going to run this and we're
9555
07:15:36,080 --> 07:15:41,520
going to try and clear and run rooster
9556
07:15:39,360 --> 07:15:43,600
we're going to get what we expect this
9557
07:15:41,520 --> 07:15:46,000
is one way we can do this and it is
9558
07:15:43,599 --> 07:15:48,877
really cool let's comment this out and
9559
07:15:46,000 --> 07:15:50,240
see another example and if we go down we
9560
07:15:50,240 --> 07:15:56,798
the example we saw in the slides which
9561
07:16:00,558 --> 07:16:05,200
so what we really want to see here is
9562
07:16:02,957 --> 07:16:06,717
that we can nest stuff but before we do
9563
07:16:06,718 --> 07:16:11,840
try and use these conditions because it
9564
07:16:08,878 --> 07:16:14,718
is just fun so if red is true meaning
9565
07:16:11,840 --> 07:16:16,718
that the red light is on we're going to
9566
07:16:14,718 --> 07:16:19,040
stop if yellow is true we're going to
9567
07:16:16,718 --> 07:16:20,159
slow down if green is true we're going
9568
07:16:20,159 --> 07:16:26,240
and if we look at what we have here
9569
07:16:23,040 --> 07:16:28,638
red is false green is true false is true
9570
07:16:26,240 --> 07:16:30,878
and a police stop is true police stop is
9571
07:16:28,637 --> 07:16:32,957
not really being used so green is true
9572
07:16:30,878 --> 07:16:35,200
we're going to execute the green
9573
07:16:32,957 --> 07:16:37,199
statement here and we're going to say go
9574
07:16:35,200 --> 07:16:38,798
that's what we're going to say let's try
9575
07:16:38,797 --> 07:16:43,039
we're going to build with gcc
9576
07:16:41,279 --> 07:16:45,199
bring this up a little bit so that we
9577
07:16:47,360 --> 07:16:50,878
and run rooster and you see that it is
9578
07:16:50,878 --> 07:16:56,240
go here you can try and change these
9579
07:16:53,599 --> 07:16:58,477
boolean variables to different things
9580
07:16:56,240 --> 07:17:00,958
and see what is printed out here this is
9581
07:16:58,477 --> 07:17:02,637
a great way to learn but what we really
9582
07:17:02,637 --> 07:17:07,759
is nested statements and let's go down
9583
07:17:05,200 --> 07:17:09,920
and do that okay again we don't want
9584
07:17:07,759 --> 07:17:11,599
what we have on top here to disturb us
9585
07:17:11,599 --> 07:17:17,039
comment this out and we are going to go
9586
07:17:22,398 --> 07:17:28,080
is if the light is green we should go
9587
07:17:25,520 --> 07:17:30,477
but the police officer has the right to
9588
07:17:28,080 --> 07:17:32,638
stop us even if the light is green at
9589
07:17:30,477 --> 07:17:34,878
least these are the laws in the country
9590
07:17:32,637 --> 07:17:37,840
where i leave so we have a variable
9591
07:17:34,878 --> 07:17:40,000
called police stop here so if they stop
9592
07:17:37,840 --> 07:17:41,840
you even if the light is green you're
9593
07:17:40,000 --> 07:17:43,919
going to stop and we're going to see
9594
07:17:41,840 --> 07:17:45,840
what we see here so if the light is
9595
07:17:43,919 --> 07:17:49,039
green we're going to fall in this body
9596
07:17:45,840 --> 07:17:51,920
again and we're going to run this inside
9597
07:17:49,040 --> 07:17:53,520
or nested if statement and if the
9598
07:17:51,919 --> 07:17:54,397
officer has stopped us we're going to
9599
07:17:54,398 --> 07:17:59,200
if they haven't stopped us we're going
9600
07:17:56,000 --> 07:18:01,200
to go and go on our merry way this is
9601
07:17:59,200 --> 07:18:03,840
what we want to see here and again i
9602
07:18:01,200 --> 07:18:06,637
want you to stop for a moment try to run
9603
07:18:03,840 --> 07:18:09,040
this through your brain and try to come
9604
07:18:06,637 --> 07:18:11,439
up with the value we're going to see
9605
07:18:09,040 --> 07:18:12,878
when we run this in visual studio code
9606
07:18:15,040 --> 07:18:20,000
we're going to build with gcc
9607
07:18:17,599 --> 07:18:22,717
and we're going to run a program and you
9608
07:18:25,520 --> 07:18:31,680
the light is green okay so we we should
9609
07:18:28,637 --> 07:18:34,878
usually go but the police stop variable
9610
07:18:31,680 --> 07:18:37,040
here is also true so if we fall in here
9611
07:18:34,878 --> 07:18:39,920
this is going to execute and it is going
9612
07:18:37,040 --> 07:18:42,558
to succeed and we are going to say stop
9613
07:18:39,919 --> 07:18:45,119
and once this statement executes the
9614
07:18:42,558 --> 07:18:48,240
else statement is not going to execute
9615
07:18:45,119 --> 07:18:50,079
control is going to fall outside here
9616
07:18:48,240 --> 07:18:53,200
and we're going to keep doing whatever
9617
07:18:50,080 --> 07:18:56,160
we have outside this if statement here
9618
07:18:53,200 --> 07:18:57,119
this is really critical to understand if
9619
07:18:57,119 --> 07:19:03,039
block of a statement succeeds all the
9620
07:19:00,319 --> 07:19:05,680
others are not going to execute and try
9621
07:19:03,040 --> 07:19:07,680
to really understand this okay we have
9622
07:19:05,680 --> 07:19:10,718
seen this we can now comment this out
9623
07:19:07,680 --> 07:19:11,760
because we have something else i want to
9624
07:19:11,759 --> 07:19:16,159
we're going to comment this out and
9625
07:19:13,680 --> 07:19:18,080
that's that you can combine the if
9626
07:19:16,159 --> 07:19:21,040
statements here or conditional
9627
07:19:18,080 --> 07:19:23,440
programming with the logical operators
9628
07:19:21,040 --> 07:19:25,920
we have learned about earlier in the
9629
07:19:23,439 --> 07:19:28,159
course and do really powerful stuff for
9630
07:19:28,159 --> 07:19:33,599
not use this nested statement and do
9631
07:19:31,200 --> 07:19:35,920
this in one go like this and i think
9632
07:19:33,599 --> 07:19:38,319
this is much cleaner so we're going to
9633
07:19:35,919 --> 07:19:40,957
say if the light is green and the police
9634
07:19:38,319 --> 07:19:43,439
officer hasn't stopped us we're going to
9635
07:19:40,957 --> 07:19:44,957
go and if they have stopped us we're
9636
07:19:43,439 --> 07:19:46,797
going to stop and you're going to see
9637
07:19:44,957 --> 07:19:49,119
that we're going to get exactly the same
9638
07:19:46,797 --> 07:19:51,199
result that we had before but this is
9639
07:19:49,119 --> 07:19:53,840
really much more compact so we're going
9640
07:19:51,200 --> 07:19:56,718
to run and see the result of this and
9641
07:19:56,718 --> 07:20:00,319
and run rooster you're going to see that
9642
07:19:58,637 --> 07:20:02,477
they're going to stop us and this is
9643
07:20:02,477 --> 07:20:07,200
up again and change up these variables
9644
07:20:04,477 --> 07:20:09,119
to really anything you want and see what
9645
07:20:07,200 --> 07:20:12,319
you get trying to really understand what
9646
07:20:09,119 --> 07:20:14,957
is going on here it is not difficult and
9647
07:20:12,319 --> 07:20:17,599
the if statement is really fundamental
9648
07:20:14,957 --> 07:20:19,119
to any programming you're going to do so
9649
07:20:17,599 --> 07:20:21,359
this is really all we set up to do in
9650
07:20:19,119 --> 07:20:24,159
this lecture to learn about conditional
9651
07:20:21,360 --> 07:20:26,240
programming using the if statement it is
9652
07:20:24,159 --> 07:20:29,360
a powerful thing and you're going to see
9653
07:20:26,240 --> 07:20:31,280
it all over your software development
9654
07:20:29,360 --> 07:20:33,200
career so make sure you really
9655
07:20:31,279 --> 07:20:35,039
understand this but even if it's not
9656
07:20:33,200 --> 07:20:37,200
clear now we're going to have a chance
9657
07:20:35,040 --> 07:20:40,000
to do many examples and you're going to
9658
07:20:37,200 --> 07:20:41,280
really understand what this is all about
9659
07:20:40,000 --> 07:20:43,279
we are going to stop here in this
9660
07:20:41,279 --> 07:20:46,797
lecture the next one we're going to see
9661
07:20:43,279 --> 07:20:49,119
how we can use the else if close
9662
07:20:46,797 --> 07:20:50,878
go ahead and finish up here and meet me
9663
07:20:49,119 --> 07:20:54,000
there in this lecture we're going to
9664
07:20:50,878 --> 07:20:57,440
learn about the else if close that you
9665
07:20:54,000 --> 07:20:59,439
can attach to your if statement
9666
07:20:57,439 --> 07:21:01,680
and that's going to allow you to test
9667
07:20:59,439 --> 07:21:02,797
for several conditions in your if
9668
07:21:03,599 --> 07:21:09,599
to really understand this suppose we are
9669
07:21:06,558 --> 07:21:12,240
building a drawing application and at
9670
07:21:09,599 --> 07:21:14,957
any given moment the user might be using
9671
07:21:12,240 --> 07:21:17,040
the pan or the marker or the eraser
9672
07:21:14,957 --> 07:21:19,919
already whatever tool that it is we
9673
07:21:22,319 --> 07:21:27,360
we need to know which tool is currently
9674
07:21:24,718 --> 07:21:29,920
selected by the user and we can do a
9675
07:21:27,360 --> 07:21:32,958
piece of logic like this we can have the
9676
07:21:29,919 --> 07:21:35,199
tool stored somewhere in our application
9677
07:21:32,957 --> 07:21:36,877
and when we get to the moment where we
9678
07:21:35,200 --> 07:21:38,878
want to do something for example when
9679
07:21:36,878 --> 07:21:41,440
the user clicks with the mouse and they
9680
07:21:38,878 --> 07:21:44,000
want to drag and start doing things then
9681
07:21:41,439 --> 07:21:45,520
we're going to test for the current tool
9682
07:21:44,000 --> 07:21:47,919
if the tool is the pan we're going to
9683
07:21:45,520 --> 07:21:49,279
use the settings for the pen if the tool
9684
07:21:47,919 --> 07:21:51,039
is the marker we're going to use the
9685
07:21:49,279 --> 07:21:53,279
settings of the marker and we're going
9686
07:21:53,279 --> 07:21:58,637
one tool that is actually selected as
9687
07:21:56,240 --> 07:22:00,558
the current tool by the user and when
9688
07:21:58,637 --> 07:22:03,680
you do something like this only one
9689
07:22:00,558 --> 07:22:06,638
block in this whole chain of statements
9690
07:22:03,680 --> 07:22:09,439
is going to execute so for example if we
9691
07:22:06,637 --> 07:22:11,520
have the marker as the current tool the
9692
07:22:09,439 --> 07:22:14,397
code inside this block is going to
9693
07:22:11,520 --> 07:22:17,279
execute and say active tool is marker
9694
07:22:14,398 --> 07:22:20,398
but nothing else in this block is going
9695
07:22:17,279 --> 07:22:22,878
to execute after we run this statement
9696
07:22:20,398 --> 07:22:25,680
control is going to jump at the end of
9697
07:22:22,878 --> 07:22:27,600
this whole chain of if and else if
9698
07:22:25,680 --> 07:22:29,920
statements here i really hope you
9699
07:22:27,599 --> 07:22:31,919
understand this and uh this is really
9700
07:22:31,919 --> 07:22:36,397
this is one of the applications i have
9701
07:22:34,000 --> 07:22:39,040
done in one of my advanced course about
9702
07:22:36,398 --> 07:22:40,478
qt and c plus qt is a framework that
9703
07:22:39,040 --> 07:22:42,477
allows you to do graphical user
9704
07:22:40,477 --> 07:22:44,718
interfaces like this and you can build
9705
07:22:42,477 --> 07:22:47,919
applications like this so what i did
9706
07:22:44,718 --> 07:22:50,398
here is i did the exact same thing that
9707
07:22:47,919 --> 07:22:53,599
we have here i had the chain of if and
9708
07:22:50,398 --> 07:22:56,319
else if statements and whatever tool
9709
07:22:53,599 --> 07:22:58,477
was selected as the current tool was
9710
07:22:56,319 --> 07:23:00,239
used to draw things on the canvas here
9711
07:22:58,477 --> 07:23:02,477
for example if the current tool was the
9712
07:23:00,240 --> 07:23:04,638
pen and the pen is this little pen tool
9713
07:23:02,477 --> 07:23:07,119
here if it is active we're going to draw
9714
07:23:04,637 --> 07:23:08,797
things like hello world here if we have
9715
07:23:07,119 --> 07:23:11,039
the star selected we're going to draw
9716
07:23:08,797 --> 07:23:12,878
stars if we have the rectangle selected
9717
07:23:11,040 --> 07:23:15,120
we're going to draw rectangles we could
9718
07:23:12,878 --> 07:23:17,520
do all kinds of crazy things using this
9719
07:23:15,119 --> 07:23:19,520
piece of logic here but it is powerful
9720
07:23:17,520 --> 07:23:21,680
stuff and you really have to make sure
9721
07:23:19,520 --> 07:23:24,080
you understand this so this is how the
9722
07:23:21,680 --> 07:23:26,240
else if clause can really help you the
9723
07:23:24,080 --> 07:23:28,398
main thing is to allow you to test for
9724
07:23:26,240 --> 07:23:30,718
several different conditions you could
9725
07:23:28,398 --> 07:23:32,398
do this with a lot of if statements but
9726
07:23:30,718 --> 07:23:34,878
that's not going to be really cool it's
9727
07:23:32,398 --> 07:23:36,398
going to be ugly and hard to read this
9728
07:23:36,398 --> 07:23:39,680
now that you have an idea about this
9729
07:23:38,159 --> 07:23:41,840
we're going to head to visual studio
9730
07:23:39,680 --> 07:23:44,718
code and actually see this in action
9731
07:23:41,840 --> 07:23:47,040
here we are in our working directory
9732
07:23:44,718 --> 07:23:49,200
we're going to grab our template project
9733
07:23:47,040 --> 07:23:51,600
pretty quick and we're going to use the
9734
07:23:49,200 --> 07:23:54,240
else if project here that's our current
9735
07:23:51,599 --> 07:23:56,717
project so we're going to do that and
9736
07:23:54,240 --> 07:23:58,638
open this up in visual studio code as we
9737
07:23:56,718 --> 07:24:01,280
always do we're going to open this up
9738
07:23:58,637 --> 07:24:03,520
we're going to open main cpp and we're
9739
07:24:01,279 --> 07:24:05,599
going to remove what we don't need
9740
07:24:03,520 --> 07:24:08,558
the first thing i am going to do is to
9741
07:24:05,599 --> 07:24:10,877
put in a set of variables that are going
9742
07:24:08,558 --> 07:24:12,477
to store our tools and we can do
9743
07:24:10,878 --> 07:24:15,440
something like this we have a variable
9744
07:24:12,477 --> 07:24:17,919
for pen marker eraser rectangle circle
9745
07:24:15,439 --> 07:24:19,599
and ellipse i have to say that this is
9746
07:24:17,919 --> 07:24:21,279
not the way to go about this we're going
9747
07:24:19,599 --> 07:24:23,359
to learn about another way we can do
9748
07:24:21,279 --> 07:24:25,039
this but that's going to be there in the
9749
07:24:23,360 --> 07:24:27,279
course when we have enough tools to
9750
07:24:25,040 --> 07:24:29,600
understand this for now we're just going
9751
07:24:29,599 --> 07:24:34,557
okay 10 is going to represent the pan 20
9752
07:24:32,558 --> 07:24:36,398
is going to represent the marker 30 is
9753
07:24:34,558 --> 07:24:38,240
going to represent the razor and we can
9754
07:24:36,398 --> 07:24:41,520
go on until we hit ellipse which is
9755
07:24:38,240 --> 07:24:43,760
represented by 60. now if we go in main
9756
07:24:41,520 --> 07:24:46,319
and set up a variable and call it tool
9757
07:24:43,759 --> 07:24:48,877
for example and initialize it with
9758
07:24:46,319 --> 07:24:50,797
whatever tool we think that the user is
9759
07:24:48,878 --> 07:24:53,760
currently using for example we can use
9760
07:24:50,797 --> 07:24:57,199
circle and initialize this we can set up
9761
07:24:53,759 --> 07:24:59,599
a chain of s and else if statements to
9762
07:24:57,200 --> 07:25:01,920
do whatever it is we want to do when
9763
07:24:59,599 --> 07:25:04,319
this tool here is selected okay we're
9764
07:25:01,919 --> 07:25:06,079
going to go down and put in our code i
9765
07:25:04,319 --> 07:25:08,319
don't want to type all this so i'm going
9766
07:25:06,080 --> 07:25:10,478
to put this up here and if you want you
9767
07:25:10,477 --> 07:25:14,159
resource section the code is going to be
9768
07:25:12,398 --> 07:25:16,159
there you can copy it and paste it in
9769
07:25:14,159 --> 07:25:19,119
here and do things with that okay we
9770
07:25:16,159 --> 07:25:21,520
have a chain of if and else if close is
9771
07:25:19,119 --> 07:25:23,919
in here and the first one is going to
9772
07:25:21,520 --> 07:25:26,080
test and see if the tool is the pan and
9773
07:25:23,919 --> 07:25:28,637
notice that we are using double equal
9774
07:25:26,080 --> 07:25:30,958
signs here this is what you use to test
9775
07:25:28,637 --> 07:25:33,279
for equality you don't use one equal
9776
07:25:30,957 --> 07:25:35,039
sign you have to use two equal signs if
9777
07:25:33,279 --> 07:25:36,878
you use one equal sign that's going to
9778
07:25:35,040 --> 07:25:38,878
be an assignment and this is going to
9779
07:25:36,878 --> 07:25:41,200
always evaluate to true so you don't
9780
07:25:38,878 --> 07:25:43,200
want to do that again to test for
9781
07:25:41,200 --> 07:25:45,760
equality you're going to use double
9782
07:25:43,200 --> 07:25:47,280
equal signs in c plus plus so if the
9783
07:25:45,759 --> 07:25:49,759
current tool is the pen we're going to
9784
07:25:47,279 --> 07:25:51,759
say active tool span if the current tool
9785
07:25:49,759 --> 07:25:54,079
is marker we're going to say that so we
9786
07:25:51,759 --> 07:25:57,119
are basically going to do this for all
9787
07:25:54,080 --> 07:25:59,600
the tools that our application supports
9788
07:25:57,119 --> 07:26:01,680
so what do you think we'll see
9789
07:25:59,599 --> 07:26:02,637
when we run this the active tool is
9790
07:26:02,637 --> 07:26:06,477
so we should print active tool is circle
9791
07:26:06,477 --> 07:26:10,159
let's try this out we're going to open
9792
07:26:08,558 --> 07:26:12,477
the terminal so that we can see the
9793
07:26:10,159 --> 07:26:14,957
output nicely and we're going to world
9794
07:26:12,477 --> 07:26:16,797
with gcc and the build is going to go
9795
07:26:14,957 --> 07:26:19,759
through if we run this we're going to
9796
07:26:16,797 --> 07:26:21,520
see active tool is circle you can go up
9797
07:26:19,759 --> 07:26:23,679
here and change the tool to rectangle
9798
07:26:21,520 --> 07:26:26,000
for example if you build again you're
9799
07:26:23,680 --> 07:26:27,840
going to see that the correct block of
9800
07:26:26,000 --> 07:26:30,718
code is going to be executed we're going
9801
07:26:27,840 --> 07:26:33,279
to clear and run rooster active tool is
9802
07:26:30,718 --> 07:26:35,360
rectangle if we try to put in something
9803
07:26:33,279 --> 07:26:36,477
that doesn't exist let's say let's put
9804
07:26:36,477 --> 07:26:40,637
just to mess with our compiler here
9805
07:26:39,279 --> 07:26:43,520
we're going to get a compiler error
9806
07:26:40,637 --> 07:26:45,840
because that type is not known by
9807
07:26:43,520 --> 07:26:47,760
our code here so we're going to get bird
9808
07:26:45,840 --> 07:26:49,759
was not declared in this scope we don't
9809
07:26:47,759 --> 07:26:52,477
know what it is you have to put in
9810
07:26:49,759 --> 07:26:55,679
whatever thing you have declared
9811
07:26:52,477 --> 07:26:58,558
beforehand here so if we put in a razor
9812
07:26:55,680 --> 07:27:00,159
for example we're going to weld with gcc
9813
07:26:58,558 --> 07:27:02,558
the world is going to go through going
9814
07:27:00,159 --> 07:27:04,957
to clear run rooster the tool is going
9815
07:27:02,558 --> 07:27:07,680
to be eraser and this is exactly what we
9816
07:27:04,957 --> 07:27:10,397
expect again the main message in this
9817
07:27:07,680 --> 07:27:12,558
lecture is that you can use this else if
9818
07:27:10,398 --> 07:27:15,040
close if you have several conditions
9819
07:27:12,558 --> 07:27:17,760
that you want to test for just like we
9820
07:27:15,040 --> 07:27:20,558
have here and again one of these blocks
9821
07:27:17,759 --> 07:27:23,119
is going to execute and once we hit the
9822
07:27:20,558 --> 07:27:26,000
end of this chain of if and else if
9823
07:27:23,119 --> 07:27:28,319
closes we're going to fall here and code
9824
07:27:26,000 --> 07:27:30,398
after that is going to execute so let's
9825
07:27:28,319 --> 07:27:33,759
say moving on so that you can really see
9826
07:27:30,398 --> 07:27:36,398
this here very clear moving on and if we
9827
07:27:33,759 --> 07:27:39,759
bolt this we're going to see only one
9828
07:27:36,398 --> 07:27:42,398
block from this whole chain and once one
9829
07:27:39,759 --> 07:27:45,119
block executes control is going to go
9830
07:27:42,398 --> 07:27:47,040
after all this chain and execute
9831
07:27:45,119 --> 07:27:50,239
whatever is after that so we're going to
9832
07:27:47,040 --> 07:27:52,878
say moving on after we print that the
9833
07:27:50,240 --> 07:27:55,440
active tool is eraser here i think we
9834
07:27:55,439 --> 07:28:01,680
try and run this and you see active tool
9835
07:27:58,159 --> 07:28:04,797
is razer and moving on so after we print
9836
07:28:01,680 --> 07:28:07,360
the code from the eraser block we're not
9837
07:28:04,797 --> 07:28:10,079
going to execute rectangle or a circle
9838
07:28:07,360 --> 07:28:12,398
or ellipse it's going to jump at the end
9839
07:28:10,080 --> 07:28:14,000
of this whole block this is really
9840
07:28:14,000 --> 07:28:18,080
super clear and again make sure you
9841
07:28:16,000 --> 07:28:20,477
understand the syntax here the else if
9842
07:28:18,080 --> 07:28:23,360
statement is followed by a set of
9843
07:28:20,477 --> 07:28:25,759
parentheses and inside the parenthesis
9844
07:28:23,360 --> 07:28:28,637
we have the condition we want to test
9845
07:28:25,759 --> 07:28:31,119
for the condition has to evaluate to
9846
07:28:28,637 --> 07:28:33,520
boolean and after that we have the block
9847
07:28:31,119 --> 07:28:35,840
of code that we want to execute and this
9848
07:28:33,520 --> 07:28:38,240
is really all you have to do to get this
9849
07:28:38,240 --> 07:28:41,280
we are going to stop here in this
9850
07:28:39,599 --> 07:28:43,439
lecture in the next one we're going to
9851
07:28:43,439 --> 07:28:46,797
go ahead and finish up here and meet me
9852
07:28:46,797 --> 07:28:51,520
in this lecture we're going to learn
9853
07:28:48,240 --> 07:28:54,398
about the switch statement and this is
9854
07:28:51,520 --> 07:28:56,957
an alternative way to do what we did
9855
07:28:54,398 --> 07:28:59,440
with these else if clauses in the last
9856
07:28:56,957 --> 07:29:01,279
lecture basically testing for several
9857
07:28:59,439 --> 07:29:03,919
different conditions but it's going to
9858
07:29:01,279 --> 07:29:06,000
be in a much more compact way than what
9859
07:29:03,919 --> 07:29:08,397
we did in the last lecture we are going
9860
07:29:06,000 --> 07:29:10,558
to be using the exact same example we
9861
07:29:08,398 --> 07:29:12,798
did in the last lecture and we're going
9862
07:29:10,558 --> 07:29:15,280
to look at the switch statement and how
9863
07:29:12,797 --> 07:29:17,759
it works in c plus plus and this is how
9864
07:29:15,279 --> 07:29:20,000
it works we have our variable which is
9865
07:29:17,759 --> 07:29:21,919
going to store the current tool and
9866
07:29:21,919 --> 07:29:24,557
inside the parenthesis here we're going
9867
07:29:24,558 --> 07:29:29,200
pass the variable that we're going to be
9868
07:29:26,477 --> 07:29:30,797
basically switching on or testing the
9869
07:29:30,797 --> 07:29:36,159
and inside the block we're going to be
9870
07:29:33,279 --> 07:29:38,159
basically testing for each case so we're
9871
07:29:36,159 --> 07:29:40,159
going to say if the current tool is the
9872
07:29:38,159 --> 07:29:42,477
pan we're going to say case pan we're
9873
07:29:40,159 --> 07:29:44,558
going to put a colon in here and we're
9874
07:29:42,477 --> 07:29:46,000
going to put the code we want to execute
9875
07:29:46,000 --> 07:29:51,439
where the current tool is the pan in
9876
07:29:48,398 --> 07:29:53,520
these curly braces here and one thing
9877
07:29:51,439 --> 07:29:55,439
you should notice from the start is this
9878
07:29:55,439 --> 07:29:59,359
this is a statement that tells c plus
9879
07:29:59,360 --> 07:30:05,279
that after we successfully execute a
9880
07:30:02,718 --> 07:30:07,760
block of code we're going to jump out of
9881
07:30:05,279 --> 07:30:09,360
this switch statement if you omit this
9882
07:30:09,360 --> 07:30:14,637
everything after the case that you just
9883
07:30:12,159 --> 07:30:17,119
executed is going to execute and that's
9884
07:30:14,637 --> 07:30:19,520
not probably going to be what you want
9885
07:30:17,119 --> 07:30:21,680
if this is not making sense yet please
9886
07:30:19,520 --> 07:30:23,600
bear with me you're going to see it run
9887
07:30:21,680 --> 07:30:25,920
in visual studio code and you are going
9888
07:30:23,599 --> 07:30:27,519
to understand so what you're going to do
9889
07:30:25,919 --> 07:30:30,477
you're going to put all the tools you
9890
07:30:27,520 --> 07:30:33,680
want to test for in separate cases you
9891
07:30:30,477 --> 07:30:36,558
see here we have marker and after that
9892
07:30:33,680 --> 07:30:39,200
you can put a default case that is going
9893
07:30:36,558 --> 07:30:40,878
to be matched when nothing has been
9894
07:30:39,200 --> 07:30:44,319
matched in whatever it is you have
9895
07:30:40,878 --> 07:30:45,920
tested for in this switch block here and
9896
07:30:44,319 --> 07:30:47,919
when we run this piece of code we're
9897
07:30:45,919 --> 07:30:50,239
going to get exactly the same results
9898
07:30:47,919 --> 07:30:52,159
that we had in the last lecture but
9899
07:30:50,240 --> 07:30:55,360
hopefully you can see that this is much
9900
07:30:52,159 --> 07:30:58,000
more compact than the series of else if
9901
07:30:55,360 --> 07:31:00,159
closes that we had in the last lecture
9902
07:30:58,000 --> 07:31:02,797
again the break statement is really
9903
07:31:00,159 --> 07:31:04,957
useful if you don't put it in c plus
9904
07:31:02,797 --> 07:31:07,279
plus is going to be confused and after
9905
07:31:04,957 --> 07:31:09,119
you hit your successful case
9906
07:31:07,279 --> 07:31:11,520
everything after that is going to be
9907
07:31:09,119 --> 07:31:14,319
executed so the break statement is
9908
07:31:11,520 --> 07:31:17,760
basically telling c plus plus if you hit
9909
07:31:14,319 --> 07:31:19,680
it after a successful case is
9910
07:31:17,759 --> 07:31:21,119
jump out of this switch block because
9911
07:31:19,680 --> 07:31:23,520
you are done you don't have to do
9912
07:31:21,119 --> 07:31:26,079
anything else in here and another thing
9913
07:31:23,520 --> 07:31:27,840
you should know is that the condition
9914
07:31:26,080 --> 07:31:31,040
which is what we have inside this
9915
07:31:27,840 --> 07:31:33,840
parenthesis here can only be an integer
9916
07:31:31,040 --> 07:31:36,000
or an enum so basically it can be ant
9917
07:31:36,000 --> 07:31:40,797
basically every integral type we have
9918
07:31:38,159 --> 07:31:42,957
seen before but it can't be another type
9919
07:31:40,797 --> 07:31:45,360
such as string because that doesn't
9920
07:31:42,957 --> 07:31:46,397
really make sense so be sure to keep
9921
07:31:46,398 --> 07:31:50,958
now that you have an idea about this
9922
07:31:48,477 --> 07:31:53,040
switch statement let's head to visual
9923
07:31:50,957 --> 07:31:56,319
video code and actually see this in
9924
07:31:53,040 --> 07:31:58,080
action here we are in our working folder
9925
07:31:56,319 --> 07:31:59,840
the current project is going to be
9926
07:31:58,080 --> 07:32:02,160
switch so we're going to grab our
9927
07:31:59,840 --> 07:32:04,398
template files and we're going to bring
9928
07:32:02,159 --> 07:32:07,119
that in here i'm going to go up a little
9929
07:32:04,398 --> 07:32:09,600
bit and open this up in visual studio
9930
07:32:07,119 --> 07:32:11,360
code as we always do and we're going to
9931
07:32:09,599 --> 07:32:13,840
open up our main file we're going to get
9932
07:32:11,360 --> 07:32:16,477
rid of what we don't need we are going
9933
07:32:13,840 --> 07:32:18,558
to go outside the main function here and
9934
07:32:16,477 --> 07:32:21,119
put in our tools just like in the last
9935
07:32:18,558 --> 07:32:24,638
lecture we are using integers each one
9936
07:32:21,119 --> 07:32:26,878
is represented by 10 20 30 up to 60 and
9937
07:32:24,637 --> 07:32:28,637
these are the tools we have and i don't
9938
07:32:26,878 --> 07:32:30,637
think i explained this but we are
9939
07:32:28,637 --> 07:32:33,039
flagging them const because we don't
9940
07:32:30,637 --> 07:32:36,319
want them to be modifiable we have seen
9941
07:32:33,040 --> 07:32:38,319
about const earlier in the course we are
9942
07:32:36,319 --> 07:32:40,477
going to jump into main and set up our
9943
07:32:38,319 --> 07:32:42,797
variable it's going to be ant and we're
9944
07:32:40,477 --> 07:32:44,797
going to call it tool and we're going to
9945
07:32:42,797 --> 07:32:47,439
initialize this whatever tool we want
9946
07:32:44,797 --> 07:32:49,360
let's use eraser why not and then we're
9947
07:32:47,439 --> 07:32:50,957
going to put in our switch block we're
9948
07:32:50,957 --> 07:32:55,279
and if i type this you see that visual
9949
07:32:53,439 --> 07:32:57,840
studio code is going to give me
9950
07:32:55,279 --> 07:33:00,000
intelligence or suggestions on what
9951
07:32:57,840 --> 07:33:01,840
thing i could do one cool thing that
9952
07:33:00,000 --> 07:33:03,840
visual studio code does is give you
9953
07:33:01,840 --> 07:33:06,319
snippets to really help you type things
9954
07:33:03,840 --> 07:33:09,360
out so we can click on this and it is
9955
07:33:06,319 --> 07:33:13,279
going to auto complete a starter version
9956
07:33:09,360 --> 07:33:15,840
of our case and we can type in our
9957
07:33:13,279 --> 07:33:18,079
expression here which is going to be
9958
07:33:15,840 --> 07:33:19,680
what we're going to be switching over so
9959
07:33:18,080 --> 07:33:22,398
we're going to switch over the variable
9960
07:33:19,680 --> 07:33:24,797
tool here and we can put in our cases so
9961
07:33:22,398 --> 07:33:26,638
in our case we're going to start with
9962
07:33:24,797 --> 07:33:28,477
pan which is what we have here so we're
9963
07:33:26,637 --> 07:33:30,637
going to say case pan we're going to
9964
07:33:30,637 --> 07:33:35,759
uh let's remove this and say pen
9965
07:33:37,599 --> 07:33:42,637
a block of code that is going to execute
9966
07:33:40,477 --> 07:33:44,319
when the current tool is the pen and
9967
07:33:42,637 --> 07:33:45,599
we're going to put that in here let's
9968
07:33:45,599 --> 07:33:51,759
to the right a little bit and inside the
9969
07:33:47,919 --> 07:33:54,239
block we can say sddc out active tool is
9970
07:33:51,759 --> 07:33:56,797
pan okay so after that we're going to
9971
07:33:54,240 --> 07:33:58,638
put this break statement if it's not
9972
07:33:56,797 --> 07:34:00,637
here we're going to have a problem
9973
07:33:58,637 --> 07:34:03,200
because when the current tool is the pan
9974
07:34:00,637 --> 07:34:05,200
and this code here executes every case
9975
07:34:03,200 --> 07:34:06,718
after that is going to execute and
9976
07:34:05,200 --> 07:34:08,798
that's not what we want we have to
9977
07:34:06,718 --> 07:34:10,798
remember to put this break statement
9978
07:34:08,797 --> 07:34:12,878
here okay so we're going to put in all
9979
07:34:10,797 --> 07:34:14,000
our other cases so we're going to copy
9980
07:34:14,000 --> 07:34:18,398
and look at the next one it's going to
9981
07:34:15,680 --> 07:34:20,319
be marker so we can go on the next line
9982
07:34:18,398 --> 07:34:22,718
and put in marker we're going to paste
9983
07:34:20,319 --> 07:34:25,040
this in we're going to say marker and
9984
07:34:22,718 --> 07:34:27,280
we're going to say active tool is marker
9985
07:34:25,040 --> 07:34:29,520
and we can keep doing the same thing
9986
07:34:27,279 --> 07:34:32,000
we're going to go download them and
9987
07:34:29,520 --> 07:34:34,159
paste this in the next one is going to
9988
07:34:32,000 --> 07:34:36,240
be eraser so let's do that we're going
9989
07:34:34,159 --> 07:34:38,718
to say eraser and we're going to say
9990
07:34:36,240 --> 07:34:40,478
current tool is razer and we're going to
9991
07:34:40,477 --> 07:34:46,000
i am doing this live because it really
9992
07:34:42,718 --> 07:34:47,840
is important for you to see me type this
9993
07:34:46,000 --> 07:34:50,558
otherwise you may be confused because
9994
07:34:47,840 --> 07:34:54,159
this is a slightly confusing construct
9995
07:34:50,558 --> 07:34:56,638
we have in c plus plus the next one is
9996
07:34:54,159 --> 07:34:58,159
rectangle so we're going to use that and
9997
07:34:56,637 --> 07:35:01,520
we're going to say current tool is
9998
07:34:58,159 --> 07:35:03,840
rectangle the next one is going to be
9999
07:35:01,520 --> 07:35:05,439
circle and ellipse so let's do that
10000
07:35:03,840 --> 07:35:08,319
we're going to put in circle we're going
10001
07:35:05,439 --> 07:35:10,000
to go down and paste this in and bring
10002
07:35:10,000 --> 07:35:15,439
and i'm going to say circle and we're
10003
07:35:12,159 --> 07:35:17,680
going to go down and put the next one in
10004
07:35:15,439 --> 07:35:20,637
which is going to be ellipse and after
10005
07:35:17,680 --> 07:35:23,279
that notice that video studio code also
10006
07:35:20,637 --> 07:35:26,079
inserted a default block and this is a
10007
07:35:23,279 --> 07:35:27,840
block that is going to execute when none
10008
07:35:29,200 --> 07:35:34,319
so this is really important so you can
10009
07:35:34,319 --> 07:35:39,360
and say no match found okay so we want
10010
07:35:37,520 --> 07:35:41,200
to see this print out and we're going to
10011
07:35:41,200 --> 07:35:46,477
okay after we do this we should get this
10012
07:35:43,840 --> 07:35:48,957
to work and do whatever we were doing in
10013
07:35:46,477 --> 07:35:50,718
the last lecture so the current tool is
10014
07:35:50,718 --> 07:35:54,798
the block here is going to be matched so
10015
07:35:52,637 --> 07:35:56,397
code here is going to execute
10016
07:35:54,797 --> 07:35:59,439
after that we're going to meet this
10017
07:35:56,398 --> 07:36:01,600
break and what it's really saying is
10018
07:35:59,439 --> 07:36:03,840
you have done what you have to do jump
10019
07:36:01,599 --> 07:36:05,359
out of this switch block here and we're
10020
07:36:03,840 --> 07:36:07,119
going to go to the end of this switch
10021
07:36:05,360 --> 07:36:09,520
block and we're going to execute
10022
07:36:07,119 --> 07:36:11,840
whatever is after that so just like in
10023
07:36:09,520 --> 07:36:14,637
the last lecture we can say moving on
10024
07:36:11,840 --> 07:36:15,920
and if we execute the program as we have
10025
07:36:15,919 --> 07:36:21,599
it's going to say active tool is razor
10026
07:36:18,957 --> 07:36:23,759
and it's going to print moving on
10027
07:36:21,599 --> 07:36:25,840
let's bring up the terminal so that we
10028
07:36:23,759 --> 07:36:28,397
can really see this and we're going to
10029
07:36:25,840 --> 07:36:31,520
build with gcc the world is going to be
10030
07:36:28,398 --> 07:36:33,600
good and if we run rooster let's clear a
10031
07:36:31,520 --> 07:36:36,240
bit we're going to see that active tool
10032
07:36:33,599 --> 07:36:38,159
is a razor and we are moving on this is
10033
07:36:36,240 --> 07:36:39,600
really cool and it is exactly the same
10034
07:36:39,599 --> 07:36:45,680
in the last lecture but now we are using
10035
07:36:42,797 --> 07:36:48,159
a much cleaner construct which switch
10036
07:36:45,680 --> 07:36:50,319
provides okay we can try to change the
10037
07:36:48,159 --> 07:36:52,319
tool and see that this really works we
10038
07:36:52,319 --> 07:36:57,200
why not i'm going to build with gcc the
10039
07:36:54,797 --> 07:36:59,840
world is going to go through as you see
10040
07:36:57,200 --> 07:37:01,760
here and if we run rooster we're going
10041
07:36:59,840 --> 07:37:03,599
to see active tool a circle we are
10042
07:37:01,759 --> 07:37:06,159
moving on you can try and change this
10043
07:37:03,599 --> 07:37:08,159
however you want if we put in ellipse
10044
07:37:06,159 --> 07:37:11,200
and world again we're going to build
10045
07:37:08,159 --> 07:37:14,718
with gcc and if we run we're going to
10046
07:37:11,200 --> 07:37:17,040
get active tool is pan and moving on why
10047
07:37:14,718 --> 07:37:19,600
is that ellipse we are saying active
10048
07:37:17,040 --> 07:37:22,878
tool is pen we didn't change that so we
10049
07:37:19,599 --> 07:37:25,279
just code a really bad bag here so let's
10050
07:37:22,878 --> 07:37:27,600
fix this and we're going to build again
10051
07:37:25,279 --> 07:37:29,840
i'm glad i found this so we're going to
10052
07:37:29,840 --> 07:37:33,840
and we're going to see active tool is
10053
07:37:33,840 --> 07:37:40,159
okay so let's see what could happen
10054
07:37:36,477 --> 07:37:43,119
if you forgot your break statement after
10055
07:37:40,159 --> 07:37:44,477
your case here so the current tool is
10056
07:37:44,477 --> 07:37:49,040
and it is the last thing we have in here
10057
07:37:46,797 --> 07:37:51,039
so it's not a good test case
10058
07:37:51,040 --> 07:37:55,600
is make the current tool the pen or the
10059
07:37:53,520 --> 07:37:57,040
marker let's use marker that's going to
10060
07:37:57,040 --> 07:38:01,360
and i am going to remove the break
10061
07:38:01,360 --> 07:38:07,119
okay so and i am going to remove all the
10062
07:38:03,759 --> 07:38:08,477
bread statements we have until we hit
10063
07:38:13,360 --> 07:38:18,718
and we're even going to remove that for
10064
07:38:18,718 --> 07:38:22,558
and if we both we're going to build fine
10065
07:38:20,957 --> 07:38:25,039
you're going to see that the world was
10066
07:38:22,558 --> 07:38:26,798
good but if we run this try to guess
10067
07:38:25,040 --> 07:38:29,680
what we're going to get the current
10068
07:38:26,797 --> 07:38:30,797
stool is the marker so we should print
10069
07:38:30,797 --> 07:38:37,279
and hit the end of the switch block and
10070
07:38:34,080 --> 07:38:39,600
do moving on but let's see what we get
10071
07:38:37,279 --> 07:38:42,557
did we build let's build again just to
10072
07:38:39,599 --> 07:38:44,397
be sure so we're going to run rooster
10073
07:38:44,398 --> 07:38:48,878
active tool is marker active thought is
10074
07:38:46,797 --> 07:38:50,000
eraser active tool is rectangle we
10075
07:38:50,000 --> 07:38:54,797
print every other case after the macro
10076
07:38:54,797 --> 07:39:00,000
and if we try to change this for example
10077
07:38:57,439 --> 07:39:01,759
not use marker and use eraser let's
10078
07:39:00,000 --> 07:39:02,957
change this you're going to see that
10079
07:39:05,520 --> 07:39:10,080
and everything after that is also going
10080
07:39:07,840 --> 07:39:12,398
to execute and it is not what you want
10081
07:39:10,080 --> 07:39:14,398
so let's clear and run rooster you're
10082
07:39:12,398 --> 07:39:16,798
going to see eraser rectangle circle
10083
07:39:14,398 --> 07:39:18,958
ellipse and no match found so you have
10084
07:39:16,797 --> 07:39:21,520
ready to remember to put in this brick
10085
07:39:18,957 --> 07:39:24,239
statement i am going to hit ctrl z a
10086
07:39:21,520 --> 07:39:26,558
couple of times and bring those in and i
10087
07:39:24,240 --> 07:39:29,440
think this is enough we have to hit
10088
07:39:26,558 --> 07:39:31,360
again so that marker also has it and if
10089
07:39:29,439 --> 07:39:33,840
we run now we're going to get what we
10090
07:39:31,360 --> 07:39:36,558
expect let's try to use an eraser again
10091
07:39:33,840 --> 07:39:38,718
and if we both again and clear and run
10092
07:39:36,558 --> 07:39:41,120
rooster we're going to see active tool
10093
07:39:38,718 --> 07:39:43,200
is razer and we are moving on
10094
07:39:41,119 --> 07:39:45,439
this is what we expect okay this is
10095
07:39:43,200 --> 07:39:47,200
really how you work with a switch
10096
07:39:45,439 --> 07:39:50,000
block you have to pass in your
10097
07:39:47,200 --> 07:39:52,718
expression or your test case and you
10098
07:39:50,000 --> 07:39:55,520
catch each case using this case syntax
10099
07:39:52,718 --> 07:39:57,200
here you say case you pass in whatever
10100
07:39:55,520 --> 07:39:59,680
it is you want to match and you put a
10101
07:39:57,200 --> 07:40:02,637
column and you put your code inside this
10102
07:39:59,680 --> 07:40:05,439
block here and remember after each case
10103
07:40:02,637 --> 07:40:07,119
you have to add this break otherwise
10104
07:40:05,439 --> 07:40:09,599
everything else after this is going to
10105
07:40:07,119 --> 07:40:12,477
execute and it is not going to be what
10106
07:40:09,599 --> 07:40:14,239
you want before i let you go i want to
10107
07:40:12,477 --> 07:40:16,878
show you that you can actually group
10108
07:40:14,240 --> 07:40:19,680
these case statements if this is what is
10109
07:40:16,878 --> 07:40:21,200
making sense for your application so for
10110
07:40:25,520 --> 07:40:28,797
this can be grouped into the group of
10111
07:40:33,439 --> 07:40:39,759
and uh put them on different lines
10112
07:40:36,477 --> 07:40:41,919
something like this so let's delete this
10113
07:40:41,919 --> 07:40:44,877
and we're going to delete the other
10114
07:40:46,080 --> 07:40:51,920
case circle just like this and we're
10115
07:40:48,878 --> 07:40:54,797
going to say drawing shape i think this
10116
07:40:51,919 --> 07:40:57,759
syntax is supported in c plus plus okay
10117
07:40:57,759 --> 07:41:03,919
and uh we're going to world with gcc
10118
07:41:01,520 --> 07:41:06,000
and the world is going to be good so if
10119
07:41:03,919 --> 07:41:08,397
we have a razor which is what we have in
10120
07:41:06,000 --> 07:41:10,240
here we're going to say drawing shape
10121
07:41:12,240 --> 07:41:17,040
you're going to see drawing shapes
10122
07:41:14,000 --> 07:41:21,040
moving on we have grouped different
10123
07:41:17,040 --> 07:41:23,280
cases and handles them with one block
10124
07:41:21,040 --> 07:41:24,878
and this may come in handy in some
10125
07:41:24,878 --> 07:41:29,119
one thing you should keep in mind is
10126
07:41:26,558 --> 07:41:32,319
that there are limitations on what you
10127
07:41:29,119 --> 07:41:34,557
can use as an expression or a condition
10128
07:41:32,319 --> 07:41:37,520
in your switch statement and that has to
10129
07:41:34,558 --> 07:41:39,520
be an integer something like ant car
10130
07:41:37,520 --> 07:41:41,920
unsigned shorter things like that we
10131
07:41:39,520 --> 07:41:44,718
have seen all of these things but it can
10132
07:41:41,919 --> 07:41:46,397
also be an enum but enam is something we
10133
07:41:44,718 --> 07:41:48,558
haven't learned about yet we will learn
10134
07:41:46,398 --> 07:41:50,878
about it later when we have enough tools
10135
07:41:48,558 --> 07:41:52,159
to understand that but know about this
10136
07:41:52,159 --> 07:41:58,000
so if we can in our project in visual
10137
07:41:55,200 --> 07:42:00,878
studio code for example and say
10138
07:42:00,878 --> 07:42:06,637
john for example and use this as a
10139
07:42:03,599 --> 07:42:08,557
switch condition or expression we have
10140
07:42:06,637 --> 07:42:10,079
to include string for this to work so
10141
07:42:10,080 --> 07:42:14,798
and include the string library we're
10142
07:42:12,477 --> 07:42:17,840
going to do string and if we go down
10143
07:42:14,797 --> 07:42:20,319
again and try to do switch and use name
10144
07:42:17,840 --> 07:42:22,637
as an expression and take out everything
10145
07:42:20,319 --> 07:42:25,200
we have in here and try to compile this
10146
07:42:22,637 --> 07:42:27,599
you see that the compiler is not happy
10147
07:42:25,200 --> 07:42:30,878
okay it's going to say expression must
10148
07:42:27,599 --> 07:42:32,477
have an integral or enum type so this is
10149
07:42:30,878 --> 07:42:34,637
not even going to compile this is a
10150
07:42:32,477 --> 07:42:37,599
limitation you have and you have to make
10151
07:42:34,637 --> 07:42:41,039
sure what you pass as a condition here
10152
07:42:37,599 --> 07:42:43,519
is an integer something like ant or car
10153
07:42:41,040 --> 07:42:46,638
or other integral types we have learnt
10154
07:42:46,878 --> 07:42:51,279
this lecture we're going to learn about
10155
07:42:48,558 --> 07:42:54,878
ternary operators and this is an
10156
07:42:51,279 --> 07:42:56,159
alternative way to do tests with the if
10157
07:42:56,159 --> 07:43:01,279
suppose here we have a variable called
10158
07:42:58,398 --> 07:43:03,200
max we have two variables called a and b
10159
07:43:01,279 --> 07:43:04,717
and we want to find the maximum between
10160
07:43:04,718 --> 07:43:09,600
one easy way we can do this is say if a
10161
07:43:07,840 --> 07:43:12,878
is greater than b we're going to store
10162
07:43:09,599 --> 07:43:14,477
the maximum in max else then b is going
10163
07:43:12,878 --> 07:43:17,200
to be the maximum and we're going to
10164
07:43:14,477 --> 07:43:18,878
store that in our maximum value and
10165
07:43:17,200 --> 07:43:20,798
we're going to print this out if we do
10166
07:43:18,878 --> 07:43:23,360
this we're going to get whatever is the
10167
07:43:20,797 --> 07:43:25,279
maximum between a and b to be printed
10168
07:43:23,360 --> 07:43:28,000
out on the console and this is going to
10169
07:43:25,279 --> 07:43:30,397
work really well but we can also use a
10170
07:43:28,000 --> 07:43:32,240
ternary expression and the ternary
10171
07:43:32,240 --> 07:43:36,398
and it starts with a pair of parentheses
10172
07:43:34,957 --> 07:43:38,319
you're going to put your condition
10173
07:43:36,398 --> 07:43:40,240
inside the parenthesis you're going to
10174
07:43:38,319 --> 07:43:42,477
follow that with the question mark
10175
07:43:40,240 --> 07:43:44,080
you're going to put your option one and
10176
07:43:42,477 --> 07:43:46,718
after that you're going to put a column
10177
07:43:44,080 --> 07:43:49,200
and option two and because this is a
10178
07:43:46,718 --> 07:43:52,558
statement in c plus plus we're going to
10179
07:43:49,200 --> 07:43:54,798
end this with a semicolon here is an
10180
07:43:54,797 --> 07:44:00,079
using f as we have been doing all along
10181
07:43:57,840 --> 07:44:03,040
so we say if condition results equals
10182
07:44:00,080 --> 07:44:05,040
option one if condition is false result
10183
07:44:03,040 --> 07:44:07,040
is going to be equal to option two and
10184
07:44:05,040 --> 07:44:09,520
this is exactly the same thing we are
10185
07:44:07,040 --> 07:44:11,280
doing with our ternary expression here
10186
07:44:09,520 --> 07:44:13,600
if the condition is true we're going to
10187
07:44:11,279 --> 07:44:15,759
take option one and assign that to
10188
07:44:13,599 --> 07:44:18,957
result if it's false we're going to take
10189
07:44:15,759 --> 07:44:21,359
option two and assign that to resort so
10190
07:44:18,957 --> 07:44:24,159
this is really a syntactic sugar or a
10191
07:44:21,360 --> 07:44:25,840
shorthand for this thing here and it's
10192
07:44:24,159 --> 07:44:27,360
going to make your code shorter and
10193
07:44:25,840 --> 07:44:28,240
you're going to see this all over the
10194
07:44:28,240 --> 07:44:32,320
in c plus plus code out there so you
10195
07:44:32,319 --> 07:44:38,319
familiar with this okay so here is our
10196
07:44:35,599 --> 07:44:40,637
example of computing the maximum you see
10197
07:44:38,319 --> 07:44:43,520
that we have the same variables max a
10198
07:44:40,637 --> 07:44:45,759
and b but we have a one liner that is
10199
07:44:43,520 --> 07:44:47,279
going to store the maximum in max and we
10200
07:44:47,279 --> 07:44:52,637
and hopefully you can see that this is
10201
07:44:49,680 --> 07:44:54,240
shorter and better than this okay one
10202
07:44:52,637 --> 07:44:57,520
other thing you should know is that
10203
07:44:54,240 --> 07:45:00,638
option one and option two should be of
10204
07:44:57,520 --> 07:45:02,718
the same type or at least the types must
10205
07:45:00,637 --> 07:45:04,477
be convertible and if that fails you're
10206
07:45:02,718 --> 07:45:06,798
going to get a compiler error we can
10207
07:45:04,477 --> 07:45:09,360
also do ternary initialization here we
10208
07:45:09,360 --> 07:45:14,319
we initialize this to false we can use
10209
07:45:14,319 --> 07:45:19,680
initialize our speed variable here we
10210
07:45:16,878 --> 07:45:23,040
are basically saying if fast initialize
10211
07:45:25,680 --> 07:45:29,439
and we're going to print the speed here
10212
07:45:27,360 --> 07:45:31,760
and this is going to work and here you
10213
07:45:29,439 --> 07:45:34,239
see that i lied a little bit in my
10214
07:45:31,759 --> 07:45:36,957
explanation to make it really obvious
10215
07:45:34,240 --> 07:45:39,200
what we had in our ternary expression
10216
07:45:36,957 --> 07:45:41,759
you don't have to always wrap your
10217
07:45:39,200 --> 07:45:44,159
condition in parenthesis but it makes
10218
07:45:41,759 --> 07:45:47,039
the code much cleaner okay now that you
10219
07:45:44,159 --> 07:45:49,279
have an idea about distance it's time we
10220
07:45:47,040 --> 07:45:53,040
headed to visual studio code and
10221
07:45:49,279 --> 07:45:56,000
actually tried this and so for ourselves
10222
07:45:53,040 --> 07:45:58,878
okay here we are in our working folder
10223
07:45:56,000 --> 07:46:02,159
the current project is ternary operators
10224
07:45:58,878 --> 07:46:05,200
we're going to grab our template files
10225
07:46:02,159 --> 07:46:08,079
and put those where they belong it is in
10226
07:46:05,200 --> 07:46:09,760
this lecture here on ternary operators
10227
07:46:08,080 --> 07:46:12,558
and we're going to open this up in
10228
07:46:09,759 --> 07:46:14,637
visual studio code as we always do we're
10229
07:46:12,558 --> 07:46:17,280
going to open this and we're going to
10230
07:46:14,637 --> 07:46:19,840
open main cpp and take out whatever we
10231
07:46:17,279 --> 07:46:22,717
don't need we are going to go down and
10232
07:46:19,840 --> 07:46:25,520
put in our test code we basically have a
10233
07:46:22,718 --> 07:46:28,477
few variables let's kill these spaces so
10234
07:46:25,520 --> 07:46:31,360
that our code is not cluttered here and
10235
07:46:28,477 --> 07:46:33,439
we're going to print our maximum
10236
07:46:31,360 --> 07:46:36,319
and we're going to be using a regular if
10237
07:46:33,439 --> 07:46:39,279
we have three variables max a and b we
10238
07:46:36,319 --> 07:46:43,200
are saying if a is greater than b
10239
07:46:39,279 --> 07:46:45,360
we're going to store the maximum and max
10240
07:46:43,200 --> 07:46:46,477
otherwise we're going to store b
10241
07:46:46,477 --> 07:46:50,797
and this is going to allow us to print
10242
07:46:48,398 --> 07:46:53,520
whatever is the maximum between 35 and
10243
07:46:50,797 --> 07:46:54,957
20. if we build this let's bring up a
10244
07:46:54,957 --> 07:47:00,079
and we are going to build with gcc as we
10245
07:46:57,759 --> 07:47:02,159
always do let's bring this up a little
10246
07:47:02,159 --> 07:47:07,279
and run rooster we're going to see that
10247
07:47:04,159 --> 07:47:08,477
the maximum is 35 if we put our maximum
10248
07:47:08,477 --> 07:47:12,239
we're going to get the maximum steel so
10249
07:47:10,637 --> 07:47:14,637
we're going to run this out to build
10250
07:47:14,637 --> 07:47:18,477
and we're going to run this clear
10251
07:47:18,477 --> 07:47:23,680
max is 200 so we're going to get the
10252
07:47:20,477 --> 07:47:27,119
maximum regardless of where it is stored
10253
07:47:23,680 --> 07:47:30,080
in a or b this is how our code works but
10254
07:47:27,119 --> 07:47:31,279
we can use ternary operators to do the
10255
07:47:31,279 --> 07:47:35,199
so what we're going to do here we're
10256
07:47:32,637 --> 07:47:36,319
going to comment out our if statement
10257
07:47:36,319 --> 07:47:42,159
a ternary version so what we're going to
10258
07:47:39,279 --> 07:47:44,957
do we're going to say result equals
10259
07:47:42,159 --> 07:47:47,200
and we're going to say a greater than b
10260
07:47:44,957 --> 07:47:48,319
we're going to put a question mark to
10261
07:47:49,520 --> 07:47:54,637
start of our two options option one is
10262
07:47:51,919 --> 07:47:57,599
going to be a because if a is greater
10263
07:47:54,637 --> 07:48:00,637
than b then a is going to be the maximum
10264
07:47:57,599 --> 07:48:02,557
so we're going to grab a here and if a
10265
07:48:02,558 --> 07:48:06,638
then b must be the maximum so we're
10266
07:48:04,558 --> 07:48:08,878
going to put that as a second option
10267
07:48:06,637 --> 07:48:10,637
here this is what we mean with this
10268
07:48:08,878 --> 07:48:12,637
statement and we don't have a variable
10269
07:48:10,637 --> 07:48:14,718
called results that's why we have a
10270
07:48:12,637 --> 07:48:17,360
problem here we're going to put our
10271
07:48:14,718 --> 07:48:19,040
result in max and this should
10272
07:48:19,040 --> 07:48:23,760
you see the squiggly lines go away and
10273
07:48:22,000 --> 07:48:26,477
we can build this and we're going to get
10274
07:48:23,759 --> 07:48:29,199
exactly the same result so this is our
10275
07:48:26,477 --> 07:48:31,919
ternary operator if we build this it is
10276
07:48:29,200 --> 07:48:33,520
going to go through and if we run this
10277
07:48:31,919 --> 07:48:36,797
we're going to get exactly the same
10278
07:48:33,520 --> 07:48:39,439
result max is 200 and it is what we
10279
07:48:36,797 --> 07:48:43,039
expect okay so take some time and really
10280
07:48:39,439 --> 07:48:44,877
make yourself familiar with this syntax
10281
07:48:43,040 --> 07:48:47,760
it is really nothing complicated you
10282
07:48:44,878 --> 07:48:49,840
just have to make sure your brain is
10283
07:48:47,759 --> 07:48:51,599
aware of something like this and you're
10284
07:48:49,840 --> 07:48:54,319
going to recognize that everywhere you
10285
07:48:51,599 --> 07:48:57,119
see it in code out there okay we have
10286
07:48:54,319 --> 07:48:59,680
mentioned that you can't pass types that
10287
07:48:57,119 --> 07:49:02,718
are not compatible and the requirement
10288
07:48:59,680 --> 07:49:05,680
is that a and b be of the same type
10289
07:49:02,718 --> 07:49:08,718
or at least types you can do conversions
10290
07:49:05,680 --> 07:49:10,558
between so for example if we try to do
10291
07:49:13,200 --> 07:49:19,360
we can't really turn a strength into a
10292
07:49:17,040 --> 07:49:21,760
integer and this is going to give us a
10293
07:49:19,360 --> 07:49:23,760
compiler error and let's look at the
10294
07:49:21,759 --> 07:49:26,557
error we see from visual studio code
10295
07:49:23,759 --> 07:49:29,199
operand types are incompatible and and
10296
07:49:26,558 --> 07:49:31,760
the const car are not compatible and
10297
07:49:29,200 --> 07:49:33,520
they have to be compatible if we ignore
10298
07:49:31,759 --> 07:49:36,477
this and go ahead and build we're going
10299
07:49:33,520 --> 07:49:39,840
to also see an error from the compiler
10300
07:49:36,477 --> 07:49:41,520
and it should be the same error so
10301
07:49:41,520 --> 07:49:46,000
question mark and column have different
10302
07:49:47,840 --> 07:49:52,878
stands you can really compare so for
10303
07:49:50,398 --> 07:49:55,680
example we can take out this string here
10304
07:49:52,878 --> 07:49:59,119
and put in a floating point let's put in
10305
07:49:55,680 --> 07:50:00,637
a 22.5 and say that this is a fluid
10306
07:49:59,119 --> 07:50:02,557
you're going to see that the problem is
10307
07:50:00,637 --> 07:50:04,637
going to go away here let's wait for a
10308
07:50:02,558 --> 07:50:06,638
minute it's not going away we're going
10309
07:50:04,637 --> 07:50:08,957
to build anyway you see the world is
10310
07:50:08,957 --> 07:50:13,439
so that we don't have all this clutter
10311
07:50:10,878 --> 07:50:15,840
you see problems by the way and if we
10312
07:50:13,439 --> 07:50:17,520
both again let's try to do that the
10313
07:50:15,840 --> 07:50:19,680
builder is going to go through and if we
10314
07:50:19,680 --> 07:50:26,240
max is 22 because we are comparing a and
10315
07:50:23,599 --> 07:50:28,239
22 here and the compiler inserted an
10316
07:50:26,240 --> 07:50:30,638
implicit conversion from this floating
10317
07:50:28,240 --> 07:50:32,159
point to integer that's why we are
10318
07:50:32,159 --> 07:50:37,119
so what is the type that's the compiler
10319
07:50:34,797 --> 07:50:39,759
really used here okay to make it really
10320
07:50:37,119 --> 07:50:40,878
clear what is going on we're not going
10321
07:50:40,878 --> 07:50:46,718
use max here let's say auto max one
10322
07:50:44,878 --> 07:50:48,319
and see what the compiler is really
10323
07:50:48,319 --> 07:50:53,200
so we're going to take this out
10324
07:50:50,878 --> 07:50:56,159
and by this we're going to see
10325
07:50:53,200 --> 07:50:58,637
what implicit conversion the compiler
10326
07:50:56,159 --> 07:51:00,718
really did here because what we had
10327
07:50:58,637 --> 07:51:03,039
before we were doing an assignment so
10328
07:51:00,718 --> 07:51:04,878
whatever was on the left was being
10329
07:51:03,040 --> 07:51:07,440
turned into an integer because we were
10330
07:51:04,878 --> 07:51:09,680
doing an implicit conversion from an
10331
07:51:07,439 --> 07:51:12,079
assignment so whatever is on the left is
10332
07:51:09,680 --> 07:51:14,159
turned into the type of whatever we have
10333
07:51:12,080 --> 07:51:16,398
on the left of the assignment i hope you
10334
07:51:14,159 --> 07:51:18,797
know this already but if we do things
10335
07:51:16,398 --> 07:51:21,360
like this we're going to deduce whatever
10336
07:51:18,797 --> 07:51:23,199
is on the left and assign that into max
10337
07:51:21,360 --> 07:51:24,958
one so we're going to do so we're going
10338
07:51:23,200 --> 07:51:27,360
to see the implicit conversion that the
10339
07:51:24,957 --> 07:51:29,680
compiler did in here and it is good to
10340
07:51:27,360 --> 07:51:31,520
be able to see things like that it is a
10341
07:51:31,520 --> 07:51:36,000
let's see what happens here we're going
10342
07:51:32,957 --> 07:51:39,359
to print max one and i'm going to world
10343
07:51:36,000 --> 07:51:41,360
with gcc this is going to go through
10344
07:51:39,360 --> 07:51:43,279
and we're going to see what is printed
10345
07:51:43,279 --> 07:51:47,360
and you're going to see that the
10346
07:51:44,477 --> 07:51:50,159
implicit conversion happened from end to
10347
07:51:47,360 --> 07:51:52,558
flood and we deduce the flood here in
10348
07:51:50,159 --> 07:51:54,878
max one so this is really interesting
10349
07:51:52,558 --> 07:51:56,798
one might have thought that we had a
10350
07:51:56,797 --> 07:52:01,439
to end but it was actually the reverse
10351
07:51:59,279 --> 07:52:02,797
and this is quite interesting this is
10352
07:52:01,439 --> 07:52:05,279
really all we set out to do in this
10353
07:52:02,797 --> 07:52:07,439
lecture i hope you found it interesting
10354
07:52:05,279 --> 07:52:09,520
again make sure you have this syntax
10355
07:52:07,439 --> 07:52:11,279
here drilled in your brain because
10356
07:52:09,520 --> 07:52:14,080
you're going to be seeing this a lot in
10357
07:52:11,279 --> 07:52:16,477
your career as a software developer not
10358
07:52:14,080 --> 07:52:18,558
only a c plus plus developer actually
10359
07:52:16,477 --> 07:52:20,119
and it is going to be helpful
10360
07:52:20,119 --> 07:52:24,797
congratulations on hitting the end of
10361
07:52:22,398 --> 07:52:26,878
this chapter this chapter was all about
10362
07:52:24,797 --> 07:52:29,199
flow control and we had the chance to
10363
07:52:26,878 --> 07:52:32,000
learn about many of the tools that c
10364
07:52:29,200 --> 07:52:34,000
plus plus provides to do conditional
10365
07:52:32,000 --> 07:52:35,919
programming and we were able to see all
10366
07:52:34,000 --> 07:52:38,240
kinds of crazy things we had the chance
10367
07:52:35,919 --> 07:52:40,637
to do things like if red is true we're
10368
07:52:38,240 --> 07:52:42,638
going to run the code inside if yellow
10369
07:52:40,637 --> 07:52:44,477
is true we're going to run code inside
10370
07:52:42,637 --> 07:52:46,319
if green is true we're going to run code
10371
07:52:44,477 --> 07:52:49,439
inside and you had a chance to play with
10372
07:52:46,319 --> 07:52:51,439
those things on many occasions we have
10373
07:52:49,439 --> 07:52:53,599
seen that the tools that c plus plus
10374
07:52:51,439 --> 07:52:56,239
provides really revolve around these
10375
07:52:53,599 --> 07:52:58,477
four things here we have if statements
10376
07:52:58,477 --> 07:53:05,119
on this if statements we can do else if
10377
07:53:02,319 --> 07:53:07,360
to really do long chains of things where
10378
07:53:05,119 --> 07:53:10,079
we do different decisions to do things
10379
07:53:07,360 --> 07:53:12,319
in our applications we also saw that
10380
07:53:10,080 --> 07:53:14,398
switch is an option if you have several
10381
07:53:12,319 --> 07:53:17,119
decisions you can make in your
10382
07:53:14,398 --> 07:53:20,080
application and we saw that a ternary
10383
07:53:17,119 --> 07:53:22,718
operator can really be used to do
10384
07:53:20,080 --> 07:53:25,120
two decisions if you have two decisions
10385
07:53:22,718 --> 07:53:27,920
you're going to be able to reduce the
10386
07:53:25,119 --> 07:53:30,477
number of lines you used to do these
10387
07:53:27,919 --> 07:53:32,637
decisions with to one line and we had a
10388
07:53:30,477 --> 07:53:35,520
chance to really look at that in detail
10389
07:53:32,637 --> 07:53:37,520
in the lecture on ternary operators this
10390
07:53:35,520 --> 07:53:40,000
is really all i had to share in this
10391
07:53:37,520 --> 07:53:41,439
chapter i hope you found it interesting
10392
07:53:40,000 --> 07:53:43,200
we are going to stop here in this
10393
07:53:41,439 --> 07:53:46,079
lecture in the next chapter we're going
10394
07:53:43,200 --> 07:53:48,398
to start and learn about loops
10395
07:53:46,080 --> 07:53:50,638
go ahead and finish up here and meet me
10396
07:53:48,398 --> 07:53:53,360
there in this chapter we're going to be
10397
07:53:50,637 --> 07:53:56,079
learning about loops and this is a
10398
07:53:53,360 --> 07:53:58,637
construct that is provided by the c plus
10399
07:53:56,080 --> 07:54:03,360
plus programming language to allow you
10400
07:53:58,637 --> 07:54:06,637
to do repetitive tasks relatively easily
10401
07:54:03,360 --> 07:54:08,319
suppose we have a task to print a
10402
07:54:08,319 --> 07:54:13,279
we can go down and do it like this and
10403
07:54:10,878 --> 07:54:14,398
it is going to work but what if they try
10404
07:54:14,398 --> 07:54:18,000
do this 100 times then you're going to
10405
07:54:16,477 --> 07:54:20,079
start scratching your head you're going
10406
07:54:18,000 --> 07:54:22,000
to type this 100 times and you're going
10407
07:54:20,080 --> 07:54:24,160
to run your program and it is going to
10408
07:54:22,000 --> 07:54:26,558
work then your manager comes up and they
10409
07:54:24,159 --> 07:54:28,797
say i want you to do this 10 000 times
10410
07:54:26,558 --> 07:54:30,558
or even 100 000 times and then you're
10411
07:54:28,797 --> 07:54:32,717
going to start pulling your hair or
10412
07:54:30,558 --> 07:54:34,878
running around breaking vents because
10413
07:54:32,718 --> 07:54:37,840
that's impossible to do not to worry
10414
07:54:34,878 --> 07:54:40,000
here c plus plus provides a way to do
10415
07:54:37,840 --> 07:54:42,319
this relatively easily and we're going
10416
07:54:40,000 --> 07:54:45,119
to be learning about ways we can do this
10417
07:54:42,319 --> 07:54:46,878
in our program in this chapter the
10418
07:54:45,119 --> 07:54:49,520
constructs we're going to be using are
10419
07:54:46,878 --> 07:54:51,760
these you see here there is a for loop a
10420
07:54:49,520 --> 07:54:54,398
range base for a loop a while loop and
10421
07:54:51,759 --> 07:54:57,840
do a while loop and we can make use of
10422
07:54:54,398 --> 07:55:00,798
these tools to not go crazy printing a
10423
07:54:57,840 --> 07:55:01,920
message one million times because that's
10424
07:55:01,919 --> 07:55:05,599
okay so that's what we are up against in
10425
07:55:04,159 --> 07:55:07,759
this chapter we're going to be learning
10426
07:55:05,599 --> 07:55:09,840
about these loop constructs and you're
10427
07:55:07,759 --> 07:55:12,159
going to find that they are really cool
10428
07:55:09,840 --> 07:55:14,319
for your application i am excited to be
10429
07:55:12,159 --> 07:55:16,637
teaching you this so let's get started
10430
07:55:14,319 --> 07:55:19,599
in the next lecture and learn about the
10431
07:55:16,637 --> 07:55:21,439
for loop go ahead and finish up here and
10432
07:55:19,599 --> 07:55:24,239
meet me there in this lecture we're
10433
07:55:21,439 --> 07:55:26,557
going to learn about four loops
10434
07:55:24,240 --> 07:55:29,120
for loops are one of the constructs we
10435
07:55:26,558 --> 07:55:31,440
have in c plus plus to do repetitive
10436
07:55:29,119 --> 07:55:33,520
tasks they allow us to do something like
10437
07:55:31,439 --> 07:55:36,717
this much more easily for example we
10438
07:55:33,520 --> 07:55:40,240
don't have to type stdc out of c plus
10439
07:55:36,718 --> 07:55:42,398
plus 10 times or 100 times we can do
10440
07:55:40,240 --> 07:55:44,558
this in less than five lines and you're
10441
07:55:42,398 --> 07:55:47,680
going to see how cool this is the syntax
10442
07:55:44,558 --> 07:55:50,398
for for loops looks like this and it may
10443
07:55:47,680 --> 07:55:53,200
look intimidating for first users but
10444
07:55:50,398 --> 07:55:56,159
we're going to break this down we have a
10445
07:55:53,200 --> 07:55:58,637
few parts in here the first part is the
10446
07:55:56,159 --> 07:56:01,439
iterator which is a variable that we're
10447
07:55:58,637 --> 07:56:03,520
going to be using to navigate through
10448
07:56:01,439 --> 07:56:06,557
the loop and that variable is this
10449
07:56:03,520 --> 07:56:09,439
unsigned int i here we are going to
10450
07:56:06,558 --> 07:56:12,477
initialize this to zero and the value we
10451
07:56:09,439 --> 07:56:14,797
initialize this with is going to be our
10452
07:56:12,477 --> 07:56:17,360
starting value and that's another key
10453
07:56:14,797 --> 07:56:19,599
point of any loop any loop is going to
10454
07:56:17,360 --> 07:56:22,159
have a starting point we are also going
10455
07:56:19,599 --> 07:56:25,199
to have a test which is going to control
10456
07:56:22,159 --> 07:56:27,680
when our loop ends for example this loop
10457
07:56:25,200 --> 07:56:30,398
is going to start with i equal to zero
10458
07:56:27,680 --> 07:56:32,398
it is going to keep doing stuff until
10459
07:56:32,398 --> 07:56:37,360
less than 10. as long as i is less than
10460
07:56:35,520 --> 07:56:40,000
10 it's going to keep doing whatever it
10461
07:56:37,360 --> 07:56:43,279
is we want to do and the first part of
10462
07:56:40,000 --> 07:56:45,279
the loop is this plus plus i thing here
10463
07:56:43,279 --> 07:56:46,797
and this is an incrementation part
10464
07:56:45,279 --> 07:56:49,199
that's how i'm going to call it for
10465
07:56:46,797 --> 07:56:52,477
simplicity but at least a part that
10466
07:56:49,200 --> 07:56:55,040
keeps changing our iterator to make our
10467
07:56:52,477 --> 07:56:57,520
loop move forward after these four
10468
07:56:55,040 --> 07:57:00,558
points we are going to have a pair of
10469
07:56:57,520 --> 07:57:03,119
curly braces and inside these curly
10470
07:57:00,558 --> 07:57:05,040
braces we're going to have the body of
10471
07:57:03,119 --> 07:57:08,239
our loop and this is the code we want to
10472
07:57:05,040 --> 07:57:10,638
execute multiple times and inside this
10473
07:57:08,240 --> 07:57:12,240
loop body we can really do all kinds of
10474
07:57:10,637 --> 07:57:14,397
crazy things you're going to see how
10475
07:57:12,240 --> 07:57:16,958
cool this is again we have a few parts
10476
07:57:14,398 --> 07:57:19,280
with our loop we have our iterator which
10477
07:57:16,957 --> 07:57:21,759
is this variable i here we're going to
10478
07:57:19,279 --> 07:57:24,397
be initializing this with a value that
10479
07:57:21,759 --> 07:57:26,557
denotes where we want our loop to start
10480
07:57:24,398 --> 07:57:28,958
we then have a test which is going to
10481
07:57:26,558 --> 07:57:30,638
control when the loop is going to end
10482
07:57:28,957 --> 07:57:33,199
we're going to have our incrementation
10483
07:57:30,637 --> 07:57:35,119
part which is going to allow our loop to
10484
07:57:33,200 --> 07:57:36,798
move forward and it's going to be doing
10485
07:57:35,119 --> 07:57:39,520
that through incrementation or
10486
07:57:36,797 --> 07:57:41,439
decrementation but to make explanation
10487
07:57:39,520 --> 07:57:44,637
easier here we're going to call this
10488
07:57:41,439 --> 07:57:46,319
part the incrementation part of the loop
10489
07:57:44,637 --> 07:57:48,397
after that we're going to have the body
10490
07:57:46,319 --> 07:57:50,878
of the loop and it's going to be within
10491
07:57:48,398 --> 07:57:53,440
this curly braces and it's going to be
10492
07:57:50,878 --> 07:57:55,840
whatever it is we want to execute inside
10493
07:57:53,439 --> 07:57:57,919
this loop okay these are the parts of a
10494
07:57:55,840 --> 07:58:00,240
loop and you need to keep this in mind
10495
07:57:57,919 --> 07:58:01,279
okay now that you know the main parts of
10496
07:58:01,279 --> 07:58:05,439
how does it really work let's go through
10497
07:58:03,279 --> 07:58:08,319
this and see how it's going to print i
10498
07:58:05,439 --> 07:58:10,477
love c plus plus 10 times so when this
10499
07:58:08,319 --> 07:58:12,957
code gets executed we're going to start
10500
07:58:10,477 --> 07:58:15,840
with i equal to 0 because that's what we
10501
07:58:12,957 --> 07:58:18,000
are initializing this value with
10502
07:58:15,840 --> 07:58:19,680
after the incrementation part we're
10503
07:58:19,680 --> 07:58:25,439
and the test is going to say is i is 0
10504
07:58:23,119 --> 07:58:28,477
less than 10 and that's going to be true
10505
07:58:25,439 --> 07:58:30,477
so if the test turns out to be true
10506
07:58:28,477 --> 07:58:32,797
we're going to jump into the loop body
10507
07:58:30,477 --> 07:58:36,319
and if it's false we're going to jump to
10508
07:58:32,797 --> 07:58:39,439
the end of the loop and execute whatever
10509
07:58:36,319 --> 07:58:41,599
is after our loop this is how it works
10510
07:58:39,439 --> 07:58:44,000
so if we jump in for the first time when
10511
07:58:41,599 --> 07:58:46,159
i is 0 we're going to print i love c
10512
07:58:44,000 --> 07:58:48,080
plus plus for the first time then after
10513
07:58:46,159 --> 07:58:50,477
the body is executed we're going to
10514
07:58:48,080 --> 07:58:53,200
execute the incrementation part
10515
07:58:50,477 --> 07:58:54,637
this is going to make i equal to 1 then
10516
07:58:53,200 --> 07:58:57,440
we're going to come back to the test
10517
07:58:54,637 --> 07:58:59,279
we're going to say is 1 less than 10
10518
07:58:57,439 --> 07:59:01,759
that's going to be true we're going to
10519
07:58:59,279 --> 07:59:04,079
come in the body and print i love c plus
10520
07:59:01,759 --> 07:59:05,679
plus for the second time after that the
10521
07:59:04,080 --> 07:59:08,878
incrementation part is going to run
10522
07:59:05,680 --> 07:59:11,360
we're going to have a 2 inside i here 2
10523
07:59:08,878 --> 07:59:12,878
is less than 10 this is going to be true
10524
07:59:11,360 --> 07:59:15,119
so we're going to follow him the body
10525
07:59:12,878 --> 07:59:17,520
again and print i love c plus plus for
10526
07:59:15,119 --> 07:59:20,718
the third time we're going to keep doing
10527
07:59:17,520 --> 07:59:22,797
this until we hit nine for example if we
10528
07:59:20,718 --> 07:59:25,920
increment and get a nine we're going to
10529
07:59:22,797 --> 07:59:27,520
form the test and say is nine less than
10530
07:59:25,919 --> 07:59:30,000
ten that's going to be true so we're
10531
07:59:27,520 --> 07:59:31,360
going to fall in here and print i love c
10532
07:59:31,360 --> 07:59:36,558
and after that we're going to run the
10533
07:59:33,520 --> 07:59:38,878
incrementation part again this time i is
10534
07:59:36,558 --> 07:59:42,240
going to become 10 we're going to do the
10535
07:59:38,878 --> 07:59:43,680
test 10 is not less than 10 so the test
10536
07:59:43,680 --> 07:59:48,878
and we're going to fall on the outside
10537
07:59:46,080 --> 07:59:52,080
of the loop here and by that time we'll
10538
07:59:48,878 --> 07:59:54,398
have printed i love c plus plus 10 times
10539
07:59:52,080 --> 07:59:56,320
and this is really how a loop works for
10540
07:59:54,398 --> 07:59:59,040
the first time we're going to run this
10541
07:59:56,319 --> 08:00:01,520
initializer part here to initialize our
10542
07:59:59,040 --> 08:00:03,040
iterator which is this value i
10543
08:00:01,520 --> 08:00:04,159
and then after that we're going to run
10544
08:00:04,159 --> 08:00:08,000
if the test is good if it's successful
10545
08:00:06,240 --> 08:00:09,840
we're going to fall in the body we're
10546
08:00:08,000 --> 08:00:11,759
going to execute whatever code is in the
10547
08:00:09,840 --> 08:00:14,240
body and after that we're going to keep
10548
08:00:11,759 --> 08:00:16,319
doing the cycle increment test the body
10549
08:00:19,439 --> 08:00:24,797
we hit a point where the test fails and
10550
08:00:22,718 --> 08:00:26,000
if the test fails we're going to fall
10551
08:00:26,000 --> 08:00:31,439
this for loop here we're going to
10552
08:00:28,398 --> 08:00:33,840
execute whatever is after this closing
10553
08:00:31,439 --> 08:00:35,919
curly brace and this is how a loop works
10554
08:00:33,840 --> 08:00:38,797
i want you to go through this one more
10555
08:00:35,919 --> 08:00:41,599
time by printing i love c plus plus and
10556
08:00:38,797 --> 08:00:42,477
making sure that this is printed 10
10557
08:00:42,477 --> 08:00:47,599
and one thing you should have noticed
10558
08:00:44,319 --> 08:00:49,279
now is that we use this test to control
10559
08:00:47,599 --> 08:00:51,919
how many times the loop is going to
10560
08:00:49,279 --> 08:00:54,797
start for example if we wanted it to run
10561
08:00:51,919 --> 08:00:57,759
20 times we would start from zero and
10562
08:00:54,797 --> 08:00:59,599
and at 20. and you don't always have to
10563
08:00:57,759 --> 08:01:01,519
start from zero you can really start
10564
08:00:59,599 --> 08:01:04,957
from anywhere for example you can
10565
08:01:01,520 --> 08:01:08,240
initialize i with a value like 30 and
10566
08:01:04,957 --> 08:01:10,159
end when i is equal to 55. let's say
10567
08:01:08,240 --> 08:01:13,120
that as an example you can really do
10568
08:01:10,159 --> 08:01:15,439
anything the main important thing is to
10569
08:01:13,119 --> 08:01:18,159
understand how a loop works one thing i
10570
08:01:15,439 --> 08:01:20,239
want you to notice is that we are saying
10571
08:01:23,279 --> 08:01:29,439
iterators are a common thing in c plus
10572
08:01:26,080 --> 08:01:31,760
plus code and they're not just used for
10573
08:01:29,439 --> 08:01:34,957
loops like we are doing it here there is
10574
08:01:31,759 --> 08:01:36,717
a type we use to do iterators and it
10575
08:01:34,957 --> 08:01:38,877
makes our code much more readable and
10576
08:01:38,878 --> 08:01:45,119
this event is a representation of some
10577
08:01:42,000 --> 08:01:46,797
unsigned and type in your c plus plus
10578
08:01:45,119 --> 08:01:48,878
compiler this is going to be different
10579
08:01:46,797 --> 08:01:52,319
from compiler to compiler but for
10580
08:01:48,878 --> 08:01:55,040
example on my system this is eight bytes
10581
08:01:52,319 --> 08:01:57,520
so it has quite a good range of values
10582
08:01:55,040 --> 08:02:00,477
you can put in there if we use size t
10583
08:01:57,520 --> 08:02:02,080
type to declare our i iterator here
10584
08:02:00,477 --> 08:02:04,159
we're going to say something like this
10585
08:02:04,159 --> 08:02:07,840
we're going to put our curly braces
10586
08:02:05,919 --> 08:02:09,839
we're going to put a semicolon we're
10587
08:02:07,840 --> 08:02:12,637
going to put our test and we're going to
10588
08:02:09,840 --> 08:02:15,040
put our incrementation part and i think
10589
08:02:12,637 --> 08:02:17,360
i really emphasize this but the
10590
08:02:15,040 --> 08:02:20,958
parts of our loop inside this
10591
08:02:17,360 --> 08:02:23,279
parenthesis are separated by semicolons
10592
08:02:20,957 --> 08:02:25,680
like this so we have the iterator
10593
08:02:23,279 --> 08:02:28,239
declaration we have a semicolon we have
10594
08:02:25,680 --> 08:02:30,477
the test we have a semicolon and we put
10595
08:02:28,240 --> 08:02:33,040
our incrementation part and then we go
10596
08:02:30,477 --> 08:02:35,360
on and put our curlies and inside we can
10597
08:02:33,040 --> 08:02:37,520
do whatever it is we want to do
10598
08:02:35,360 --> 08:02:39,520
inside the loop so size t is something
10599
08:02:37,520 --> 08:02:42,080
you're going to see a lot make sure you
10600
08:02:39,520 --> 08:02:45,840
know what it means remember that it is a
10601
08:02:42,080 --> 08:02:47,920
representation of an unsigned and type
10602
08:02:45,840 --> 08:02:50,558
so it can only represent positive
10603
08:02:47,919 --> 08:02:53,439
numbers and it is used to represent
10604
08:02:50,558 --> 08:02:56,159
things like sizes in c plus plus thank
10605
08:02:53,439 --> 08:02:58,477
the number of students in a classroom
10606
08:02:56,159 --> 08:03:00,957
for example that can never be negative
10607
08:02:58,477 --> 08:03:02,637
think about the number of seats in a car
10608
08:03:00,957 --> 08:03:05,520
that's something that is always going to
10609
08:03:02,637 --> 08:03:08,000
be positive and it won't make sense for
10610
08:03:05,520 --> 08:03:11,360
that to be negative so for those kinds
10611
08:03:08,000 --> 08:03:13,599
of things we can use size t to represent
10612
08:03:11,360 --> 08:03:15,279
the size of those things and you're
10613
08:03:13,599 --> 08:03:17,279
going to see how this works in a minute
10614
08:03:15,279 --> 08:03:20,079
okay now that you have a pretty good
10615
08:03:17,279 --> 08:03:22,239
idea about how a loop works and the main
10616
08:03:20,080 --> 08:03:24,478
parts that make it up i want you to know
10617
08:03:22,240 --> 08:03:27,360
that you can also do all kinds of crazy
10618
08:03:24,477 --> 08:03:30,000
operations inside the body of your loop
10619
08:03:27,360 --> 08:03:32,797
for example here we are printing out the
10620
08:03:30,000 --> 08:03:35,119
current value of our iterator and we're
10621
08:03:32,797 --> 08:03:37,840
going to print the double that we can do
10622
08:03:35,119 --> 08:03:40,637
this we can also leave out the curly
10623
08:03:37,840 --> 08:03:43,040
braces and this is only valid if we have
10624
08:03:40,637 --> 08:03:45,119
one statement we want to run in the loop
10625
08:03:43,040 --> 08:03:47,200
so this is going to print this message
10626
08:03:45,119 --> 08:03:49,840
here five times because this loop is
10627
08:03:47,200 --> 08:03:52,558
going from zero all the way to four it
10628
08:03:49,840 --> 08:03:54,878
is going to stop when i stops being less
10629
08:03:52,558 --> 08:03:56,638
than five and this is going to be five
10630
08:03:54,878 --> 08:03:58,240
times if you go through this you're
10631
08:03:56,637 --> 08:04:00,397
going to see that this is going to print
10632
08:03:58,240 --> 08:04:03,040
five times you should also know that
10633
08:04:00,398 --> 08:04:06,159
this iterator that we are declaring like
10634
08:04:03,040 --> 08:04:08,878
this is going to be scoped inside the
10635
08:04:06,159 --> 08:04:11,520
body of the loop so you can only use it
10636
08:04:08,878 --> 08:04:15,040
inside these curly braces and if you try
10637
08:04:11,520 --> 08:04:17,680
to use it outside for example here after
10638
08:04:15,040 --> 08:04:19,280
the closing curly braces of the body of
10639
08:04:17,680 --> 08:04:21,520
the loop you're going to get a compiler
10640
08:04:19,279 --> 08:04:24,239
error again you can only use this
10641
08:04:21,520 --> 08:04:27,600
variable i which is our iterator
10642
08:04:24,240 --> 08:04:30,478
inside the curlies that mark the
10643
08:04:27,599 --> 08:04:32,557
start and the end of our loop body if
10644
08:04:30,477 --> 08:04:35,759
you want the iterator to be usable
10645
08:04:32,558 --> 08:04:37,280
outside the scope of the for loop you
10646
08:04:35,759 --> 08:04:40,239
can do something like this you can
10647
08:04:37,279 --> 08:04:41,840
declare your iterator outside the loop
10648
08:04:40,240 --> 08:04:43,760
and you can initialize that with
10649
08:04:41,840 --> 08:04:46,477
whatever you want and then you can set
10650
08:04:43,759 --> 08:04:49,039
up your loop like this you can say for j
10651
08:04:46,477 --> 08:04:51,520
and put and your test and your
10652
08:04:49,040 --> 08:04:52,958
incrementation part and inside do
10653
08:04:51,520 --> 08:04:55,520
whatever it is you want to do in the
10654
08:04:52,957 --> 08:04:58,159
body of the look if we do it like this
10655
08:04:55,520 --> 08:05:00,319
then j is going to be usable outside of
10656
08:04:58,159 --> 08:05:02,797
the loop and we're going to see its
10657
08:05:00,319 --> 08:05:04,878
value if we print it out like this so
10658
08:05:02,797 --> 08:05:08,557
this is also something you can do
10659
08:05:04,878 --> 08:05:09,440
you can even go all crazy and leave out
10660
08:05:09,439 --> 08:05:13,279
declaration part if you happen to have
10661
08:05:13,279 --> 08:05:18,239
iterator declared outside so if you do
10662
08:05:16,477 --> 08:05:20,477
something like this it is also going to
10663
08:05:18,240 --> 08:05:22,798
work okay the last thing i want you to
10664
08:05:20,477 --> 08:05:25,119
see before we head over to visual studio
10665
08:05:22,797 --> 08:05:27,840
code and actually try this out
10666
08:05:25,119 --> 08:05:29,840
is that it is a bad thing to hard code
10667
08:05:27,840 --> 08:05:32,398
your values in for example you see here
10668
08:05:29,840 --> 08:05:34,957
we are saying j less than 10
10669
08:05:32,398 --> 08:05:37,280
this is really bad design because every
10670
08:05:34,957 --> 08:05:39,520
time you need to change the number of
10671
08:05:37,279 --> 08:05:41,199
times that your loop is going to run
10672
08:05:39,520 --> 08:05:43,360
you're going to have to hunt for these
10673
08:05:41,200 --> 08:05:45,920
loops and change these values and this
10674
08:05:43,360 --> 08:05:48,477
may be in a lot of places in your code
10675
08:05:45,919 --> 08:05:51,039
so a good thing to do is to put the
10676
08:05:48,477 --> 08:05:53,040
value that controls how many times your
10677
08:05:51,040 --> 08:05:55,120
loop is going to run in a variable like
10678
08:05:53,040 --> 08:05:56,958
this we're going to store that value in
10679
08:05:56,957 --> 08:06:01,279
notice that it is of size t because it
10680
08:05:59,360 --> 08:06:03,360
is a representation of the size of
10681
08:06:01,279 --> 08:06:05,759
things something we don't really want to
10682
08:06:03,360 --> 08:06:09,279
be negative and we're going to use this
10683
08:06:05,759 --> 08:06:11,359
in our test part of our for loop here
10684
08:06:09,279 --> 08:06:14,079
instead of saying j less than 10 we're
10685
08:06:11,360 --> 08:06:16,797
going to say j less than count and if we
10686
08:06:14,080 --> 08:06:19,280
want to change this we have one point of
10687
08:06:16,797 --> 08:06:20,878
control to go and change this value here
10688
08:06:19,279 --> 08:06:23,199
and this is really good design you
10689
08:06:20,878 --> 08:06:25,760
should do this okay we have talked a lot
10690
08:06:23,200 --> 08:06:28,319
about loops it is time we headed over to
10691
08:06:25,759 --> 08:06:30,797
visual studio code and actually tried
10692
08:06:28,319 --> 08:06:33,279
these things out here we are in visual
10693
08:06:30,797 --> 08:06:35,360
studio code the current project is for
10694
08:06:33,279 --> 08:06:37,919
loop here we're going to grab the code
10695
08:06:37,919 --> 08:06:41,759
and we're going to put that in place
10696
08:06:41,759 --> 08:06:46,957
and we're going to open this in visual
10697
08:06:43,840 --> 08:06:48,957
studio code so let's do that pretty fast
10698
08:06:46,957 --> 08:06:51,439
for loop that's the current project we
10699
08:06:48,957 --> 08:06:52,717
selected and we opened this in visual
10700
08:06:52,718 --> 08:06:58,159
we're going to open up our main cpp file
10701
08:06:55,680 --> 08:07:00,000
which is going to show up here and we're
10702
08:06:58,159 --> 08:07:00,878
going to remove things we don't need
10703
08:07:00,878 --> 08:07:05,360
so let's remove that okay the first
10704
08:07:03,040 --> 08:07:06,718
thing i want you to do is the bad way to
10705
08:07:06,718 --> 08:07:12,477
again if we want to print i love c plus
10706
08:07:09,119 --> 08:07:14,319
plus 10 times we can do it like this and
10707
08:07:12,477 --> 08:07:16,558
if we run the program it's going to work
10708
08:07:14,319 --> 08:07:18,797
but this is really bad design because
10709
08:07:16,558 --> 08:07:20,798
you would have to copy and paste this
10710
08:07:18,797 --> 08:07:22,717
for example a thousand times or even a
10711
08:07:20,797 --> 08:07:24,957
hundred thousand of times and that's
10712
08:07:22,718 --> 08:07:26,398
really bad so if we bring up our
10713
08:07:26,398 --> 08:07:31,040
and build with gcc like we always do
10714
08:07:31,919 --> 08:07:36,877
the build is going to go through you see
10715
08:07:34,398 --> 08:07:38,478
it's successful we're going to clear and
10716
08:07:36,878 --> 08:07:40,958
we're going to run rooster and it's
10717
08:07:38,477 --> 08:07:43,119
going to say lfc plus plus 10 times if
10718
08:07:40,957 --> 08:07:45,119
you count this it's going to be 10 times
10719
08:07:43,119 --> 08:07:46,878
because that's what we're doing here but
10720
08:07:45,119 --> 08:07:49,039
this is really bad design you don't want
10721
08:07:46,878 --> 08:07:50,958
to do something like this so we're going
10722
08:07:50,957 --> 08:07:55,680
and do this better using a for loop
10723
08:07:53,599 --> 08:07:57,439
let's say that this is the bad way and
10724
08:07:55,680 --> 08:07:59,360
we're going to use for loop which is the
10725
08:07:57,439 --> 08:08:01,840
good way sorry so we're going to start
10726
08:07:59,360 --> 08:08:04,797
by declaring our iterator so we're going
10727
08:08:01,840 --> 08:08:06,797
to say for we're going to say size t
10728
08:08:04,797 --> 08:08:08,477
let's use unsigned end to show you that
10729
08:08:06,797 --> 08:08:10,557
you can use that and we're going to say
10730
08:08:08,477 --> 08:08:12,239
i and we're going to initialize this
10731
08:08:12,240 --> 08:08:18,000
and this is going to be the declaration
10732
08:08:14,797 --> 08:08:20,319
of our iterator this is the first part
10733
08:08:18,000 --> 08:08:22,718
we have in this parenthesis here we're
10734
08:08:20,319 --> 08:08:25,119
going to put in a semicolon and put in
10735
08:08:25,119 --> 08:08:29,279
loop to run ten times so it's going to
10736
08:08:27,360 --> 08:08:31,840
run from zero to nine we're going to
10737
08:08:31,840 --> 08:08:36,637
less than ten this is one way you can
10738
08:08:34,159 --> 08:08:38,159
understand this after we have our test
10739
08:08:38,159 --> 08:08:42,957
incrementation part which is going to
10740
08:08:40,398 --> 08:08:45,040
change the iterator to make the loop
10741
08:08:42,957 --> 08:08:48,000
move forward and we're going to do that
10742
08:08:45,040 --> 08:08:50,477
by incrementing our iterator after that
10743
08:08:48,000 --> 08:08:52,558
we're going to put a pair of curly
10744
08:08:50,477 --> 08:08:55,119
braces not angle brackets and we're
10745
08:08:52,558 --> 08:08:57,840
going to fall inside the body of the
10746
08:08:55,119 --> 08:09:00,637
loop this block here delimitated by the
10747
08:08:57,840 --> 08:09:02,797
curly braces is the body of the loop and
10748
08:09:00,637 --> 08:09:04,797
inside here we're going to put whatever
10749
08:09:02,797 --> 08:09:07,520
we want the loop to run so we can go
10750
08:09:04,797 --> 08:09:10,079
down here and say i love c plus plus 10
10751
08:09:07,520 --> 08:09:12,477
times let's say that but before we do
10752
08:09:10,080 --> 08:09:15,040
that let's say i so that we know the
10753
08:09:12,477 --> 08:09:17,119
current iteration where we are at
10754
08:09:15,040 --> 08:09:20,000
and we're going to put a column and say
10755
08:09:17,119 --> 08:09:23,200
i love c plus plus this is going to be
10756
08:09:20,000 --> 08:09:25,680
better to follow in the terminal i guess
10757
08:09:30,398 --> 08:09:36,000
and we need to put our stream output
10758
08:09:33,439 --> 08:09:38,797
operator here for this to make sense to
10759
08:09:36,000 --> 08:09:40,718
the compiler and this is our loop now if
10760
08:09:38,797 --> 08:09:42,477
we run it we're going to see exactly the
10761
08:09:40,718 --> 08:09:45,360
same thing like this but we're going to
10762
08:09:42,477 --> 08:09:47,599
have these iterators prepended to the
10763
08:09:45,360 --> 08:09:50,319
message so that it becomes easy to
10764
08:09:47,599 --> 08:09:53,759
follow this and again how this is going
10765
08:09:50,319 --> 08:09:56,718
to work we are going to run our code to
10766
08:09:53,759 --> 08:09:58,957
declare and initialize the iterator
10767
08:09:56,718 --> 08:10:01,760
after that we're going to do the test we
10768
08:09:58,957 --> 08:10:03,759
are going to start with i zero so zero
10769
08:10:01,759 --> 08:10:05,759
is less than ten this is going to
10770
08:10:03,759 --> 08:10:06,557
succeed we are going to fall in the body
10771
08:10:06,558 --> 08:10:11,600
and after that we're going to
10772
08:10:08,797 --> 08:10:13,520
print sddc out i love c plus plus and
10773
08:10:11,599 --> 08:10:15,119
this is going to be zero we're going to
10774
08:10:15,119 --> 08:10:20,319
and we're going to do the test again
10775
08:10:17,759 --> 08:10:21,919
we're going to have to do is one less
10776
08:10:20,319 --> 08:10:23,599
than 10 the test is going to be
10777
08:10:21,919 --> 08:10:26,159
successful so we're going to fall in
10778
08:10:23,599 --> 08:10:27,119
here and we're going to print a one
10779
08:10:27,119 --> 08:10:31,119
incrementation part again we're going to
10780
08:10:29,360 --> 08:10:32,797
run the test and we're going to keep
10781
08:10:31,119 --> 08:10:35,439
doing this until we hit a point for
10782
08:10:32,797 --> 08:10:36,319
example when we increment this to be a
10783
08:10:36,319 --> 08:10:39,919
and after that we're going to run the
10784
08:10:37,919 --> 08:10:42,557
test we're going to say is 9 less than
10785
08:10:39,919 --> 08:10:43,919
10 the test is going to be successful so
10786
08:10:42,558 --> 08:10:46,398
we're going to follow in here and we're
10787
08:10:46,398 --> 08:10:49,200
and after that we're going to increment
10788
08:10:48,240 --> 08:10:50,878
again we're going to run the
10789
08:10:49,200 --> 08:10:53,600
incrementation part and we're going to
10790
08:10:50,878 --> 08:10:56,958
make i 10 if we run the test we're going
10791
08:10:53,599 --> 08:10:58,877
to say is 10 less than 10 the test here
10792
08:10:56,957 --> 08:11:00,637
is going to fail we're going to stop
10793
08:10:58,878 --> 08:11:02,878
running the loop all together and we're
10794
08:11:00,637 --> 08:11:05,919
going to fall on the outside of the loop
10795
08:11:02,878 --> 08:11:08,159
and say loop done let's say that so that
10796
08:11:05,919 --> 08:11:10,637
we can see this on the terminal and this
10797
08:11:08,159 --> 08:11:13,759
is going to run and print i love c plus
10798
08:11:10,637 --> 08:11:16,079
plus 10 times and we expect i to go from
10799
08:11:16,080 --> 08:11:20,558
try to run this in your mind
10800
08:11:18,240 --> 08:11:22,718
take a piece of paper try to
10801
08:11:20,558 --> 08:11:24,240
print this as you fall into the body of
10802
08:11:22,718 --> 08:11:26,878
the loop you're going to see that's
10803
08:11:24,240 --> 08:11:28,878
exactly what is happening here so what
10804
08:11:26,878 --> 08:11:31,920
we're going to do we're going to boil
10805
08:11:28,878 --> 08:11:33,360
this again so we're going to run the
10806
08:11:35,040 --> 08:11:40,718
the world is good we're going to go down
10807
08:11:37,360 --> 08:11:42,159
and run this we're going to clear
10808
08:11:42,159 --> 08:11:45,759
and you're going to see that we have
10809
08:11:43,520 --> 08:11:48,637
zero i love c plus plus all the way to
10810
08:11:45,759 --> 08:11:51,039
nine i love c plus plus our loop is
10811
08:11:48,637 --> 08:11:53,200
working exactly the way we want okay so
10812
08:11:51,040 --> 08:11:55,520
this is the first step we are able to
10813
08:11:53,200 --> 08:11:57,840
run our code a lot of times without
10814
08:11:55,520 --> 08:12:00,398
really having to manually do things like
10815
08:11:57,840 --> 08:12:02,637
this and the benefit of this is that if
10816
08:12:00,398 --> 08:12:05,600
we want this to run for example 100
10817
08:12:02,637 --> 08:12:06,477
times all we have to do is change our
10818
08:12:08,398 --> 08:12:13,040
is equal to 100 and we're going to stop
10819
08:12:13,040 --> 08:12:17,040
less than 100 and if we run this we're
10820
08:12:17,040 --> 08:12:22,398
the message from 0 all the way to 99 and
10821
08:12:20,477 --> 08:12:25,279
this is pretty cool the torso is going
10822
08:12:22,398 --> 08:12:27,440
to be 100 times so let's weld again to
10823
08:12:27,439 --> 08:12:31,199
we're going to run this task to weld
10824
08:12:33,119 --> 08:12:39,439
run rooster prepare to be amazed run and
10825
08:12:37,119 --> 08:12:42,637
it's going to run all the way to 99 we
10826
08:12:39,439 --> 08:12:45,840
can change this to even 1 000 or even 10
10827
08:12:42,637 --> 08:12:48,797
000 why not we're going to weld again
10828
08:12:45,840 --> 08:12:50,477
and we're going to be successful
10829
08:12:50,477 --> 08:12:54,718
and run rooster and this is going to go
10830
08:12:52,878 --> 08:12:56,477
all the way to 10 000 times we're going
10831
08:12:54,718 --> 08:13:03,520
to wait for this to get there
10832
08:12:56,477 --> 08:13:05,200
now 3 000 4 000 5000 6000 7000 8000
10833
08:13:03,520 --> 08:13:07,600
ten thousand it's going to go all the
10834
08:13:05,200 --> 08:13:09,760
way to nine thousand nine hundred ninety
10835
08:13:07,599 --> 08:13:12,239
nine and it is going to stop and the
10836
08:13:15,520 --> 08:13:20,080
this storping number here okay now we
10837
08:13:18,240 --> 08:13:22,798
can see that our loop is really working
10838
08:13:20,080 --> 08:13:25,680
fine we don't have to do these hddc out
10839
08:13:22,797 --> 08:13:28,079
statements a crazy amount of times okay
10840
08:13:25,680 --> 08:13:31,599
and the benefit again is that
10841
08:13:28,080 --> 08:13:33,920
regardless of the number of times the
10842
08:13:31,599 --> 08:13:36,000
code here is going to run our loop is
10843
08:13:33,919 --> 08:13:38,637
going to stay relatively the same it's
10844
08:13:36,000 --> 08:13:40,957
just going to be one two three four
10845
08:13:38,637 --> 08:13:43,279
lines of code and this is really cool
10846
08:13:40,957 --> 08:13:45,840
okay so i think this now makes it very
10847
08:13:43,279 --> 08:13:47,680
clear how loops work so we're going to
10848
08:13:45,840 --> 08:13:49,119
comment this out and show you another
10849
08:13:47,680 --> 08:13:51,599
thing and we're going to show you that
10850
08:13:49,119 --> 08:13:54,477
you can use size t to actually
10851
08:13:51,599 --> 08:13:57,039
denote the type of your iterator
10852
08:13:54,477 --> 08:14:00,079
and it is easy to do that so we're going
10853
08:13:57,040 --> 08:14:02,718
to say use size t and for us to be able
10854
08:14:00,080 --> 08:14:05,200
to see all this here let's hit this file
10855
08:14:02,718 --> 08:14:06,637
icon here to close this pane and we're
10856
08:14:05,200 --> 08:14:09,520
going to have a better chance of seeing
10857
08:14:06,637 --> 08:14:11,039
our code here so what we want to do
10858
08:14:09,520 --> 08:14:12,957
we're going to declare a group we're
10859
08:14:11,040 --> 08:14:15,760
going to save for we're not going to say
10860
08:14:12,957 --> 08:14:18,159
our design and we're going to say size t
10861
08:14:15,759 --> 08:14:20,000
and this is going to be the type of our
10862
08:14:18,159 --> 08:14:22,398
iterator we're going to say i we're
10863
08:14:20,000 --> 08:14:24,398
going to initialize this with a zero
10864
08:14:22,398 --> 08:14:26,319
and we're going to put a semicolon like
10865
08:14:24,398 --> 08:14:29,440
we just did we're going to put in the
10866
08:14:26,319 --> 08:14:32,477
end test we're going to put in the test
10867
08:14:29,439 --> 08:14:34,079
so we're going to say i less than 10
10868
08:14:34,080 --> 08:14:39,600
and we are going to increment to put in
10869
08:14:36,797 --> 08:14:41,039
place our incrementation part we're
10870
08:14:39,599 --> 08:14:43,599
going to fall in the loop we're going to
10871
08:14:41,040 --> 08:14:45,840
say stdc out this is the code we want to
10872
08:14:43,599 --> 08:14:48,159
run so we're going to put in our
10873
08:14:45,840 --> 08:14:50,319
coverage value for the iterator and
10874
08:14:48,159 --> 08:14:52,558
we're going to say i love c plus plus
10875
08:14:50,319 --> 08:14:55,279
again and we're going to put in our new
10876
08:14:52,558 --> 08:14:57,280
line character and if we build and run
10877
08:14:55,279 --> 08:14:59,759
this it's going to work and run the same
10878
08:14:59,759 --> 08:15:03,359
so that we know when it's done and we're
10879
08:15:01,520 --> 08:15:05,600
going to weld and run we're going to
10880
08:15:07,759 --> 08:15:10,957
and what we're going to do we're going
10881
08:15:10,957 --> 08:15:18,079
and run rooster and this is going to say
10882
08:15:13,360 --> 08:15:20,080
i love c plus plus 10 times from 0 to 9.
10883
08:15:18,080 --> 08:15:23,120
again the message here is that you can
10884
08:15:20,080 --> 08:15:25,360
use size t to represent the type of your
10885
08:15:23,119 --> 08:15:27,599
iterators and this is the type that is
10886
08:15:25,360 --> 08:15:30,240
even used in the c plus plus standard
10887
08:15:27,599 --> 08:15:32,637
library so this is going to be something
10888
08:15:30,240 --> 08:15:35,360
people expect from your code if you are
10889
08:15:32,637 --> 08:15:37,360
representing sizes in code that should
10890
08:15:35,360 --> 08:15:40,000
be compliant with the c plus plus
10891
08:15:37,360 --> 08:15:42,797
standard library nothing stops you from
10892
08:15:40,000 --> 08:15:43,919
using unsigned it like we do here but
10893
08:15:42,797 --> 08:15:46,079
we're just going to follow the
10894
08:15:43,919 --> 08:15:48,477
convention from the c plus plus standard
10895
08:15:46,080 --> 08:15:51,040
library and use this type here to
10896
08:15:51,040 --> 08:15:55,600
and some of you might be wondering how
10897
08:15:53,200 --> 08:15:56,477
big is this thing we have the tools to
10898
08:15:56,477 --> 08:16:01,200
how big it is so let's do that pretty
10899
08:15:58,558 --> 08:16:03,920
fast so we're going to go down here
10900
08:16:01,200 --> 08:16:05,520
and say sddc out and we're going to say
10901
08:16:05,520 --> 08:16:10,159
size t and we can print this out and
10902
08:16:08,159 --> 08:16:11,759
let's say what we are doing here so that
10903
08:16:11,759 --> 08:16:17,039
use this code as the reference and if we
10904
08:16:14,477 --> 08:16:19,279
print this out we're going to see
10905
08:16:17,040 --> 08:16:21,680
the size of this thing on the system
10906
08:16:19,279 --> 08:16:23,360
where this code here is going to run
10907
08:16:26,477 --> 08:16:31,599
the bolt is going to be good we're going
10908
08:16:28,558 --> 08:16:33,280
to go here and clear and run rooster
10909
08:16:31,599 --> 08:16:35,119
you're going to see that it is eight
10910
08:16:33,279 --> 08:16:37,520
bytes on my system so you're going to
10911
08:16:35,119 --> 08:16:39,840
have quite a huge range of numbers you
10912
08:16:37,520 --> 08:16:41,760
can put in here because this is going to
10913
08:16:41,759 --> 08:16:46,159
okay if you try to put in a negative
10914
08:16:43,919 --> 08:16:48,397
number you're going to get an underflow
10915
08:16:46,159 --> 08:16:51,680
and we have learned about overflow and
10916
08:16:48,398 --> 08:16:53,760
underfloor in the previous chapter
10917
08:16:51,680 --> 08:16:56,477
okay so let's comment this out and keep
10918
08:16:53,759 --> 08:16:58,397
learning more things about for loops
10919
08:16:56,477 --> 08:17:01,200
okay the next thing i really want you to
10920
08:16:58,398 --> 08:17:03,520
focus on and learn is the scope of the
10921
08:17:01,200 --> 08:17:05,440
iterator and we're going to grab our
10922
08:17:07,599 --> 08:17:12,717
as a learning tool so we're going to go
10923
08:17:12,718 --> 08:17:17,680
and what we're going to have let's move
10924
08:17:15,200 --> 08:17:19,760
this a little bit to the right i think
10925
08:17:17,680 --> 08:17:22,080
we can do something like this i am going
10926
08:17:19,759 --> 08:17:24,477
to select the entire thing here and hit
10927
08:17:22,080 --> 08:17:26,558
tab and it is going to be aligned with
10928
08:17:26,558 --> 08:17:30,638
okay so we have our loop it is going to
10929
08:17:28,637 --> 08:17:32,797
run 10 times it's going to print i love
10930
08:17:34,957 --> 08:17:40,957
what is the scope of this i think here
10931
08:17:37,680 --> 08:17:43,439
and the fact is it is scoped inside this
10932
08:17:40,957 --> 08:17:46,159
loop here you might have guessed that if
10933
08:17:43,439 --> 08:17:47,680
you try to use it outside the loop
10934
08:17:46,159 --> 08:17:50,240
you're going to get a compiler arrow
10935
08:17:47,680 --> 08:17:53,040
because it is only usable inside the
10936
08:17:50,240 --> 08:17:55,840
body of the you can also use it inside
10937
08:17:53,040 --> 08:17:58,398
the control part of the loop here but
10938
08:17:55,840 --> 08:18:00,957
you can't use it outside the loop so if
10939
08:17:58,398 --> 08:18:02,638
you try to print i here for example
10940
08:18:00,957 --> 08:18:04,797
you're going to get a compiler error so
10941
08:18:02,637 --> 08:18:06,397
let's try and do that and show you how
10942
08:18:06,398 --> 08:18:12,958
so if we try to print i here let's say i
10943
08:18:10,398 --> 08:18:14,478
to make it clear what we want to print
10944
08:18:12,957 --> 08:18:17,439
if we try to do this we're going to get
10945
08:18:14,477 --> 08:18:20,558
a compiler error because i is not in
10946
08:18:17,439 --> 08:18:23,599
scope it is only in scope inside these
10947
08:18:20,558 --> 08:18:25,680
curly braces that show the body part of
10948
08:18:23,599 --> 08:18:27,199
our loop okay visual studio code is
10949
08:18:25,680 --> 08:18:29,840
showing the problem here it's saying
10950
08:18:27,200 --> 08:18:32,240
eyes undefined here so you shouldn't
10951
08:18:29,840 --> 08:18:34,080
really do this but if we move on and
10952
08:18:32,240 --> 08:18:36,159
ignore the message from visual studio
10953
08:18:36,159 --> 08:18:39,040
we're going to get a compiler error and
10954
08:18:39,040 --> 08:18:44,240
i don't know what you're doing here i
10955
08:18:41,360 --> 08:18:46,477
was not declared in this scope where you
10956
08:18:44,240 --> 08:18:48,240
are using it and i think it's even going
10957
08:18:46,477 --> 08:18:51,439
to give me a line a number it's going to
10958
08:18:48,240 --> 08:18:53,680
tell me 46 that's where you are doing
10959
08:18:51,439 --> 08:18:55,840
something wrong and if we go in our code
10960
08:18:53,680 --> 08:18:58,477
we're going to see that this is the line
10961
08:18:55,840 --> 08:19:00,637
where we are making the mistake so i is
10962
08:18:58,477 --> 08:19:04,718
not in scope here we're going to comment
10963
08:19:00,637 --> 08:19:06,637
this out and say compiler error i is not
10964
08:19:04,718 --> 08:19:08,718
in scope that's what you're going to get
10965
08:19:06,637 --> 08:19:11,439
if you try to do this and the main
10966
08:19:08,718 --> 08:19:14,317
message is that if you declare your loop
10967
08:19:11,439 --> 08:19:16,079
like this ah is only going to be scoped
10968
08:19:14,317 --> 08:19:18,398
in the body of the loop and that's the
10969
08:19:16,080 --> 08:19:20,638
only place where you can mention its
10970
08:19:18,398 --> 08:19:23,520
name and use it if we comment this out
10971
08:19:20,637 --> 08:19:25,200
and world again the compiler error is
10972
08:19:23,520 --> 08:19:27,439
going to go away you're going to see
10973
08:19:25,200 --> 08:19:30,317
that the world is good let's clear so
10974
08:19:30,317 --> 08:19:34,000
we're going to build again and show you
10975
08:19:31,759 --> 08:19:36,477
that the build is good and uh this is
10976
08:19:34,000 --> 08:19:39,200
really cool both finished successfully
10977
08:19:36,477 --> 08:19:42,159
okay this is one way we can set up our
10978
08:19:39,200 --> 08:19:45,600
loop but there is a way we can make our
10979
08:19:42,159 --> 08:19:46,878
iterator usable outside the body of the
10980
08:19:45,599 --> 08:19:49,279
loop and we're going to show you how you
10981
08:19:46,878 --> 08:19:51,520
can do that next so let's comment this
10982
08:19:51,520 --> 08:19:55,760
and we're going to grab the code because
10983
08:19:53,279 --> 08:19:58,717
we don't want to type all this again and
10984
08:19:55,759 --> 08:20:01,679
we're going to say iterator declared
10985
08:19:58,718 --> 08:20:04,080
outside the loop we're going to go down
10986
08:20:04,080 --> 08:20:10,718
and we're going to align this nicely
10987
08:20:07,279 --> 08:20:13,279
and we're going to take the iterator and
10988
08:20:10,718 --> 08:20:15,520
declare it on the outside of the loop so
10989
08:20:15,520 --> 08:20:19,439
and we're going to say i and initialize
10990
08:20:19,439 --> 08:20:25,520
and we're going to say this very clearly
10991
08:20:30,240 --> 08:20:34,159
and we're going to say in our
10992
08:20:34,159 --> 08:20:38,797
declaration part of the iterator we're
10993
08:20:36,718 --> 08:20:41,520
going to just say i and this is going to
10994
08:20:38,797 --> 08:20:43,599
work pretty fine if we build this you're
10995
08:20:41,520 --> 08:20:45,600
going to see that the world is good and
10996
08:20:43,599 --> 08:20:47,279
if we run this it's going to do the same
10997
08:20:45,599 --> 08:20:50,159
thing it's been doing it's going to
10998
08:20:47,279 --> 08:20:52,797
print i love c plus plus 10 times and if
10999
08:20:50,159 --> 08:20:55,040
you want i usable on the outside of the
11000
08:20:52,797 --> 08:20:57,919
loop now you can use it we can grab the
11001
08:20:57,919 --> 08:21:03,359
in the last run of our code and put that
11002
08:21:01,279 --> 08:21:05,039
out here and we're going to align this a
11003
08:21:05,040 --> 08:21:08,878
and if we compile this the book is going
11004
08:21:08,878 --> 08:21:13,920
and if we try to run rooster we're going
11005
08:21:11,200 --> 08:21:15,600
to see i love c plus 10 times we're
11006
08:21:13,919 --> 08:21:18,239
going to say loop done and we're going
11007
08:21:15,599 --> 08:21:20,397
to print the value of i and you see that
11008
08:21:18,240 --> 08:21:23,040
if we do things like this i is going to
11009
08:21:20,398 --> 08:21:23,920
be usable on the outside of the loop
11010
08:21:23,919 --> 08:21:28,397
and sometimes these may come in handy
11011
08:21:26,718 --> 08:21:30,718
depending on the logic of the
11012
08:21:28,398 --> 08:21:33,040
application that you are designing just
11013
08:21:30,718 --> 08:21:34,878
know that this is something you can do
11014
08:21:34,878 --> 08:21:41,840
okay you can go even crazier and leave
11015
08:21:38,317 --> 08:21:44,000
out this iterator declaration part in
11016
08:21:41,840 --> 08:21:45,680
your loop all together so you can remove
11017
08:21:44,000 --> 08:21:47,520
that and we're going to show you how you
11018
08:21:45,680 --> 08:21:49,520
can do that in a minute so let's comment
11019
08:21:47,520 --> 08:21:51,200
this out i don't want to remove code
11020
08:21:49,520 --> 08:21:53,119
because i want you to have this as a
11021
08:21:51,200 --> 08:21:56,080
reference if you need to look at this
11022
08:21:53,119 --> 08:21:59,039
later so we're going to say leave out
11023
08:21:56,080 --> 08:22:02,798
and what you can do is grab the code we
11024
08:21:59,040 --> 08:22:05,040
had before i'm going to grab it
11025
08:22:02,797 --> 08:22:06,797
and we're going to paste that in here
11026
08:22:05,040 --> 08:22:08,958
and what we're going to do is take out
11027
08:22:06,797 --> 08:22:12,397
this eye this can work and you may see
11028
08:22:08,957 --> 08:22:14,079
code like this out there in the wild so
11029
08:22:12,398 --> 08:22:17,040
we're going to run this task to build
11030
08:22:14,080 --> 08:22:19,440
with gcc the world is going to be good
11031
08:22:17,040 --> 08:22:21,040
and we're going to clear and run rooster
11032
08:22:19,439 --> 08:22:23,279
and it's going to do exactly the same
11033
08:22:21,040 --> 08:22:25,680
thing so this is one way you can set up
11034
08:22:23,279 --> 08:22:28,317
your loops okay the last thing we need
11035
08:22:28,317 --> 08:22:33,279
this test here is using a hard coded
11036
08:22:30,957 --> 08:22:35,359
value and if we needed to change this
11037
08:22:33,279 --> 08:22:38,000
loop to run for example for a thousand
11038
08:22:35,360 --> 08:22:40,317
times we would need to manually hunt for
11039
08:22:38,000 --> 08:22:43,040
this line of code change this and this
11040
08:22:40,317 --> 08:22:45,360
is really not good design so what is
11041
08:22:43,040 --> 08:22:48,317
recommended is to store this value in a
11042
08:22:45,360 --> 08:22:50,080
variable and test against that variable
11043
08:22:50,080 --> 08:22:54,000
let's comment this out and show you that
11044
08:22:55,680 --> 08:23:00,718
and go down and copy this entire thing
11045
08:22:58,957 --> 08:23:02,797
i don't think i want to do my loops like
11046
08:23:00,718 --> 08:23:06,080
this because this is really unintuitive
11047
08:23:02,797 --> 08:23:08,477
most times so i am going to declare my
11048
08:23:06,080 --> 08:23:10,878
iterator inside and i'm going to copy
11049
08:23:08,477 --> 08:23:12,317
the code that does that here we're going
11050
08:23:13,680 --> 08:23:18,637
don't hardcord values okay we're going
11051
08:23:18,637 --> 08:23:22,718
and we're going to go down and show you
11052
08:23:20,317 --> 08:23:25,439
a better way to do things and again
11053
08:23:22,718 --> 08:23:28,080
right now we are hard coding in this
11054
08:23:30,317 --> 08:23:34,477
and we can call this value count for
11055
08:23:32,558 --> 08:23:36,638
example and we can initialize it with
11056
08:23:34,477 --> 08:23:39,759
whatever we want in this case we want to
11057
08:23:36,637 --> 08:23:42,159
control our loop to run 10 times so
11058
08:23:39,759 --> 08:23:44,477
we're going to put in a 10 and instead
11059
08:23:42,159 --> 08:23:46,477
of hard coding and this 10 we're going
11060
08:23:47,439 --> 08:23:51,039
and if we build and run it the loop is
11061
08:23:49,279 --> 08:23:53,279
going to do exactly the same thing it's
11062
08:23:51,040 --> 08:23:54,159
going to print i love c plus plus 10
11063
08:23:58,398 --> 08:24:02,798
it's going to do the same thing but now
11064
08:24:00,558 --> 08:24:06,240
we have one point of control if we want
11065
08:24:02,797 --> 08:24:09,199
this to run for let's say 100 times we
11066
08:24:06,240 --> 08:24:11,280
can change the count value to 100 times
11067
08:24:09,200 --> 08:24:13,040
and if we both again that's how many
11068
08:24:11,279 --> 08:24:15,520
times the loop is going to run and this
11069
08:24:13,040 --> 08:24:16,558
is much cleaner so i do recommend you
11070
08:24:16,558 --> 08:24:20,080
the values you use in your loops in
11071
08:24:18,317 --> 08:24:22,797
variables like this and it's going to
11072
08:24:22,797 --> 08:24:27,680
so it's going to run 100 times and this
11073
08:24:27,680 --> 08:24:30,718
this is really all we set out to do in
11074
08:24:29,200 --> 08:24:31,840
this lecture i hope you found it
11075
08:24:31,840 --> 08:24:36,240
i am sorry that this lecture turned out
11076
08:24:34,398 --> 08:24:39,360
lengthy because we had a lot of things
11077
08:24:36,240 --> 08:24:41,600
to talk about but now i hope you really
11078
08:24:39,360 --> 08:24:44,080
know a lot of things about ways you can
11079
08:24:41,599 --> 08:24:46,477
use your for loops to make them do
11080
08:24:44,080 --> 08:24:48,318
things and again many loops that we're
11081
08:24:46,477 --> 08:24:50,397
going to use in our c plus plus code are
11082
08:24:48,317 --> 08:24:52,317
going to have five parts we're going to
11083
08:24:50,398 --> 08:24:55,200
have an iterator which is going to be a
11084
08:24:52,317 --> 08:24:57,119
variable we use to manipulate how a loop
11085
08:24:55,200 --> 08:24:59,040
moves forward and does things the
11086
08:24:57,119 --> 08:25:00,797
starting point is going to be where the
11087
08:24:59,040 --> 08:25:02,398
loop is going to start we're going to
11088
08:25:00,797 --> 08:25:04,397
have a test in place which is going to
11089
08:25:02,398 --> 08:25:06,718
control when the loop ends and we're
11090
08:25:04,398 --> 08:25:08,240
going to have the end point encoded in
11091
08:25:06,718 --> 08:25:10,159
that test we're going to have the
11092
08:25:08,240 --> 08:25:12,878
incrementation part of the loop which is
11093
08:25:10,159 --> 08:25:14,797
going to control how our loop moves
11094
08:25:12,878 --> 08:25:18,000
forward and we are going to set up a
11095
08:25:14,797 --> 08:25:20,957
pair of curly braces that are going to
11096
08:25:18,000 --> 08:25:22,957
contain the body of our loop in this
11097
08:25:20,957 --> 08:25:25,199
lecture we're going to learn about while
11098
08:25:22,957 --> 08:25:27,599
loops and this is another construct we
11099
08:25:25,200 --> 08:25:29,680
have in the c plus plus programming
11100
08:25:27,599 --> 08:25:32,557
language to allow us to do repetitive
11101
08:25:29,680 --> 08:25:35,520
tasks the syntax for a while loop looks
11102
08:25:32,558 --> 08:25:37,600
like this we have five parts in our loop
11103
08:25:35,520 --> 08:25:40,000
we have the iterator the starting point
11104
08:25:37,599 --> 08:25:41,840
the test the incrementation and the loop
11105
08:25:40,000 --> 08:25:45,279
body it's just going to be set up
11106
08:25:41,840 --> 08:25:47,759
differently for while loops the iterator
11107
08:25:45,279 --> 08:25:49,759
is declared on the outside and you see
11108
08:25:47,759 --> 08:25:52,239
here we have unsigned in i which is
11109
08:25:49,759 --> 08:25:54,317
exactly the same type of iterator we've
11110
08:25:52,240 --> 08:25:56,798
used in the last lecture but know that
11111
08:25:54,317 --> 08:25:59,439
you can also use size t here i am just
11112
08:25:56,797 --> 08:26:02,717
using unsigned and for this case after
11113
08:25:59,439 --> 08:26:04,957
you have your iterator declared you're
11114
08:26:02,718 --> 08:26:08,080
going to fall to this part here and say
11115
08:26:04,957 --> 08:26:10,877
while open a set of parentheses and
11116
08:26:08,080 --> 08:26:12,798
inside you're going to put in your test
11117
08:26:10,878 --> 08:26:15,200
after that you're going to open a pair
11118
08:26:12,797 --> 08:26:17,919
of curly braces and design them you're
11119
08:26:15,200 --> 08:26:19,360
going to put the body of your loop
11120
08:26:17,919 --> 08:26:22,477
and you're going to do whatever it is
11121
08:26:19,360 --> 08:26:24,398
you want to do in the loop in there and
11122
08:26:22,477 --> 08:26:26,718
after your code to do whatever it is you
11123
08:26:24,398 --> 08:26:29,760
want to do is executed you're going to
11124
08:26:26,718 --> 08:26:32,000
put in your incrementation part after
11125
08:26:29,759 --> 08:26:33,679
you code and that's what we have here
11126
08:26:32,000 --> 08:26:37,040
and this is the setup we're going to be
11127
08:26:33,680 --> 08:26:38,477
using for our while loops again
11128
08:26:38,477 --> 08:26:43,520
iterator declared on the outside and we
11129
08:26:41,200 --> 08:26:44,798
can initialize it with whatever it is we
11130
08:26:46,159 --> 08:26:50,159
then we're going to put in our test it's
11131
08:26:48,080 --> 08:26:52,318
going to be within this parenthesis and
11132
08:26:50,159 --> 08:26:54,797
after that we're going to set up a pair
11133
08:26:52,317 --> 08:26:56,558
of curly braces and inside them we're
11134
08:26:54,797 --> 08:26:58,477
going to put whatever code we want to
11135
08:26:56,558 --> 08:27:01,200
run in the loop and then we're going to
11136
08:26:58,477 --> 08:27:03,040
follow that with our incrementation part
11137
08:27:01,200 --> 08:27:05,119
and if we try to run this we're going to
11138
08:27:03,040 --> 08:27:07,440
run this line we're going to declare the
11139
08:27:05,119 --> 08:27:10,797
iterator i and it's going to start with
11140
08:27:07,439 --> 08:27:12,557
zero so the test is going to run and 0
11141
08:27:12,558 --> 08:27:16,000
and we're going to succeed and we're
11142
08:27:14,398 --> 08:27:18,478
going to run the body here we're going
11143
08:27:16,000 --> 08:27:20,080
to say i love c plus plus and after that
11144
08:27:18,477 --> 08:27:22,797
we're going to run the incrementation
11145
08:27:20,080 --> 08:27:25,520
part i is going to become one we're
11146
08:27:22,797 --> 08:27:27,199
going to run the test again so one is
11147
08:27:25,520 --> 08:27:29,520
less than 10 we're going to succeed
11148
08:27:27,200 --> 08:27:31,680
we're going to fall in print i love c
11149
08:27:29,520 --> 08:27:34,477
plus plus we're going to increment again
11150
08:27:31,680 --> 08:27:36,317
then we're going to have a 2 in i here
11151
08:27:34,477 --> 08:27:38,637
we're going to run the test again we're
11152
08:27:36,317 --> 08:27:40,159
going to say is 2 less than 10 that's
11153
08:27:38,637 --> 08:27:42,477
going to be true so we're going to be
11154
08:27:40,159 --> 08:27:44,079
successful we're going to fall in the
11155
08:27:42,477 --> 08:27:46,079
body of the loop we're going to
11156
08:27:44,080 --> 08:27:48,878
increment and get a three we're going to
11157
08:27:46,080 --> 08:27:50,478
test against our three value three is
11158
08:27:48,878 --> 08:27:53,200
less than ten we're going to succeed
11159
08:27:50,477 --> 08:27:55,119
we're going to print i love c plus plus
11160
08:27:53,200 --> 08:27:57,280
we're going to increment again we're
11161
08:27:55,119 --> 08:28:01,039
going to test again and we're going to
11162
08:27:57,279 --> 08:28:02,557
say is for less than count or 10 we're
11163
08:28:01,040 --> 08:28:04,798
going to be successful and we're going
11164
08:28:02,558 --> 08:28:07,360
to keep running until we increment and
11165
08:28:04,797 --> 08:28:09,520
get a 9. once we get a 9 we're going to
11166
08:28:07,360 --> 08:28:12,000
run the test again and we're going to
11167
08:28:09,520 --> 08:28:14,957
say is 9 less than 10 that's going to be
11168
08:28:12,000 --> 08:28:16,957
successful so we're going to fall inside
11169
08:28:14,957 --> 08:28:18,957
print i love c plus plus we're going to
11170
08:28:18,957 --> 08:28:23,919
and if we run the test again i'm going
11171
08:28:20,957 --> 08:28:26,477
to say is 10 less than 10 that's going
11172
08:28:23,919 --> 08:28:27,919
to fail and we are going to fall on the
11173
08:28:26,477 --> 08:28:30,317
outside of the loop and we're going to
11174
08:28:27,919 --> 08:28:32,717
run whatever code is on the outside here
11175
08:28:30,317 --> 08:28:34,718
this is really how a while loop works
11176
08:28:32,718 --> 08:28:36,878
and i hope you can see the similarities
11177
08:28:34,718 --> 08:28:38,878
between the for loop we have seen it is
11178
08:28:36,878 --> 08:28:41,200
really the same thing we just have
11179
08:28:38,878 --> 08:28:42,878
different syntaxes to do these things
11180
08:28:41,200 --> 08:28:44,240
okay if you look at these things we
11181
08:28:42,878 --> 08:28:46,317
already have the same pieces of
11182
08:28:44,240 --> 08:28:48,878
information it is just different
11183
08:28:46,317 --> 08:28:51,040
syntaxes that c plus plus provides to do
11184
08:28:48,878 --> 08:28:53,279
the same things and sometimes you're
11185
08:28:51,040 --> 08:28:54,878
going to find it convenient to use while
11186
08:28:53,279 --> 08:28:57,439
loops and sometimes you're going to find
11187
08:28:54,878 --> 08:28:59,040
it convenient to use for loops and
11188
08:28:57,439 --> 08:29:01,520
you're going to have to decide what
11189
08:28:59,040 --> 08:29:03,600
works better for whatever it is you are
11190
08:29:01,520 --> 08:29:05,840
working on for now we're going to head
11191
08:29:03,599 --> 08:29:08,317
over to visual studio code and try this
11192
08:29:05,840 --> 08:29:10,957
out okay here we are in visual studio
11193
08:29:08,317 --> 08:29:13,520
code the current project is while loop
11194
08:29:10,957 --> 08:29:15,279
we're going to grab our template files
11195
08:29:13,520 --> 08:29:16,797
and we're going to go in our project and
11196
08:29:16,797 --> 08:29:21,680
and we're going to open this in visual
11197
08:29:18,718 --> 08:29:24,080
studio code so let's do that
11198
08:29:21,680 --> 08:29:26,000
we're going to open the folder
11199
08:29:24,080 --> 08:29:28,638
and we're going to work on while loop
11200
08:29:26,000 --> 08:29:30,637
here we are going to open our main cpp
11201
08:29:28,637 --> 08:29:33,200
file pretty quick and we're going to get
11202
08:29:30,637 --> 08:29:35,520
rid of this and what we're going to do
11203
08:29:33,200 --> 08:29:36,878
is remove what we don't need and again
11204
08:29:35,520 --> 08:29:38,477
we're going to show you the bad way to
11205
08:29:36,878 --> 08:29:40,477
do things you don't really want to do
11206
08:29:38,477 --> 08:29:42,317
this manually we want to print i love c
11207
08:29:43,119 --> 08:29:47,119
we're going to build let's bring up a
11208
08:29:47,119 --> 08:29:52,557
use this when we run thanks and we are
11209
08:29:49,919 --> 08:29:55,039
going to world with gcc let's do that
11210
08:29:52,558 --> 08:29:57,680
pretty quick the world is good
11211
08:29:55,040 --> 08:29:59,520
so we can clear and run rooster and
11212
08:29:57,680 --> 08:30:02,477
we're going to have i love c plus
11213
08:29:59,520 --> 08:30:05,840
printed out 10 times so what we can do
11214
08:30:02,477 --> 08:30:08,079
is comment this out and use a while loop
11215
08:30:05,840 --> 08:30:11,040
like we want to do in this lecture here
11216
08:30:08,080 --> 08:30:13,520
and as we have seen with the slides
11217
08:30:11,040 --> 08:30:15,520
the first thing we need to do is declare
11218
08:30:13,520 --> 08:30:17,279
our iterator on the outside so we're
11219
08:30:15,520 --> 08:30:19,279
going to say size ti we're going to
11220
08:30:19,279 --> 08:30:24,239
and that's going to be our iterator
11221
08:30:21,360 --> 08:30:26,558
declaration and we're going to say while
11222
08:30:24,240 --> 08:30:28,798
i is less than the value where we want
11223
08:30:26,558 --> 08:30:30,718
to stop and again we don't want to hard
11224
08:30:28,797 --> 08:30:32,397
code these values and so what we're
11225
08:30:32,398 --> 08:30:38,080
const size t and we're going to call
11226
08:30:35,200 --> 08:30:40,159
this count and make it uppercase this is
11227
08:30:38,080 --> 08:30:42,160
a convention we use to declare constants
11228
08:30:40,159 --> 08:30:43,840
in c plus plus but you don't have to
11229
08:30:42,159 --> 08:30:45,840
make them uppercase it is just a
11230
08:30:43,840 --> 08:30:48,477
convention that is going to make your
11231
08:30:45,840 --> 08:30:50,000
code easier to read for other people so
11232
08:30:50,000 --> 08:30:54,477
put a 10 in here because we want our
11233
08:30:56,797 --> 08:31:02,000
is less than count and we're going to
11234
08:30:58,797 --> 08:31:03,919
set up a pair of curly braces and they
11235
08:31:03,919 --> 08:31:09,199
the start and the end of the body of a
11236
08:31:07,200 --> 08:31:11,440
loop here and inside we're going to put
11237
08:31:09,200 --> 08:31:14,637
in whatever code we want the loop to run
11238
08:31:11,439 --> 08:31:17,919
multiple times and the code is now very
11239
08:31:14,637 --> 08:31:19,680
familiar we're going to say sddc out
11240
08:31:19,680 --> 08:31:25,920
current iteration and we're going to say
11241
08:31:22,159 --> 08:31:28,000
i love c plus plus sdd endl for our new
11242
08:31:25,919 --> 08:31:30,557
line character and after that we will
11243
08:31:28,000 --> 08:31:32,718
need to put in our own incrementation
11244
08:31:30,558 --> 08:31:34,798
part if you forget that you're going to
11245
08:31:32,718 --> 08:31:37,119
get something really bad happen we're
11246
08:31:34,797 --> 08:31:40,239
really going to look at that later in
11247
08:31:37,119 --> 08:31:42,718
the chapter but for now remember to put
11248
08:31:40,240 --> 08:31:45,440
the incrementation part and we're going
11249
08:31:42,718 --> 08:31:47,440
to say plus plus i this is really easy
11250
08:31:45,439 --> 08:31:49,199
and we're going to say that this is the
11251
08:31:49,200 --> 08:31:54,159
and this is going to do what we want but
11252
08:31:51,439 --> 08:31:56,317
let's go down here and say that loop is
11253
08:31:54,159 --> 08:31:59,759
done when it is done so we're going to
11254
08:31:59,759 --> 08:32:05,199
and we're going to say stdendya
11255
08:32:03,439 --> 08:32:07,439
and before we run this we're going to go
11256
08:32:05,200 --> 08:32:10,558
through it and see how it is going to
11257
08:32:07,439 --> 08:32:12,877
work so let's click on this file icon
11258
08:32:10,558 --> 08:32:15,280
here to close this pane so that we have
11259
08:32:12,878 --> 08:32:17,760
some breathing room i am going to open a
11260
08:32:15,279 --> 08:32:20,397
notepad file we're going to use to see
11261
08:32:20,398 --> 08:32:25,120
when this loop runs we're going to
11262
08:32:22,317 --> 08:32:27,200
initialize the iterator here what we're
11263
08:32:25,119 --> 08:32:29,840
going to do is put in a 0 and we are
11264
08:32:27,200 --> 08:32:31,840
going to run the test to see if 0 is
11265
08:32:29,840 --> 08:32:34,240
less than 10 and the test is going to be
11266
08:32:31,840 --> 08:32:35,920
successful so we are going to fall in
11267
08:32:35,919 --> 08:32:41,199
0 i love c plus plus so let's say that
11268
08:32:38,558 --> 08:32:42,798
here to make this super clear inside the
11269
08:32:41,200 --> 08:32:45,200
loop we're going to print this message
11270
08:32:42,797 --> 08:32:47,039
zero i love c plus plus and after we
11271
08:32:45,200 --> 08:32:49,840
execute this line we're going to
11272
08:32:47,040 --> 08:32:51,680
increment i is going to become one we're
11273
08:32:49,840 --> 08:32:54,080
going to go up again and run the test
11274
08:32:54,080 --> 08:32:59,520
less than count or is 1 less than 10.
11275
08:32:57,520 --> 08:33:01,360
the test is going to be successful we're
11276
08:32:59,520 --> 08:33:03,920
going to run inside the loop and we're
11277
08:33:01,360 --> 08:33:05,200
going to print 1 i love c plus plus
11278
08:33:03,919 --> 08:33:07,119
that's what we're going to do here so
11279
08:33:07,119 --> 08:33:11,200
and after we do that we're going to run
11280
08:33:08,718 --> 08:33:13,600
our incrementation part again
11281
08:33:11,200 --> 08:33:15,680
i is going to become two we are going to
11282
08:33:13,599 --> 08:33:17,919
run the test we're going to say is 2
11283
08:33:15,680 --> 08:33:19,599
less than 10 that's going to be true of
11284
08:33:17,919 --> 08:33:22,717
course and we're going to fall in the
11285
08:33:19,599 --> 08:33:23,919
body again and say two i love c plus
11286
08:33:25,840 --> 08:33:28,878
we're going to increment and we're going
11287
08:33:27,279 --> 08:33:30,397
to get a three we're going to run the
11288
08:33:28,878 --> 08:33:32,558
test again the test is going to be
11289
08:33:30,398 --> 08:33:35,200
successful because three is less than
11290
08:33:32,558 --> 08:33:38,000
ten we are going to fall in here and say
11291
08:33:35,200 --> 08:33:40,240
three i love c plus plus okay so we can
11292
08:33:40,240 --> 08:33:44,718
and we are going to increment to get a
11293
08:33:42,080 --> 08:33:47,120
four and the test is going to say is
11294
08:33:44,718 --> 08:33:48,637
four less than ten that's going to be
11295
08:33:47,119 --> 08:33:50,477
true so we're going to succeed and
11296
08:33:48,637 --> 08:33:53,759
following the body again and we're going
11297
08:33:50,477 --> 08:33:55,279
to say 4 i love z plus blocks
11298
08:33:53,759 --> 08:33:56,637
we're going to keep doing this and we're
11299
08:33:55,279 --> 08:33:59,119
going to increment again we're going to
11300
08:33:56,637 --> 08:34:01,200
get a 5. the test is going to run again
11301
08:33:59,119 --> 08:34:03,279
we're going to say is 5 less than 10
11302
08:34:01,200 --> 08:34:05,600
that's going to be true of course and
11303
08:34:03,279 --> 08:34:08,397
we're going to run the code to print
11304
08:34:08,398 --> 08:34:11,760
we're going to increment again to get a
11305
08:34:11,759 --> 08:34:16,000
we're going to run the test we're going
11306
08:34:13,520 --> 08:34:18,159
to say is 6 less than 10 that's going to
11307
08:34:16,000 --> 08:34:21,279
be true of course again and we're going
11308
08:34:18,159 --> 08:34:23,119
to print sets i love c plus plus and
11309
08:34:21,279 --> 08:34:25,759
we're going to increment to get a 7
11310
08:34:23,119 --> 08:34:28,797
we're going to run the test our iterator
11311
08:34:25,759 --> 08:34:30,877
we're going to say is 7 less than count
11312
08:34:28,797 --> 08:34:33,599
that's going to be true we're going to
11313
08:34:30,878 --> 08:34:35,680
print the message again and say seven i
11314
08:34:33,599 --> 08:34:37,680
love c plus plus and we're going to
11315
08:34:35,680 --> 08:34:39,360
increment again to get an eight we're
11316
08:34:37,680 --> 08:34:40,317
going to say is eight less than and
11317
08:34:40,317 --> 08:34:44,718
that's going to be true we're going to
11318
08:34:41,840 --> 08:34:47,200
fall in the body and say eight i love c
11319
08:34:44,718 --> 08:34:48,798
plus plus we're going to increment to
11320
08:34:48,797 --> 08:34:54,000
we're going to run the test against our
11321
08:34:50,718 --> 08:34:55,680
nine of course nine is less than ten so
11322
08:34:54,000 --> 08:34:58,878
that's going to be true we're going to
11323
08:34:55,680 --> 08:35:00,398
fall inside and we're going to say nine
11324
08:35:00,398 --> 08:35:04,240
and after that we're going to increment
11325
08:35:02,080 --> 08:35:06,160
again and we're going to get a 10.
11326
08:35:04,240 --> 08:35:09,360
now if we run the test we're going to
11327
08:35:06,159 --> 08:35:12,000
say is 10 less than 10 and that's going
11328
08:35:09,360 --> 08:35:15,360
to be false because 10 is not less than
11329
08:35:12,000 --> 08:35:17,279
10 and if the test here fails we're not
11330
08:35:15,360 --> 08:35:20,080
going to fall in the body of the loop
11331
08:35:17,279 --> 08:35:22,239
control is going to fall at the end of
11332
08:35:20,080 --> 08:35:24,160
the loop body and we're going to print
11333
08:35:22,240 --> 08:35:26,840
loop done that's what we're going to say
11334
08:35:26,840 --> 08:35:33,439
done and our loop will have run 10 times
11335
08:35:31,360 --> 08:35:35,200
by the time we print this loop down
11336
08:35:33,439 --> 08:35:37,439
message here if you count here you see
11337
08:35:35,200 --> 08:35:39,520
that the loop is going to run 10 times
11338
08:35:37,439 --> 08:35:41,680
and it is going to say i love c plus
11339
08:35:39,520 --> 08:35:43,840
plus 10 times which is really what we
11340
08:35:41,680 --> 08:35:46,000
want okay i really had to show you this
11341
08:35:43,840 --> 08:35:48,477
manually so that you can really see what
11342
08:35:46,000 --> 08:35:50,878
is happening but now we can weld and run
11343
08:35:48,477 --> 08:35:53,200
this and let the computer do the heavy
11344
08:35:50,878 --> 08:35:54,637
duty of running this and showing us all
11345
08:35:54,637 --> 08:35:57,840
so the build is going to be successful
11346
08:35:57,840 --> 08:36:01,520
we're going to run rooster and it's
11347
08:35:59,680 --> 08:36:05,680
going to exactly show the same thing we
11348
08:36:01,520 --> 08:36:08,159
just came up in our trusty notepad file
11349
08:36:05,680 --> 08:36:10,240
here you see it is the same thing but
11350
08:36:08,159 --> 08:36:12,878
the beauty is that we don't have to do
11351
08:36:10,240 --> 08:36:15,280
all these crazy computations again what
11352
08:36:12,878 --> 08:36:17,840
we can do is we can even change the
11353
08:36:15,279 --> 08:36:19,439
count to 100 so it is going to run for
11354
08:36:22,957 --> 08:36:28,717
clear and run rooster and is going to do
11355
08:36:25,840 --> 08:36:30,159
that 100 times and that's pretty fast
11356
08:36:30,159 --> 08:36:35,279
this is really all we had to share with
11357
08:36:32,637 --> 08:36:37,840
you in this lecture the main thing is to
11358
08:36:35,279 --> 08:36:40,159
learn about the syntax of a while loop
11359
08:36:37,840 --> 08:36:42,957
and again notice that we have these five
11360
08:36:40,159 --> 08:36:44,637
parts that make up our loop we have an
11361
08:36:42,957 --> 08:36:46,877
iterator we have the starting point we
11362
08:36:44,637 --> 08:36:49,520
have a test we have the incrementation
11363
08:36:46,878 --> 08:36:52,000
part and we have the loop body it is
11364
08:36:49,520 --> 08:36:54,637
just set up differently with a while
11365
08:36:52,000 --> 08:36:56,558
loop like we can see here in this
11366
08:36:54,637 --> 08:36:58,797
lecture we're going to learn about do
11367
08:36:56,558 --> 08:37:01,120
while loops and this is yet another
11368
08:36:58,797 --> 08:37:03,039
construct we have in c plus plus to do
11369
08:37:03,040 --> 08:37:08,558
let's look at the syntax here we have
11370
08:37:05,520 --> 08:37:10,637
our declaration of the iterator on the
11371
08:37:08,558 --> 08:37:13,440
outside and after that you're going to
11372
08:37:10,637 --> 08:37:15,759
say do you're going to put a pair of
11373
08:37:13,439 --> 08:37:18,397
curly braces like this you're going to
11374
08:37:15,759 --> 08:37:20,397
put whatever code it is you want to run
11375
08:37:18,398 --> 08:37:22,958
inside the loop and then you're going to
11376
08:37:20,398 --> 08:37:25,840
do your incrementation and after the
11377
08:37:22,957 --> 08:37:27,439
closing curly brace you're going to say
11378
08:37:25,840 --> 08:37:29,599
while and you're going to put in your
11379
08:37:27,439 --> 08:37:32,317
text this is really the structure again
11380
08:37:29,599 --> 08:37:33,599
notice that we have those five parts and
11381
08:37:33,599 --> 08:37:38,317
declaration of our iterator and we're
11382
08:37:36,240 --> 08:37:40,558
going to initialize this in place for
11383
08:37:38,317 --> 08:37:42,239
example if we want to do that
11384
08:37:42,240 --> 08:37:46,558
fall in the body of the loop
11385
08:37:44,718 --> 08:37:48,798
and after that we're going to do the
11386
08:37:46,558 --> 08:37:50,958
incrementation after we run the code it
11387
08:37:48,797 --> 08:37:53,439
is we want to run in the body of the
11388
08:37:50,957 --> 08:37:56,797
loop and then we're going to do the test
11389
08:37:53,439 --> 08:38:00,477
later and the special thing about a do
11390
08:37:56,797 --> 08:38:03,520
while loop is that it is going to run
11391
08:38:00,477 --> 08:38:05,200
first and then you do the test last
11392
08:38:03,520 --> 08:38:07,760
this is really something you need to be
11393
08:38:05,200 --> 08:38:09,680
careful about make sure that when it
11394
08:38:07,759 --> 08:38:12,159
runs it is doing whatever it is you want
11395
08:38:09,680 --> 08:38:15,200
to do because the test is going to run
11396
08:38:12,159 --> 08:38:17,119
after your code has actually run and you
11397
08:38:15,200 --> 08:38:19,680
can tweak this to do whatever it is we
11398
08:38:17,119 --> 08:38:21,840
want it to do as we are going to see
11399
08:38:19,680 --> 08:38:24,000
when we hit visual studio code in a
11400
08:38:21,840 --> 08:38:26,797
minute okay again one thing you need to
11401
08:38:24,000 --> 08:38:28,797
keep in mind is that the do while loop
11402
08:38:28,797 --> 08:38:34,239
of the loop and then do the check or the
11403
08:38:31,599 --> 08:38:36,557
test and that may come in handy in some
11404
08:38:34,240 --> 08:38:38,718
of the applications you'll be doing
11405
08:38:36,558 --> 08:38:40,798
within your career as a c plus plus
11406
08:38:38,718 --> 08:38:42,477
developer okay this is really the syntax
11407
08:38:40,797 --> 08:38:44,878
we're going to be using we're going to
11408
08:38:42,477 --> 08:38:48,317
head over to visual studio code and play
11409
08:38:44,878 --> 08:38:50,317
with us okay here we are in our working
11410
08:38:48,317 --> 08:38:52,079
folder the current project is going to
11411
08:38:52,080 --> 08:38:57,360
we're going to grab the template files
11412
08:38:54,718 --> 08:39:00,000
pretty fast and we are going to put them
11413
08:38:57,360 --> 08:39:02,159
in our current project let's open this
11414
08:39:02,159 --> 08:39:07,279
and we are going to open this in visual
11415
08:39:04,637 --> 08:39:09,520
studio code do while loop is our project
11416
08:39:07,279 --> 08:39:12,477
we're going to open this and the main
11417
08:39:09,520 --> 08:39:14,797
cpp is opened up so let's remove
11418
08:39:12,477 --> 08:39:16,957
whatever it is we don't need and we are
11419
08:39:14,797 --> 08:39:19,599
going to show you the bad way to do
11420
08:39:16,957 --> 08:39:22,000
things the bad way to do things is
11421
08:39:19,599 --> 08:39:24,079
typing your code to do things manually
11422
08:39:22,000 --> 08:39:26,317
if you wanted them to be done multiple
11423
08:39:24,080 --> 08:39:28,240
times and this is something bad if we
11424
08:39:26,317 --> 08:39:30,878
bought this and run we're going to go
11425
08:39:30,878 --> 08:39:34,000
that's g brush we're going to run
11426
08:39:34,000 --> 08:39:37,759
and we're going to get i love c plus
11427
08:39:35,840 --> 08:39:40,240
plus 10 times and you don't want to do
11428
08:39:37,759 --> 08:39:42,079
something like this what we want in this
11429
08:39:42,080 --> 08:39:46,958
do while loops to solve this problem
11430
08:39:45,119 --> 08:39:49,039
we're going to comment this out because
11431
08:39:49,040 --> 08:39:53,840
and we're going to go down and set up
11432
08:39:51,200 --> 08:39:56,080
our do while loop the first thing we
11433
08:39:53,840 --> 08:39:57,920
need to do is to set up the count
11434
08:39:56,080 --> 08:39:59,600
because we want to store this in some
11435
08:39:57,919 --> 08:40:00,477
variables so we're going to say const
11436
08:40:01,840 --> 08:40:05,279
and we're going to put in our value
11437
08:40:05,279 --> 08:40:11,360
not 190 we're going to say 10 times
11438
08:40:08,957 --> 08:40:14,557
and we're going to set up our iterator
11439
08:40:14,558 --> 08:40:18,958
and we're going to say i and initialize
11440
08:40:16,558 --> 08:40:20,638
this with our starting point we're going
11441
08:40:20,637 --> 08:40:27,360
and what we're going to do is say do
11442
08:40:24,080 --> 08:40:30,318
and put a pair of curly braces
11443
08:40:27,360 --> 08:40:31,840
and inside this pair of curly braces
11444
08:40:30,317 --> 08:40:33,119
we're going to put whatever it is we
11445
08:40:33,119 --> 08:40:37,360
multiple times so we want to print i
11446
08:40:35,599 --> 08:40:38,957
love c plus plus so that's what we're
11447
08:40:38,957 --> 08:40:43,199
put in the current iteration
11448
08:40:41,439 --> 08:40:46,159
and we're going to put a column and say
11449
08:40:46,159 --> 08:40:51,200
and then we're going to jump to the new
11450
08:40:51,200 --> 08:40:55,520
and after that we don't want to forget
11451
08:40:53,599 --> 08:40:57,680
our incrementation part so we're going
11452
08:40:59,680 --> 08:41:04,718
the part that moves our iterator to the
11453
08:41:02,637 --> 08:41:07,039
next step this is going to be the
11454
08:41:04,718 --> 08:41:08,398
incrementation and this is going to be
11455
08:41:11,040 --> 08:41:16,159
and after the closing brace we need to
11456
08:41:16,159 --> 08:41:19,919
so we're going to say while and we're
11457
08:41:18,398 --> 08:41:22,718
going to put in our test here and we
11458
08:41:19,919 --> 08:41:24,957
want to keep doing this as long as i is
11459
08:41:24,957 --> 08:41:28,717
and we're going to put in our closing
11460
08:41:28,718 --> 08:41:34,317
now this code is going to run 10 times
11461
08:41:31,919 --> 08:41:36,317
but let's go through how it's going to
11462
08:41:34,317 --> 08:41:37,520
run so that you can really see
11463
08:41:37,520 --> 08:41:42,439
that is happening here okay so when this
11464
08:41:40,240 --> 08:41:44,958
code here is run we're going to hit the
11465
08:41:42,439 --> 08:41:48,159
initialization line here we're going to
11466
08:41:44,957 --> 08:41:50,557
declare i and we're going to put in a 0.
11467
08:41:48,159 --> 08:41:52,878
we're going to say do and inside we're
11468
08:41:50,558 --> 08:41:55,520
going to print whatever we have in i and
11469
08:41:52,878 --> 08:41:58,558
say i love c plus plus so we're going to
11470
08:41:55,520 --> 08:42:02,398
say 0 because i is 0 at this point and
11471
08:41:58,558 --> 08:42:04,477
we're going to say i love c plus plus
11472
08:42:02,398 --> 08:42:07,680
and after that we're going to increment
11473
08:42:07,680 --> 08:42:10,477
and we are going to do the test at this
11474
08:42:10,477 --> 08:42:14,797
we're going to say is one less than ten
11475
08:42:12,878 --> 08:42:17,600
that's going to be successful so we're
11476
08:42:17,599 --> 08:42:22,397
and we're going to say 1 i love c plus
11477
08:42:20,317 --> 08:42:24,398
let's copy this and print this again so
11478
08:42:22,398 --> 08:42:26,159
that we don't have to type this all the
11479
08:42:26,159 --> 08:42:31,119
i love c plus and after that we're going
11480
08:42:28,637 --> 08:42:33,439
to run the incrementation part again so
11481
08:42:31,119 --> 08:42:36,397
we're going to get a 2 inside i we're
11482
08:42:33,439 --> 08:42:38,159
going to test and say is 2 less than 10
11483
08:42:36,398 --> 08:42:41,280
that's going to be true so we're going
11484
08:42:38,159 --> 08:42:43,439
to run the body again and print 2 i love
11485
08:42:43,439 --> 08:42:46,957
and we're going to increment to get a
11486
08:42:46,957 --> 08:42:51,199
we're going to run the test against our
11487
08:42:49,119 --> 08:42:52,797
three is three less than ten that's
11488
08:42:51,200 --> 08:42:55,520
going to be true so we're going to fall
11489
08:42:52,797 --> 08:42:58,000
in the body again and print three
11490
08:42:55,520 --> 08:42:59,680
i love c plus plus let's do that we're
11491
08:42:58,000 --> 08:43:02,240
going to do the incrementation we're
11492
08:42:59,680 --> 08:43:04,398
going to get a 4 inside this i variable
11493
08:43:02,240 --> 08:43:06,478
here we're going to run the test we're
11494
08:43:04,398 --> 08:43:08,398
going to say is 4 less than 10 that's
11495
08:43:06,477 --> 08:43:11,520
going to be true of course we're going
11496
08:43:08,398 --> 08:43:13,120
to say four i love c plus plus when we
11497
08:43:13,119 --> 08:43:17,200
we're going to do the implementation and
11498
08:43:14,718 --> 08:43:19,119
get a five we're going to do the test
11499
08:43:17,200 --> 08:43:21,280
it's five less than ten that's going to
11500
08:43:19,119 --> 08:43:24,159
be true so we're going to fall in the
11501
08:43:21,279 --> 08:43:25,919
body again and say five i love c plus
11502
08:43:27,279 --> 08:43:31,919
we're going to increment again
11503
08:43:30,000 --> 08:43:34,878
we're going to get a six the test is
11504
08:43:31,919 --> 08:43:36,797
going to run and we're going to say is
11505
08:43:36,797 --> 08:43:42,159
that's going to be true again then the
11506
08:43:38,878 --> 08:43:44,477
body is going to execute and say
11507
08:43:42,159 --> 08:43:47,119
6 i love c plus plus we're going to do
11508
08:43:44,477 --> 08:43:49,360
the incrementation and get a 7. we're
11509
08:43:47,119 --> 08:43:51,520
going to run the test against our 7 so
11510
08:43:49,360 --> 08:43:53,040
we're going to say is 7 less than 10
11511
08:43:53,040 --> 08:43:58,398
we are going to fall in the body again
11512
08:43:55,360 --> 08:44:00,477
and say 7 i love c plus plus
11513
08:43:58,398 --> 08:44:03,120
we are going to do the incrementation we
11514
08:44:00,477 --> 08:44:06,000
are going to get 8 we're going to say is
11515
08:44:03,119 --> 08:44:08,000
8 less than 10 that's going to be true
11516
08:44:06,000 --> 08:44:10,878
we are going to fall in the body again
11517
08:44:08,000 --> 08:44:12,398
and say 8 i love c plus plus we're going
11518
08:44:10,878 --> 08:44:14,878
to do the incrementation we're going to
11519
08:44:12,398 --> 08:44:16,958
get a 9 and we're going to run the test
11520
08:44:14,878 --> 08:44:18,477
we're going to say is 9 less than 10
11521
08:44:16,957 --> 08:44:21,759
that's going to be true so we're going
11522
08:44:18,477 --> 08:44:23,360
to go inside and say 9 i love c plus
11523
08:44:23,360 --> 08:44:27,680
and we're going to do the incrementation
11524
08:44:25,040 --> 08:44:30,958
again now we're going to get a 10 and
11525
08:44:27,680 --> 08:44:31,760
the test is going to say is 10 less than
11526
08:44:31,759 --> 08:44:35,519
and that's going to be false now the
11527
08:44:35,520 --> 08:44:40,878
and we're going to fall after the while
11528
08:44:38,398 --> 08:44:44,159
loop here so if we had a statement here
11529
08:44:40,878 --> 08:44:46,477
that said stdc out loop done we would
11530
08:44:44,159 --> 08:44:48,797
print that we would go down here and say
11531
08:44:48,797 --> 08:44:52,397
and this is what we're going to get if
11532
08:44:50,398 --> 08:44:54,240
we run this program and again i
11533
08:44:52,398 --> 08:44:56,798
encourage you to try this out in your
11534
08:44:54,240 --> 08:44:59,200
mind print this in some file you have on
11535
08:44:56,797 --> 08:45:01,680
your computer or you can even use a
11536
08:44:59,200 --> 08:45:04,000
regular piece of paper but make sure you
11537
08:45:01,680 --> 08:45:06,477
understand the flow we go through to get
11538
08:45:04,000 --> 08:45:08,718
this code to run multiple times okay now
11539
08:45:06,477 --> 08:45:10,477
that we have done this we can work this
11540
08:45:10,477 --> 08:45:14,957
do the heavy work for us and run this
11541
08:45:12,797 --> 08:45:16,957
fence multiple times the world is going
11542
08:45:14,957 --> 08:45:18,797
to be good so what we're going to do
11543
08:45:18,797 --> 08:45:23,360
and run rooster and it's going to say
11544
08:45:21,040 --> 08:45:25,760
exactly what we expect i'll have c plus
11545
08:45:23,360 --> 08:45:28,080
10 times and then it's going to say
11546
08:45:25,759 --> 08:45:29,039
loop done okay one thing i want you to
11547
08:45:29,040 --> 08:45:35,920
is that the do while loop runs before it
11548
08:45:32,957 --> 08:45:38,397
does the test and this may cause crazy
11549
08:45:35,919 --> 08:45:40,079
things happening in your program if
11550
08:45:40,080 --> 08:45:44,958
let's say that you wanted this program
11551
08:45:42,477 --> 08:45:47,200
not to run and initialize this thing
11552
08:45:44,957 --> 08:45:49,759
with a zero for the count so it's going
11553
08:45:47,200 --> 08:45:51,840
to run zero times but that's not going
11554
08:45:49,759 --> 08:45:53,359
to do what you expect with the do while
11555
08:45:53,360 --> 08:45:59,200
it runs things before it does the test
11556
08:45:57,279 --> 08:46:01,439
so if you run this program it's not
11557
08:45:59,200 --> 08:46:03,760
going to just say loop done it's going
11558
08:46:01,439 --> 08:46:06,079
to say i love c plus plus and have zero
11559
08:46:03,759 --> 08:46:07,599
value in here and it's going to say loop
11560
08:46:07,599 --> 08:46:12,557
that's not going to be probably what you
11561
08:46:10,000 --> 08:46:15,279
intended by putting a zero in here you
11562
08:46:12,558 --> 08:46:17,840
put a zero in here if you want this code
11563
08:46:15,279 --> 08:46:20,317
to run zero times or the code in the
11564
08:46:17,840 --> 08:46:22,878
body not to run that's another way to
11565
08:46:20,317 --> 08:46:25,119
say that but in this case a do while
11566
08:46:22,878 --> 08:46:28,878
loop is not going to do what you expect
11567
08:46:25,119 --> 08:46:29,840
because it runs before it does the test
11568
08:46:29,840 --> 08:46:35,520
let's build this and show you this
11569
08:46:33,360 --> 08:46:38,240
so we're going to go through the world
11570
08:46:40,797 --> 08:46:44,717
and run rooster you're going to see that
11571
08:46:42,558 --> 08:46:47,920
it's saying zero i love c plus plus loop
11572
08:46:44,718 --> 08:46:51,040
done it is running even if we set our
11573
08:46:47,919 --> 08:46:53,519
count to zero here so be sure the do
11574
08:46:51,040 --> 08:46:55,360
while loop is doing what you want but if
11575
08:46:55,360 --> 08:47:00,240
you're going to have no problems and if
11576
08:46:57,840 --> 08:47:01,360
you want the rope to actually not do
11577
08:47:01,360 --> 08:47:06,797
when you have zero counting here you can
11578
08:47:03,840 --> 08:47:08,398
use the while loop or the full look like
11579
08:47:08,398 --> 08:47:11,600
i would like to welcome you in this new
11580
08:47:11,599 --> 08:47:17,519
where we're going to be learning about
11581
08:47:13,680 --> 08:47:19,840
arrays and arrays are a way to
11582
08:47:17,520 --> 08:47:22,317
set up collections in our c plus plus
11583
08:47:19,840 --> 08:47:24,317
program so far we have been working with
11584
08:47:22,317 --> 08:47:26,878
single variables for example you have a
11585
08:47:24,317 --> 08:47:30,477
bunch of integer variables you can even
11586
08:47:26,878 --> 08:47:32,080
have 10 or 20 variables of integer type
11587
08:47:30,477 --> 08:47:34,239
and that's going to be fine but
11588
08:47:32,080 --> 08:47:37,680
sometimes you don't want to manage all
11589
08:47:34,240 --> 08:47:40,718
these variables it is really desirable
11590
08:47:37,680 --> 08:47:43,520
to group all these variables into one
11591
08:47:40,718 --> 08:47:45,920
single unity and manage them as one
11592
08:47:43,520 --> 08:47:48,477
single entity and we can do something
11593
08:47:45,919 --> 08:47:50,957
like this group them together and give
11594
08:47:48,477 --> 08:47:52,797
them a name so that we can refer to them
11595
08:47:52,797 --> 08:47:59,680
under this name here and c plus plus has
11596
08:47:55,840 --> 08:48:02,558
the array construct to help us do this
11597
08:47:59,680 --> 08:48:04,159
okay so again if you look in memory how
11598
08:48:02,558 --> 08:48:06,317
things are laid out you're going to have
11599
08:48:04,159 --> 08:48:09,840
a bunch of zeros and ones for example
11600
08:48:06,317 --> 08:48:12,398
here each red defend is a net it is four
11601
08:48:09,840 --> 08:48:15,119
bytes in size and it can be used to
11602
08:48:12,398 --> 08:48:17,280
represent a net so if we have a bunch of
11603
08:48:15,119 --> 08:48:19,680
events like this we might want to group
11604
08:48:17,279 --> 08:48:22,477
them together and give them a name and
11605
08:48:19,680 --> 08:48:24,159
manipulate them under this name this is
11606
08:48:22,477 --> 08:48:27,200
another way to look at what we just
11607
08:48:24,159 --> 08:48:29,520
talked about here and again arrays are a
11608
08:48:27,200 --> 08:48:31,920
way to do these kinds of things in c
11609
08:48:29,520 --> 08:48:34,398
plus plus and we're going to be learning
11610
08:48:31,919 --> 08:48:36,477
all about it in this chapter we are
11611
08:48:34,398 --> 08:48:38,240
going to stop here in this lecture and
11612
08:48:36,477 --> 08:48:40,878
we are going to start and look at how
11613
08:48:38,240 --> 08:48:42,318
you can declare and initialize an array
11614
08:48:44,240 --> 08:48:48,718
and meet me there in this lecture we're
11615
08:48:46,317 --> 08:48:52,159
going to see how we can declare and use
11616
08:48:48,718 --> 08:48:55,119
arrays in our c plus plus program and
11617
08:48:52,159 --> 08:48:57,680
again arrays are a facility we have in
11618
08:48:55,119 --> 08:49:00,557
the c plus plus programming language to
11619
08:48:57,680 --> 08:49:03,840
group many variables together and
11620
08:49:00,558 --> 08:49:06,317
manipulate them as a single unit for
11621
08:49:03,840 --> 08:49:08,637
example here we have a bunch of integers
11622
08:49:06,317 --> 08:49:11,119
in memory each of these red things is
11623
08:49:08,637 --> 08:49:13,360
going to be four bytes in size so we can
11624
08:49:11,119 --> 08:49:16,000
think of it as an integer and we can
11625
08:49:13,360 --> 08:49:18,398
group them together and give them an a
11626
08:49:16,000 --> 08:49:21,439
we call them scores here and they are
11627
08:49:18,398 --> 08:49:24,000
going to be living under that scores
11628
08:49:24,000 --> 08:49:29,439
refer to each of these things z plus
11629
08:49:26,558 --> 08:49:32,558
plus provides an indexing system so we
11630
08:49:29,439 --> 08:49:36,317
cannot use angle brackets like this and
11631
08:49:32,558 --> 08:49:39,040
refer to the first of these integers as
11632
08:49:36,317 --> 08:49:42,317
zero so we can go from zero all the way
11633
08:49:39,040 --> 08:49:44,558
to nine here but your array can even be
11634
08:49:42,317 --> 08:49:46,477
bigger than this many times bigger than
11635
08:49:44,558 --> 08:49:48,317
this and we're going to see examples of
11636
08:49:46,477 --> 08:49:51,040
how we can do that but this is an
11637
08:49:48,317 --> 08:49:54,637
example of how you can take many
11638
08:49:51,040 --> 08:49:56,718
variables group them under one entity
11639
08:49:54,637 --> 08:49:59,119
give them a name and be able to
11640
08:49:56,718 --> 08:50:01,760
reference each of these events that are
11641
08:49:59,119 --> 08:50:04,317
under that entity and now that the idea
11642
08:50:01,759 --> 08:50:06,717
is pretty clear let's see how we can do
11643
08:50:04,317 --> 08:50:09,200
this in c plus plus the way to do that
11644
08:50:06,718 --> 08:50:11,600
is to say and you have to specify the
11645
08:50:09,200 --> 08:50:13,520
type of your collection you have to
11646
08:50:11,599 --> 08:50:16,000
specify the name after that and then
11647
08:50:13,520 --> 08:50:18,240
you're going to put a pair of angle
11648
08:50:16,000 --> 08:50:21,119
brackets like this and inside those
11649
08:50:18,240 --> 08:50:23,520
angle brackets you can specify the size
11650
08:50:21,119 --> 08:50:26,718
you want that collection to have or that
11651
08:50:23,520 --> 08:50:29,119
array to have and after this statement
11652
08:50:26,718 --> 08:50:30,558
is run we are basically going to have
11653
08:50:29,119 --> 08:50:32,557
something like this in memory we're
11654
08:50:30,558 --> 08:50:35,280
going to have 10 integers so if you
11655
08:50:32,558 --> 08:50:37,360
count here 0 all the way through 9
11656
08:50:35,279 --> 08:50:39,840
that's 10 integers they're going to be
11657
08:50:37,360 --> 08:50:41,760
grouped together under one logic entity
11658
08:50:39,840 --> 08:50:44,637
that logic entity is going to be called
11659
08:50:41,759 --> 08:50:47,439
scores and we can go through that name
11660
08:50:44,637 --> 08:50:50,159
to manipulate all these things that are
11661
08:50:47,439 --> 08:50:52,397
in this entity okay after your array is
11662
08:50:50,159 --> 08:50:54,637
declared and you have space for it in
11663
08:50:52,398 --> 08:50:57,120
memory basically something like this we
11664
08:50:54,637 --> 08:50:59,119
need a way to read data from at and
11665
08:50:57,119 --> 08:51:01,360
we're going to see how we can do that
11666
08:50:59,119 --> 08:51:03,360
and it is what we have here for example
11667
08:51:01,360 --> 08:51:05,600
if we want to print the first of these
11668
08:51:03,360 --> 08:51:08,080
elements we're going to say scores
11669
08:51:05,599 --> 08:51:11,279
angle brackets and specify the index of
11670
08:51:08,080 --> 08:51:13,840
the first element in that array or that
11671
08:51:11,279 --> 08:51:16,159
collection of integers that is called
11672
08:51:13,840 --> 08:51:19,439
scores okay one thing you should really
11673
08:51:16,159 --> 08:51:21,840
keep in mind is that arrays are indexed
11674
08:51:19,439 --> 08:51:23,919
from zero they don't start from one so
11675
08:51:21,840 --> 08:51:26,080
the first element is going to live at
11676
08:51:23,919 --> 08:51:28,637
index zero it's not going to live at
11677
08:51:26,080 --> 08:51:30,958
index one so here scores zero is going
11678
08:51:28,637 --> 08:51:32,878
to print the first element and scores
11679
08:51:30,957 --> 08:51:35,119
nine is going to print the last element
11680
08:51:32,878 --> 08:51:38,000
which happens to be the last in our
11681
08:51:35,119 --> 08:51:40,797
collection here of integers okay once
11682
08:51:38,000 --> 08:51:42,957
our array is declared it's not going to
11683
08:51:40,797 --> 08:51:45,439
have data in it there is going to be
11684
08:51:42,957 --> 08:51:48,159
data in but it's not going to be data
11685
08:51:45,439 --> 08:51:51,119
that we put in so we can think of this
11686
08:51:48,159 --> 08:51:53,599
data basically as garbage another thing
11687
08:51:51,119 --> 08:51:54,477
i wanted to bring to your attention is
11688
08:51:54,477 --> 08:52:00,558
your array has clear boundaries when we
11689
08:51:58,398 --> 08:52:04,558
declare an array like this notice that
11690
08:52:00,558 --> 08:52:06,638
we specify 10 as the size of our array
11691
08:52:04,558 --> 08:52:08,798
it's only going to have 10 elements
11692
08:52:06,637 --> 08:52:11,520
inside and you can see that we have from
11693
08:52:08,797 --> 08:52:13,759
index 0 all the way to 9 and inside we
11694
08:52:11,520 --> 08:52:15,920
have garbage data but we're going to fix
11695
08:52:13,759 --> 08:52:18,317
that in a minute what i want you to see
11696
08:52:15,919 --> 08:52:20,957
here is that you can to try and read
11697
08:52:18,317 --> 08:52:23,279
outside the bounds of your array
11698
08:52:20,957 --> 08:52:25,359
c plus plus is funny in that it allows
11699
08:52:23,279 --> 08:52:27,279
you to do that but if you do that you're
11700
08:52:25,360 --> 08:52:29,760
going to get weird problems for example
11701
08:52:27,279 --> 08:52:31,680
your program would crash or do something
11702
08:52:29,759 --> 08:52:35,199
really bad so you shouldn't really do
11703
08:52:31,680 --> 08:52:37,760
this be aware of the boundaries of your
11704
08:52:35,200 --> 08:52:40,080
array if you try to read the data from
11705
08:52:37,759 --> 08:52:42,797
the outside of your balance you may read
11706
08:52:40,080 --> 08:52:44,718
garbage data you may even cause failure
11707
08:52:42,797 --> 08:52:46,957
of the operating system because you
11708
08:52:44,718 --> 08:52:49,200
don't really know whose memory you're
11709
08:52:46,957 --> 08:52:51,840
reading it's not going to be memory that
11710
08:52:49,200 --> 08:52:53,360
is allocated to your program so array
11711
08:52:51,840 --> 08:52:56,159
boundaries are something you need to
11712
08:52:53,360 --> 08:52:58,637
keep in mind when working with arrays
11713
08:52:56,159 --> 08:53:00,957
okay we just saw that we could read data
11714
08:52:58,637 --> 08:53:03,919
from the array using this angle bracket
11715
08:53:00,957 --> 08:53:05,359
syntax we can even do that through the
11716
08:53:05,360 --> 08:53:09,200
read all the elements in the array and
11717
08:53:07,200 --> 08:53:11,040
this is how we could do that and you can
11718
08:53:09,200 --> 08:53:12,398
see that the loops we learned about in
11719
08:53:12,398 --> 08:53:16,878
are starting to come in handy okay we
11720
08:53:14,317 --> 08:53:17,919
have seen how we can read data from the
11721
08:53:17,919 --> 08:53:22,557
but what if we want to put something
11722
08:53:20,159 --> 08:53:25,840
back in what if we want to write our own
11723
08:53:22,558 --> 08:53:28,000
data in an array well the syntax is
11724
08:53:25,840 --> 08:53:30,558
pretty much what you would expect we
11725
08:53:28,000 --> 08:53:33,680
also use this angle bracket syntax but
11726
08:53:30,558 --> 08:53:35,680
we're going to assign data to that
11727
08:53:33,680 --> 08:53:38,558
element in the array for example if we
11728
08:53:35,680 --> 08:53:41,279
wanted to assign data to the first
11729
08:53:38,558 --> 08:53:42,317
element in our array we're going to say
11730
08:53:42,317 --> 08:53:47,360
angle brackets 0 and we're going to
11731
08:53:44,398 --> 08:53:51,520
assign a 20 in it and we can assign a 21
11732
08:53:47,360 --> 08:53:54,797
into the element at index 1 and the 22
11733
08:53:51,520 --> 08:53:56,240
in the element at index 2 and if we do
11734
08:53:54,797 --> 08:53:59,039
that we're going to have something like
11735
08:53:56,240 --> 08:54:02,159
this in our array so index 0 we have a
11736
08:53:59,040 --> 08:54:05,520
20 index 1 we have a 21 index 2 we have
11737
08:54:02,159 --> 08:54:08,000
a 22 and the rest is still garbage
11738
08:54:05,520 --> 08:54:10,317
because we didn't put in our data we can
11739
08:54:08,000 --> 08:54:13,439
also write data in a loop for example
11740
08:54:10,317 --> 08:54:15,520
here we have our array declared
11741
08:54:13,439 --> 08:54:18,397
and we're going to loop around putting
11742
08:54:15,520 --> 08:54:20,477
data at different indexes notice that
11743
08:54:18,398 --> 08:54:23,280
the index is going to be the current
11744
08:54:20,477 --> 08:54:25,680
iteration we are at so this is a common
11745
08:54:23,279 --> 08:54:27,840
way to do things in c plus plus and you
11746
08:54:25,680 --> 08:54:30,398
need to be familiar with this and after
11747
08:54:27,840 --> 08:54:32,797
we put in the data we can read that back
11748
08:54:30,398 --> 08:54:34,718
and make sure that it is the actual data
11749
08:54:32,797 --> 08:54:36,239
that we put in and we're going to have a
11750
08:54:34,718 --> 08:54:38,637
chance to play with this in visual
11751
08:54:36,240 --> 08:54:40,798
studio code in a minute so don't worry
11752
08:54:38,637 --> 08:54:43,279
if some of these things don't make sense
11753
08:54:40,797 --> 08:54:45,680
yet but again the main thing here is
11754
08:54:43,279 --> 08:54:49,039
this angle bracket syntax we can use
11755
08:54:45,680 --> 08:54:51,599
that to either write data in the element
11756
08:54:49,040 --> 08:54:53,280
of the array or read data from the
11757
08:54:51,599 --> 08:54:56,557
element of the array and this is the
11758
08:54:53,279 --> 08:54:59,840
syntax here scores angle brackets i okay
11759
08:54:56,558 --> 08:55:01,920
so far our array has been declared and
11760
08:54:59,840 --> 08:55:04,398
we didn't really put in data and there
11761
08:55:01,919 --> 08:55:07,519
was junk data inside but there's a way
11762
08:55:04,398 --> 08:55:10,240
you can declare an array and put data in
11763
08:55:07,520 --> 08:55:12,159
in one single statement and this is how
11764
08:55:10,240 --> 08:55:14,240
you would do it here we have another
11765
08:55:12,159 --> 08:55:15,439
array it's going to be grouping double
11766
08:55:15,439 --> 08:55:19,840
we call the array salaries and we
11767
08:55:17,439 --> 08:55:23,279
specify that it's going to be
11768
08:55:19,840 --> 08:55:27,360
of size five and we can put these
11769
08:55:23,279 --> 08:55:29,520
elements in a comma separated list using
11770
08:55:27,360 --> 08:55:31,440
braced initialization like this and it
11771
08:55:29,520 --> 08:55:32,957
is going to work if we try to print it
11772
08:55:31,439 --> 08:55:35,119
out we're going to see these elements
11773
08:55:32,957 --> 08:55:36,797
here and you see that we can read this
11774
08:55:35,119 --> 08:55:40,239
using the same syntax we've learned
11775
08:55:36,797 --> 08:55:42,317
about salaries we say the array name we
11776
08:55:40,240 --> 08:55:44,878
do angle brackets and inside we put the
11777
08:55:42,317 --> 08:55:47,680
index of the element we are reading from
11778
08:55:44,878 --> 08:55:49,840
and this index is coming from our loop
11779
08:55:47,680 --> 08:55:51,840
here and it is going to work you're
11780
08:55:49,840 --> 08:55:54,080
going to get this element printed out
11781
08:55:51,840 --> 08:55:55,599
this is pretty cool when initializing
11782
08:55:55,599 --> 08:56:00,079
you can leave out elements for example
11783
08:55:57,360 --> 08:56:03,040
here we have a neat array it is called
11784
08:56:00,080 --> 08:56:05,440
families it's going to be of size 5 but
11785
08:56:03,040 --> 08:56:08,080
we are just putting in three elements
11786
08:56:05,439 --> 08:56:10,557
the rest are going to be initialized to
11787
08:56:08,080 --> 08:56:12,398
zero when we do things like this and
11788
08:56:10,558 --> 08:56:14,477
this is something you need to be aware
11789
08:56:12,398 --> 08:56:16,080
of and we are going to try this out in
11790
08:56:14,477 --> 08:56:18,239
visual studio code and you're going to
11791
08:56:16,080 --> 08:56:21,280
see that this is actually true it is
11792
08:56:18,240 --> 08:56:23,360
possible to also omit the size when you
11793
08:56:21,279 --> 08:56:25,599
are declaring your array and the
11794
08:56:23,360 --> 08:56:28,000
compiler is going to deduce the size
11795
08:56:25,599 --> 08:56:30,637
from the elements that you initialize
11796
08:56:28,000 --> 08:56:33,360
your array with for example here we have
11797
08:56:30,637 --> 08:56:35,919
in one two three four five six elements
11798
08:56:33,360 --> 08:56:38,000
this array is going to have a size of
11799
08:56:35,919 --> 08:56:40,079
six and if we print elements we're going
11800
08:56:38,000 --> 08:56:43,520
to get those printed out notice here
11801
08:56:40,080 --> 08:56:44,958
that we are using a ranged base for loop
11802
08:56:44,957 --> 08:56:49,279
hopefully you can see that it is easier
11803
08:56:46,797 --> 08:56:51,439
to read data from a collection like this
11804
08:56:49,279 --> 08:56:53,840
using a ranged base for loop because we
11805
08:56:51,439 --> 08:56:55,919
don't have to set up an iterator
11806
08:56:53,840 --> 08:56:58,000
initialize it to do the test do the
11807
08:56:55,919 --> 08:57:01,279
incrementation we can just read the
11808
08:56:58,000 --> 08:57:03,360
value and use it and be on our merry way
11809
08:57:01,279 --> 08:57:06,317
this is pretty cool it is possible to
11810
08:57:03,360 --> 08:57:08,080
also declare your array constant and
11811
08:57:06,317 --> 08:57:10,477
when you do that you won't be able to
11812
08:57:08,080 --> 08:57:12,478
modify elements of that array
11813
08:57:10,477 --> 08:57:14,878
that's what it means if you make it
11814
08:57:12,477 --> 08:57:17,279
constant you basically want it to stay
11815
08:57:14,878 --> 08:57:19,760
constant and you don't want to allow
11816
08:57:17,279 --> 08:57:21,439
modifications of your array and we're
11817
08:57:19,759 --> 08:57:23,759
going to see this in a minute when we
11818
08:57:21,439 --> 08:57:25,279
get in visual studio code the last thing
11819
08:57:23,759 --> 08:57:27,759
i want you to see is that you can
11820
08:57:25,279 --> 08:57:30,397
actually do operations on the data that
11821
08:57:27,759 --> 08:57:32,239
you have stored in an array for example
11822
08:57:30,398 --> 08:57:34,798
here we can sum the elements up and
11823
08:57:32,240 --> 08:57:36,798
store the result back in our variable
11824
08:57:34,797 --> 08:57:39,919
sum and this is something you would do
11825
08:57:36,797 --> 08:57:42,317
and it might come in handy in many times
11826
08:57:39,919 --> 08:57:44,397
okay one thing i want you to see before
11827
08:57:42,317 --> 08:57:47,599
we head over to visual studio code and
11828
08:57:44,398 --> 08:57:49,920
play with us is that arrays store
11829
08:57:49,919 --> 08:57:56,159
repeat after me arrays store elements of
11830
08:57:53,599 --> 08:57:58,477
the same type you can't try and store
11831
08:57:56,159 --> 08:58:00,079
variables of different types in an array
11832
08:57:58,477 --> 08:58:02,878
i don't even know how you would actually
11833
08:58:00,080 --> 08:58:04,318
declare that and if you try and store a
11834
08:58:04,317 --> 08:58:08,878
than the type that was declared for the
11835
08:58:06,797 --> 08:58:10,317
array you're going to get a compiler
11836
08:58:08,878 --> 08:58:13,680
error so this is something you should
11837
08:58:10,317 --> 08:58:15,439
keep in mind but it makes sense because
11838
08:58:13,680 --> 08:58:18,957
when you declare an array you're going
11839
08:58:15,439 --> 08:58:20,477
to be given a bunch of bytes in memory
11840
08:58:18,957 --> 08:58:23,840
and those bytes are going to be
11841
08:58:20,477 --> 08:58:26,159
collections of data that is of the same
11842
08:58:23,840 --> 08:58:28,637
type for example here we have a bunch of
11843
08:58:26,159 --> 08:58:31,360
integers again each of these red events
11844
08:58:28,637 --> 08:58:34,239
is an integer and if you try to put in
11845
08:58:31,360 --> 08:58:36,558
something that is smaller or bigger than
11846
08:58:34,240 --> 08:58:38,958
an edge then the compiler is going to be
11847
08:58:36,558 --> 08:58:42,240
confused that as to how to read these
11848
08:58:38,957 --> 08:58:44,797
text so for arrays to work the types
11849
08:58:42,240 --> 08:58:47,600
that you store in the array have to be
11850
08:58:44,797 --> 08:58:49,360
the same and they need to be consistent
11851
08:58:47,599 --> 08:58:51,599
this is something you should know and if
11852
08:58:49,360 --> 08:58:53,440
you try to break this rule you're going
11853
08:58:53,439 --> 08:58:57,840
now that you know about arrays we're
11854
08:58:55,599 --> 08:58:59,680
going to head over to visual studio code
11855
08:58:57,840 --> 08:59:02,718
and play with them a little bit okay
11856
08:58:59,680 --> 08:59:04,957
here we are in our working folder the
11857
08:59:02,718 --> 08:59:07,840
current chapter is raised the current
11858
08:59:04,957 --> 08:59:10,797
project is declaring and using arrays
11859
08:59:07,840 --> 08:59:12,957
we're going to grab our template code
11860
08:59:10,797 --> 08:59:14,477
and we're going to copy and move the
11861
08:59:14,477 --> 08:59:18,317
and we're going to open this thing up in
11862
08:59:16,558 --> 08:59:20,958
visual studio code pretty quick we're
11863
08:59:18,317 --> 08:59:23,520
going to open up the main cpp file and
11864
08:59:23,520 --> 08:59:28,398
and we're going to see how we can
11865
08:59:28,398 --> 08:59:33,520
okay the way you do that you say the
11866
08:59:30,477 --> 08:59:36,159
name of the arrays and you put these
11867
08:59:33,520 --> 08:59:38,637
angle brackets and specify the size of
11868
08:59:36,159 --> 08:59:40,240
your array if you want you can put a
11869
08:59:38,637 --> 08:59:42,000
space in here it's really not going to
11870
08:59:40,240 --> 08:59:44,878
make a difference and you're going to
11871
08:59:42,000 --> 08:59:47,599
put a semicolon at the end the moment
11872
08:59:44,878 --> 08:59:50,398
this line executes we're going to have
11873
08:59:47,599 --> 08:59:52,797
the space for 10 integers allocated to
11874
08:59:50,398 --> 08:59:54,638
us in memory and that space is going to
11875
08:59:52,797 --> 08:59:57,039
be called scores and we're going to be
11876
08:59:54,637 --> 08:59:59,840
able to read data from it or even write
11877
08:59:57,040 --> 09:00:01,920
data back into it for now let's see how
11878
08:59:59,840 --> 09:00:03,920
we can read the data and it is really
11879
09:00:01,919 --> 09:00:05,919
simple we're going to use this angle
11880
09:00:03,919 --> 09:00:08,317
bracket syntax that we just saw in the
11881
09:00:05,919 --> 09:00:10,079
slides so if we want to read the first
11882
09:00:10,080 --> 09:00:14,878
sddc out we want to print it out and
11883
09:00:14,878 --> 09:00:19,040
specify the index we want to read from
11884
09:00:19,040 --> 09:00:24,240
and we're going to say std endl to move
11885
09:00:22,080 --> 09:00:25,680
to the next line if you have this typed
11886
09:00:24,240 --> 09:00:27,920
out you're going to see that this is
11887
09:00:25,680 --> 09:00:31,119
going to work and it is going to print
11888
09:00:27,919 --> 09:00:33,679
whatever is stored in the first element
11889
09:00:31,119 --> 09:00:36,878
in this array here and again i want you
11890
09:00:33,680 --> 09:00:38,718
to keep in mind the memory structure of
11891
09:00:36,878 --> 09:00:40,718
your data when you are working with
11892
09:00:38,718 --> 09:00:44,558
arrays so what we're going to print
11893
09:00:40,718 --> 09:00:47,119
right now is whatever junk data is in
11894
09:00:44,558 --> 09:00:48,558
this first element here okay in here
11895
09:00:47,119 --> 09:00:50,797
we're going to say that we haven't
11896
09:00:50,797 --> 09:00:55,520
and let's bring up a terminal
11897
09:00:53,520 --> 09:00:58,159
so that we can play with us and we're
11898
09:00:55,520 --> 09:00:59,520
going to build this with gcc as we
11899
09:00:59,520 --> 09:01:03,680
the build is going to be good
11900
09:01:03,680 --> 09:01:08,718
and run rooster you see that this is the
11901
09:01:06,477 --> 09:01:09,599
junk value we have in here we don't have
11902
09:01:09,599 --> 09:01:15,039
useful data in here it's just junk data
11903
09:01:12,637 --> 09:01:17,599
because we didn't initialize this array
11904
09:01:15,040 --> 09:01:19,520
we can also read the element at location
11905
09:01:17,599 --> 09:01:22,317
two and see what we have in there when
11906
09:01:19,520 --> 09:01:23,840
you run the program i'm not even sure if
11907
09:01:22,317 --> 09:01:26,239
it is guaranteed that you're going to
11908
09:01:23,840 --> 09:01:28,558
get the same data if you run the program
11909
09:01:26,240 --> 09:01:31,360
multiple times but we don't really care
11910
09:01:28,558 --> 09:01:33,360
we know that it is junk data so we can't
11911
09:01:33,360 --> 09:01:38,317
what we're going to do is run this
11912
09:01:35,520 --> 09:01:39,840
and see the value for the element at
11913
09:01:42,957 --> 09:01:46,717
the world is going to be good we're
11914
09:01:46,718 --> 09:01:50,398
and we're going to run rooster and
11915
09:01:48,637 --> 09:01:51,840
you're going to see that at index 1 we
11916
09:01:52,878 --> 09:01:58,080
doing it manually like this is really
11917
09:01:55,119 --> 09:02:00,397
time consuming and it is possible to
11918
09:02:00,398 --> 09:02:06,478
we know the size of this array so it's a
11919
09:02:02,878 --> 09:02:09,600
10. and we can loop around 10 times
11920
09:02:06,477 --> 09:02:11,040
pretend each element at each iteration
11921
09:02:09,599 --> 09:02:13,199
and the way we do that we're going to
11922
09:02:11,040 --> 09:02:14,878
read with that loop and we're going to
11923
09:02:16,558 --> 09:02:20,878
and we're going to start from index to
11924
09:02:18,878 --> 09:02:23,760
zero this is really important because
11925
09:02:20,878 --> 09:02:25,680
arrays are indexed from zero they don't
11926
09:02:23,759 --> 09:02:27,840
start from one again this is something
11927
09:02:25,680 --> 09:02:29,680
you need to drill in your brain
11928
09:02:27,840 --> 09:02:32,240
and we're going to put in our test case
11929
09:02:29,680 --> 09:02:34,957
we're going to say i less than 10
11930
09:02:32,240 --> 09:02:37,440
because we want to go from 0 through 9
11931
09:02:34,957 --> 09:02:40,000
and we are going to increment our
11932
09:02:37,439 --> 09:02:41,199
iterator after we do that we're going to
11933
09:02:41,200 --> 09:02:46,159
jump into the body of the loop and we
11934
09:02:44,080 --> 09:02:48,160
didn't name our iterator that's why
11935
09:02:46,159 --> 09:02:50,079
we're having this squiggly line here
11936
09:02:48,159 --> 09:02:53,520
let's do that pretty quick we're going
11937
09:02:50,080 --> 09:02:55,840
to jump into the body of our loop and we
11938
09:02:55,840 --> 09:03:00,159
and we're going to say scores
11939
09:02:58,159 --> 09:03:02,477
and we need to be careful about how we
11940
09:03:00,159 --> 09:03:04,637
format this because i is not something
11941
09:03:02,477 --> 09:03:06,718
we have we're going to be getting that
11942
09:03:04,637 --> 09:03:08,557
from our iterator here so we're going to
11943
09:03:06,718 --> 09:03:10,718
print it like this and this is going to
11944
09:03:12,840 --> 09:03:18,477
squares and we're going to say i that's
11945
09:03:15,919 --> 09:03:20,159
going to be our index that we want to
11946
09:03:20,159 --> 09:03:25,840
and we're going to say stdendl
11947
09:03:23,520 --> 09:03:27,040
and uh because we don't want this to
11948
09:03:27,040 --> 09:03:32,718
we're going to comment that out
11949
09:03:29,439 --> 09:03:35,680
and we're going to go up and make sure
11950
09:03:32,718 --> 09:03:37,440
our comment is nice and neat
11951
09:03:35,680 --> 09:03:39,279
and we're going to try and run this and
11952
09:03:39,279 --> 09:03:44,239
well we don't have any real data in here
11953
09:03:42,317 --> 09:03:46,637
we're going to have some junk data so it
11954
09:03:44,240 --> 09:03:50,000
could really be anything we get printed
11955
09:03:46,637 --> 09:03:52,239
here so let's build with gcc and we're
11956
09:03:50,000 --> 09:03:54,398
going to give ourselves some breathing
11957
09:03:52,240 --> 09:03:57,360
room we're going to go down and clear
11958
09:03:54,398 --> 09:03:59,680
and run rooster and you see that um this
11959
09:03:57,360 --> 09:04:01,840
is really some junk data and if we run
11960
09:03:59,680 --> 09:04:03,040
it again let's see that we get the same
11961
09:04:03,040 --> 09:04:08,240
it is the same data in here if we want
11962
09:04:05,279 --> 09:04:10,477
to have in some reliable data we need to
11963
09:04:08,240 --> 09:04:12,080
write in our own data and we're going to
11964
09:04:10,477 --> 09:04:16,397
see how we can do that we're going to
11965
09:04:12,080 --> 09:04:19,280
see how we can write data into an array
11966
09:04:16,398 --> 09:04:20,798
and the syntax is really simple so the
11967
09:04:20,797 --> 09:04:26,317
you just say the index for which you
11968
09:04:22,637 --> 09:04:29,439
want to write data in and you say scores
11969
09:04:26,317 --> 09:04:31,840
and you specify the index let's say zero
11970
09:04:29,439 --> 09:04:33,759
and i'm going to put in a 20 for example
11971
09:04:36,240 --> 09:04:40,478
we're going to grab the index one the
11972
09:04:38,398 --> 09:04:42,798
first element and we're going to put in
11973
09:04:42,797 --> 09:04:47,520
and we're going to say scores we're
11974
09:04:44,878 --> 09:04:49,920
going to say 2 for index 2 and we're
11975
09:04:49,919 --> 09:04:55,679
why not and after we do this we can
11976
09:04:53,360 --> 09:04:57,920
print this out or read data with the
11977
09:04:55,680 --> 09:05:00,240
loop and make sure that the data we did
11978
09:05:02,000 --> 09:05:06,957
and comment this out because we don't
11979
09:05:04,000 --> 09:05:08,637
want this to confuse us on the console
11980
09:05:06,957 --> 09:05:12,159
and we're going to do that we're going
11981
09:05:08,637 --> 09:05:14,397
to come down here and print the data out
11982
09:05:12,159 --> 09:05:17,119
let's say what we're doing here and if
11983
09:05:14,398 --> 09:05:20,159
we build this we expect to see
11984
09:05:17,119 --> 09:05:23,439
that at index 0 1 and 2 we have the
11985
09:05:23,439 --> 09:05:27,919
let's build and see we're going to run
11986
09:05:27,919 --> 09:05:32,000
the build is going to go through we're
11987
09:05:29,360 --> 09:05:35,680
going to clear and run the rooster
11988
09:05:32,000 --> 09:05:38,878
and look at this score is a 0 20 score
11989
09:05:38,878 --> 09:05:43,279
and our data is actually getting gain
11990
09:05:41,520 --> 09:05:45,439
now we're going to see that we can also
11991
09:05:43,279 --> 09:05:48,477
write the data using the loop to make it
11992
09:05:45,439 --> 09:05:49,919
really easy without us manually doing
11993
09:05:49,919 --> 09:05:54,637
for that we're going to copy what we
11994
09:05:54,637 --> 09:05:57,599
and we're going to comment what we had
11995
09:05:57,599 --> 09:06:01,119
so let's comment this out and we're
11996
09:06:01,119 --> 09:06:06,239
and uh print the data again we're going
11997
09:06:03,520 --> 09:06:08,237
to put in the code here and before we
11998
09:06:06,240 --> 09:06:08,959
print the data we're going to put data
11999
09:06:08,959 --> 09:06:12,398
with the loop so the loop is basically
12000
09:06:11,122 --> 09:06:14,000
going to be the same thing we're going
12001
09:06:14,000 --> 09:06:18,639
ti we're going to initialize this we're
12002
09:06:16,398 --> 09:06:20,800
going to say i less than 10 because we
12003
09:06:18,639 --> 09:06:22,078
want to loop 10 times we're going to
12004
09:06:22,078 --> 09:06:26,078
and we're going to fall in the body of
12005
09:06:23,597 --> 09:06:28,000
the loop what we're going to do is write
12006
09:06:26,078 --> 09:06:30,319
data at the index of the current
12007
09:06:28,000 --> 09:06:32,480
iteration i should say so what we're
12008
09:06:30,319 --> 09:06:34,959
going to do we're going to say scores i
12009
09:06:32,480 --> 09:06:37,840
and we can really put in anything for
12010
09:06:34,959 --> 09:06:40,319
now let's say we want to put an i
12011
09:06:37,839 --> 09:06:43,597
multiplied by 10 so we're going to take
12012
09:06:40,319 --> 09:06:45,758
the current index multiply it by 10 and
12013
09:06:43,597 --> 09:06:47,839
we're going to store that in the index
12014
09:06:45,758 --> 09:06:49,122
at the current iteration this is what we
12015
09:06:49,122 --> 09:06:53,122
and if we print this out try to think
12016
09:06:51,122 --> 09:06:54,160
about what we're going to get here
12017
09:06:54,160 --> 09:06:59,040
at index 0 let's put in a 0 to be super
12018
09:06:56,877 --> 09:07:01,597
clear here that we are starting from
12019
09:06:59,040 --> 09:07:03,597
index 0. at index 0 we're going to take
12020
09:07:01,597 --> 09:07:07,121
0 and multiply that with the 10 so we're
12021
09:07:03,597 --> 09:07:08,877
going to store 0 at index 0. the loop is
12022
09:07:07,122 --> 09:07:10,960
going to run again at index 1 we're
12023
09:07:08,877 --> 09:07:13,277
going to take a 1 multiply with 10 we're
12024
09:07:10,959 --> 09:07:16,159
going to get it 10 at index 2 we're
12025
09:07:13,277 --> 09:07:19,040
going to multiply 2 with a 10 and store
12026
09:07:16,160 --> 09:07:21,438
a 20 at index 2 and we're going to keep
12027
09:07:21,438 --> 09:07:26,480
10 20 all the way to 90 stored in our
12028
09:07:24,639 --> 09:07:29,917
array here so if we print it out we
12029
09:07:26,480 --> 09:07:32,000
expect to see 0 10 20 all the way to 90.
12030
09:07:29,917 --> 09:07:34,877
let's weld and see that that's actually
12031
09:07:32,000 --> 09:07:37,199
what we have in our array we're going to
12032
09:07:34,877 --> 09:07:39,757
work successfully let's clear and run
12033
09:07:37,199 --> 09:07:42,557
rooster and you see that this is exactly
12034
09:07:39,758 --> 09:07:44,800
the same thing we have in our array how
12035
09:07:42,557 --> 09:07:47,437
cool is that okay another thing i want
12036
09:07:44,800 --> 09:07:49,680
you to see is that we can declare and
12037
09:07:49,680 --> 09:07:54,078
in place but before we do that let's say
12038
09:07:52,000 --> 09:07:56,078
what we were doing here we were trying
12039
09:07:54,078 --> 09:07:58,160
to write data in a loop and we're going
12040
09:07:56,078 --> 09:08:01,360
to comment this out because we don't
12041
09:07:58,160 --> 09:08:03,520
want a lot of confusing output
12042
09:08:01,360 --> 09:08:05,680
in our console and we're going to go
12043
09:08:03,519 --> 09:08:07,597
down and put in the data because i don't
12044
09:08:05,680 --> 09:08:09,840
want to type all these thanks
12045
09:08:07,597 --> 09:08:13,277
so we can declare and initialize an
12046
09:08:09,839 --> 09:08:15,757
array in place and the way we do that
12047
09:08:13,277 --> 09:08:17,680
the array is going to store doubles now
12048
09:08:15,758 --> 09:08:20,000
we can really declare an array of
12049
09:08:17,680 --> 09:08:22,319
anything but so far we have seen that we
12050
09:08:20,000 --> 09:08:23,917
can do that for ant now let's try a
12051
09:08:22,319 --> 09:08:26,319
little bit and show you that you can do
12052
09:08:23,917 --> 09:08:28,799
the same thing for double times so we
12053
09:08:26,319 --> 09:08:31,040
can declare an array of double types the
12054
09:08:28,800 --> 09:08:33,360
size is going to be five and we're going
12055
09:08:31,040 --> 09:08:35,277
to initialize that with this data here
12056
09:08:33,360 --> 09:08:41,758
so at index zero we're going to have a
12057
09:08:35,277 --> 09:08:43,121
12.7 index one a 7.5 index 2 a 13.2
12058
09:08:43,122 --> 09:08:49,520
an 8.1 and index 4 and 9.3 and that's
12059
09:08:47,597 --> 09:08:51,437
what we're going to have if we print
12060
09:08:49,519 --> 09:08:53,121
this out here we have a simple loop to
12061
09:08:51,438 --> 09:08:54,680
print it out and it's going to basically
12062
09:08:54,680 --> 09:09:01,360
12.7 and it's going to go all the way to
12063
09:08:57,360 --> 09:09:02,800
salary 4 and print a 9.3 and this is
12064
09:09:02,800 --> 09:09:07,840
if it makes sense for whatever you are
12065
09:09:04,877 --> 09:09:10,479
designing with c plus plus we're going
12066
09:09:10,480 --> 09:09:16,238
let's clear and run and you see that
12067
09:09:13,199 --> 09:09:18,639
this is exactly what we expect okay now
12068
09:09:16,237 --> 09:09:20,799
this is super clear the next thing we're
12069
09:09:18,639 --> 09:09:24,078
going to see is that if you don't
12070
09:09:20,800 --> 09:09:26,319
initialize all the elements in the array
12071
09:09:24,078 --> 09:09:28,558
those you leave out are going to be
12072
09:09:26,319 --> 09:09:31,438
initialized to zero and we are going to
12073
09:09:28,557 --> 09:09:33,360
put in a piece of code to play with that
12074
09:09:31,438 --> 09:09:35,520
so here we have an array it's a net
12075
09:09:33,360 --> 09:09:38,160
array it's going to be called families
12076
09:09:35,519 --> 09:09:41,359
and the size is going to be five but we
12077
09:09:38,160 --> 09:09:43,200
are only initializing three elements and
12078
09:09:41,360 --> 09:09:47,199
these elements are going to be elements
12079
09:09:43,199 --> 09:09:49,680
on the front so elements at index 3 and
12080
09:09:47,199 --> 09:09:52,479
4 are going to be left out and they are
12081
09:09:49,680 --> 09:09:54,800
going to be initialized to 0 by the
12082
09:09:52,480 --> 09:09:58,960
compiler so if we print this out we
12083
09:09:54,800 --> 09:10:01,520
expect to get 12 7 5 and 0 0 at
12084
09:09:58,959 --> 09:10:03,040
different indexes in this array here
12085
09:10:04,959 --> 09:10:08,799
we're going to clear because the build
12086
09:10:11,040 --> 09:10:16,398
this is exactly what we expect we have a
12087
09:10:13,040 --> 09:10:18,959
12 a 7 and 5 and the last two elements
12088
09:10:16,398 --> 09:10:21,438
are initialized to zero and this may
12089
09:10:18,959 --> 09:10:23,438
come in handy sometimes okay let's
12090
09:10:21,438 --> 09:10:26,238
comment this out another thing we want
12091
09:10:23,438 --> 09:10:29,277
to see is that we can actually
12092
09:10:26,237 --> 09:10:30,319
omit the size when we are declaring our
12093
09:10:30,319 --> 09:10:35,277
and initializing it so here is a simple
12094
09:10:33,040 --> 09:10:38,398
example we have an inter array called
12095
09:10:35,277 --> 09:10:41,360
class sizes we don't specify the size
12096
09:10:38,398 --> 09:10:44,000
but we initialize it and the compiler is
12097
09:10:41,360 --> 09:10:46,718
going to deduce the size of this array
12098
09:10:44,000 --> 09:10:49,122
from the elements we put in here so if
12099
09:10:46,718 --> 09:10:51,520
we put in two elements so it's going to
12100
09:10:49,122 --> 09:10:54,238
be of size 2 if we put in 10 elements
12101
09:10:51,519 --> 09:10:56,959
it's going to be of size 10 and this is
12102
09:10:54,237 --> 09:10:59,199
how this works but if you do something
12103
09:10:56,959 --> 09:11:02,398
like this and not to initialize the
12104
09:10:59,199 --> 09:11:03,917
array let's take this out for example
12105
09:11:02,398 --> 09:11:06,319
you're going to get a compiler error
12106
09:11:03,917 --> 09:11:08,319
because the compiler now doesn't know
12107
09:11:06,319 --> 09:11:10,959
which size it's going to give to this
12108
09:11:12,237 --> 09:11:17,360
put in the size or initialize your array
12109
09:11:15,122 --> 09:11:19,278
like this and it is going to work in
12110
09:11:17,360 --> 09:11:21,758
this case we're going to have six
12111
09:11:19,277 --> 09:11:23,917
elements and and you see that a range
12112
09:11:21,758 --> 09:11:26,319
based for loop is going to come in handy
12113
09:11:23,917 --> 09:11:28,557
here because we don't really know the
12114
09:11:26,319 --> 09:11:31,597
size of this array if somebody comes and
12115
09:11:28,557 --> 09:11:33,757
adds another element let's say 23
12116
09:11:31,597 --> 09:11:36,557
the size is going to change and if we
12117
09:11:33,758 --> 09:11:38,959
hard to code the size in our full loop
12118
09:11:36,557 --> 09:11:41,680
the code is going to break but a range
12119
09:11:38,959 --> 09:11:43,597
based for loop is going to use whatever
12120
09:11:41,680 --> 09:11:45,360
size this already has so we're going to
12121
09:11:43,597 --> 09:11:47,917
try and build this we're going to build
12122
09:11:47,917 --> 09:11:51,839
and the world is going to go through if
12123
09:11:49,680 --> 09:11:56,160
we run rooster we're going to get the
12124
09:11:51,839 --> 09:11:58,000
elements we have 10 12 15 11 18 17 23 if
12125
09:11:56,160 --> 09:11:58,960
we add a new element this is going to
12126
09:11:58,959 --> 09:12:02,319
you see that we don't need to modify the
12127
09:12:02,319 --> 09:12:06,959
put in the new size and this is really
12128
09:12:04,639 --> 09:12:09,040
cool i like this about range based for
12129
09:12:06,959 --> 09:12:11,040
loops we're going to build again
12130
09:12:11,040 --> 09:12:15,122
run the rooster and this is going to
12131
09:12:12,557 --> 09:12:17,519
give us exactly the data we have in the
12132
09:12:15,122 --> 09:12:19,840
array so this is one way you can do
12133
09:12:17,519 --> 09:12:22,557
things another thing we saw is that you
12134
09:12:22,557 --> 09:12:27,360
so let's do an example here for example
12135
09:12:25,040 --> 09:12:30,319
we're going to grab this thing and uh
12136
09:12:27,360 --> 09:12:32,718
put an array declared down here we're
12137
09:12:30,319 --> 09:12:34,800
going to copy that and use that here and
12138
09:12:32,718 --> 09:12:37,520
we're going to make this cost
12139
09:12:34,800 --> 09:12:39,680
let's give it a name let's say
12140
09:12:37,519 --> 09:12:40,557
birds for example for example we want to
12141
09:12:42,398 --> 09:12:46,639
lines of birds or whatever this is just
12142
09:12:44,959 --> 09:12:49,438
an example to show you that you can't
12143
09:12:46,639 --> 09:12:51,839
modify this array so if you try to do
12144
09:12:51,839 --> 09:12:57,519
and index 2 for example and you want to
12145
09:12:57,519 --> 09:13:01,757
the compiler is going to complain you
12146
09:12:59,758 --> 09:13:03,438
see that visual studio code is
12147
09:13:03,438 --> 09:13:09,360
expiration must be a modifiable value so
12148
09:13:06,160 --> 09:13:12,398
it is saying that the array stores const
12149
09:13:09,360 --> 09:13:14,877
elements so you can't modify elements of
12150
09:13:12,398 --> 09:13:16,800
this array okay so this is something you
12151
09:13:14,877 --> 09:13:20,397
can do if you don't want people to be
12152
09:13:16,800 --> 09:13:22,718
able to modify data in your array and
12153
09:13:20,398 --> 09:13:26,078
the last thing i'm going to show you is
12154
09:13:22,718 --> 09:13:27,597
that you can do operations on the data
12155
09:13:27,597 --> 09:13:31,917
so let's bring up our scores array again
12156
09:13:30,237 --> 09:13:34,077
so we're going to go up and copy it
12157
09:13:31,917 --> 09:13:37,519
because the code is using there so let's
12158
09:13:34,078 --> 09:13:39,520
put in our own scores array
12159
09:13:37,519 --> 09:13:41,199
it's going to be pretty fast and we're
12160
09:13:39,519 --> 09:13:42,717
going to say that it is an array with
12161
09:13:41,199 --> 09:13:44,799
this angle brackets we're going to
12162
09:13:42,718 --> 09:13:47,520
initialize this let's put in a bunch of
12163
09:13:44,800 --> 09:13:49,520
values and what we can do is sum these
12164
09:13:47,519 --> 09:13:52,077
things up we're going to store our
12165
09:13:49,519 --> 09:13:54,479
results in the sum variable and we're
12166
09:13:52,078 --> 09:13:56,800
going to loop around with a ranged based
12167
09:13:54,480 --> 09:13:58,718
for loop because we don't really know
12168
09:13:56,800 --> 09:14:02,238
the size of this array it can change any
12169
09:13:58,718 --> 09:14:04,557
time with however many elements and a
12170
09:14:02,237 --> 09:14:06,398
range based for loop is really cool in
12171
09:14:04,557 --> 09:14:07,917
that we don't have to keep track of the
12172
09:14:07,917 --> 09:14:12,639
so we're going to go in here
12173
09:14:14,718 --> 09:14:18,800
so for example for the first time sum is
12174
09:14:17,122 --> 09:14:20,639
going to be 0 because that's what we
12175
09:14:18,800 --> 09:14:23,598
initialize it with we're going to get
12176
09:14:20,639 --> 09:14:25,519
into this loop here the first element is
12177
09:14:23,597 --> 09:14:28,479
going to be 2 we're going to add that to
12178
09:14:25,519 --> 09:14:29,917
0 and get 2 we're going to add a 5 we're
12179
09:14:28,480 --> 09:14:33,122
going to get a 7 we're going to keep
12180
09:14:29,917 --> 09:14:35,757
adding this element and at the end sum
12181
09:14:33,122 --> 09:14:37,918
is going to contain the sum of all these
12182
09:14:35,758 --> 09:14:40,398
elements in the array here and this is
12183
09:14:37,917 --> 09:14:43,040
one cool way you can sum up the elements
12184
09:14:40,398 --> 09:14:44,800
in your array so if we run this we're
12185
09:14:43,040 --> 09:14:46,959
going to get the sun printed out let's
12186
09:14:44,800 --> 09:14:50,000
do that pretty quick we're going to run
12187
09:14:46,959 --> 09:14:52,319
this has to build with gcc and we have
12188
09:14:52,319 --> 09:14:58,237
what is happening here it's going to say
12189
09:14:54,959 --> 09:15:00,639
redeclaration of scores where did we
12190
09:14:58,237 --> 09:15:03,121
declare scores before let's go up and
12191
09:15:00,639 --> 09:15:05,040
make sure it is not declared somewhere
12192
09:15:05,040 --> 09:15:09,597
so we want to comment this out
12193
09:15:07,438 --> 09:15:10,319
come back to our code so that we can see
12194
09:15:10,319 --> 09:15:16,078
and we're going to build again with gcc
12195
09:15:14,160 --> 09:15:17,278
and now the world is going through we're
12196
09:15:20,160 --> 09:15:26,640
sum is 37 and if you sum these things up
12197
09:15:23,758 --> 09:15:28,398
i'm sure you get 37. this is really all
12198
09:15:26,639 --> 09:15:30,398
we set out to do in this lecture i hope
12199
09:15:28,398 --> 09:15:33,680
you have a better idea of how you can
12200
09:15:30,398 --> 09:15:36,319
declare your arrays put data in read
12201
09:15:33,680 --> 09:15:38,800
data out of those arrays make them const
12202
09:15:36,319 --> 09:15:40,718
or even do all kinds of operations on
12203
09:15:38,800 --> 09:15:42,718
them and this was really what this
12204
09:15:42,718 --> 09:15:46,000
we are going to stop here in this
12205
09:15:44,160 --> 09:15:48,398
lecture in the next one we're going to
12206
09:15:46,000 --> 09:15:50,639
see a cool way we can use to get the
12207
09:15:52,480 --> 09:15:56,718
and meet me there in this lecture we're
12208
09:15:54,718 --> 09:15:58,398
going to see a way we can query for the
12209
09:15:58,398 --> 09:16:02,800
at runtime if you remember in the last
12210
09:16:00,718 --> 09:16:05,277
lecture we had an example like this
12211
09:16:02,800 --> 09:16:08,000
showing how we can declare an array and
12212
09:16:05,277 --> 09:16:08,799
initialize it in a single statement like
12213
09:16:08,800 --> 09:16:14,800
but the problem we had with this is that
12214
09:16:11,680 --> 09:16:17,040
if we tried to print the array using a
12215
09:16:14,800 --> 09:16:19,680
for loop for example we would have to
12216
09:16:17,040 --> 09:16:22,000
use the size and the size of this array
12217
09:16:19,680 --> 09:16:24,078
may change if somebody decides to add
12218
09:16:22,000 --> 09:16:26,398
elements or remove elements then the
12219
09:16:24,078 --> 09:16:29,200
size is going to be irrelevant c plus
12220
09:16:26,398 --> 09:16:31,917
plus provides a way we can query for the
12221
09:16:29,199 --> 09:16:34,479
size of an array at runtime and we're
12222
09:16:31,917 --> 09:16:36,877
going to get the real size accounting
12223
09:16:34,480 --> 09:16:39,360
for the current number of elements that
12224
09:16:36,877 --> 09:16:42,319
we have in the array and for that we use
12225
09:16:42,319 --> 09:16:46,237
this is a function that comes with the c
12226
09:16:44,557 --> 09:16:48,479
plus plus standard library so you're
12227
09:16:46,237 --> 09:16:50,799
going to have it already if you have a
12228
09:16:48,480 --> 09:16:54,000
compliant compiler if you see here you
12229
09:16:50,800 --> 09:16:56,000
see that it was introduced in c plus 17
12230
09:16:54,000 --> 09:16:58,319
and it is a cool addition we can use it
12231
09:16:56,000 --> 09:16:59,839
to make our code easier to work with if
12232
09:16:58,319 --> 09:17:02,000
you look here we have a simple loop
12233
09:16:59,839 --> 09:17:04,319
which is going to print data out it is
12234
09:17:02,000 --> 09:17:06,877
going to loop starting from zero all the
12235
09:17:04,319 --> 09:17:09,597
way to the size of the array you see
12236
09:17:06,877 --> 09:17:12,000
that we use this to control when this
12237
09:17:09,597 --> 09:17:14,078
loop is going to end we then put in our
12238
09:17:12,000 --> 09:17:16,237
incrementation part and then we jump
12239
09:17:14,078 --> 09:17:18,319
into the body of the loop and print the
12240
09:17:16,237 --> 09:17:19,680
current element in the loop and if we do
12241
09:17:18,319 --> 09:17:22,237
things like this we're going to be able
12242
09:17:19,680 --> 09:17:24,959
to print all elements in the array
12243
09:17:22,237 --> 09:17:27,680
regardless of the number we initialize
12244
09:17:24,959 --> 09:17:30,557
it with okay so this is one way and it
12245
09:17:27,680 --> 09:17:32,718
was introduced in c plus plus 17. but
12246
09:17:32,718 --> 09:17:36,398
how did we do things before z plus plus
12247
09:17:36,398 --> 09:17:42,160
well we had to kind of do a hack to get
12248
09:17:39,597 --> 09:17:44,718
something like this we use the size of
12249
09:17:42,160 --> 09:17:45,680
operator we have seen a lot of times
12250
09:17:47,519 --> 09:17:52,959
if you do size of and passing the array
12251
09:17:50,959 --> 09:17:56,237
you're going to get the entire size of
12252
09:17:52,959 --> 09:17:58,959
the array so if we take that and divide
12253
09:17:56,237 --> 09:18:00,959
that with the size of a single element
12254
09:17:58,959 --> 09:18:03,199
in the array we're going to get the
12255
09:18:00,959 --> 09:18:05,277
number of elements of the array and this
12256
09:18:03,199 --> 09:18:07,680
is really what we are doing here we are
12257
09:18:05,277 --> 09:18:09,917
setting up a count variable and we are
12258
09:18:07,680 --> 09:18:12,480
taking the size of the array and
12259
09:18:09,917 --> 09:18:14,799
dividing that with the size of a single
12260
09:18:12,480 --> 09:18:17,040
element in the array and we are just
12261
09:18:14,800 --> 09:18:19,598
grabbing the first element because you
12262
09:18:17,040 --> 09:18:22,078
can really use any element here and once
12263
09:18:19,597 --> 09:18:24,078
we have this we can use this count to do
12264
09:18:22,078 --> 09:18:25,122
a loop like this and it is working
12265
09:18:25,122 --> 09:18:29,360
please remember that you don't have to
12266
09:18:27,597 --> 09:18:32,479
go through this craziness we're doing
12267
09:18:29,360 --> 09:18:35,520
here you don't even have to use std size
12268
09:18:32,480 --> 09:18:37,840
because you can use a ranged base for
12269
09:18:35,519 --> 09:18:39,437
loop and get access to the elements you
12270
09:18:37,839 --> 09:18:41,597
have in the array and it is going to
12271
09:18:39,438 --> 09:18:44,000
work pretty well now that you have an
12272
09:18:41,597 --> 09:18:46,718
idea about this let's head to visual
12273
09:18:44,000 --> 09:18:49,680
studio code and actually play with us
12274
09:18:46,718 --> 09:18:52,000
okay so here we are in our working
12275
09:18:49,680 --> 09:18:54,557
folder we are going to be working on
12276
09:18:52,000 --> 09:18:56,557
this project size of an array we're
12277
09:18:54,557 --> 09:18:59,121
going to grab our template project we're
12278
09:18:56,557 --> 09:19:00,237
going to copy the files and put them in
12279
09:19:00,237 --> 09:19:03,917
and we're going to open this up in
12280
09:19:01,758 --> 09:19:05,840
visual studio code let's do that it's
12281
09:19:03,917 --> 09:19:08,078
going to open up in visual studio code
12282
09:19:08,078 --> 09:19:12,800
clean it up a little bit and we are
12283
09:19:10,237 --> 09:19:14,479
going to declare an array if we want to
12284
09:19:14,480 --> 09:19:19,360
we need to know how many times we're
12285
09:19:16,639 --> 09:19:21,595
going to loop and print elements in here
12286
09:19:19,360 --> 09:19:24,319
so one thing you might want to do is to
12287
09:19:21,595 --> 09:19:26,639
say okay we have 10 elements in here so
12288
09:19:24,319 --> 09:19:28,720
i'm going to loop for 10 times you might
12289
09:19:26,639 --> 09:19:30,479
think this is going to work and it is
12290
09:19:32,400 --> 09:19:36,959
and build this with gcc like we usually
12291
09:19:39,595 --> 09:19:44,239
and run rooster we are going to get our
12292
09:19:42,160 --> 09:19:46,160
numbers this is what we have in the
12293
09:19:46,160 --> 09:19:51,200
but what if somebody comes and changes
12294
09:19:49,360 --> 09:19:54,080
the elements we have in here let's add
12295
09:19:54,959 --> 09:19:59,519
the moment we change this we will need
12296
09:19:57,040 --> 09:20:01,840
to come and change the size in here and
12297
09:19:59,519 --> 09:20:04,719
this loop here might be buried somewhere
12298
09:20:01,839 --> 09:20:08,319
deep in your project and it might not be
12299
09:20:04,720 --> 09:20:10,880
as easy as it is now to see that we also
12300
09:20:08,319 --> 09:20:14,400
need to change this this may be a really
12301
09:20:10,879 --> 09:20:17,680
big source of hard to debug problems so
12302
09:20:14,400 --> 09:20:21,275
what we really need is a way to get the
12303
09:20:17,680 --> 09:20:23,756
size of the array at runtime and be able
12304
09:20:21,275 --> 09:20:26,079
to dynamically query for that size and
12305
09:20:23,756 --> 09:20:30,080
use it in our program and that's exactly
12306
09:20:26,080 --> 09:20:32,080
what std size provides so we're going to
12307
09:20:32,080 --> 09:20:36,400
and we're going to put in a value let's
12308
09:20:34,400 --> 09:20:38,800
use a braced initializer so we're going
12309
09:20:38,800 --> 09:20:42,639
and we're going to pass the array we
12310
09:20:42,639 --> 09:20:46,000
and if we do this we're going to get
12311
09:20:46,000 --> 09:20:50,319
and we're going to be looping for this
12312
09:20:48,319 --> 09:20:53,839
number of times so we're going to test
12313
09:20:50,319 --> 09:20:56,159
for i is less than the count here
12314
09:20:53,839 --> 09:20:58,000
and now it doesn't matter how many
12315
09:20:56,160 --> 09:21:00,480
elements we have in here we're going to
12316
09:20:58,000 --> 09:21:03,120
get them at run time we need to only
12317
09:21:00,480 --> 09:21:04,880
update this initializer here so what we
12318
09:21:09,756 --> 09:21:14,160
and run rooster and we're going to get
12319
09:21:12,400 --> 09:21:17,275
the numbers here you see that we get all
12320
09:21:14,160 --> 09:21:19,596
the elements if we take out a few of
12321
09:21:17,275 --> 09:21:22,079
these elements let's take out a few of
12322
09:21:19,595 --> 09:21:22,959
these let's leave it up to seven or
12323
09:21:22,959 --> 09:21:28,000
let's build again and we are going to
12324
09:21:25,595 --> 09:21:30,399
clear and run rooster we're going to get
12325
09:21:28,000 --> 09:21:33,199
however many elements we have in there
12326
09:21:30,400 --> 09:21:35,840
and this is pretty cool again you might
12327
09:21:33,199 --> 09:21:39,915
ask how did we do things before c plus
12328
09:21:35,839 --> 09:21:42,959
plus 17 because std size was introduced
12329
09:21:39,915 --> 09:21:46,239
in c plus plus 17 let's say that here
12330
09:21:42,959 --> 09:21:49,756
before that we had to get the size of
12331
09:21:46,239 --> 09:21:52,479
the entire array and divide that with
12332
09:21:49,756 --> 09:21:55,120
the size of each element in the array
12333
09:21:52,480 --> 09:21:58,400
and we could use the size of operator to
12334
09:21:55,120 --> 09:22:00,959
do that so before we do any of that we
12335
09:21:58,400 --> 09:22:02,800
want to play with the size of method to
12336
09:22:02,800 --> 09:22:08,480
so what we're going to do is say sdd the
12337
09:22:08,480 --> 09:22:13,120
scores the entire array and we're going
12338
09:22:11,120 --> 09:22:15,436
to print that and we're going to say
12339
09:22:17,199 --> 09:22:24,479
you know one element let's say
12340
09:22:20,839 --> 09:22:27,199
scores and use the first element this is
12341
09:22:24,480 --> 09:22:29,040
the easiest thing we can find here but
12342
09:22:27,199 --> 09:22:31,360
you can use any element so we're going
12343
09:22:29,040 --> 09:22:34,559
to say size of here and we're going to
12344
09:22:31,360 --> 09:22:36,879
say scores and grab the first element
12345
09:22:34,559 --> 09:22:39,360
which is at index 0 and we're going to
12346
09:22:36,879 --> 09:22:40,879
print its size if we build and run this
12347
09:22:43,519 --> 09:22:48,559
and the world is good we can clear now
12348
09:22:46,400 --> 09:22:51,596
and run rooster you're going to see that
12349
09:22:48,559 --> 09:22:54,639
we're going to get size of scores is 32
12350
09:22:51,595 --> 09:22:56,559
the entire array the size of one element
12351
09:22:54,639 --> 09:23:00,080
is four because we are storing in
12352
09:22:56,559 --> 09:23:03,119
integers and i want you to see that 32
12353
09:23:00,080 --> 09:23:05,436
is four times eight because we have an
12354
09:23:03,120 --> 09:23:08,319
eight elements so it's going to give you
12355
09:23:05,436 --> 09:23:11,200
the combined size of all of the elements
12356
09:23:08,319 --> 09:23:12,559
that we have in here if you do size of
12357
09:23:12,559 --> 09:23:16,639
but if you do size of a single element
12358
09:23:14,879 --> 09:23:19,199
you're going to get the size of a single
12359
09:23:16,639 --> 09:23:21,595
element so c plus plus developers were
12360
09:23:21,595 --> 09:23:25,595
and see that we could use this
12361
09:23:23,756 --> 09:23:28,239
information and get the count of
12362
09:23:25,595 --> 09:23:30,239
elements inside so we can do something
12363
09:23:30,239 --> 09:23:33,756
and we're going to assign a value to
12364
09:23:33,756 --> 09:23:37,840
in our braced initializer so we're going
12365
09:23:41,040 --> 09:23:46,720
and we're going to divide that with size
12366
09:23:43,756 --> 09:23:49,120
of and i'm going to grab scores we can
12367
09:23:46,720 --> 09:23:51,680
really use any element in the array but
12368
09:23:49,120 --> 09:23:53,360
we're going to grab the one at index 0
12369
09:23:51,680 --> 09:23:55,840
and now we're going to get the count
12370
09:23:53,360 --> 09:23:59,520
stored in our account variable without
12371
09:23:55,839 --> 09:24:00,879
using std size and we can uncomment our
12372
09:24:00,879 --> 09:24:05,360
or the code to print the array and if we
12373
09:24:03,519 --> 09:24:07,680
run now it is going to work exactly the
12374
09:24:05,360 --> 09:24:10,319
same thing regardless of the amount of
12375
09:24:07,680 --> 09:24:13,915
elements you have in here let's put a
12376
09:24:10,319 --> 09:24:16,639
few numbers randomly and if we will then
12377
09:24:13,915 --> 09:24:18,719
run we are going to clear and run
12378
09:24:16,639 --> 09:24:20,639
rooster and we're going to get all the
12379
09:24:20,639 --> 09:24:24,720
you can really use any of these
12380
09:24:22,480 --> 09:24:27,840
techniques just choose what you feel
12381
09:24:24,720 --> 09:24:30,080
works better for you okay we are going
12382
09:24:27,839 --> 09:24:32,239
through all this trouble to set up an
12383
09:24:30,080 --> 09:24:34,160
iterator we're going to do the test
12384
09:24:32,239 --> 09:24:37,595
we're going to increment this is really
12385
09:24:34,160 --> 09:24:40,320
too much work to try and get data from a
12386
09:24:37,595 --> 09:24:43,519
collection like an array so what we can
12387
09:24:40,319 --> 09:24:44,800
do instead is comment out all this hard
12388
09:24:44,800 --> 09:24:49,200
and we can use a ranged based for loop
12389
09:24:47,436 --> 09:24:52,239
as we have seen before and it is
12390
09:24:49,199 --> 09:24:55,199
ridiculously easy and convenient to work
12391
09:24:52,239 --> 09:24:57,436
with so what you can do is say for
12392
09:24:57,436 --> 09:25:02,160
type deduction on whatever it is we have
12393
09:24:59,756 --> 09:25:04,400
stored in our array so we're going to
12394
09:25:04,400 --> 09:25:10,720
and we're going to print out the element
12395
09:25:07,120 --> 09:25:14,000
so let's do that we're going to print
12396
09:25:10,720 --> 09:25:16,480
stdcl and here we're going to say value
12397
09:25:14,000 --> 09:25:17,756
let's say value in the array and we're
12398
09:25:17,756 --> 09:25:22,559
i and this is going to print all the
12399
09:25:20,000 --> 09:25:25,120
elements and we can work with the values
12400
09:25:22,559 --> 09:25:27,519
inside if we want that but you see that
12401
09:25:27,519 --> 09:25:32,319
on the indexes so if you really need the
12402
09:25:29,839 --> 09:25:34,799
indexes you will need to go through
12403
09:25:32,319 --> 09:25:38,159
something like this and if you just need
12404
09:25:34,800 --> 09:25:40,080
the values in the array ranged based for
12405
09:25:38,160 --> 09:25:42,320
loops are going to be really cool let's
12406
09:25:40,080 --> 09:25:44,319
say range base for loop and if we boiled
12407
09:25:42,319 --> 09:25:45,199
and run this it's going to work pretty
12408
09:25:45,199 --> 09:25:50,479
so the world is going to go through
12409
09:25:47,839 --> 09:25:53,119
let's bring this up so that we have some
12410
09:25:50,480 --> 09:25:55,120
breathing room we're going to clear
12411
09:25:55,120 --> 09:25:58,720
and we're going to get our elements
12412
09:25:56,800 --> 09:26:01,120
printed out here and you see that it is
12413
09:25:58,720 --> 09:26:01,916
the exact same thing we have in scores
12414
09:26:01,915 --> 09:26:05,839
so this is really all we set out to do
12415
09:26:03,839 --> 09:26:08,799
in this lecture i just wanted you to be
12416
09:26:08,800 --> 09:26:13,360
facility that we have in the c plus plus
12417
09:26:11,275 --> 09:26:16,000
standard library if you don't want to
12418
09:26:13,360 --> 09:26:18,559
use it for any reason you can also go in
12419
09:26:16,000 --> 09:26:21,839
and do the division we did here to get
12420
09:26:18,559 --> 09:26:24,799
the count of elements in the array
12421
09:26:21,839 --> 09:26:27,119
and uh do your best to try and use
12422
09:26:24,800 --> 09:26:30,160
ranged basis for loops because they make
12423
09:26:27,120 --> 09:26:32,800
it easier and cleaner to get data from a
12424
09:26:30,160 --> 09:26:35,520
collection like we are doing here with
12425
09:26:32,800 --> 09:26:37,120
an array we are going to stop here in
12426
09:26:35,519 --> 09:26:39,519
this lecture and the next one we're
12427
09:26:37,120 --> 09:26:41,276
going to see how we can work with arrays
12428
09:26:41,275 --> 09:26:45,119
go ahead and finish up here and meet me
12429
09:26:45,120 --> 09:26:49,520
in this lecture we're going to work on
12430
09:26:47,120 --> 09:26:50,480
array of characters and show how special
12431
09:26:50,480 --> 09:26:55,276
you can declare an array of characters
12432
09:26:53,120 --> 09:26:56,400
just like any other array so here we
12433
09:26:56,400 --> 09:27:01,360
an array called message it stores
12434
09:26:58,639 --> 09:27:04,239
elements of type character the size is
12435
09:27:01,360 --> 09:27:05,520
five and we initialize it with a bunch
12436
09:27:05,519 --> 09:27:10,639
if we want to print it out we can look
12437
09:27:07,756 --> 09:27:12,480
like we loop through any other array in
12438
09:27:10,639 --> 09:27:15,519
this case we're going to be using a
12439
09:27:12,480 --> 09:27:17,276
ranged base for loop we say for auto c
12440
09:27:15,519 --> 09:27:19,595
we pass the message and then we're going
12441
09:27:17,275 --> 09:27:21,680
to be printing each character in the
12442
09:27:19,595 --> 09:27:24,000
message and if we do this we're going to
12443
09:27:21,680 --> 09:27:27,040
see hello printed out on the console we
12444
09:27:24,000 --> 09:27:29,199
can also modify elements in our array
12445
09:27:27,040 --> 09:27:31,595
for example we can say message1 and
12446
09:27:31,595 --> 09:27:36,000
and if we print out we should see hello
12447
09:27:33,839 --> 09:27:38,879
printed out on the console nothing
12448
09:27:36,000 --> 09:27:41,595
really special so far the cool thing you
12449
09:27:38,879 --> 09:27:43,275
can do with character arrays
12450
09:27:41,595 --> 09:27:45,595
is that you can print them to the
12451
09:27:43,275 --> 09:27:47,595
console directly without even doing the
12452
09:27:45,595 --> 09:27:50,159
loop you can do something like this you
12453
09:27:47,595 --> 09:27:52,239
can do sddc out you say whatever you
12454
09:27:50,160 --> 09:27:54,640
want to do in quotes here and you're
12455
09:27:52,239 --> 09:27:57,595
going to print the message but sometimes
12456
09:27:54,639 --> 09:28:01,275
this one to do what you expect because
12457
09:27:57,595 --> 09:28:04,559
only proper c strings can be printed on
12458
09:28:01,275 --> 09:28:07,839
the console and what makes up a proper c
12459
09:28:04,559 --> 09:28:10,479
string a proper c string has this thing
12460
09:28:07,839 --> 09:28:11,435
you see on the end here this backslash
12461
09:28:11,436 --> 09:28:16,480
is called a null termination string and
12462
09:28:14,400 --> 09:28:19,040
it is what is going to tell c plus plus
12463
09:28:16,480 --> 09:28:21,276
that we have hit the end of the string
12464
09:28:19,040 --> 09:28:24,239
and we are going to stop printing it if
12465
09:28:21,275 --> 09:28:26,799
we are printing with things like stdcl
12466
09:28:24,239 --> 09:28:29,360
so this is really important to be in
12467
09:28:26,800 --> 09:28:31,520
your strength if it's not there it may
12468
09:28:29,360 --> 09:28:34,239
work but sometimes it's also going to
12469
09:28:31,519 --> 09:28:37,595
print some garbage characters after this
12470
09:28:34,239 --> 09:28:39,839
because what tells sddc out that we have
12471
09:28:37,595 --> 09:28:42,319
reached the end of the string is this
12472
09:28:39,839 --> 09:28:44,239
backslash zero here if it's not there
12473
09:28:42,319 --> 09:28:46,480
it's going to keep printing until it
12474
09:28:44,239 --> 09:28:48,720
sees one and then you're going to
12475
09:28:46,480 --> 09:28:51,120
probably have some garbage characters
12476
09:28:48,720 --> 09:28:53,040
added to your string and that's not what
12477
09:28:51,120 --> 09:28:56,080
you want so to have your strengths
12478
09:28:53,040 --> 09:28:58,720
printed out correctly be sure to have in
12479
09:28:56,080 --> 09:29:00,400
this null termination character here and
12480
09:28:58,720 --> 09:29:02,000
if we print it out we're going to get it
12481
09:29:00,400 --> 09:29:05,120
and we're going to see the size printed
12482
09:29:02,000 --> 09:29:07,839
out properly if we do things like this
12483
09:29:05,120 --> 09:29:10,000
but it is possible to get to this auto
12484
09:29:07,839 --> 09:29:12,959
field for us if you look here we have a
12485
09:29:10,000 --> 09:29:15,680
character array called message2 inside
12486
09:29:12,959 --> 09:29:18,400
we have said that we need six elements
12487
09:29:15,680 --> 09:29:20,879
and we say hello so we have one two
12488
09:29:18,400 --> 09:29:24,000
three four five elements and the
12489
09:29:20,879 --> 09:29:26,639
elements we don't initialize properly is
12490
09:29:24,000 --> 09:29:28,959
going to be initialized with a zero
12491
09:29:26,639 --> 09:29:31,756
version of a character and that happens
12492
09:29:28,959 --> 09:29:34,319
to be the null terminator of the null
12493
09:29:31,756 --> 09:29:36,000
termination character so this is going
12494
09:29:34,319 --> 09:29:37,595
to print correctly and we're going to
12495
09:29:37,595 --> 09:29:42,959
backslash n appended to this for us by
12496
09:29:40,720 --> 09:29:45,756
the compiler but be sure you understand
12497
09:29:42,959 --> 09:29:48,239
the difference between this and this
12498
09:29:45,756 --> 09:29:50,959
here we have specified the size to be a
12499
09:29:48,239 --> 09:29:53,360
5 and we are putting in five elements so
12500
09:29:50,959 --> 09:29:55,595
we have no null character appended to
12501
09:29:53,360 --> 09:29:58,400
this string but here we have said that
12502
09:29:55,595 --> 09:30:01,680
we can put in six elements and we have
12503
09:29:58,400 --> 09:30:05,120
only put five and the compiler is going
12504
09:30:01,680 --> 09:30:07,199
to autofill then the null terminating
12505
09:30:05,120 --> 09:30:08,560
character these two things are different
12506
09:30:07,199 --> 09:30:11,039
and make sure you understand the
12507
09:30:08,559 --> 09:30:13,435
difference okay so now take a look at
12508
09:30:11,040 --> 09:30:15,915
what we have here we have a strand we
12509
09:30:13,436 --> 09:30:18,639
didn't specify the size and we just
12510
09:30:15,915 --> 09:30:20,639
initialize it with hello someone might
12511
09:30:18,639 --> 09:30:23,040
think ah this is also going to autofill
12512
09:30:20,639 --> 09:30:25,756
but it's not because the compiler is
12513
09:30:23,040 --> 09:30:28,239
going to deduce the size of this array
12514
09:30:25,756 --> 09:30:30,559
using what you initialize it with and
12515
09:30:28,239 --> 09:30:32,079
you didn't put in a null character so
12516
09:30:30,559 --> 09:30:34,239
it's not going to be accounted for
12517
09:30:32,080 --> 09:30:36,480
you're only going to have this here and
12518
09:30:34,239 --> 09:30:38,559
if you print this out you may get
12519
09:30:36,480 --> 09:30:40,800
garbage characters appended to your
12520
09:30:38,559 --> 09:30:44,000
string here so be careful but it is
12521
09:30:40,800 --> 09:30:47,040
possible to do literal c strings and
12522
09:30:44,000 --> 09:30:49,275
only say hello like this in quotes and
12523
09:30:47,040 --> 09:30:52,480
you're going to get the null terminating
12524
09:30:49,275 --> 09:30:54,319
character appended to your string here
12525
09:30:52,480 --> 09:30:56,720
so if we print this this is going to
12526
09:30:54,319 --> 09:30:58,959
pretty nicely and this is the
12527
09:30:56,720 --> 09:31:01,680
recommended way to initialize your
12528
09:30:58,959 --> 09:31:04,879
character arrays if you want to put in
12529
09:31:01,680 --> 09:31:06,959
string data like this you have to use
12530
09:31:04,879 --> 09:31:09,360
double quotes and the cool thing about
12531
09:31:06,959 --> 09:31:11,519
this is that you can even put in
12532
09:31:09,360 --> 09:31:13,915
spaces between words like this it is
12533
09:31:11,519 --> 09:31:16,639
going to work this really looks like how
12534
09:31:13,915 --> 09:31:19,595
you would like to type text and store
12535
09:31:16,639 --> 09:31:21,360
that in your character arrays and we're
12536
09:31:19,595 --> 09:31:23,119
going to be using this a lot in the
12537
09:31:21,360 --> 09:31:25,520
course again i want to bring to your
12538
09:31:23,120 --> 09:31:26,639
attention that character arrays are
12539
09:31:26,639 --> 09:31:30,479
in that you can directly print them on
12540
09:31:30,480 --> 09:31:35,436
like we are doing here you see this is a
12541
09:31:32,239 --> 09:31:38,079
character array and we are saying stdc
12542
09:31:35,436 --> 09:31:40,880
out message for you can't do this with
12543
09:31:38,080 --> 09:31:43,840
other arrays and this is really all i
12544
09:31:40,879 --> 09:31:45,839
had to share about character arrays so
12545
09:31:43,839 --> 09:31:48,159
what we're going to do next is head to
12546
09:31:45,839 --> 09:31:51,275
visual studio code and play with us okay
12547
09:31:48,160 --> 09:31:54,400
here we are in our working directory the
12548
09:31:51,275 --> 09:31:57,360
current project is arrays of characters
12549
09:31:54,400 --> 09:31:59,275
we're going to grab our template project
12550
09:31:57,360 --> 09:32:01,915
and we're going to copy the files
12551
09:32:01,915 --> 09:32:06,879
and we are going to open our folder
12552
09:32:04,720 --> 09:32:08,559
we're going to open the main cpp file
12553
09:32:06,879 --> 09:32:10,639
and we're going to get rid of what we
12554
09:32:08,559 --> 09:32:12,479
don't need here let's put in some
12555
09:32:10,639 --> 09:32:14,400
startup code so that we can start
12556
09:32:12,480 --> 09:32:16,720
playing with this without typing this
12557
09:32:14,400 --> 09:32:18,959
too much so we're going to declare an
12558
09:32:16,720 --> 09:32:20,880
array of characters it's going to be
12559
09:32:18,959 --> 09:32:22,799
called message the size is going to be
12560
09:32:20,879 --> 09:32:25,040
five and we're going to fill it with
12561
09:32:22,800 --> 09:32:27,756
characters like this so if we do this we
12562
09:32:25,040 --> 09:32:30,400
might want to print it like we print any
12563
09:32:27,756 --> 09:32:32,720
other array we're going to use loops and
12564
09:32:32,720 --> 09:32:37,120
a range base for loop so we take a toast
12565
09:32:37,120 --> 09:32:41,276
in message and we're going to print out
12566
09:32:39,275 --> 09:32:44,879
each character notice that we're not
12567
09:32:41,275 --> 09:32:47,360
adding std endl here because we want the
12568
09:32:44,879 --> 09:32:49,915
characters printed close to each other
12569
09:32:47,360 --> 09:32:51,840
so that we can read this easily and
12570
09:32:49,915 --> 09:32:53,519
after this we will need to go to the
12571
09:32:51,839 --> 09:32:55,839
next line so that the next thing we
12572
09:32:53,519 --> 09:32:59,915
print doesn't disturb us so we're going
12573
09:32:55,839 --> 09:33:01,915
to say sddc out std endl and if we do
12574
09:32:59,915 --> 09:33:04,399
this we're going to see hello printed
12575
09:33:01,915 --> 09:33:07,040
out on the console but we had to do too
12576
09:33:04,400 --> 09:33:09,360
much work to print something simple
12577
09:33:07,040 --> 09:33:10,319
like hello but let's do this we are
12578
09:33:10,319 --> 09:33:15,360
so we're going to bring up our terminal
12579
09:33:12,800 --> 09:33:16,960
and we're going to build with gcc let's
12580
09:33:16,959 --> 09:33:20,400
the world is going to go through and
12581
09:33:20,400 --> 09:33:24,239
and run rooster you're going to see that
12582
09:33:22,480 --> 09:33:26,080
it's going to say message is hello and
12583
09:33:24,239 --> 09:33:28,479
this is what we expect and this is
12584
09:33:26,080 --> 09:33:30,560
really how you would declare an array of
12585
09:33:28,480 --> 09:33:32,480
characters and initialize it with
12586
09:33:30,559 --> 09:33:34,720
whatever it is you want to initialize it
12587
09:33:32,480 --> 09:33:37,916
with but you notice that it's really not
12588
09:33:34,720 --> 09:33:40,959
convenient to put data in here if you
12589
09:33:37,915 --> 09:33:43,839
want to store a message for example for
12590
09:33:40,959 --> 09:33:45,519
someone you don't want to do this thing
12591
09:33:43,839 --> 09:33:48,000
you see here it's really ugly it's
12592
09:33:45,519 --> 09:33:50,879
convenient and nobody would definitely
12593
09:33:48,000 --> 09:33:53,199
use your program if you required your
12594
09:33:50,879 --> 09:33:55,595
users to type things like this so we
12595
09:33:53,199 --> 09:33:57,755
need to change this and we will but
12596
09:33:55,595 --> 09:34:00,639
before we get there let's also see that
12597
09:33:57,756 --> 09:34:03,520
we can change characters in our array so
12598
09:34:00,639 --> 09:34:07,120
if you look here this e here is at index
12599
09:34:03,519 --> 09:34:10,079
two so what we can say is a message and
12600
09:34:07,120 --> 09:34:11,040
uh we're going to target the element on
12601
09:34:13,680 --> 09:34:19,360
let's use that so this is index zero the
12602
09:34:16,239 --> 09:34:21,519
h and the e is at index one let's make
12603
09:34:19,360 --> 09:34:23,595
sure we get this straight and we're
12604
09:34:23,595 --> 09:34:29,839
in quotes remember characters are
12605
09:34:27,120 --> 09:34:32,720
surrounded by single quotes like this
12606
09:34:29,839 --> 09:34:35,679
once we do this and we try to print the
12607
09:34:35,680 --> 09:34:39,519
technique here we're going to copy the
12608
09:34:37,519 --> 09:34:40,319
code and we're going to paste it down
12609
09:34:42,800 --> 09:34:48,880
and if we do this we're going to see the
12610
09:34:45,436 --> 09:34:50,800
message printed out here to be hello
12611
09:34:48,879 --> 09:34:53,040
and the second message is going to be
12612
09:34:53,040 --> 09:34:58,800
because we changed the second element
12613
09:34:56,160 --> 09:35:00,960
to an a it's no longer an e so that's
12614
09:34:58,800 --> 09:35:03,840
what we expect we're going to run the
12615
09:35:00,959 --> 09:35:06,080
test to build with gcc and we're going
12616
09:35:03,839 --> 09:35:07,915
to bring this up and clear and we're
12617
09:35:06,080 --> 09:35:11,120
going to run rooster you see that we
12618
09:35:07,915 --> 09:35:13,595
have message hello and message hello and
12619
09:35:11,120 --> 09:35:16,000
we are able to print things successfully
12620
09:35:13,595 --> 09:35:18,799
this is really cool but we are doing too
12621
09:35:16,000 --> 09:35:20,639
much work really to print something on
12622
09:35:18,800 --> 09:35:23,276
the console and there should be an
12623
09:35:20,639 --> 09:35:25,519
easier way to do this and there is so
12624
09:35:23,275 --> 09:35:28,079
what we're going to do is comment this
12625
09:35:25,519 --> 09:35:30,239
out because we don't want noise output
12626
09:35:28,080 --> 09:35:31,756
in the console when we try to do
12627
09:35:31,756 --> 09:35:35,840
so what we're going to do is comment out
12628
09:35:34,160 --> 09:35:38,240
all we've done so far we're going to
12629
09:35:35,839 --> 09:35:40,559
leave in our message here and we're
12630
09:35:38,239 --> 09:35:44,000
going to try and print it directly on
12631
09:35:40,559 --> 09:35:46,159
the console so we can say sddcl
12632
09:35:46,160 --> 09:35:51,520
and we're going to print out the message
12633
09:35:48,720 --> 09:35:54,480
and take a moment and look at this
12634
09:35:51,519 --> 09:35:56,559
and try to compile this it is going to
12635
09:35:54,480 --> 09:35:58,720
go through it is going to compile
12636
09:35:58,720 --> 09:36:02,559
supports printing character arrays like
12637
09:36:03,915 --> 09:36:09,119
in most times this is not going to do
12638
09:36:05,756 --> 09:36:11,360
what you expect let's try and run this
12639
09:36:14,800 --> 09:36:19,120
we're lucky to get something that really
12640
09:36:19,120 --> 09:36:23,520
it's pretty hello and you see that we
12641
09:36:21,360 --> 09:36:25,840
have a bunch of other things and the
12642
09:36:23,519 --> 09:36:28,879
reason is what we have discussed in
12643
09:36:25,839 --> 09:36:31,435
these slides for character arrays like
12644
09:36:28,879 --> 09:36:34,399
this to be printed out properly
12645
09:36:31,436 --> 09:36:36,880
on the console they need to be null
12646
09:36:34,400 --> 09:36:39,360
terminated in other words they need to
12647
09:36:36,879 --> 09:36:42,239
have the null character which is a
12648
09:36:39,360 --> 09:36:45,680
backslash zero appended to the string
12649
09:36:42,239 --> 09:36:47,756
for sddc out to know that it has reached
12650
09:36:45,680 --> 09:36:51,275
the end of the string so this is what
12651
09:36:47,756 --> 09:36:52,720
makes your character strings legal
12652
09:36:51,275 --> 09:36:55,360
now you see that we are getting a
12653
09:36:52,720 --> 09:36:57,840
compiler error because we have overflown
12654
09:36:55,360 --> 09:36:59,840
the size of the array i think that's the
12655
09:36:57,839 --> 09:37:02,239
message too many initializer values and
12656
09:36:59,839 --> 09:37:05,119
this is exactly what we have done
12657
09:37:02,239 --> 09:37:07,839
now we can try and change this guy to a
12658
09:37:05,120 --> 09:37:08,639
six to say that we have six elements in
12659
09:37:08,639 --> 09:37:13,275
this wiggly line should go away and if
12660
09:37:13,275 --> 09:37:18,479
we're going to build with gcc
12661
09:37:15,839 --> 09:37:20,079
let's bring this up a little bit and
12662
09:37:22,400 --> 09:37:26,720
and you see that now we have hello
12663
09:37:24,000 --> 09:37:29,360
printed out correctly if we turn this
12664
09:37:29,360 --> 09:37:35,275
and take out the null terminator
12665
09:37:33,120 --> 09:37:37,840
we're going to try and build again and
12666
09:37:35,275 --> 09:37:39,119
we're going to clear and run rooster
12667
09:37:37,839 --> 09:37:41,755
you're going to see that we get the
12668
09:37:39,120 --> 09:37:44,560
garbage back so for your strings to be
12669
09:37:41,756 --> 09:37:48,000
printed out correctly they need to be
12670
09:37:44,559 --> 09:37:50,639
now terminated that's why it is not safe
12671
09:37:50,639 --> 09:37:55,275
when your character array is not now
12672
09:37:53,595 --> 09:37:58,000
terminated i really want you to
12673
09:37:55,275 --> 09:38:00,959
understand this so in c plus plus we
12674
09:37:58,000 --> 09:38:03,436
have a proper name for these strings
12675
09:38:00,959 --> 09:38:05,756
that are null terminated a null
12676
09:38:03,436 --> 09:38:07,916
terminated string is called the c string
12677
09:38:05,756 --> 09:38:09,756
because these things come from the c
12678
09:38:07,915 --> 09:38:11,915
programming language okay and we're
12679
09:38:09,756 --> 09:38:15,360
going to see a few ways we can set up c
12680
09:38:11,915 --> 09:38:18,479
strings now and the first one is to say
12681
09:38:15,360 --> 09:38:20,080
car we can call this message one
12682
09:38:18,480 --> 09:38:22,240
and it's going to be an array of
12683
09:38:20,080 --> 09:38:24,400
characters and we're going to initialize
12684
09:38:22,239 --> 09:38:26,720
this with hello let's copy this because
12685
09:38:24,400 --> 09:38:29,756
i don't want to type all these
12686
09:38:26,720 --> 09:38:31,916
things here so let's copy this
12687
09:38:29,756 --> 09:38:33,916
and initialize this properly notice that
12688
09:38:31,915 --> 09:38:36,159
we didn't specify the size so the
12689
09:38:33,915 --> 09:38:38,639
compiler is going to get the size from
12690
09:38:36,160 --> 09:38:41,120
however many elements we put in here and
12691
09:38:38,639 --> 09:38:43,360
we're going to put in our null
12692
09:38:41,120 --> 09:38:46,160
terminator here and if we print this
12693
09:38:43,360 --> 09:38:48,239
this is going to work and we are going
12694
09:38:46,160 --> 09:38:50,880
to comment this out and i'm going to say
12695
09:38:48,239 --> 09:38:52,159
that this will give you garbage okay if
12696
09:38:50,879 --> 09:38:55,040
we come down here we're going to see
12697
09:38:52,160 --> 09:38:57,916
that we have a car array it is called
12698
09:38:55,040 --> 09:39:00,720
message1 and we have initialized it with
12699
09:38:57,915 --> 09:39:03,119
data we have hello and we have a null
12700
09:39:00,720 --> 09:39:04,800
terminator here and the compiler is
12701
09:39:03,120 --> 09:39:07,200
going to deduce the size so this is
12702
09:39:04,800 --> 09:39:09,200
going to be a proper c string and we
12703
09:39:09,199 --> 09:39:14,159
let's try and weld this the board is
12704
09:39:11,756 --> 09:39:15,680
going to go through if we clear and run
12705
09:39:14,160 --> 09:39:18,640
rooster we're going to get our message
12706
09:39:15,680 --> 09:39:21,756
here and this is one way we can set up a
12707
09:39:18,639 --> 09:39:25,680
proper c string the second way is to
12708
09:39:21,756 --> 09:39:28,559
actually not putting the null terminator
12709
09:39:25,680 --> 09:39:30,160
but let the compiler add that in for you
12710
09:39:28,559 --> 09:39:33,199
and the way we can do that we can say
12711
09:39:30,160 --> 09:39:37,276
car message to and we're going to say
12712
09:39:33,199 --> 09:39:39,119
this array is of size 6. let's say that
12713
09:39:39,120 --> 09:39:43,276
and a fix how we end things here we're
12714
09:39:43,275 --> 09:39:48,000
and end this with a semicolon now what
12715
09:39:46,080 --> 09:39:50,160
is going to happen is the compiler is
12716
09:39:48,000 --> 09:39:53,199
going to see that this array is of size
12717
09:39:50,160 --> 09:39:55,520
6 but we are putting in five elements so
12718
09:39:53,199 --> 09:39:58,479
the remaining slots are going to be auto
12719
09:39:55,519 --> 09:40:01,275
filled and it is going to be using
12720
09:39:58,480 --> 09:40:03,520
null terminators to autofill this then
12721
09:40:01,275 --> 09:40:05,839
if we try to print the size here we're
12722
09:40:05,839 --> 09:40:12,239
because the null terminator is added in
12723
09:40:09,275 --> 09:40:14,959
by the compiler let's try and print the
12724
09:40:12,239 --> 09:40:17,519
sizes here actually so that you can see
12725
09:40:14,959 --> 09:40:19,436
these things so we're going to say size
12726
09:40:17,519 --> 09:40:21,755
and we're going to say that size of
12727
09:40:19,436 --> 09:40:24,720
message one and we're going to put in a
12728
09:40:21,756 --> 09:40:27,200
new line character and this should be
12729
09:40:24,720 --> 09:40:28,959
what we expect so what we're going to do
12730
09:40:28,959 --> 09:40:32,479
and i put that down here because we're
12731
09:40:30,959 --> 09:40:34,319
going to be doing the same thing for
12732
09:40:32,480 --> 09:40:36,319
message to so we're going to say message
12733
09:40:36,319 --> 09:40:40,639
and i say size of message to and do
12734
09:40:38,800 --> 09:40:43,200
signs of message too so what we're going
12735
09:40:40,639 --> 09:40:45,680
to see is a message 1 and message 2
12736
09:40:43,199 --> 09:40:48,399
printing out and we expect to see a size
12737
09:40:45,680 --> 09:40:51,199
of 6 because both of these guys have six
12738
09:40:48,400 --> 09:40:54,239
elements inside so we're going to run
12739
09:40:58,080 --> 09:41:03,436
and this is exactly what we expect
12740
09:41:00,720 --> 09:41:05,840
message one is hello the size is six
12741
09:41:03,436 --> 09:41:07,916
message two is hello and the size is six
12742
09:41:05,839 --> 09:41:10,159
and these are a few ways you can declare
12743
09:41:07,915 --> 09:41:12,959
your character arrays and initialize
12744
09:41:10,160 --> 09:41:16,400
them with proper data that is going to
12745
09:41:12,959 --> 09:41:18,959
print correctly with stdc out make sure
12746
09:41:16,400 --> 09:41:21,840
you don't do something like we did here
12747
09:41:18,959 --> 09:41:24,159
by printing message here because it is
12748
09:41:21,839 --> 09:41:27,119
not null terminated this is going to
12749
09:41:24,160 --> 09:41:29,200
give you a lot of problems again i want
12750
09:41:29,199 --> 09:41:35,595
that message three here is not a proper
12751
09:41:32,800 --> 09:41:37,756
c string because the compiler is going
12752
09:41:35,595 --> 09:41:40,399
to deduce however many elements we have
12753
09:41:37,756 --> 09:41:42,239
in here and this thing is going to be of
12754
09:41:42,239 --> 09:41:45,680
and we're not going to have a null
12755
09:41:43,839 --> 09:41:47,755
terminator and if we print it out we're
12756
09:41:45,680 --> 09:41:50,239
going to get some garbage so let's try
12757
09:41:47,756 --> 09:41:51,040
and copy this so that we are consistent
12758
09:41:51,040 --> 09:41:56,639
what we've done above here and if we
12759
09:41:56,639 --> 09:42:01,915
we are going to compile successfully but
12760
09:41:58,959 --> 09:42:04,319
we may get weird things if we print out
12761
09:42:01,915 --> 09:42:06,159
message three like we do here and you're
12762
09:42:04,319 --> 09:42:09,040
going to see that the size is five
12763
09:42:06,160 --> 09:42:13,200
because we only have five elements in
12764
09:42:09,040 --> 09:42:14,879
here so let's clear and run rooster and
12765
09:42:14,879 --> 09:42:19,519
we have hello for message one we have
12766
09:42:17,120 --> 09:42:22,560
hello for message two but for message
12767
09:42:19,519 --> 09:42:24,719
three we have things we don't expect
12768
09:42:22,559 --> 09:42:26,639
because it's going to keep printing and
12769
09:42:24,720 --> 09:42:29,520
it's going to go overbound and it's
12770
09:42:26,639 --> 09:42:32,319
going to stop when it hits the first
12771
09:42:32,319 --> 09:42:37,436
like what we have in here okay so this
12772
09:42:34,800 --> 09:42:39,276
is not safe don't do it make sure your
12773
09:42:39,275 --> 09:42:44,799
it if you intend to print them with sddc
12774
09:42:42,319 --> 09:42:46,800
out like this okay so working with
12775
09:42:44,800 --> 09:42:48,639
character arrays like this to print
12776
09:42:46,800 --> 09:42:51,120
messages and do all kinds of crazy
12777
09:42:48,639 --> 09:42:53,436
things is nice but it really isn't
12778
09:42:53,436 --> 09:42:58,720
you wouldn't expect your users to type
12779
09:42:55,839 --> 09:43:01,435
characters like this by surrounding them
12780
09:42:58,720 --> 09:43:04,480
with single quotes this is really ugly
12781
09:43:01,436 --> 09:43:07,436
and it is painful to do if you want to
12782
09:43:04,480 --> 09:43:10,240
do some productive work so c plus plus
12783
09:43:07,436 --> 09:43:11,916
allows you to use what we call string
12784
09:43:10,239 --> 09:43:13,436
literals and we're going to see an
12785
09:43:13,436 --> 09:43:18,400
down below we're going to say string
12786
09:43:15,040 --> 09:43:21,756
literals and uh what we can do is car
12787
09:43:18,400 --> 09:43:22,880
message for it's going to be an array as
12788
09:43:25,199 --> 09:43:30,399
with a string that is surrounded by
12789
09:43:27,915 --> 09:43:32,239
double quotes and what this is going to
12790
09:43:32,239 --> 09:43:38,400
is you know take these things break it
12791
09:43:35,120 --> 09:43:41,840
into characters and store this in this
12792
09:43:38,400 --> 09:43:44,880
array here and make sure you properly
12793
09:43:41,839 --> 09:43:47,519
now terminate this string here so if we
12794
09:43:44,879 --> 09:43:50,000
print the size of message four we're not
12795
09:43:47,519 --> 09:43:52,000
going to get five we're going to get six
12796
09:43:50,000 --> 09:43:54,319
because c plus plus is going to see
12797
09:43:52,000 --> 09:43:56,319
these double quotes and know that we
12798
09:43:54,319 --> 09:43:58,879
intend for these things to be properly
12799
09:43:56,319 --> 09:44:02,400
null terminated and it's going to add a
12800
09:43:58,879 --> 09:44:05,199
null terminator so let's try and print
12801
09:44:02,400 --> 09:44:08,160
this out so that we really are sure and
12802
09:44:05,199 --> 09:44:09,360
we're going to weld this with gcc as we
12803
09:44:09,360 --> 09:44:13,520
the world is going to go through let's
12804
09:44:11,360 --> 09:44:14,639
go up and clear and we're going to run
12805
09:44:14,639 --> 09:44:20,319
and you see that message 4 is hello
12806
09:44:20,319 --> 09:44:25,199
so this is one way we have to do things
12807
09:44:25,199 --> 09:44:30,559
and do all kinds of crazy things and
12808
09:44:27,915 --> 09:44:32,319
it's really cool and if we try to build
12809
09:44:30,559 --> 09:44:34,399
this we're going to get the proper
12810
09:44:32,319 --> 09:44:38,080
message printed out you see the world is
12811
09:44:34,400 --> 09:44:40,239
good if we clear and run rooster we're
12812
09:44:38,080 --> 09:44:42,720
going to see hello world how are you
12813
09:44:40,239 --> 09:44:45,680
doing and this is really cool so from
12814
09:44:42,720 --> 09:44:47,756
now on if we need to store a string in
12815
09:44:45,680 --> 09:44:49,519
our program this is how we're going to
12816
09:44:47,756 --> 09:44:52,160
do it because this is much more
12817
09:44:49,519 --> 09:44:54,399
civilized and it is how you would really
12818
09:44:52,160 --> 09:44:57,276
like to type characters in your program
12819
09:44:54,400 --> 09:44:59,596
i have said that character arrays are
12820
09:44:57,275 --> 09:45:03,680
really special because you can directly
12821
09:44:59,595 --> 09:45:05,360
print them out with stdc out like this i
12822
09:45:03,680 --> 09:45:07,436
want to prove this so we're going to try
12823
09:45:05,360 --> 09:45:09,756
and declare another array so we're going
12824
09:45:09,756 --> 09:45:14,080
and we're going to make this an array
12825
09:45:11,595 --> 09:45:17,595
and we're going to initialize with one
12826
09:45:14,080 --> 09:45:19,596
two three four five this is going to do
12827
09:45:17,595 --> 09:45:21,435
and we're going to put our closing
12828
09:45:19,595 --> 09:45:24,879
semicolon and we're going to try and
12829
09:45:21,436 --> 09:45:27,120
print this out i'm going to say std
12830
09:45:29,360 --> 09:45:33,680
let's try and compile this and see what
12831
09:45:31,275 --> 09:45:36,159
we get it is not actually going to give
12832
09:45:33,680 --> 09:45:38,080
us a compiler error but it's not going
12833
09:45:36,160 --> 09:45:39,840
to print what we expect and let's put a
12834
09:45:38,080 --> 09:45:42,400
message here so that we know that it is
12835
09:45:39,839 --> 09:45:44,559
this thing we are seeing here so we're
12836
09:45:42,400 --> 09:45:47,120
going to say numbers and we're going to
12837
09:45:54,879 --> 09:46:00,239
and if a run rooster look out for the
12838
09:45:57,915 --> 09:46:02,559
output that says numbers here so let's
12839
09:46:00,239 --> 09:46:05,040
run rooster it's not a one two three
12840
09:46:02,559 --> 09:46:05,839
four five it's something we don't really
12841
09:46:05,839 --> 09:46:09,435
and we will get to understand what is
12842
09:46:09,436 --> 09:46:14,959
in the next chapter for now note that
12843
09:46:12,160 --> 09:46:17,520
you can't directly print arrays other
12844
09:46:14,959 --> 09:46:19,120
than those of characters if you try to
12845
09:46:17,519 --> 09:46:21,119
do that you're going to get weird
12846
09:46:19,120 --> 09:46:23,276
numbers printed out and we're going to
12847
09:46:23,275 --> 09:46:27,595
the next chapter so let's say that here
12848
09:46:25,756 --> 09:46:29,360
okay this is really all we set out to do
12849
09:46:27,595 --> 09:46:32,239
in this lecture i hope you found it
12850
09:46:29,360 --> 09:46:34,480
interesting character arrays have a few
12851
09:46:32,239 --> 09:46:37,119
things you need to be careful about and
12852
09:46:34,480 --> 09:46:39,040
we try to cover those in this lecture we
12853
09:46:37,120 --> 09:46:40,880
are going to stop here in this lecture
12854
09:46:39,040 --> 09:46:43,680
and the next one we're going to try and
12855
09:46:43,680 --> 09:46:48,319
go ahead and finish up here and meet me
12856
09:46:46,000 --> 09:46:50,959
there in this lecture we're going to
12857
09:46:48,319 --> 09:46:53,680
look at what could happen if you try to
12858
09:46:50,959 --> 09:46:56,479
manipulate data out of the bounds of
12859
09:46:53,680 --> 09:46:59,680
your array we have seen that when you
12860
09:46:56,480 --> 09:47:01,520
allocate space for an array the computer
12861
09:46:59,680 --> 09:47:03,915
is going to give you a bunch of memory
12862
09:47:01,519 --> 09:47:06,239
locations you can use to store your data
12863
09:47:03,915 --> 09:47:08,639
and it's going to be of the size that
12864
09:47:06,239 --> 09:47:11,360
you have specified or that is deduced by
12865
09:47:08,639 --> 09:47:13,360
the compiler so here is an example of an
12866
09:47:11,360 --> 09:47:16,000
array that is going to store seven
12867
09:47:13,360 --> 09:47:18,000
elements and we have green slots for
12868
09:47:16,000 --> 09:47:21,199
these elements and these are the
12869
09:47:18,000 --> 09:47:23,915
locations we are allowed to manipulate
12870
09:47:21,199 --> 09:47:26,159
in our c plus plus program if we try to
12871
09:47:23,915 --> 09:47:29,519
go overbound for example if we try to
12872
09:47:26,160 --> 09:47:31,520
modify something before our array or
12873
09:47:31,519 --> 09:47:35,839
it might be a memory location that is
12874
09:47:33,360 --> 09:47:38,000
owned by another program it might be a
12875
09:47:35,839 --> 09:47:40,639
memory location that is even being used
12876
09:47:38,000 --> 09:47:44,000
by the operating system so bad things
12877
09:47:40,639 --> 09:47:47,199
can really happen if you try to use data
12878
09:47:44,000 --> 09:47:49,120
that is outside the bounds of your array
12879
09:47:47,199 --> 09:47:50,639
let's try to look at a simple example
12880
09:47:49,120 --> 09:47:54,000
here here we have an array called
12881
09:47:50,639 --> 09:47:57,519
numbers we have 10 slots inside so we
12882
09:47:54,000 --> 09:48:00,400
are only allowed to modify the memory
12883
09:47:57,519 --> 09:48:03,119
locations for these 10 numbers and if we
12884
09:48:00,400 --> 09:48:05,520
try to access something outside the
12885
09:48:03,120 --> 09:48:07,916
bounds of this array something might
12886
09:48:05,519 --> 09:48:10,479
happen but some people say that c plus
12887
09:48:07,915 --> 09:48:12,319
plus is really funny because it should
12888
09:48:10,480 --> 09:48:14,480
be stopping you from doing something
12889
09:48:12,319 --> 09:48:17,360
like this but c plus plus allows you to
12890
09:48:14,480 --> 09:48:20,240
do this if you look at code here we have
12891
09:48:17,360 --> 09:48:23,120
an array we have 10 elements n so the
12892
09:48:20,239 --> 09:48:26,319
valid indexes we can really use are from
12893
09:48:23,120 --> 09:48:29,200
0 to 9. but if we try and access
12894
09:48:26,319 --> 09:48:31,275
something at index 12 the code is going
12895
09:48:29,199 --> 09:48:33,199
to compile and if we run it we're going
12896
09:48:31,275 --> 09:48:35,360
to get something printed out but that's
12897
09:48:33,199 --> 09:48:37,915
something this is going to give you
12898
09:48:35,360 --> 09:48:40,639
garbage data or you might be even trying
12899
09:48:37,915 --> 09:48:42,239
to read some restricted memory and your
12900
09:48:40,639 --> 09:48:44,720
program is going to terminate
12901
09:48:42,239 --> 09:48:47,839
immediately and we're going to say that
12902
09:48:44,720 --> 09:48:50,080
it has crashed if you try to write over
12903
09:48:47,839 --> 09:48:52,959
bounce the compiler is also going to
12904
09:48:50,080 --> 09:48:55,040
allow it but you don't own the memory so
12905
09:48:52,959 --> 09:48:57,360
other programs might come and change
12906
09:48:55,040 --> 09:48:58,959
that memory location and if you try to
12907
09:48:57,360 --> 09:49:00,959
read from it again you're not going to
12908
09:48:58,959 --> 09:49:03,436
get what you expect another thing that
12909
09:49:00,959 --> 09:49:06,319
could happen is that you try and modify
12910
09:49:03,436 --> 09:49:09,596
data that is owned by other programs and
12911
09:49:06,319 --> 09:49:12,800
you might imagine how bad that really is
12912
09:49:09,595 --> 09:49:14,799
so the message here is don't go over
12913
09:49:12,800 --> 09:49:17,596
your array balance and you're going to
12914
09:49:14,800 --> 09:49:20,000
be playing in the safe zone let's head
12915
09:49:17,595 --> 09:49:22,720
over to visual studio code and play with
12916
09:49:20,000 --> 09:49:25,436
us a little bit here we are in our
12917
09:49:22,720 --> 09:49:27,520
working directory the current project is
12918
09:49:25,436 --> 09:49:29,436
array balance we're going to grab the
12919
09:49:33,275 --> 09:49:36,639
and we're going to open this up in
12920
09:49:34,639 --> 09:49:40,239
visual studio code we are going to
12921
09:49:36,639 --> 09:49:43,436
declare an array and try to read beyond
12922
09:49:40,239 --> 09:49:46,319
the legal bounds of our array so let's
12923
09:49:43,436 --> 09:49:48,800
try and bring up a terminal here and we
12924
09:49:46,319 --> 09:49:50,639
are going to build this with gcc the
12925
09:49:48,800 --> 09:49:53,436
world is going to go through you're not
12926
09:49:50,639 --> 09:49:55,519
going to get a compiler error but if we
12927
09:49:53,436 --> 09:49:58,080
run this we can really get anything and
12928
09:49:55,519 --> 09:50:01,039
you see we have a number we don't really
12929
09:49:58,080 --> 09:50:02,720
know what it means and this means that
12930
09:50:02,720 --> 09:50:07,275
out of the legal bounds of your array
12931
09:50:07,275 --> 09:50:13,119
allows you to do this and the reason
12932
09:50:09,756 --> 09:50:15,680
they do this is because they expect you
12933
09:50:13,120 --> 09:50:17,840
the developer to know what you're doing
12934
09:50:15,680 --> 09:50:20,639
when you try manipulating things like
12935
09:50:17,839 --> 09:50:22,559
ray and now you know this and be careful
12936
09:50:20,639 --> 09:50:25,040
when you are working with arrays like
12937
09:50:22,559 --> 09:50:28,479
this so don't go overbound that's the
12938
09:50:25,040 --> 09:50:31,680
message we may also try to modify data
12939
09:50:28,480 --> 09:50:34,000
beyond balance so let's go down and put
12940
09:50:31,680 --> 09:50:36,959
in the code to modify thanks and i have
12941
09:50:34,000 --> 09:50:38,559
put a clear message here as a comment to
12942
09:50:36,959 --> 09:50:40,799
let you know that this is really
12943
09:50:38,559 --> 09:50:42,639
something you should be very very
12944
09:50:40,800 --> 09:50:44,880
careful about so we're going to try and
12945
09:50:42,639 --> 09:50:46,400
change that number to 1000 and we're
12946
09:50:44,879 --> 09:50:49,519
going to try and print it out and see
12947
09:50:46,400 --> 09:50:51,040
what we get but this memory location at
12948
09:50:51,040 --> 09:50:55,915
is not something we own so other
12949
09:50:53,595 --> 09:50:58,399
programs might come and write to this
12950
09:50:55,915 --> 09:51:01,119
location and if we try to read from it
12951
09:50:58,400 --> 09:51:03,520
again we might not get what we put in
12952
09:51:01,120 --> 09:51:06,240
here even worse this memory location
12953
09:51:03,519 --> 09:51:08,079
might be owned by other programs and if
12954
09:51:06,239 --> 09:51:10,639
they read they're going to get what they
12955
09:51:08,080 --> 09:51:13,120
didn't put in they're going to get what
12956
09:51:10,639 --> 09:51:15,436
you put in and this is something bad we
12957
09:51:13,120 --> 09:51:17,520
might try and really go crazy with us
12958
09:51:15,436 --> 09:51:19,680
let's put in a really huge number and
12959
09:51:19,680 --> 09:51:23,040
this is a good way to learn by the way
12960
09:51:23,040 --> 09:51:28,480
and let's try and print what we have in
12961
09:51:25,595 --> 09:51:30,559
there and we're going to say
12962
09:51:30,559 --> 09:51:34,879
and that's what we're going to say here
12963
09:51:32,720 --> 09:51:36,480
and we're going to build again the world
12964
09:51:34,879 --> 09:51:39,040
is going to go through you see that we
12965
09:51:36,480 --> 09:51:41,916
are doing something really crazy our
12966
09:51:39,040 --> 09:51:44,559
array has 10 elements but we are trying
12967
09:51:44,559 --> 09:51:50,639
1 million memory locations away and uh
12968
09:51:48,480 --> 09:51:52,400
this is really crazy and c plus plus
12969
09:51:52,400 --> 09:51:58,239
so let's clear and run did we world
12970
09:51:54,720 --> 09:52:00,319
let's make sure we have world so let's
12971
09:52:02,160 --> 09:52:06,240
and run rooster our program is crashing
12972
09:52:04,720 --> 09:52:07,756
because we are trying to access
12973
09:52:07,756 --> 09:52:10,959
that isn't really ours and you see it
12974
09:52:10,959 --> 09:52:16,159
okay for example if we have something
12975
09:52:13,120 --> 09:52:18,160
printed out after this let's say std
12976
09:52:18,160 --> 09:52:21,680
and then so that you can see it is
12977
09:52:23,915 --> 09:52:29,040
this statement here is not going to
12978
09:52:26,400 --> 09:52:31,275
print because once we hit this location
12979
09:52:29,040 --> 09:52:33,120
we're going to try and modify this and
12980
09:52:31,275 --> 09:52:34,479
the program is not going to be able to
12981
09:52:33,120 --> 09:52:36,160
do that it's going to crash the
12982
09:52:34,480 --> 09:52:38,560
operating system is going to notice that
12983
09:52:36,160 --> 09:52:40,880
we are trying to do something crazy and
12984
09:52:38,559 --> 09:52:43,199
it's going to say this program is really
12985
09:52:40,879 --> 09:52:44,879
crazy it doesn't know what it's doing i
12986
09:52:43,199 --> 09:52:47,039
am going to kill it and it is going to
12987
09:52:44,879 --> 09:52:50,879
stop that's basically what is happening
12988
09:52:47,040 --> 09:52:53,200
here so let's weld again with gcc
12989
09:52:55,120 --> 09:52:59,520
and run rooster you see that it's going
12990
09:52:57,680 --> 09:53:01,756
to try and do this it's going to try and
12991
09:52:59,519 --> 09:53:04,399
put a value in here the program is going
12992
09:53:01,756 --> 09:53:06,319
to end here and this is really bad
12993
09:53:04,400 --> 09:53:09,040
because memory locations you have
12994
09:53:06,319 --> 09:53:11,360
allocated for before here are not
12995
09:53:09,040 --> 09:53:13,520
properly released and returned to the
12996
09:53:11,360 --> 09:53:16,400
operating system and this is something
12997
09:53:16,400 --> 09:53:22,560
don't go overbound make sure you are
12998
09:53:19,519 --> 09:53:25,519
working within the legal boundaries of
12999
09:53:22,559 --> 09:53:27,435
your array welcome to this new chapter
13000
09:53:25,519 --> 09:53:29,680
and we are going to be talking about
13001
09:53:27,436 --> 09:53:32,239
pointers pointers are one of the
13002
09:53:29,680 --> 09:53:34,480
important topics in c plus plus and they
13003
09:53:32,239 --> 09:53:36,720
allow you to do some of the things very
13004
09:53:34,480 --> 09:53:38,960
conveniently and we're going to be
13005
09:53:36,720 --> 09:53:41,200
learning about all those tricky things
13006
09:53:38,959 --> 09:53:43,199
you can do with them in this chapter but
13007
09:53:41,199 --> 09:53:45,435
now i want you to have a basic
13008
09:53:43,199 --> 09:53:46,239
understanding of what a pointer really
13009
09:53:46,239 --> 09:53:50,000
so far we have been working with
13010
09:53:47,915 --> 09:53:52,399
variables like this we set up a variable
13011
09:53:50,000 --> 09:53:54,480
in our c plus plus code we get to a
13012
09:53:52,400 --> 09:53:56,880
point where we put a value inside that
13013
09:53:54,480 --> 09:54:00,000
variable and we could use it for example
13014
09:53:56,879 --> 09:54:02,000
we could print it out on stdc out or we
13015
09:54:00,000 --> 09:54:04,239
could even store a value or assign
13016
09:54:02,000 --> 09:54:06,800
another value to the variable we've been
13017
09:54:04,239 --> 09:54:08,639
doing that quite a lot but there is a
13018
09:54:06,800 --> 09:54:11,276
point we haven't really been talking
13019
09:54:08,639 --> 09:54:13,839
about those variables have an address in
13020
09:54:11,275 --> 09:54:15,199
memory and here for example you see that
13021
09:54:15,199 --> 09:54:19,755
is stored at location one zero zero
13022
09:54:17,756 --> 09:54:21,120
eight of course this is a simple example
13023
09:54:21,120 --> 09:54:26,319
but i hope it drives the point home all
13024
09:54:24,080 --> 09:54:28,720
the variables you use in your code have
13025
09:54:26,319 --> 09:54:31,756
some kind of address in memory
13026
09:54:28,720 --> 09:54:34,400
and we can grab that address and store
13027
09:54:31,756 --> 09:54:36,800
that in a special kind of variable which
13028
09:54:34,400 --> 09:54:37,840
is really a pointer so we can say that a
13029
09:54:37,839 --> 09:54:43,435
is a special kind of variable
13030
09:54:40,239 --> 09:54:45,275
that stores addresses of other variables
13031
09:54:43,436 --> 09:54:47,680
make sure you really understand this
13032
09:54:45,275 --> 09:54:50,879
here we have p var so it is a pointer
13033
09:54:47,680 --> 09:54:54,400
its type is end pointer and we denote
13034
09:54:50,879 --> 09:54:56,479
pointer using this star symbol after our
13035
09:54:54,400 --> 09:54:58,160
type if you see something like this
13036
09:54:56,480 --> 09:55:00,720
you're going to know that this type is a
13037
09:54:58,160 --> 09:55:02,560
pointer to end its name is going to be p
13038
09:55:02,559 --> 09:55:06,639
and its value is going to be the address
13039
09:55:04,959 --> 09:55:10,239
of another variable you see it is
13040
09:55:06,639 --> 09:55:13,595
storing 1 0 0 8 which happens to be the
13041
09:55:10,239 --> 09:55:15,595
address of our var here in memory
13042
09:55:13,595 --> 09:55:17,595
pointers and variables we've been
13043
09:55:15,595 --> 09:55:19,595
talking about can work hand in hand and
13044
09:55:17,595 --> 09:55:21,435
we're going to be seeing how this is
13045
09:55:19,595 --> 09:55:24,399
done in the next few lectures in the
13046
09:55:21,436 --> 09:55:26,959
chapter but the basic idea is really the
13047
09:55:24,400 --> 09:55:29,120
same here you see that we have a pointer
13048
09:55:26,959 --> 09:55:30,959
to it but you can have a pointer ready
13049
09:55:29,120 --> 09:55:33,436
to anything in your code you can have a
13050
09:55:30,959 --> 09:55:35,839
pointer to car you can have a pointer to
13051
09:55:33,436 --> 09:55:39,120
double you can have a pointer to float
13052
09:55:35,839 --> 09:55:40,879
even pointers to custom types we haven't
13053
09:55:39,120 --> 09:55:42,880
really talked about now but we will
13054
09:55:40,879 --> 09:55:45,519
learn about them later in the course
13055
09:55:42,879 --> 09:55:48,639
again a pointer is a special type of
13056
09:55:45,519 --> 09:55:51,119
variable in your c plus program that is
13057
09:55:48,639 --> 09:55:54,000
going to store addresses to other
13058
09:55:51,120 --> 09:55:55,680
variables that's what it really is and
13059
09:55:54,000 --> 09:55:58,080
we're going to start and see how you can
13060
09:55:55,680 --> 09:56:00,800
declare initialize and use them in your
13061
09:55:58,080 --> 09:56:03,120
code starting in the next lecture
13062
09:56:00,800 --> 09:56:04,000
go ahead and finish up here and meet me
13063
09:56:04,000 --> 09:56:08,720
in this lecture we're going to see how
13064
09:56:05,595 --> 09:56:10,879
we can declare and use pointers in our c
13065
09:56:08,720 --> 09:56:13,436
plus plus code in the last lecture we
13066
09:56:10,879 --> 09:56:14,479
say that a pointer is a special kind of
13067
09:56:14,480 --> 09:56:20,000
that can store addresses to other
13068
09:56:17,120 --> 09:56:22,080
variables in our c plus plus code and we
13069
09:56:20,000 --> 09:56:24,160
have seen a slide like this to drive the
13070
09:56:22,080 --> 09:56:27,040
point home now we're going to see how we
13071
09:56:24,160 --> 09:56:29,596
can actually use pointers in our code
13072
09:56:27,040 --> 09:56:32,000
here is a simple example of how you can
13073
09:56:29,595 --> 09:56:34,559
declare a pointer variable in your c
13074
09:56:32,000 --> 09:56:36,959
plus plus code you say ent you put a
13075
09:56:36,959 --> 09:56:41,680
to mean that this variable is not a
13076
09:56:39,519 --> 09:56:45,359
regular variable like we have seen
13077
09:56:41,680 --> 09:56:47,120
before it is a special kind of variable
13078
09:56:47,120 --> 09:56:51,596
addresses to other variables and here i
13079
09:56:49,519 --> 09:56:54,959
have to say that you have to be really
13080
09:56:51,595 --> 09:56:57,595
careful and only store addresses to
13081
09:56:57,595 --> 09:57:02,639
in your pointers for example this is a
13082
09:57:00,000 --> 09:57:05,595
pointer to end it can only store an
13083
09:57:02,639 --> 09:57:08,239
address of a variable of type and for
13084
09:57:05,595 --> 09:57:10,319
other types if you try and put in their
13085
09:57:08,239 --> 09:57:12,559
addresses in here you're going to get a
13086
09:57:10,319 --> 09:57:14,959
compiler error down here you see we have
13087
09:57:12,559 --> 09:57:17,119
another example and it's called p
13088
09:57:14,959 --> 09:57:19,519
fractional number because it's a double
13089
09:57:17,120 --> 09:57:22,959
and you see that our pointers here are
13090
09:57:19,519 --> 09:57:24,639
initialized using braced initializers
13091
09:57:22,959 --> 09:57:28,000
and this is going to initialize the
13092
09:57:24,639 --> 09:57:30,080
pointers with a special address that
13093
09:57:28,000 --> 09:57:32,559
really denotes that these pointers are
13094
09:57:30,080 --> 09:57:35,916
not pointing to anything yet okay you
13095
09:57:32,559 --> 09:57:38,399
can also say that explicitly and put now
13096
09:57:35,915 --> 09:57:41,040
ptr inside and this is going to mean
13097
09:57:38,400 --> 09:57:43,275
that these pointers are not pointing
13098
09:57:41,040 --> 09:57:46,160
anywhere you can't really use the values
13099
09:57:43,275 --> 09:57:48,799
at the addresses where they point this
13100
09:57:46,160 --> 09:57:51,756
is the message here don't use pointers
13101
09:57:48,800 --> 09:57:54,240
that contain null pointer all pointers
13102
09:57:51,756 --> 09:57:56,800
on a given system are going to have the
13103
09:57:54,239 --> 09:57:59,436
same size for example if you have a
13104
09:57:56,800 --> 09:58:01,040
pointer to end and the pointer to double
13105
09:57:59,436 --> 09:58:03,596
they are going to be the same size
13106
09:58:01,040 --> 09:58:06,239
because they really store the same thing
13107
09:58:03,595 --> 09:58:08,879
they store addresses to variables and
13108
09:58:06,239 --> 09:58:10,799
addresses to different variables even if
13109
09:58:08,879 --> 09:58:13,519
they happen to be of the same type on
13110
09:58:10,800 --> 09:58:15,840
the same system are of the same size
13111
09:58:13,519 --> 09:58:17,519
that's why all the pointers you're going
13112
09:58:15,839 --> 09:58:19,275
to use in your code are going to have
13113
09:58:17,519 --> 09:58:21,519
the same size and this is something you
13114
09:58:19,275 --> 09:58:23,680
should keep in mind and here is a simple
13115
09:58:21,519 --> 09:58:26,799
example to really play with that we have
13116
09:58:23,680 --> 09:58:28,959
a size of it printed out we have a size
13117
09:58:26,800 --> 09:58:30,720
of our pointers printed out and we're
13118
09:58:28,959 --> 09:58:32,639
going to compare these things when we
13119
09:58:30,720 --> 09:58:33,756
get to visual studio code in a minute
13120
09:58:32,639 --> 09:58:36,479
and you're going to see that all
13121
09:58:33,756 --> 09:58:39,200
pointers are of the same size a question
13122
09:58:36,480 --> 09:58:42,080
i get from many people is if the
13123
09:58:42,080 --> 09:58:47,276
really matters and i have to break it to
13124
09:58:44,319 --> 09:58:49,275
you it doesn't but i prefer to put it on
13125
09:58:47,275 --> 09:58:51,680
the left some people prefer to put it on
13126
09:58:49,275 --> 09:58:53,680
the right but definitely don't put it in
13127
09:58:51,680 --> 09:58:55,756
the middle i've never seen anybody do
13128
09:58:53,680 --> 09:58:58,559
this but it's going to work it's going
13129
09:58:55,756 --> 09:59:00,239
to be legal c plus plus code another
13130
09:58:58,559 --> 09:59:03,119
thing i see people do which is really
13131
09:59:00,239 --> 09:59:05,680
confusing is to declare your pointers on
13132
09:59:03,120 --> 09:59:08,400
the same line and do a comma like this
13133
09:59:05,680 --> 09:59:11,595
this is really going to be confusing and
13134
09:59:08,400 --> 09:59:15,120
now i want you to guess and see what is
13135
09:59:11,595 --> 09:59:17,915
happening here is either it var a
13136
09:59:15,120 --> 09:59:19,520
pointer or it's a regular end i want you
13137
09:59:17,915 --> 09:59:21,519
to keep this in mind i'm not going to
13138
09:59:19,519 --> 09:59:23,595
tell you we're going to try this out
13139
09:59:21,519 --> 09:59:25,680
actually in visual studio code and we're
13140
09:59:23,595 --> 09:59:27,680
going to figure this out together but
13141
09:59:25,680 --> 09:59:29,275
now i want you to try and think about it
13142
09:59:27,680 --> 09:59:31,275
we're going to leave this question
13143
09:59:29,275 --> 09:59:33,680
unanswered and we're going to answer it
13144
09:59:31,275 --> 09:59:35,756
in a little while but for now
13145
09:59:33,680 --> 09:59:37,840
don't really do this because it's
13146
09:59:35,756 --> 09:59:40,160
confusing and it's going to make your
13147
09:59:37,839 --> 09:59:42,000
code less readable if you have to do
13148
09:59:40,160 --> 09:59:44,160
something like this make sure you just
13149
09:59:42,000 --> 09:59:46,480
put them on different lines and it's not
13150
09:59:44,160 --> 09:59:48,320
going to be confusing for example if you
13151
09:59:46,480 --> 09:59:50,480
look down here you're going to know that
13152
09:59:48,319 --> 09:59:52,959
p number seven is a pointer other
13153
09:59:50,480 --> 09:59:55,756
interval is a regular end and there is
13154
09:59:52,959 --> 09:59:57,839
no room for confusion this time use code
13155
09:59:55,756 --> 10:00:00,800
like this and don't put things on the
13156
09:59:57,839 --> 10:00:02,959
same line like we have on top here okay
13157
10:00:00,800 --> 10:00:06,319
now we have seen that we can declare and
13158
10:00:02,959 --> 10:00:09,275
initialize pointers with null pointer
13159
10:00:06,319 --> 10:00:12,000
now is the time to see how we can put
13160
10:00:09,275 --> 10:00:13,915
actual data in those pointer variables
13161
10:00:12,000 --> 10:00:17,120
here we have a variable which is called
13162
10:00:13,915 --> 10:00:18,559
into var it is of type and and its value
13163
10:00:18,559 --> 10:00:23,040
we can also set up another pointer
13164
10:00:25,275 --> 10:00:31,680
underscore int and we can initialize it
13165
10:00:28,559 --> 10:00:34,000
with the address of another variable and
13166
10:00:31,680 --> 10:00:37,120
here is a new operator we haven't seen
13167
10:00:34,000 --> 10:00:39,595
before this ampersand variable here
13168
10:00:37,120 --> 10:00:41,360
really means the address of this ant
13169
10:00:39,595 --> 10:00:43,595
variable that's what we mean here so
13170
10:00:41,360 --> 10:00:46,319
we're going to initialize this p end
13171
10:00:43,595 --> 10:00:48,559
variable with the address of enter
13172
10:00:46,319 --> 10:00:50,720
variable and this is how we do it
13173
10:00:48,559 --> 10:00:52,239
if we go down here we print antivirus
13174
10:00:50,720 --> 10:00:55,275
we're going to get the value printed
13175
10:00:52,239 --> 10:00:57,199
down if we print the pointer directly
13176
10:00:55,275 --> 10:00:59,519
we're going to get the address of this
13177
10:00:57,199 --> 10:01:01,595
little guy printed out on the console
13178
10:00:59,519 --> 10:01:03,680
and we're going to see it okay so this
13179
10:01:01,595 --> 10:01:05,519
is how you can store things in your
13180
10:01:03,680 --> 10:01:08,080
pointer variables and what you have to
13181
10:01:05,519 --> 10:01:09,435
store and has to be an address of
13182
10:01:09,436 --> 10:01:13,120
down here you see we have another
13183
10:01:10,800 --> 10:01:16,560
variable called into r1 inside we have a
13184
10:01:13,120 --> 10:01:19,200
65 and if you go down here you see that
13185
10:01:16,559 --> 10:01:21,915
we are storing something else
13186
10:01:19,199 --> 10:01:24,399
in our point of variable here we had in
13187
10:01:21,915 --> 10:01:27,435
the address of into var now we are
13188
10:01:24,400 --> 10:01:29,916
putting in the address of into var1
13189
10:01:27,436 --> 10:01:32,080
using an assignment operator and this is
13190
10:01:29,915 --> 10:01:34,639
something you can definitely do it's
13191
10:01:32,080 --> 10:01:36,400
legal c plus plus it's going to work if
13192
10:01:34,639 --> 10:01:38,639
we print it out we're going to get a
13193
10:01:36,400 --> 10:01:41,200
different address printed out this is
13194
10:01:38,639 --> 10:01:44,159
how you can store values in your pointer
13195
10:01:41,199 --> 10:01:46,799
variables again you can't cross a sign
13196
10:01:44,160 --> 10:01:48,840
before different pointer types here we
13197
10:01:46,800 --> 10:01:51,360
have an eight pointer which is called
13198
10:01:48,839 --> 10:01:53,755
pn1 and we have a double variable it's
13199
10:01:51,360 --> 10:01:56,879
called double var we can't take the
13200
10:01:53,756 --> 10:01:59,200
address of double var and store that in
13201
10:01:56,879 --> 10:02:01,915
pnt1 this is going to be a compiler
13202
10:01:59,199 --> 10:02:05,680
error the variables whose addresses you
13203
10:02:01,915 --> 10:02:07,839
store in payment 1 have to be of type
13204
10:02:05,680 --> 10:02:10,559
and again the basic idea is that a
13205
10:02:07,839 --> 10:02:12,959
pointer is really a special kind of
13206
10:02:10,559 --> 10:02:15,839
variable that is going to store
13207
10:02:12,959 --> 10:02:18,479
addresses to other variables and if your
13208
10:02:18,480 --> 10:02:23,756
the variables whose addresses you can
13209
10:02:20,720 --> 10:02:26,400
store in this pointer to end can only be
13210
10:02:23,756 --> 10:02:27,595
ends if you try and put in doubles
13211
10:02:26,400 --> 10:02:29,520
you're going to be in trouble you're
13212
10:02:27,595 --> 10:02:31,519
going to get a compiler error and it's
13213
10:02:29,519 --> 10:02:33,595
not going to work now we're going to
13214
10:02:31,519 --> 10:02:36,239
head over to visual studio code and
13215
10:02:33,595 --> 10:02:39,360
actually play with these things here we
13216
10:02:36,239 --> 10:02:41,756
are in our working directory the current
13217
10:02:39,360 --> 10:02:43,915
chapter is pointers the current lecture
13218
10:02:41,756 --> 10:02:46,160
is declaring and using pointers we're
13219
10:02:43,915 --> 10:02:48,000
going to grab our template files and put
13220
10:02:48,000 --> 10:02:52,720
so put them in our project here and
13221
10:02:51,120 --> 10:02:54,400
we're going to open this in visual
13222
10:02:52,720 --> 10:02:56,559
studio code the first thing we're going
13223
10:02:56,559 --> 10:03:00,799
and initialize pointers and we're going
13224
10:02:58,800 --> 10:03:02,720
to use a pointer to end as a first
13225
10:03:00,800 --> 10:03:05,200
example we're going to set up an inch
13226
10:03:02,720 --> 10:03:06,480
pointer and we say in store we're going
13227
10:03:05,199 --> 10:03:09,199
to give it a name we're going to call
13228
10:03:06,480 --> 10:03:11,840
this p number and you can leave it like
13229
10:03:09,199 --> 10:03:14,159
this uninitialized but it is really
13230
10:03:11,839 --> 10:03:16,559
advised to always initialize your
13231
10:03:14,160 --> 10:03:19,276
pointers so we're going to do that with
13232
10:03:16,559 --> 10:03:21,839
a brist initializer which is going to do
13233
10:03:19,275 --> 10:03:24,239
that for us this is going to implicitly
13234
10:03:21,839 --> 10:03:26,399
initialize it with zero equivalent of
13235
10:03:24,239 --> 10:03:29,680
pointers and that happens to be null
13236
10:03:26,400 --> 10:03:31,360
pointer so we'll initialize okay so this
13237
10:03:29,680 --> 10:03:32,080
is what we're going to initialize with
13238
10:03:34,720 --> 10:03:39,680
and this is how you should do things you
13239
10:03:37,436 --> 10:03:41,520
can also do a pointer to double why not
13240
10:03:39,680 --> 10:03:44,080
let's do double pointer and we're going
13241
10:03:41,519 --> 10:03:45,915
to say fractional number pointer to
13242
10:03:44,080 --> 10:03:48,959
fractional number and we can also
13243
10:03:45,915 --> 10:03:50,399
initialize this with null pointer
13244
10:03:51,275 --> 10:03:57,119
once you do this the program is going to
13245
10:03:53,199 --> 10:03:59,275
be legal if we try to world at with gcc
13246
10:03:57,120 --> 10:04:01,436
like we always do the build is going to
13247
10:03:59,275 --> 10:04:03,680
be good but we don't really have any
13248
10:04:03,680 --> 10:04:07,680
if we run this program we are just
13249
10:04:05,595 --> 10:04:10,720
getting started we will get to see
13250
10:04:07,680 --> 10:04:13,680
things later for now just understand
13251
10:04:10,720 --> 10:04:16,400
that p number is a variable we have in
13252
10:04:13,680 --> 10:04:19,360
our code this variable can only store
13253
10:04:16,400 --> 10:04:22,800
addresses to other variables that happen
13254
10:04:19,360 --> 10:04:25,436
to be of type and if you try and store
13255
10:04:22,800 --> 10:04:27,916
in an address of a variable which is of
13256
10:04:25,436 --> 10:04:29,200
type double for example or flute you're
13257
10:04:27,915 --> 10:04:31,435
going to get a compiler error you
13258
10:04:29,199 --> 10:04:34,079
shouldn't do that the same for p
13259
10:04:31,436 --> 10:04:36,880
fractional number it can only store
13260
10:04:34,080 --> 10:04:39,596
addresses to other variables which
13261
10:04:36,879 --> 10:04:41,435
happen to be of type double keep this in
13262
10:04:41,436 --> 10:04:47,120
explicitly initialize with no pointer so
13263
10:04:44,319 --> 10:04:49,199
we can say end pointer and say p number
13264
10:04:47,120 --> 10:04:51,520
one why not and we're going to
13265
10:04:51,519 --> 10:04:56,479
ptr like this and this is going to work
13266
10:04:59,756 --> 10:05:05,120
one why not and say now pqr this is
13267
10:05:03,436 --> 10:05:06,720
going to work this is something you can
13268
10:05:05,120 --> 10:05:08,720
do you're going to see that if we
13269
10:05:06,720 --> 10:05:11,756
compile this the compiler is going to be
13270
10:05:08,720 --> 10:05:13,360
happy with this the world is good okay
13271
10:05:11,756 --> 10:05:15,360
now you know how you can declare and
13272
10:05:13,360 --> 10:05:16,080
initialize your pointers now we want to
13273
10:05:16,080 --> 10:05:21,120
that pointers to different variables are
13274
10:05:21,120 --> 10:05:25,840
on whatever system you are working on
13275
10:05:23,595 --> 10:05:28,479
it's not consistent across operating
13276
10:05:25,839 --> 10:05:31,359
systems or riffing systems but it is
13277
10:05:28,480 --> 10:05:32,560
guaranteed to be of the same size on the
13278
10:05:32,559 --> 10:05:36,799
i am going to go down and put in a piece
13279
10:05:34,879 --> 10:05:39,040
of code that is going to show us all
13280
10:05:36,800 --> 10:05:41,276
these things on the console and i am
13281
10:05:39,040 --> 10:05:43,040
going to click on this file icon here
13282
10:05:43,040 --> 10:05:46,959
some breathing room so that we can see
13283
10:05:45,040 --> 10:05:48,959
the entire thing here if you look here
13284
10:05:46,959 --> 10:05:51,595
we are printing the size of ant we know
13285
10:05:48,959 --> 10:05:53,519
that this is going to be a four
13286
10:05:51,595 --> 10:05:55,915
size of double this is going to be an
13287
10:05:53,519 --> 10:05:58,239
eight on our system here but we don't
13288
10:05:55,915 --> 10:06:00,799
know what the size of a double pointer
13289
10:05:58,239 --> 10:06:03,119
is or the size of an end pointer and
13290
10:06:00,800 --> 10:06:04,960
we're going to see that in a minute here
13291
10:06:03,120 --> 10:06:06,880
you see that we are also using the
13292
10:06:04,959 --> 10:06:08,959
pointer variables immediately this is
13293
10:06:06,879 --> 10:06:11,275
something you can do you see that visual
13294
10:06:08,959 --> 10:06:14,799
studio code is not complaining and we
13295
10:06:11,275 --> 10:06:16,400
can go on top here and boulder with gcc
13296
10:06:16,400 --> 10:06:21,680
the world is going to be good now we can
13297
10:06:19,360 --> 10:06:23,520
open up a terminal and actually run this
13298
10:06:21,680 --> 10:06:24,800
program here we're going to clear if we
13299
10:06:27,756 --> 10:06:32,239
our directory here so you see that we
13300
10:06:32,239 --> 10:06:35,519
and we can run this and it's going to
13301
10:06:35,519 --> 10:06:39,680
sizeofant is four size of double is
13302
10:06:39,680 --> 10:06:47,120
this is expected but pointer types are
13303
10:06:43,360 --> 10:06:49,915
of size 8 on my system they occupy 8
13304
10:06:47,120 --> 10:06:52,400
bytes in memory so it doesn't matter the
13305
10:06:49,915 --> 10:06:55,435
type we are pointing to a pointer to it
13306
10:06:52,400 --> 10:06:57,756
is always going to be 8 bytes in memory
13307
10:06:55,436 --> 10:06:59,756
this is something you should really know
13308
10:06:57,756 --> 10:07:01,916
and keep in your mind another thing we
13309
10:06:59,756 --> 10:07:02,959
have said that i want to play with right
13310
10:07:02,959 --> 10:07:07,040
is the location of the star symbol some
13311
10:07:05,275 --> 10:07:08,639
people say you should put it on the left
13312
10:07:07,040 --> 10:07:11,360
some people say you should put it to the
13313
10:07:08,639 --> 10:07:13,519
right i don't really think any of these
13314
10:07:11,360 --> 10:07:15,360
dense matters i prefer to put it to the
13315
10:07:13,519 --> 10:07:17,839
left but if you put it to the right it's
13316
10:07:15,360 --> 10:07:19,436
also possible it's going to work you see
13317
10:07:17,839 --> 10:07:21,359
that even if you put it in the middle
13318
10:07:19,436 --> 10:07:23,756
here which is really crazy the compiler
13319
10:07:21,360 --> 10:07:25,520
is going to take this we can run the
13320
10:07:23,756 --> 10:07:27,120
task to build this to make sure the
13321
10:07:25,519 --> 10:07:29,039
compiler is really happy and you see
13322
10:07:27,120 --> 10:07:31,200
that there's no problem the compiler is
13323
10:07:29,040 --> 10:07:34,000
going to accept this and we are going to
13324
10:07:31,199 --> 10:07:36,479
build successfully if you put your
13325
10:07:34,000 --> 10:07:39,199
declaration on a single line like this
13326
10:07:36,480 --> 10:07:41,436
what is other ant var going to be is it
13327
10:07:39,199 --> 10:07:43,755
going to be a regular end variable is it
13328
10:07:41,436 --> 10:07:45,756
going to be a pointer to end
13329
10:07:43,756 --> 10:07:47,680
we don't really know now and i don't
13330
10:07:45,756 --> 10:07:49,436
want to tell you we're going to find out
13331
10:07:47,680 --> 10:07:52,080
together so what we're going to do we're
13332
10:07:49,436 --> 10:07:54,000
going to print the size of these things
13333
10:07:52,080 --> 10:07:56,319
i am going to go down here and put in
13334
10:07:54,000 --> 10:07:59,199
the code and come back in a minute here
13335
10:07:56,319 --> 10:08:01,839
is our code typed out and we're going to
13336
10:07:59,199 --> 10:08:04,239
see the size of these things what we're
13337
10:08:01,839 --> 10:08:07,519
going to do is run the task to build
13338
10:08:04,239 --> 10:08:08,799
with gcc as we always do let's clear
13339
10:08:10,720 --> 10:08:15,595
and you see size of p number five is
13340
10:08:15,595 --> 10:08:20,879
because it's a pointer size of either
13341
10:08:17,756 --> 10:08:22,639
end is four and the same applies to the
13342
10:08:22,639 --> 10:08:28,000
so from this we can tell that other
13343
10:08:24,639 --> 10:08:30,639
interval and other ant versus x are not
13344
10:08:28,000 --> 10:08:34,559
pointers they are regular integers and
13345
10:08:30,639 --> 10:08:37,519
this can be really confusing so to avoid
13346
10:08:34,559 --> 10:08:38,559
this confusion i would advise not to
13347
10:08:38,559 --> 10:08:42,239
your thanks when you have pointers
13348
10:08:40,480 --> 10:08:44,560
inside like this because that's going to
13349
10:08:42,239 --> 10:08:46,559
be really confusing what you can do is
13350
10:08:44,559 --> 10:08:49,040
put them on separate lines and do
13351
10:08:46,559 --> 10:08:51,595
something like this so here it is very
13352
10:08:49,040 --> 10:08:54,000
clear that p number seven is a pointer
13353
10:08:51,595 --> 10:08:55,915
other eight var seven is a regular it
13354
10:08:54,000 --> 10:08:58,959
variable and there is no room for
13355
10:08:55,915 --> 10:09:00,639
confusion with this way of doing that so
13356
10:08:58,959 --> 10:09:02,479
make sure you put things on separate
13357
10:09:00,639 --> 10:09:05,199
lines like this and you're going to be
13358
10:09:02,480 --> 10:09:07,436
fine now what i want you to see is that
13359
10:09:05,199 --> 10:09:10,239
we can actually store data in all
13360
10:09:07,436 --> 10:09:12,400
pointers i mean valid data that is not
13361
10:09:10,239 --> 10:09:14,720
null pointer in this case we're going to
13362
10:09:12,400 --> 10:09:17,275
set up a variable a regular end variable
13363
10:09:14,720 --> 10:09:19,200
it's going to store a 43 inside and
13364
10:09:17,275 --> 10:09:22,239
we're going to set up another pointer
13365
10:09:19,199 --> 10:09:24,639
and initialize that with the address of
13366
10:09:22,239 --> 10:09:27,360
this it variable and this is going to
13367
10:09:24,639 --> 10:09:29,199
work properly what we can do now
13368
10:09:27,360 --> 10:09:31,360
is print the interval we're going to
13369
10:09:29,199 --> 10:09:33,519
print it out if we try to print the
13370
10:09:31,360 --> 10:09:36,480
pointer we're going to get the address
13371
10:09:33,519 --> 10:09:38,559
of this into var in memory and this is
13372
10:09:36,480 --> 10:09:40,400
something you need to see with your eyes
13373
10:09:38,559 --> 10:09:42,639
this is the first time we are printing
13374
10:09:40,400 --> 10:09:44,720
out an address that is stored in a
13375
10:09:42,639 --> 10:09:46,879
pointer and we're going to see that on
13376
10:09:44,720 --> 10:09:49,200
the console here what i am going to do
13377
10:09:46,879 --> 10:09:50,879
before we build and run this i am going
13378
10:09:49,199 --> 10:09:53,119
to comment out everything we've done
13379
10:09:50,879 --> 10:09:54,319
before because our console is now
13380
10:09:54,319 --> 10:10:01,519
so let's come and comment out everything
13381
10:09:58,959 --> 10:10:03,360
and let's go down again now if we print
13382
10:10:01,519 --> 10:10:07,119
we're going to see these two statements
13383
10:10:03,360 --> 10:10:09,595
and that's going to be easier to follow
13384
10:10:07,120 --> 10:10:11,200
on the console here the build is good so
13385
10:10:13,275 --> 10:10:18,720
and the var is 43 and its address in
13386
10:10:16,080 --> 10:10:21,360
memory is this number here it is in
13387
10:10:18,720 --> 10:10:24,400
hexadecimal so this is the address in
13388
10:10:21,360 --> 10:10:26,639
memory and we can print that out and see
13389
10:10:24,400 --> 10:10:29,120
what it is okay so this is really cool
13390
10:10:26,639 --> 10:10:31,275
but we can also change what is stored in
13391
10:10:29,120 --> 10:10:34,240
our pointer here for example we can set
13392
10:10:31,275 --> 10:10:37,756
up another variable call it into our one
13393
10:10:34,239 --> 10:10:40,319
and uh change pnt which is a pointer to
13394
10:10:37,756 --> 10:10:42,880
contain the address of this new variable
13395
10:10:40,319 --> 10:10:44,879
and we can do that now if we print
13396
10:10:42,879 --> 10:10:46,799
payment we're going to see that it
13397
10:10:44,879 --> 10:10:48,239
contains a different address and we can
13398
10:10:48,239 --> 10:10:53,275
so let's build with gcc again
13399
10:10:51,275 --> 10:10:55,360
we're going to go down and clear and run
13400
10:10:53,275 --> 10:10:57,519
rooster and we're going to see that now
13401
10:10:55,360 --> 10:11:01,756
we have a different address the one we
13402
10:10:57,519 --> 10:11:04,239
had ended in d e4 now we end in de0
13403
10:11:01,756 --> 10:11:06,559
these are different addresses and we are
13404
10:11:04,239 --> 10:11:08,239
storing different things in our pointer
13405
10:11:06,559 --> 10:11:10,559
this is really cool you can do something
13406
10:11:08,239 --> 10:11:14,000
like this and the next thing we want to
13407
10:11:10,559 --> 10:11:16,959
see now is that we can't cross a sign
13408
10:11:14,000 --> 10:11:19,275
between pointers of different types and
13409
10:11:16,959 --> 10:11:21,839
what i mean here is that for example if
13410
10:11:19,275 --> 10:11:24,479
we have two variables here one is a
13411
10:11:21,839 --> 10:11:26,639
pointer to end it is initialized with no
13412
10:11:24,480 --> 10:11:28,560
pointer and we have another variable
13413
10:11:26,639 --> 10:11:30,000
which is a double var it's going to be
13414
10:11:30,000 --> 10:11:37,360
and we can't do something like payment
13415
10:11:33,915 --> 10:11:38,959
equals address of double bar you can't
13416
10:11:37,360 --> 10:11:40,879
do something like this if you do it
13417
10:11:38,959 --> 10:11:43,436
you're going to get a compiler error and
13418
10:11:40,879 --> 10:11:45,360
you see that we have squiggly lines
13419
10:11:43,436 --> 10:11:47,596
in visual studio code this is a good
13420
10:11:45,360 --> 10:11:49,915
indication that something might be wrong
13421
10:11:47,595 --> 10:11:52,559
if we open the problems tab we're going
13422
10:11:49,915 --> 10:11:54,799
to say a value of double pointer cannot
13423
10:11:52,559 --> 10:11:57,839
be assigned to an entity of type 8
13424
10:11:54,800 --> 10:11:59,436
pointer so this is not something you can
13425
10:11:57,839 --> 10:12:02,559
do if you do this you're going to get a
13426
10:11:59,436 --> 10:12:05,275
compiler error be aware of this visual
13427
10:12:02,559 --> 10:12:07,435
studio code has warned us enough but we
13428
10:12:07,436 --> 10:12:12,720
a clear compiler error by building this
13429
10:12:10,239 --> 10:12:14,879
with gcc and we're going to get
13430
10:12:12,720 --> 10:12:16,800
basically the same thing you can't
13431
10:12:14,879 --> 10:12:20,239
cross-assign between pointers of
13432
10:12:16,800 --> 10:12:22,000
different types we are trying to assign
13433
10:12:22,000 --> 10:12:26,639
into a pointer to enter and this is not
13434
10:12:24,239 --> 10:12:28,319
going to work so let's comment this out
13435
10:12:26,639 --> 10:12:31,199
because we don't want this compiler
13436
10:12:28,319 --> 10:12:33,436
error now you know this and before we
13437
10:12:31,199 --> 10:12:36,239
close this lecture i want to mention
13438
10:12:33,436 --> 10:12:39,520
what is called the referencing and that
13439
10:12:36,239 --> 10:12:41,680
is the act of reading something
13440
10:12:39,519 --> 10:12:43,680
through a pointer so if we have an
13441
10:12:41,680 --> 10:12:46,480
address in a pointer we can go through
13442
10:12:43,680 --> 10:12:48,800
that address and actually read the value
13443
10:12:46,480 --> 10:12:51,040
contained in that address and we can do
13444
10:12:48,800 --> 10:12:54,160
something like this so if we have for
13445
10:12:51,040 --> 10:12:57,275
example an end pointer let's call it p
13446
10:12:54,160 --> 10:12:59,436
and two do we have a variable like this
13447
10:12:57,275 --> 10:13:02,479
so let's say we initialize this with
13448
10:12:59,436 --> 10:13:06,400
nodepointer and we have an end
13449
10:13:02,480 --> 10:13:09,436
variable and this is a 56 for example
13450
10:13:06,400 --> 10:13:12,400
and we do something like we do say
13451
10:13:09,436 --> 10:13:14,560
pnt2 we're going to make it contain the
13452
10:13:12,400 --> 10:13:16,959
address of int data this is something
13453
10:13:14,559 --> 10:13:19,680
you know you can do now now we want to
13454
10:13:16,959 --> 10:13:23,199
go through pm to 2 to read what is
13455
10:13:19,680 --> 10:13:26,400
contained in interdata because pn 2
13456
10:13:23,199 --> 10:13:29,915
contains the address of our integer here
13457
10:13:26,400 --> 10:13:32,560
so what we can do we can do stdc out and
13458
10:13:29,915 --> 10:13:35,040
say value and the syntax we use in c
13459
10:13:32,559 --> 10:13:37,119
plus plus is like this we say store and
13460
10:13:35,040 --> 10:13:40,160
we say our pointer variable we're going
13461
10:13:37,120 --> 10:13:42,639
to say pnt2 and now if we run we're
13462
10:13:40,160 --> 10:13:44,560
going to get the value here printed out
13463
10:13:42,639 --> 10:13:48,319
okay now if we try to build we're going
13464
10:13:44,559 --> 10:13:49,839
to build fine let's try with gcc
13465
10:13:53,519 --> 10:13:59,680
a previous run are cleared out
13466
10:13:56,800 --> 10:14:01,200
you see the bullet is good we can now
13467
10:14:01,199 --> 10:14:05,119
and we're going to see that value is 56
13468
10:14:05,120 --> 10:14:10,240
reading the value stored in the address
13469
10:14:07,680 --> 10:14:12,959
pointed to by our pointer here and this
13470
10:14:10,239 --> 10:14:14,799
is the syntax used and this is called
13471
10:14:12,959 --> 10:14:17,436
the referencing a pointer we are
13472
10:14:14,800 --> 10:14:19,360
basically reading something stored in
13473
10:14:17,436 --> 10:14:21,520
the address of a pointer this is what we
13474
10:14:19,360 --> 10:14:23,275
mean here this is really all we set out
13475
10:14:21,519 --> 10:14:26,399
to do in this lecture the lecture turned
13476
10:14:23,275 --> 10:14:29,199
out to be lengthy but we had a lot of
13477
10:14:26,400 --> 10:14:31,680
ground to cover and now i hope you have
13478
10:14:29,199 --> 10:14:34,479
a good grasp on how to declare
13479
10:14:31,680 --> 10:14:36,559
initialize and use your pointers to do
13480
10:14:36,559 --> 10:14:40,159
we are going to stop here in this
13481
10:14:38,239 --> 10:14:42,479
lecture in the next one we're going to
13482
10:14:40,160 --> 10:14:45,040
learn a little more about pointer to
13483
10:14:42,480 --> 10:14:46,160
character types because they are also
13484
10:14:46,160 --> 10:14:50,560
go ahead and finish up here and meet me
13485
10:14:48,480 --> 10:14:53,596
there in this lecture we're going to
13486
10:14:50,559 --> 10:14:55,756
explore pointer to characters
13487
10:14:53,595 --> 10:14:58,159
and you can declare a pointer to a
13488
10:14:55,756 --> 10:14:59,200
character just like this we have car
13489
10:14:59,199 --> 10:15:04,239
and we say p carvar to give it a
13490
10:15:02,080 --> 10:15:06,880
variable name we initialize this with a
13491
10:15:04,239 --> 10:15:09,360
null pointer and after that we set up a
13492
10:15:06,879 --> 10:15:12,879
character variable and it is called
13493
10:15:09,360 --> 10:15:16,400
corvar and we store in an a in uppercase
13494
10:15:12,879 --> 10:15:19,275
a after that we take the address of car
13495
10:15:16,400 --> 10:15:21,680
of r and assign that to our pointer
13496
10:15:19,275 --> 10:15:23,915
variable this is how we store data in a
13497
10:15:21,680 --> 10:15:26,720
pointer and we can go through this
13498
10:15:23,915 --> 10:15:28,879
pointer to access data in this character
13499
10:15:26,720 --> 10:15:30,880
variable if we do something like this
13500
10:15:28,879 --> 10:15:33,360
we're going to print a down here we
13501
10:15:30,879 --> 10:15:34,879
declare another variable we store in a c
13502
10:15:34,879 --> 10:15:40,479
assign the address of this new character
13503
10:15:37,756 --> 10:15:42,959
variable to our pointer variable and if
13504
10:15:40,480 --> 10:15:45,040
we print this again we're going to get a
13505
10:15:42,959 --> 10:15:46,720
c printed out this is really what we
13506
10:15:45,040 --> 10:15:48,720
have done in the last lecture we are
13507
10:15:46,720 --> 10:15:51,120
just extending that to character
13508
10:15:48,720 --> 10:15:53,520
pointers but with character pointers you
13509
10:15:51,120 --> 10:15:55,200
can do something really special what you
13510
10:15:53,519 --> 10:15:58,000
can do that is special you can
13511
10:15:55,199 --> 10:16:00,159
initialize that with a string literal
13512
10:15:58,000 --> 10:16:03,040
something like hello world which is
13513
10:16:00,160 --> 10:16:05,040
wrapped in quotes like this when you do
13514
10:16:03,040 --> 10:16:07,840
something like this the string here is
13515
10:16:05,040 --> 10:16:11,040
going to be expanded into a character
13516
10:16:07,839 --> 10:16:14,079
array and the first character of our
13517
10:16:11,040 --> 10:16:16,800
array is going to be pointed to by p
13518
10:16:14,080 --> 10:16:18,880
message here this is what we mean i
13519
10:16:16,800 --> 10:16:21,436
realize i might be throwing a lot of
13520
10:16:18,879 --> 10:16:23,755
things at you right now i am mixing up
13521
10:16:21,436 --> 10:16:25,916
arrays and pointers but they have a
13522
10:16:23,756 --> 10:16:28,000
really strong relationship and we're
13523
10:16:25,915 --> 10:16:30,639
going to learn about that in detail in a
13524
10:16:30,639 --> 10:16:34,879
think of it like this this hello world
13525
10:16:33,199 --> 10:16:37,595
string is going to be turned into a
13526
10:16:34,879 --> 10:16:40,239
character array and the p message is
13527
10:16:37,595 --> 10:16:42,399
going to point to the first character
13528
10:16:40,239 --> 10:16:44,400
in this array here this is what is going
13529
10:16:42,400 --> 10:16:46,480
to happen and this is going to give us
13530
10:16:44,400 --> 10:16:49,840
the flexibility of treating our
13531
10:16:46,480 --> 10:16:51,756
strengths as character pointers and this
13532
10:16:49,839 --> 10:16:52,959
is going to come in handy at many
13533
10:16:52,959 --> 10:16:57,199
one thing i should tell you though is
13534
10:16:54,800 --> 10:17:00,080
that some compilers will refuse to
13535
10:16:57,199 --> 10:17:02,559
compile this code for example visual
13536
10:17:00,080 --> 10:17:04,720
studio 19 that i have installed on my
13537
10:17:02,559 --> 10:17:07,199
computer right now is going to refuse to
13538
10:17:04,720 --> 10:17:09,360
compile this code and the reason is the
13539
10:17:07,199 --> 10:17:11,119
compiler is going to expand this
13540
10:17:11,120 --> 10:17:17,756
a character array of const car
13541
10:17:14,959 --> 10:17:20,559
and here what we are using to point to
13542
10:17:17,756 --> 10:17:23,756
that is not a cost car pointer
13543
10:17:20,559 --> 10:17:27,040
so this pointer here can be used to try
13544
10:17:23,756 --> 10:17:29,120
and modify data into an array of cost
13545
10:17:27,040 --> 10:17:31,360
cars and that's going to be disastrous
13546
10:17:29,120 --> 10:17:33,200
because if you try to modify that
13547
10:17:31,360 --> 10:17:35,199
that's going to fail and that's not
13548
10:17:33,199 --> 10:17:37,755
going to be good so some compilers are
13549
10:17:35,199 --> 10:17:41,275
going to try and protect you from this
13550
10:17:37,756 --> 10:17:43,756
and force you to use pointers that are
13551
10:17:41,275 --> 10:17:46,319
qualified with cost to really mean that
13552
10:17:43,756 --> 10:17:48,239
they are closed car pointers and to get
13553
10:17:46,319 --> 10:17:49,839
the code to work we will have to do that
13554
10:17:48,239 --> 10:17:52,000
and i will show you how we do that in
13555
10:17:49,839 --> 10:17:54,319
visual studio code but i have to tell
13556
10:17:52,000 --> 10:17:56,639
you this in case you just want to jump
13557
10:17:54,319 --> 10:17:58,639
ahead and try this code out if you get a
13558
10:17:56,639 --> 10:18:00,479
compiler error that's going to be the
13559
10:17:58,639 --> 10:18:02,400
reason now that we have our strength
13560
10:18:00,480 --> 10:18:04,800
stored in memory we can really print it
13561
10:18:02,400 --> 10:18:06,400
out like this if you print p message
13562
10:18:04,800 --> 10:18:09,040
you're going to get this ring printed
13563
10:18:06,400 --> 10:18:09,916
out but i want to give you a question
13564
10:18:09,915 --> 10:18:14,959
what do you think we will get if we
13565
10:18:16,720 --> 10:18:21,840
i told you that the compiler is going to
13566
10:18:19,120 --> 10:18:25,120
expand this hello world string into an
13567
10:18:21,839 --> 10:18:27,435
array of characters or to be specific an
13568
10:18:27,436 --> 10:18:31,680
and p message is going to be pointing to
13569
10:18:33,360 --> 10:18:38,480
so if we dereference p message we're
13570
10:18:36,480 --> 10:18:40,960
going to get that character printed out
13571
10:18:38,480 --> 10:18:42,640
in this case we will get an h and that's
13572
10:18:40,959 --> 10:18:45,756
what is going to happen here but
13573
10:18:42,639 --> 10:18:48,400
character pointers are special in that
13574
10:18:45,756 --> 10:18:51,120
if you print them out directory the
13575
10:18:48,400 --> 10:18:53,840
compiler is going to do its magic and
13576
10:18:51,120 --> 10:18:56,639
make it possible to print out the entire
13577
10:18:53,839 --> 10:18:58,799
string that is stored in p message here
13578
10:18:56,639 --> 10:19:00,800
that's how character pointers are
13579
10:18:58,800 --> 10:19:02,639
special and you really need to be aware
13580
10:19:00,800 --> 10:19:06,400
of this because this is going to come in
13581
10:19:02,639 --> 10:19:08,639
handy many times just to emphasize that
13582
10:19:06,400 --> 10:19:11,520
this is going to be expanded into an
13583
10:19:08,639 --> 10:19:12,800
array of constant characters if we try
13584
10:19:12,800 --> 10:19:18,400
something inside p message here for
13585
10:19:15,199 --> 10:19:20,879
example we try to change the h into a b
13586
10:19:18,400 --> 10:19:23,436
we can try to do that because p message
13587
10:19:20,879 --> 10:19:26,319
is pointing to the first character so we
13588
10:19:23,436 --> 10:19:28,959
can try to dereference and assign a new
13589
10:19:26,319 --> 10:19:31,199
value and if we do that we're going to
13590
10:19:28,959 --> 10:19:34,080
get a compiler arrow or even worse we
13591
10:19:31,199 --> 10:19:36,399
might get a crash at run time so this is
13592
10:19:34,080 --> 10:19:38,160
something you shouldn't really do and
13593
10:19:38,160 --> 10:19:43,120
your p message here as the cost card
13594
10:19:41,040 --> 10:19:45,040
pointer and that's going to prevent you
13595
10:19:43,120 --> 10:19:47,520
from doing things like this which may
13596
10:19:45,040 --> 10:19:50,319
turn out to be very bad but most
13597
10:19:47,519 --> 10:19:52,959
compilers are going to even prevent you
13598
10:19:50,319 --> 10:19:55,360
from compiling this thing in modern
13599
10:19:52,959 --> 10:19:57,120
times for example if you are using a
13600
10:19:57,120 --> 10:20:02,639
of visual studio you're going to get a
13601
10:19:59,680 --> 10:20:04,959
compiler error but i don't believe gcc
13602
10:20:02,639 --> 10:20:07,275
is going to give us a compiler error so
13603
10:20:04,959 --> 10:20:10,239
we will have to try this out and see how
13604
10:20:07,275 --> 10:20:12,400
it behaves but the message is if you
13605
10:20:10,239 --> 10:20:15,040
have to do something like this make sure
13606
10:20:12,400 --> 10:20:17,200
you use the cost car pointer and you're
13607
10:20:15,040 --> 10:20:19,595
going to be playing on the safe side
13608
10:20:17,199 --> 10:20:21,915
okay now i think you know enough about
13609
10:20:19,595 --> 10:20:24,799
character pointers what if we want our
13610
10:20:21,915 --> 10:20:26,559
users to be able to change this string
13611
10:20:24,800 --> 10:20:28,880
and make it be something else for
13612
10:20:26,559 --> 10:20:31,680
example change the first character here
13613
10:20:28,879 --> 10:20:34,719
into a b well in that case don't use
13614
10:20:31,680 --> 10:20:37,436
character pointers use regular arrays
13615
10:20:34,720 --> 10:20:40,080
like we have seen before so you can set
13616
10:20:37,436 --> 10:20:43,360
up an array like this it's going to be a
13617
10:20:40,080 --> 10:20:45,916
character array and you can initialize
13618
10:20:43,360 --> 10:20:47,680
it with the string literal and this is
13619
10:20:45,915 --> 10:20:50,159
going to allow you to modify things
13620
10:20:47,680 --> 10:20:52,879
inside so if we do something like this
13621
10:20:50,160 --> 10:20:54,400
we will get the message printed out and
13622
10:20:52,879 --> 10:20:57,275
the message is going to be tailored
13623
10:20:54,400 --> 10:21:00,319
because we changed the edge to be
13624
10:20:57,275 --> 10:21:02,479
a t and this is going to work so this is
13625
10:21:00,319 --> 10:21:05,199
something you really need to be aware of
13626
10:21:02,480 --> 10:21:07,756
but character pointers are very helpful
13627
10:21:05,199 --> 10:21:09,839
in many cases and in most cases you just
13628
10:21:07,756 --> 10:21:12,000
want to store the string and print it
13629
10:21:09,839 --> 10:21:13,755
out you're not interested in changing it
13630
10:21:12,000 --> 10:21:17,040
so that's why this is going to come in
13631
10:21:13,756 --> 10:21:18,400
handy in a lot of occasions now that you
13632
10:21:17,040 --> 10:21:20,720
know this we're going to head over to
13633
10:21:18,400 --> 10:21:23,840
visual studio code and actually try this
13634
10:21:20,720 --> 10:21:26,319
out okay here we are in our working
13635
10:21:23,839 --> 10:21:29,519
folder the current project is pointer to
13636
10:21:26,319 --> 10:21:31,275
car that's what we are exploring here so
13637
10:21:29,519 --> 10:21:34,079
we're going to grab our template files
13638
10:21:31,275 --> 10:21:36,559
and put them in place and we are going
13639
10:21:34,080 --> 10:21:38,800
to open this thing into visual studio
13640
10:21:36,559 --> 10:21:42,319
code and we're going to jump into here
13641
10:21:38,800 --> 10:21:44,720
and set up our first const car pointer
13642
10:21:42,319 --> 10:21:46,800
let's do a car pointer to see how this
13643
10:21:44,720 --> 10:21:48,959
thing behaves we're going to call this
13644
10:21:46,800 --> 10:21:52,240
message and we're going to initialize
13645
10:21:48,959 --> 10:21:54,080
this with our trusty message here hello
13646
10:21:52,239 --> 10:21:56,559
world okay once you do something like
13647
10:21:54,080 --> 10:21:57,276
this your string is going to be referred
13648
10:21:57,275 --> 10:22:02,720
by message let's try and compile this
13649
10:21:59,680 --> 10:22:04,639
and see that gcc is happy we can compile
13650
10:22:04,639 --> 10:22:09,436
and uh it's going to tell us we can't
13651
10:22:06,879 --> 10:22:11,680
really do that and this is really good
13652
10:22:09,436 --> 10:22:14,400
for base converting a string to constant
13653
10:22:11,680 --> 10:22:19,040
card pointer so what we are doing really
13654
10:22:14,400 --> 10:22:22,560
is making an array of const characters
13655
10:22:19,040 --> 10:22:24,319
and refer to it as a car pointer and
13656
10:22:22,559 --> 10:22:26,639
this is not going to work this is a good
13657
10:22:24,319 --> 10:22:28,559
thing so you can't really do this and
13658
10:22:28,559 --> 10:22:34,319
and let's try and see if visual studio
13659
10:22:32,319 --> 10:22:37,275
can actually do this we're going to
13660
10:22:34,319 --> 10:22:40,080
build with msvc in this case let's do
13661
10:22:37,275 --> 10:22:43,040
read to rooster before we do that we can
13662
10:22:40,080 --> 10:22:45,436
right click to add and say delete
13663
10:22:45,436 --> 10:22:49,596
make sure it is selected and hit delete
13664
10:22:49,595 --> 10:22:53,839
move to recycle bin in this case
13665
10:22:52,000 --> 10:22:56,639
now we're going to clear here let's
13666
10:22:58,959 --> 10:23:05,199
and we're going to build with gcc
13667
10:23:02,319 --> 10:23:08,319
we're going to choose the msvc compiler
13668
10:23:05,199 --> 10:23:10,079
if you're trying to build this
13669
10:23:10,080 --> 10:23:15,360
with errors and the error is going to be
13670
10:23:12,959 --> 10:23:17,756
basically the same thing this line here
13671
10:23:15,360 --> 10:23:20,559
won't work what we can do is make this
13672
10:23:17,756 --> 10:23:23,595
cost and make it super clear
13673
10:23:20,559 --> 10:23:26,079
that message here is going to point to
13674
10:23:26,080 --> 10:23:30,639
if we try to build again i think we're
13675
10:23:27,680 --> 10:23:31,756
going to be good now so let's try and do
13676
10:23:31,756 --> 10:23:38,239
we're going to build with msvc this time
13677
10:23:35,360 --> 10:23:40,239
and world finished successfully
13678
10:23:38,239 --> 10:23:42,959
now this is really cool and we can print
13679
10:23:44,959 --> 10:23:48,879
and we're going to say message
13680
10:23:51,040 --> 10:23:55,120
let's go back to gcc because that's my
13681
10:23:53,199 --> 10:23:57,039
favorite compiler and you see that the
13682
10:23:55,120 --> 10:23:59,120
compiler from visual studio is going to
13683
10:23:57,040 --> 10:24:00,239
clutter our folder here with a lot of
13684
10:24:00,239 --> 10:24:04,319
we don't want that what i'm going to do
13685
10:24:02,480 --> 10:24:06,880
i'm going to select all this collector
13686
10:24:04,319 --> 10:24:09,360
here and remove that and i'm going to
13687
10:24:06,879 --> 10:24:11,119
hit delete with the right click
13688
10:24:11,120 --> 10:24:16,639
we're going to go back to gcc and use it
13689
10:24:16,639 --> 10:24:21,436
the build is going to go through because
13690
10:24:18,239 --> 10:24:24,079
we qualified our character pointer with
13691
10:24:21,436 --> 10:24:25,756
cost here and everything is going to be
13692
10:24:25,756 --> 10:24:31,040
you know what is happening here because
13693
10:24:28,480 --> 10:24:33,596
this kind of problems can be really hard
13694
10:24:31,040 --> 10:24:35,756
to solve okay now that we have this we
13695
10:24:33,595 --> 10:24:37,756
can try and change something inside but
13696
10:24:35,756 --> 10:24:40,080
the compiler is not going to allow it so
13697
10:24:37,756 --> 10:24:43,040
if we try and do something like this is
13698
10:24:40,080 --> 10:24:45,756
not going to work because message is a
13699
10:24:45,756 --> 10:24:50,480
and we can't go through this pointer to
13700
10:24:47,680 --> 10:24:52,160
modify something so we're going to get a
13701
10:24:50,480 --> 10:24:55,680
compiler arrow this is something you
13702
10:24:52,160 --> 10:24:58,000
should know but we can add the reference
13703
10:24:55,680 --> 10:25:00,319
this pointer and print something that is
13704
10:24:58,000 --> 10:25:02,080
inside and i want you to guess again and
13705
10:25:00,319 --> 10:25:03,680
see that you can come up with what is
13706
10:25:02,080 --> 10:25:06,639
going to be printed if with the
13707
10:25:03,680 --> 10:25:09,436
reference message and print out when we
13708
10:25:06,639 --> 10:25:11,275
run this program if we have this thing
13709
10:25:09,436 --> 10:25:13,275
printed out here again we are the
13710
10:25:13,275 --> 10:25:19,915
and printing whatever result we get from
13711
10:25:16,160 --> 10:25:23,040
that remember that this string literal
13712
10:25:19,915 --> 10:25:25,915
is going to be turned into an array of
13713
10:25:23,040 --> 10:25:28,319
const cars and the first element of that
13714
10:25:25,915 --> 10:25:32,239
array is going to be pointed to
13715
10:25:28,319 --> 10:25:35,436
by this message car pointer here so if
13716
10:25:32,239 --> 10:25:37,756
we dereference this thing we should get
13717
10:25:35,436 --> 10:25:39,436
the h here printed out that's what i
13718
10:25:43,436 --> 10:25:47,436
the bolt is going to be good let's clear
13719
10:25:47,436 --> 10:25:52,639
see that message is h this is exactly
13720
10:25:50,559 --> 10:25:54,079
what we expect here now that we have
13721
10:25:54,080 --> 10:25:59,756
what if we really want this thing here
13722
10:25:57,436 --> 10:26:01,680
to work what if we wanted to allow our
13723
10:26:01,680 --> 10:26:06,160
this message thing and modify what is
13724
10:26:04,319 --> 10:26:07,275
stored inside because sometimes that's
13725
10:26:07,275 --> 10:26:11,915
useful okay we wanted to allow our users
13726
10:26:10,000 --> 10:26:15,680
to modify this trend if you want to do
13727
10:26:11,915 --> 10:26:17,680
that you can use row character arrays
13728
10:26:15,680 --> 10:26:20,879
and the way we do that we can say car
13729
10:26:17,680 --> 10:26:23,360
message one and we can make it an array
13730
10:26:20,879 --> 10:26:25,275
and initialize that with hello world and
13731
10:26:23,360 --> 10:26:28,400
once we do this we can go through the
13732
10:26:25,275 --> 10:26:31,275
angle bracket syntax and modify the
13733
10:26:28,400 --> 10:26:33,200
first character or whatever character we
13734
10:26:31,275 --> 10:26:36,239
really want to modify in this string
13735
10:26:33,199 --> 10:26:38,239
here in this case we are going to target
13736
10:26:36,239 --> 10:26:42,239
the first so we're going to say message
13737
10:26:38,239 --> 10:26:43,915
1 and we're going to grab the index 0
13738
10:26:42,239 --> 10:26:46,239
because that's going to be the first
13739
10:26:43,915 --> 10:26:48,799
character here and we're going to assign
13740
10:26:48,800 --> 10:26:56,080
b like we just said and if we print this
13741
10:26:51,839 --> 10:26:58,000
out say message one and uh put that out
13742
10:26:56,080 --> 10:26:59,680
we're going to see what comes out if we
13743
10:26:58,000 --> 10:27:01,120
run this program we're going to build
13744
10:27:03,436 --> 10:27:08,639
the world is good so we're good here
13745
10:27:06,800 --> 10:27:11,040
if we're on we're going to get below
13746
10:27:08,639 --> 10:27:13,680
printed down and we have successfully
13747
10:27:11,040 --> 10:27:15,595
changed this thing here so if you don't
13748
10:27:13,680 --> 10:27:18,639
want to allow modifications to your
13749
10:27:15,595 --> 10:27:21,199
strength use this thing here if you want
13750
10:27:18,639 --> 10:27:23,595
to allow modification to your strength
13751
10:27:21,199 --> 10:27:25,519
use this syntax here and this is really
13752
10:27:25,519 --> 10:27:31,119
in this lecture in this lecture we're
13753
10:27:27,595 --> 10:27:32,559
going to revisit our idea of a c plus
13754
10:27:32,559 --> 10:27:37,119
memory map we have seen that the c plus
13755
10:27:34,959 --> 10:27:39,275
plus development workflow really goes
13756
10:27:37,120 --> 10:27:41,520
like this we have a program typed out in
13757
10:27:39,275 --> 10:27:44,319
our ide we pass that through the
13758
10:27:41,519 --> 10:27:47,275
compiler and we get a binary executable
13759
10:27:44,319 --> 10:27:50,319
which is a binary representation of the
13760
10:27:47,275 --> 10:27:52,959
code we have in our c plus plus program
13761
10:27:50,319 --> 10:27:55,199
you can then run that program on an
13762
10:27:52,959 --> 10:27:58,479
operating system for example here i am
13763
10:27:55,199 --> 10:28:01,360
on windows if i double click on my dot
13764
10:27:58,480 --> 10:28:02,596
exe file for example our applications
13765
10:28:02,595 --> 10:28:07,360
rooster.exe you've seen me run this a
13766
10:28:07,360 --> 10:28:12,800
if we double click this program is going
13767
10:28:09,595 --> 10:28:15,680
to be loaded in our computer memory and
13768
10:28:12,800 --> 10:28:17,756
by memory i mean random access memory
13769
10:28:15,680 --> 10:28:19,840
the memory that is going to be actively
13770
10:28:17,756 --> 10:28:22,239
running things when they happen in your
13771
10:28:19,839 --> 10:28:23,119
computer is different from the hard
13772
10:28:23,120 --> 10:28:27,276
storage that can also be called memory
13773
10:28:25,436 --> 10:28:30,080
and this can throw off a lot of
13774
10:28:27,275 --> 10:28:32,239
beginners we are talking about ram here
13775
10:28:30,080 --> 10:28:34,480
when we mean memory random access memory
13776
10:28:32,239 --> 10:28:36,879
to be exact if you double click on your
13777
10:28:34,480 --> 10:28:39,276
program or open it on the terminal like
13778
10:28:36,879 --> 10:28:41,680
we've been doing the program is going to
13779
10:28:39,275 --> 10:28:44,879
be loaded in memory and it's going to be
13780
10:28:41,680 --> 10:28:47,519
stored in a special section of memory
13781
10:28:44,879 --> 10:28:50,159
called program area and so far we have
13782
10:28:47,519 --> 10:28:53,435
been thinking that our program is really
13783
10:28:50,160 --> 10:28:57,276
loaded in real memory on our computer
13784
10:28:53,436 --> 10:28:59,840
but that's not the case it is an idea of
13785
10:28:57,275 --> 10:29:02,479
the memory that the program thinks it
13786
10:28:59,839 --> 10:29:04,879
has but it's not the real thing and i am
13787
10:29:02,480 --> 10:29:07,680
going to explain but before we explain
13788
10:29:04,879 --> 10:29:10,000
let me elaborate on the reason why this
13789
10:29:07,680 --> 10:29:12,319
is done if we have many programs and
13790
10:29:10,000 --> 10:29:15,436
each program is going to use real memory
13791
10:29:12,319 --> 10:29:17,040
on our computer we could quickly run out
13792
10:29:15,436 --> 10:29:19,275
of memory because there are many
13793
10:29:17,040 --> 10:29:20,959
programs you might even have hundreds or
13794
10:29:19,275 --> 10:29:22,959
thousands of programs running on your
13795
10:29:20,959 --> 10:29:26,080
computer you may never have enough
13796
10:29:22,959 --> 10:29:28,239
memory to run them all if real memory
13797
10:29:31,120 --> 10:29:36,639
create what is called virtual memory and
13798
10:29:34,400 --> 10:29:39,120
it is a trick that pulls your program
13799
10:29:36,639 --> 10:29:41,915
into thinking it is the only program
13800
10:29:39,120 --> 10:29:44,959
running on your operating systems and it
13801
10:29:41,915 --> 10:29:46,719
owns or the address space or all the
13802
10:29:44,959 --> 10:29:49,680
memory on your computer that's what your
13803
10:29:46,720 --> 10:29:52,880
program thanks and the view that your
13804
10:29:49,680 --> 10:29:55,840
program has of that memory is called a
13805
10:29:52,879 --> 10:29:58,000
memory map each program is abstracted
13806
10:29:55,839 --> 10:30:00,159
into what we call a process you can
13807
10:30:00,160 --> 10:30:05,596
that we have been welding as a process
13808
10:30:03,360 --> 10:30:08,639
on the system and each process has
13809
10:30:05,595 --> 10:30:11,435
access to the memory range between 0 and
13810
10:30:08,639 --> 10:30:14,559
2 to the power of n where n is the
13811
10:30:11,436 --> 10:30:17,239
number of bits that your operating
13812
10:30:14,559 --> 10:30:20,559
system supports for example i am on a
13813
10:30:17,239 --> 10:30:23,199
64-bit operating system so the range for
13814
10:30:20,559 --> 10:30:25,915
my memory is going to be between 0 and 2
13815
10:30:23,199 --> 10:30:28,319
to the power of 64. and that's a lot of
13816
10:30:25,915 --> 10:30:31,275
memory my program is going to think that
13817
10:30:28,319 --> 10:30:32,879
it owns all that all and it can never
13818
10:30:31,275 --> 10:30:35,519
run out it's going to do whatever it
13819
10:30:32,879 --> 10:30:37,435
wants if you are on a 32-bit system
13820
10:30:35,519 --> 10:30:39,915
that's going to be between 0 and 2 to
13821
10:30:37,436 --> 10:30:42,639
the power of 32 and that's going to be
13822
10:30:39,915 --> 10:30:45,595
your virtual memory the amount of memory
13823
10:30:42,639 --> 10:30:47,680
that your program fans that it owns and
13824
10:30:45,595 --> 10:30:50,079
it happens to be the entirety of your
13825
10:30:47,680 --> 10:30:52,720
ram that you have on your system each
13826
10:30:50,080 --> 10:30:55,276
program basically thinks that it owns
13827
10:30:52,720 --> 10:30:58,000
the entire memory and it can do whatever
13828
10:30:55,275 --> 10:31:00,159
it wants okay so we have the rio memory
13829
10:30:58,000 --> 10:31:02,720
which is random access memory and we
13830
10:31:00,160 --> 10:31:06,000
have virtual memory which is going to be
13831
10:31:02,720 --> 10:31:09,680
between 0 and 2 to the power of n okay
13832
10:31:06,000 --> 10:31:12,239
so now we're going to update on the idea
13833
10:31:09,680 --> 10:31:14,239
of the program execution model because
13834
10:31:12,239 --> 10:31:16,799
now we know more we know about virtual
13835
10:31:14,239 --> 10:31:18,799
memory here is our c plus program it's
13836
10:31:16,800 --> 10:31:21,200
going to go through the compiler and we
13837
10:31:18,800 --> 10:31:23,916
are going to generate a binary file
13838
10:31:21,199 --> 10:31:25,915
which is going to be a representation of
13839
10:31:23,915 --> 10:31:27,915
how things are going to be laid out in
13840
10:31:30,800 --> 10:31:36,720
it is going to go through a section of
13841
10:31:33,199 --> 10:31:40,799
the cpu called memory management unit or
13842
10:31:36,720 --> 10:31:43,275
mmu for short so that mmu is going to be
13843
10:31:40,800 --> 10:31:47,200
basically transforming between the
13844
10:31:43,275 --> 10:31:49,756
memory map of each process and the radio
13845
10:31:47,199 --> 10:31:51,839
memory layout that we have in ram what
13846
10:31:49,756 --> 10:31:54,319
the memory management unit does is
13847
10:31:54,319 --> 10:31:58,800
representation we have in the memory map
13848
10:31:56,639 --> 10:32:00,720
and the real thing we have in ram the
13849
10:31:58,800 --> 10:32:02,480
entire program is not loaded in real
13850
10:32:02,480 --> 10:32:07,436
only parts of the program that are
13851
10:32:05,120 --> 10:32:09,360
really going to be used soon unloaded in
13852
10:32:07,436 --> 10:32:12,239
memory and this is going to make
13853
10:32:09,360 --> 10:32:14,400
effective use of the memory parts that
13854
10:32:12,239 --> 10:32:17,040
are not likely to be used are going to
13855
10:32:14,400 --> 10:32:18,720
be discarded from memory and stored on
13856
10:32:17,040 --> 10:32:21,520
the hard drive instead and this is
13857
10:32:18,720 --> 10:32:23,120
really cool please note that the real
13858
10:32:21,519 --> 10:32:26,000
way these things are done is really
13859
10:32:23,120 --> 10:32:28,480
complicated but it is buried down into
13860
10:32:26,000 --> 10:32:30,080
the logic of the cpu and whatever you
13861
10:32:28,480 --> 10:32:32,480
don't really need to worry about this as
13862
10:32:30,080 --> 10:32:34,319
a super plus programmer but there are a
13863
10:32:32,480 --> 10:32:36,880
few things you need to know as we are
13864
10:32:34,319 --> 10:32:39,839
about to see in this lecture so memory
13865
10:32:36,879 --> 10:32:40,959
management unit helps out in mapping
13866
10:32:40,959 --> 10:32:46,159
the memory map you have in your program
13867
10:32:42,879 --> 10:32:49,119
basically the idea that your program has
13868
10:32:46,160 --> 10:32:51,916
of memory and the real thing
13869
10:32:49,120 --> 10:32:53,756
that we have in memory okay here is a
13870
10:32:51,915 --> 10:32:56,559
slide that is going to drive this home
13871
10:32:53,756 --> 10:32:59,120
we have a few programs with their own
13872
10:32:56,559 --> 10:33:00,319
separate memory maps we have program one
13873
10:33:00,319 --> 10:33:05,360
if we execute them they are going to go
13874
10:33:02,480 --> 10:33:07,276
through the memory management unit and
13875
10:33:05,360 --> 10:33:10,160
the memory management unit is going to
13876
10:33:07,275 --> 10:33:12,000
assign them sections on the real
13877
10:33:10,160 --> 10:33:14,800
ram that we have in our computer and
13878
10:33:12,000 --> 10:33:17,360
they are going to be using that section
13879
10:33:14,800 --> 10:33:19,436
on the real random access memory that we
13880
10:33:17,360 --> 10:33:22,319
have on our computer the thing is your
13881
10:33:19,436 --> 10:33:23,916
program is going to really think it owns
13882
10:33:23,915 --> 10:33:28,239
but it's not just going to be using a
13883
10:33:26,080 --> 10:33:30,800
part of it and the memory management
13884
10:33:28,239 --> 10:33:33,595
unit is going to be transforming between
13885
10:33:30,800 --> 10:33:36,319
the idea that your program has and the
13886
10:33:33,595 --> 10:33:39,040
real memory that we have on our computer
13887
10:33:36,319 --> 10:33:41,839
and the memory map is a standard format
13888
10:33:39,040 --> 10:33:43,915
that is defined by the operating system
13889
10:33:41,839 --> 10:33:46,959
this is why for example you can't take
13890
10:33:43,915 --> 10:33:49,435
an executable that was set up on windows
13891
10:33:46,959 --> 10:33:52,159
and directly run it on linux this is an
13892
10:33:49,436 --> 10:33:55,200
operating system thing the memory map or
13893
10:33:52,160 --> 10:33:57,520
the structure of your program is defined
13894
10:33:55,199 --> 10:34:01,199
by the operating system that is going to
13895
10:33:57,519 --> 10:34:03,359
be running that program so all program
13896
10:34:01,199 --> 10:34:05,915
written for an operating system must
13897
10:34:03,360 --> 10:34:08,639
conform to the memory map that is
13898
10:34:05,915 --> 10:34:11,040
defined by that operating system so all
13899
10:34:08,639 --> 10:34:13,436
programs on windows if you had a way to
13900
10:34:11,040 --> 10:34:15,360
go in and look at the memory map they
13901
10:34:13,436 --> 10:34:17,436
are going to be pretty similar so we
13902
10:34:15,360 --> 10:34:18,160
have been talking about the memory map
13903
10:34:20,080 --> 10:34:25,040
well here is a slide that is going to
13904
10:34:22,720 --> 10:34:27,275
try and clear that out so we're going to
13905
10:34:25,040 --> 10:34:29,915
have a bunch of memory locations from 0
13906
10:34:27,275 --> 10:34:32,079
all the way to 2 to the power of m
13907
10:34:29,915 --> 10:34:34,719
and the memory map is really divided
13908
10:34:32,080 --> 10:34:36,319
into a lot of parts for example we have
13909
10:34:34,720 --> 10:34:38,080
the text section we have the data
13910
10:34:36,319 --> 10:34:39,040
section we have the heap stack and
13911
10:34:39,040 --> 10:34:43,360
and this is one view you can have on
13912
10:34:41,120 --> 10:34:45,120
this there are a few different versions
13913
10:34:43,360 --> 10:34:47,120
of this slide that you're going to see
13914
10:34:45,120 --> 10:34:50,639
on the internet but what is really
13915
10:34:47,120 --> 10:34:53,276
important is stack and hip for our
13916
10:34:50,639 --> 10:34:56,479
purposes here stack is what is going to
13917
10:34:53,275 --> 10:34:59,360
store our local variables thank the a
13918
10:34:56,480 --> 10:35:01,680
that we have here in main bc thanks we
13919
10:34:59,360 --> 10:35:05,120
had inside functions those things are
13920
10:35:01,680 --> 10:35:06,400
stored inside the stack section of our
13921
10:35:06,400 --> 10:35:10,880
besides the stack we also have the hip
13922
10:35:08,879 --> 10:35:13,595
which is going to be the location where
13923
10:35:10,879 --> 10:35:16,079
we get additional memory we can use to
13924
10:35:13,595 --> 10:35:17,839
make things better for our program we
13925
10:35:16,080 --> 10:35:20,400
also have the text section which is
13926
10:35:17,839 --> 10:35:23,119
going to load the actual binary of our
13927
10:35:20,400 --> 10:35:24,880
program so that the cpu can execute it
13928
10:35:23,120 --> 10:35:26,560
but we're not going to worry too much
13929
10:35:24,879 --> 10:35:28,879
about this section in this course
13930
10:35:26,559 --> 10:35:31,040
because it is out of scope for
13931
10:35:28,879 --> 10:35:33,839
what we are trying to do here we are
13932
10:35:31,040 --> 10:35:35,520
going to focus on stack and hip because
13933
10:35:33,839 --> 10:35:38,479
hip is actually going to be very
13934
10:35:35,519 --> 10:35:41,199
important from the next lecture when we
13935
10:35:38,480 --> 10:35:43,120
start talking about dynamic memory hip
13936
10:35:41,199 --> 10:35:45,275
is going to be additional memory that
13937
10:35:43,120 --> 10:35:47,360
you can use in your program if you run
13938
10:35:45,275 --> 10:35:49,436
out of stack memory and we're going to
13939
10:35:47,360 --> 10:35:51,915
see a few other reasons why you might
13940
10:35:49,436 --> 10:35:54,239
want to use this as we progress in this
13941
10:35:51,915 --> 10:35:57,435
chapter so our memory map is going to
13942
10:35:54,239 --> 10:35:59,915
have a lot of parts but the parts that
13943
10:35:57,436 --> 10:36:02,480
we really care about in this course are
13944
10:35:59,915 --> 10:36:04,000
stack and heap this is really all we set
13945
10:36:02,480 --> 10:36:06,480
out to do in this lecture i hope you
13946
10:36:04,000 --> 10:36:09,199
have a better idea of the memory map and
13947
10:36:06,480 --> 10:36:11,596
how this really works we introduced
13948
10:36:09,199 --> 10:36:14,799
another view that you can have on how
13949
10:36:11,595 --> 10:36:16,720
your c plus plus program is executed and
13950
10:36:14,800 --> 10:36:18,800
i hope you have a better idea of the
13951
10:36:16,720 --> 10:36:21,436
memory system and we are going to start
13952
10:36:18,800 --> 10:36:23,840
and see how you can work with dynamic
13953
10:36:21,436 --> 10:36:25,520
memory allocation which is going to
13954
10:36:27,595 --> 10:36:30,879
go ahead and finish up here and meet me
13955
10:36:30,879 --> 10:36:36,079
in this lecture we're going to start and
13956
10:36:32,800 --> 10:36:38,480
learn about dynamic memory allocation
13957
10:36:36,080 --> 10:36:42,080
and this is a technique we can use to
13958
10:36:38,480 --> 10:36:44,400
start using hip storage that we have in
13959
10:36:42,080 --> 10:36:46,480
the memory map of our c plus plus
13960
10:36:44,400 --> 10:36:48,560
program we can use that to get
13961
10:36:46,480 --> 10:36:51,840
additional memory we can use and do
13962
10:36:48,559 --> 10:36:54,079
stuff if stack memory isn't enough for
13963
10:36:51,839 --> 10:36:56,079
our purposes this is how we have been
13964
10:36:54,080 --> 10:36:58,319
using pointers so far for example we
13965
10:36:56,080 --> 10:37:00,959
have a variable we set up a pointer and
13966
10:36:58,319 --> 10:37:03,839
we store the address of the variable n
13967
10:37:00,959 --> 10:37:06,479
so we can go ahead and use this pointer
13968
10:37:03,839 --> 10:37:08,879
to manipulate the variable or do all
13969
10:37:06,480 --> 10:37:11,756
kinds of crazy things if you go down
13970
10:37:08,879 --> 10:37:14,399
here we have a pointer p number one
13971
10:37:11,756 --> 10:37:16,639
and we have a number one variable and we
13972
10:37:14,400 --> 10:37:18,720
can store the address of number one into
13973
10:37:16,639 --> 10:37:21,519
this pointer it's really the same thing
13974
10:37:18,720 --> 10:37:24,800
like we have on top here but the pointer
13975
10:37:21,519 --> 10:37:26,399
is not initialized at declaration here
13976
10:37:24,800 --> 10:37:28,480
and you have to make sure you put
13977
10:37:26,400 --> 10:37:30,959
invalid data and one thing i haven't
13978
10:37:28,480 --> 10:37:32,319
really stressed enough is that it is
13979
10:37:32,319 --> 10:37:37,360
really bad to try and use a pointer that
13980
10:37:34,800 --> 10:37:39,916
is not initialized for example here we
13981
10:37:37,360 --> 10:37:43,199
have p number two which is a pointer it
13982
10:37:39,915 --> 10:37:47,199
is not initialized it contains junk
13983
10:37:43,199 --> 10:37:49,275
and we try and write into it okay so try
13984
10:37:47,199 --> 10:37:51,119
to think about what we really are doing
13985
10:37:49,275 --> 10:37:54,159
here this is a pointer that we have set
13986
10:37:51,120 --> 10:37:56,480
up we haven't really initialized that so
13987
10:37:54,160 --> 10:37:58,800
it's going to contain whatever address
13988
10:37:56,480 --> 10:38:00,800
is possible it can contain an address
13989
10:37:58,800 --> 10:38:02,639
that is used by another program it may
13990
10:38:00,800 --> 10:38:04,800
contain an address that is being used by
13991
10:38:02,639 --> 10:38:07,680
the operating system it's not your
13992
10:38:04,800 --> 10:38:09,520
address to mess with and here we are
13993
10:38:07,680 --> 10:38:13,275
actually trying to mess with that by
13994
10:38:09,519 --> 10:38:16,079
storing in a 55 so this is going to
13995
10:38:13,275 --> 10:38:18,559
cause the crash possibly or even
13996
10:38:16,080 --> 10:38:21,276
corrupt data that is being used by other
13997
10:38:18,559 --> 10:38:23,435
people so don't do this another thing is
13998
10:38:21,275 --> 10:38:25,915
to try and use a pointer that is
13999
10:38:23,436 --> 10:38:29,200
initialized to know for example here we
14000
10:38:25,915 --> 10:38:31,360
have a pointer p number three and it is
14001
10:38:29,199 --> 10:38:34,000
braced initialized this is going to
14002
10:38:31,360 --> 10:38:37,275
initialize it to null pointer but we are
14003
10:38:34,000 --> 10:38:39,360
trying and storing in a value here so
14004
10:38:37,275 --> 10:38:40,959
this is also going to be bad it's not
14005
10:38:39,360 --> 10:38:43,120
granted what you're going to get
14006
10:38:40,959 --> 10:38:45,120
actually c plus doesn't give you any
14007
10:38:43,120 --> 10:38:47,200
guarantees this is called undefined
14008
10:38:45,120 --> 10:38:50,160
behavior so you're going to get a crash
14009
10:38:47,199 --> 10:38:51,915
and don't do it as a good practice the
14010
10:38:50,160 --> 10:38:53,200
first thing you should do is initialize
14011
10:38:53,199 --> 10:38:58,799
before you use them you can initialize
14012
10:38:55,519 --> 10:39:00,000
them with no pointer and make sure that
14013
10:39:00,000 --> 10:39:04,400
modifying valid addresses into those
14014
10:39:02,720 --> 10:39:06,959
pointers if you don't know what is in a
14015
10:39:04,400 --> 10:39:09,520
pointer don't use that pointer because
14016
10:39:06,959 --> 10:39:12,080
bad things can happen okay rule number
14017
10:39:09,519 --> 10:39:13,680
one don't try to use a pointer that you
14018
10:39:13,680 --> 10:39:19,436
rule number two don't try to work with a
14019
10:39:16,720 --> 10:39:21,120
pointer that is pointing to no ptr
14020
10:39:19,436 --> 10:39:23,275
that's going to give you bad things you
14021
10:39:21,120 --> 10:39:26,080
don't want to really deal with okay so
14022
10:39:23,275 --> 10:39:28,879
far we have been using memory that lives
14023
10:39:26,080 --> 10:39:30,800
on the stack section of our memory map
14024
10:39:28,879 --> 10:39:32,959
we were using variables that we have
14025
10:39:30,800 --> 10:39:34,639
declared in the main function we were
14026
10:39:32,959 --> 10:39:37,199
using the variables that we have
14027
10:39:34,639 --> 10:39:39,756
declared inside some functions and
14028
10:39:37,199 --> 10:39:41,519
that's all stuff that live on the stack
14029
10:39:39,756 --> 10:39:44,239
now we want to see how we can use the
14030
10:39:41,519 --> 10:39:46,799
hip okay let's take a closer look at our
14031
10:39:44,239 --> 10:39:47,595
memory map we have the stack we have the
14032
10:39:47,595 --> 10:39:50,879
and the differences between these two
14033
10:39:52,480 --> 10:39:58,720
the stack memory is finite so you don't
14034
10:39:55,756 --> 10:40:00,959
have infinite memory but the same is
14035
10:39:58,720 --> 10:40:03,200
true for the heap but hip is additional
14036
10:40:00,959 --> 10:40:05,680
memory that you can use if you don't
14037
10:40:03,199 --> 10:40:08,399
want to run out of stock memory for a
14038
10:40:05,680 --> 10:40:11,680
stack memory the developer isn't in full
14039
10:40:08,400 --> 10:40:13,680
control of the memory lifetime so if you
14040
10:40:11,680 --> 10:40:16,480
declare something on the stack for
14041
10:40:13,680 --> 10:40:19,519
example if you say int var1 and you
14042
10:40:16,480 --> 10:40:22,000
initialize that to 23 you don't control
14043
10:40:19,519 --> 10:40:24,319
when that variable is wiped out of
14044
10:40:22,000 --> 10:40:26,800
memory the variable is going to be
14045
10:40:24,319 --> 10:40:29,839
killed when the scope in which it was
14046
10:40:29,839 --> 10:40:34,719
and you developer don't really say when
14047
10:40:32,559 --> 10:40:36,479
the variable dies and sometimes you
14048
10:40:36,480 --> 10:40:40,880
when your variable dies so this is a
14049
10:40:38,239 --> 10:40:42,959
limitation we have with the stack memory
14050
10:40:40,879 --> 10:40:44,719
okay so for stack memory lifetime is
14051
10:40:42,959 --> 10:40:47,915
controlled by the scope mechanism we
14052
10:40:44,720 --> 10:40:50,720
just say that for heap the developer is
14053
10:40:47,915 --> 10:40:53,519
in full control of when the variable
14054
10:40:50,720 --> 10:40:55,200
comes to life and when the variable dies
14055
10:40:53,519 --> 10:40:57,755
and this is a benefit you might have
14056
10:40:55,199 --> 10:40:59,275
with heap storage and you might want to
14057
10:40:57,756 --> 10:41:01,840
use this and we're going to see how we
14058
10:40:59,275 --> 10:41:03,436
can use that in the next few lectures
14059
10:41:01,839 --> 10:41:05,755
okay so make sure you understand the
14060
10:41:03,436 --> 10:41:07,436
difference between stack and hip here if
14061
10:41:05,756 --> 10:41:10,239
you look at the example here we have a
14062
10:41:07,436 --> 10:41:13,275
variable which is called locoscope var
14063
10:41:10,239 --> 10:41:16,000
it is stored within this block delimited
14064
10:41:13,275 --> 10:41:17,756
by the curly braces and the variable is
14065
10:41:16,000 --> 10:41:20,720
going to come to life when this
14066
10:41:17,756 --> 10:41:21,520
statement is executed but it is going to
14067
10:41:21,519 --> 10:41:26,639
when we hit the closing curly brace here
14068
10:41:24,639 --> 10:41:29,839
so the lifetime of this variable is
14069
10:41:26,639 --> 10:41:33,116
controlled by the scope mechanism but it
14070
10:41:29,839 --> 10:41:34,719
is possible to use dynamic memory or use
14071
10:41:33,116 --> 10:41:37,116
memory on the heap and we're going to
14072
10:41:34,720 --> 10:41:38,880
see a syntax you can use to do that the
14073
10:41:37,116 --> 10:41:41,116
first thing we want to do it to set up
14074
10:41:38,879 --> 10:41:44,239
employer that is going to be pointing to
14075
10:41:41,116 --> 10:41:45,840
that heap allocated memory the way you
14076
10:41:44,239 --> 10:41:48,639
do that you set up a pointer here we
14077
10:41:45,839 --> 10:41:50,159
have p number four we initialize it with
14078
10:41:50,160 --> 10:41:54,960
but what we do to allocate memory is the
14079
10:41:52,879 --> 10:41:58,239
second statement here we say p number
14080
10:41:58,239 --> 10:42:03,040
the moment this statement is going to be
14081
10:42:00,400 --> 10:42:06,080
executed the operating system is going
14082
10:42:03,040 --> 10:42:07,840
to allocate a piece of memory on the
14083
10:42:06,080 --> 10:42:10,000
heap the memory is going to be large
14084
10:42:07,839 --> 10:42:12,159
enough to accommodate for an integer so
14085
10:42:10,000 --> 10:42:14,319
it's going to be four bytes long
14086
10:42:12,160 --> 10:42:16,880
and it is your memory now your program
14087
10:42:14,319 --> 10:42:19,116
can use it to do whatever it wants and
14088
10:42:16,879 --> 10:42:21,519
no other program on the system can use
14089
10:42:19,116 --> 10:42:25,276
this piece of memory so it is going to
14090
10:42:21,519 --> 10:42:27,519
be yours until you explicitly return
14091
10:42:25,275 --> 10:42:29,040
this piece of memory to the system and
14092
10:42:27,519 --> 10:42:31,435
we're going to see how you can do that
14093
10:42:29,040 --> 10:42:33,436
in a minute once this memory is yours
14094
10:42:31,436 --> 10:42:35,200
you can use it you see here we already
14095
10:42:33,436 --> 10:42:37,680
referencing the memory and the story
14096
10:42:35,199 --> 10:42:39,680
again is 77 and if we're trying to print
14097
10:42:37,680 --> 10:42:41,915
this 77 we're going to get it printed
14098
10:42:39,680 --> 10:42:44,480
out okay this is how you can use dynamic
14099
10:42:44,480 --> 10:42:49,756
things are not being stored on the stack
14100
10:42:47,595 --> 10:42:51,360
things are being stored on the heap i
14101
10:42:49,756 --> 10:42:54,639
really hope you understand this because
14102
10:42:51,360 --> 10:42:58,000
it is very important okay so here is our
14103
10:42:54,639 --> 10:43:00,559
view of stack and heap so if you use new
14104
10:42:58,000 --> 10:43:03,839
to allocate for memory stuff are going
14105
10:43:00,559 --> 10:43:06,159
to be stored in this hip section here of
14106
10:43:03,839 --> 10:43:08,879
your memory map here is another example
14107
10:43:06,160 --> 10:43:11,840
to try and understand the lifetime of
14108
10:43:08,879 --> 10:43:13,755
our variables docovar again is limited
14109
10:43:11,839 --> 10:43:15,755
to this scope it is going to come into
14110
10:43:13,756 --> 10:43:19,040
life when this statement here is
14111
10:43:15,756 --> 10:43:21,520
executed and it is going to die when we
14112
10:43:19,040 --> 10:43:24,319
run out of this scope here so if you try
14113
10:43:21,519 --> 10:43:26,479
executing code out of this scope locovar
14114
10:43:24,319 --> 10:43:29,360
is no longer going to be available you
14115
10:43:26,480 --> 10:43:33,116
can't use it but that's not the case for
14116
10:43:29,360 --> 10:43:35,040
locro ptr var because this is a pointer
14117
10:43:35,040 --> 10:43:40,720
and if you go out of this scope the
14118
10:43:38,160 --> 10:43:42,800
memory is still going to be yours if you
14119
10:43:40,720 --> 10:43:44,959
have a way you can access it and use it
14120
10:43:42,800 --> 10:43:48,319
you're going to be able to use it and it
14121
10:43:44,959 --> 10:43:50,959
is going to be yours until you decide to
14122
10:43:48,319 --> 10:43:52,879
return it to the operating system so we
14123
10:43:50,959 --> 10:43:54,559
have been talking about returning the
14124
10:43:54,559 --> 10:44:00,399
how do we do it well you use the delete
14125
10:43:57,756 --> 10:44:03,200
keyword in c plus plus here we have our
14126
10:44:00,400 --> 10:44:05,520
memory which is allocated using new and
14127
10:44:03,199 --> 10:44:07,839
so the operating system is going to give
14128
10:44:05,519 --> 10:44:09,435
us a new piece of memory it is going to
14129
10:44:07,839 --> 10:44:11,595
be four bytes because we're going to
14130
10:44:09,436 --> 10:44:14,000
store in an integer and we are going to
14131
10:44:11,595 --> 10:44:16,319
be pointing to that memory through p
14132
10:44:14,000 --> 10:44:18,160
number four here we can use this memory
14133
10:44:16,319 --> 10:44:20,319
however we want through the referencing
14134
10:44:18,160 --> 10:44:22,480
and do all kinds of crazy things and
14135
10:44:20,319 --> 10:44:24,639
when we are done with this memory we are
14136
10:44:22,480 --> 10:44:26,400
going to say delete p number four and
14137
10:44:24,639 --> 10:44:28,080
this statement is going to return the
14138
10:44:26,400 --> 10:44:30,720
memory to the operating system the
14139
10:44:28,080 --> 10:44:33,276
memory is no longer going to be hours
14140
10:44:30,720 --> 10:44:35,916
after this statement and a good thing to
14141
10:44:33,275 --> 10:44:37,680
do after you release your memory is to
14142
10:44:37,680 --> 10:44:43,360
no ptr so that other people know that
14143
10:44:40,639 --> 10:44:46,559
you don't really have any valid data in
14144
10:44:43,360 --> 10:44:47,840
that memory because if you try to use a
14145
10:44:47,839 --> 10:44:51,595
memory section bad things are going to
14146
10:44:50,080 --> 10:44:53,680
happen that's not going to be your
14147
10:44:51,595 --> 10:44:55,519
memory we're going to fall into the same
14148
10:44:55,519 --> 10:45:01,199
uninitialized piece of memory don't do
14149
10:44:58,160 --> 10:45:04,240
that so whenever you release memory also
14150
10:45:01,199 --> 10:45:06,639
reset it to no ptr to play it safe we
14151
10:45:04,239 --> 10:45:09,360
can also initialize our pointers with
14152
10:45:06,639 --> 10:45:11,275
dynamic memory when we declare them and
14153
10:45:09,360 --> 10:45:14,080
this is how you can do it we say p
14154
10:45:11,275 --> 10:45:15,915
number five and we initialize that with
14155
10:45:14,080 --> 10:45:18,639
new and this is going to give us a new
14156
10:45:15,915 --> 10:45:21,040
piece of memory on the heap and it is
14157
10:45:18,639 --> 10:45:23,436
going to be pointed to by p number five
14158
10:45:21,040 --> 10:45:25,840
we get the same thing here but uh here
14159
10:45:23,436 --> 10:45:27,275
we are just pointing in new values and p
14160
10:45:27,275 --> 10:45:32,319
number seven the memory locations on the
14161
10:45:29,839 --> 10:45:35,755
heap are going to be containing 22 and
14162
10:45:32,319 --> 10:45:38,000
23 for p number six and p number seven
14163
10:45:35,756 --> 10:45:40,400
and here we have a few examples of how
14164
10:45:38,000 --> 10:45:43,436
we can print the contents of these
14165
10:45:43,436 --> 10:45:49,200
and after you are done using your hip
14166
10:45:46,480 --> 10:45:51,360
memory you're going to release it using
14167
10:45:49,199 --> 10:45:54,319
the delete keyword and you are going to
14168
10:45:51,360 --> 10:45:57,040
reset that to no ptr to really play it
14169
10:45:54,319 --> 10:46:00,080
safe this is how you should use dynamic
14170
10:45:57,040 --> 10:46:02,559
memory allocated on the heap another
14171
10:46:00,080 --> 10:46:05,916
thing you should know is that it is
14172
10:46:02,559 --> 10:46:08,079
really bad to call delete twice on a
14173
10:46:05,915 --> 10:46:10,159
pointer so here we have a memory
14174
10:46:08,080 --> 10:46:12,560
location that we allocate on the heap we
14175
10:46:12,559 --> 10:46:18,159
we are trying to use it here in sddc
14176
10:46:18,160 --> 10:46:21,756
and if we delete it for the first time
14177
10:46:20,239 --> 10:46:23,915
that's going to be cool it is going to
14178
10:46:21,756 --> 10:46:26,319
be returned to the system but if you try
14179
10:46:23,915 --> 10:46:28,639
to delete it for the second time you're
14180
10:46:26,319 --> 10:46:31,199
going to get a crash don't do this this
14181
10:46:28,639 --> 10:46:34,319
is really bad okay now that we have a
14182
10:46:31,199 --> 10:46:36,959
slightly clearer idea about pointers and
14183
10:46:34,319 --> 10:46:38,959
dynamic memory allocation i think it is
14184
10:46:36,959 --> 10:46:40,959
time we went to visual studio code and
14185
10:46:38,959 --> 10:46:44,000
actually played with a few of these
14186
10:46:40,959 --> 10:46:46,400
concepts here we are in our working
14187
10:46:44,000 --> 10:46:48,480
directory the current project is dynamic
14188
10:46:46,400 --> 10:46:50,639
memory allocation we're going to grab
14189
10:46:48,480 --> 10:46:52,960
our template files and we're going to
14190
10:46:50,639 --> 10:46:55,275
put them in place dynamic memory
14191
10:46:52,959 --> 10:46:57,519
allocation let's do that and we're going
14192
10:46:55,275 --> 10:46:59,360
to open this in visual studio code the
14193
10:46:57,519 --> 10:47:02,079
first thing we're going to do is review
14194
10:46:59,360 --> 10:47:04,080
how we have been using players so far
14195
10:47:02,080 --> 10:47:06,560
we have been using them like this we had
14196
10:47:04,080 --> 10:47:09,200
a variable stored somewhere on the stack
14197
10:47:06,559 --> 10:47:11,839
again this is the stack memory that we
14198
10:47:11,839 --> 10:47:16,079
stored addresses of some variables you
14199
10:47:14,080 --> 10:47:17,360
know pointers something like this and we
14200
10:47:16,080 --> 10:47:19,360
could go through the pointer to
14201
10:47:17,360 --> 10:47:20,319
manipulate that memory location for
14202
10:47:20,319 --> 10:47:24,400
we can print the address of that memory
14203
10:47:22,239 --> 10:47:26,000
we can even the reference and print the
14204
10:47:26,000 --> 10:47:31,360
by doing something like we do here and
14205
10:47:29,360 --> 10:47:33,595
we are not printing here so let's say
14206
10:47:31,360 --> 10:47:35,360
that and say p number we can do
14207
10:47:33,595 --> 10:47:38,879
something like this and we have been
14208
10:47:35,360 --> 10:47:40,720
doing this quite a lot so far we can
14209
10:47:38,879 --> 10:47:43,519
also have a piece of memory that is
14210
10:47:40,720 --> 10:47:46,080
uninitialized and we store the address
14211
10:47:43,519 --> 10:47:47,915
of some variable in that piece of memory
14212
10:47:46,080 --> 10:47:49,520
and we can do the same thing for example
14213
10:47:47,915 --> 10:47:52,479
if we print p number one we're going to
14214
10:47:49,519 --> 10:47:54,399
get the value 12 printed out here and we
14215
10:47:52,480 --> 10:47:56,640
could run this so let's try and do that
14216
10:47:54,400 --> 10:47:58,720
we're going to bring up a terminal first
14217
10:47:56,639 --> 10:48:01,275
and close this pane so that we have some
14218
10:47:58,720 --> 10:48:04,319
breathing room and we are going to build
14219
10:48:04,319 --> 10:48:08,720
we're going to build successfully going
14220
10:48:06,639 --> 10:48:10,639
to clear and run rooster and we're going
14221
10:48:08,720 --> 10:48:13,040
to see that we have these things printed
14222
10:48:10,639 --> 10:48:14,959
out here the variable we have in here is
14223
10:48:13,040 --> 10:48:17,040
22 so we're going to get that if we
14224
10:48:17,040 --> 10:48:20,879
if we print pointer we're going to get
14225
10:48:18,720 --> 10:48:23,275
the address printed out we can also go
14226
10:48:20,879 --> 10:48:26,319
through the address of operator to print
14227
10:48:23,275 --> 10:48:28,479
the address of this variable here but we
14228
10:48:26,319 --> 10:48:31,116
can also print our value through the
14229
10:48:28,480 --> 10:48:33,200
referencing our pointer and we can get
14230
10:48:31,116 --> 10:48:35,520
access to it here down here we have a
14231
10:48:33,199 --> 10:48:37,519
pointer that is not initialized so it
14232
10:48:35,519 --> 10:48:39,755
will contain a junk address that you
14233
10:48:37,519 --> 10:48:41,595
shouldn't really use but we're not going
14234
10:48:39,756 --> 10:48:44,480
to do that because we're going to store
14235
10:48:41,595 --> 10:48:47,199
in the address of number one here and we
14236
10:48:44,480 --> 10:48:50,080
can manipulate the value here through
14237
10:48:47,199 --> 10:48:52,319
the pointer using the the reference
14238
10:48:50,080 --> 10:48:54,800
operator here and if we print this p
14239
10:48:52,319 --> 10:48:57,199
number one we're going to get 12 printed
14240
10:48:54,800 --> 10:49:00,639
out this is pretty cool okay so this is
14241
10:48:57,199 --> 10:49:02,319
how we have been using pointers so far
14242
10:49:00,639 --> 10:49:04,239
let's comment this out because we're
14243
10:49:02,319 --> 10:49:06,639
going to see some other things okay
14244
10:49:04,239 --> 10:49:08,799
before we really look at how dynamic
14245
10:49:06,639 --> 10:49:11,680
memory works we are going to show you a
14246
10:49:08,800 --> 10:49:13,916
few bad things you need to be aware of
14247
10:49:11,680 --> 10:49:15,275
so let's put in a piece of code for us
14248
10:49:15,275 --> 10:49:21,519
and here we are saying that writing into
14249
10:49:18,360 --> 10:49:23,275
uninitialized memory is really bad so
14250
10:49:23,275 --> 10:49:28,239
uninitialized and we are trying and
14251
10:49:25,839 --> 10:49:30,559
directly right into it through the
14252
10:49:28,239 --> 10:49:31,756
reference and this is going to be bad
14253
10:49:31,756 --> 10:49:36,480
visual studio code is not complaining it
14254
10:49:34,239 --> 10:49:39,115
thinks that we know what we are doing
14255
10:49:36,480 --> 10:49:41,200
here and it's not going to warn us but
14256
10:49:39,116 --> 10:49:43,840
this pointer could really be pointing
14257
10:49:41,199 --> 10:49:46,079
anywhere including operating system
14258
10:49:43,839 --> 10:49:47,359
specific memory and here you may be
14259
10:49:47,360 --> 10:49:53,040
modify things that your operating system
14260
10:49:50,080 --> 10:49:54,720
is going to need so clearly the
14261
10:49:53,040 --> 10:49:57,275
operating system is not going to be
14262
10:49:54,720 --> 10:49:59,040
happy about this and the bad things can
14263
10:49:59,040 --> 10:50:03,116
so now we have this memory location
14264
10:50:01,040 --> 10:50:04,720
we're going to try and write into it and
14265
10:50:03,116 --> 10:50:07,040
we're going to see what happens if we
14266
10:50:04,720 --> 10:50:08,639
run this program for now let's try and
14267
10:50:07,040 --> 10:50:10,559
take this little section here and
14268
10:50:10,559 --> 10:50:16,159
and we want to see what happens on the
14269
10:50:13,756 --> 10:50:17,756
program here the code here that we might
14270
10:50:17,756 --> 10:50:23,200
let's try and build it with gcc we're
14271
10:50:20,800 --> 10:50:24,720
going to run the task to do that
14272
10:50:23,199 --> 10:50:26,719
the build is going to be good you see
14273
10:50:24,720 --> 10:50:28,959
that we don't even get a compiler error
14274
10:50:26,720 --> 10:50:30,639
and if we're trying to run rooster you
14275
10:50:28,959 --> 10:50:32,559
see that the program is going to try and
14276
10:50:30,639 --> 10:50:34,639
run you know the operating system is
14277
10:50:32,559 --> 10:50:37,115
going to say this guy doesn't know what
14278
10:50:34,639 --> 10:50:39,595
they are doing and i am going to close
14279
10:50:37,116 --> 10:50:40,639
them you see that it's not even
14280
10:50:40,639 --> 10:50:46,080
this statement here let's go on top here
14281
10:50:43,519 --> 10:50:47,680
and put in an sddc out statement so that
14282
10:50:47,680 --> 10:50:52,800
where this program is failing
14283
10:50:54,959 --> 10:50:58,799
okay so this is what we have we have a
14284
10:50:56,639 --> 10:51:01,360
few statements other than and we want to
14285
10:50:58,800 --> 10:51:03,116
see if we actually get to run these two
14286
10:51:03,116 --> 10:51:09,596
where the program is actually failing
14287
10:51:06,000 --> 10:51:11,595
we are going to build it again with gcc
14288
10:51:11,595 --> 10:51:17,040
and run rooster you see that it's going
14289
10:51:13,680 --> 10:51:18,959
to say writing in a 55 but this
14290
10:51:17,040 --> 10:51:22,160
statement here is going to fail because
14291
10:51:18,959 --> 10:51:24,559
we are trying to ride into memory that
14292
10:51:22,160 --> 10:51:27,040
is not ours and the operating system is
14293
10:51:24,559 --> 10:51:30,000
going to stop us so our program is
14294
10:51:27,040 --> 10:51:32,559
crashing and it is terminating before it
14295
10:51:30,000 --> 10:51:34,879
even runs the things that are down here
14296
10:51:32,559 --> 10:51:36,799
hopefully you can see how bad this is
14297
10:51:34,879 --> 10:51:39,360
you have designed your program to do
14298
10:51:36,800 --> 10:51:41,756
things but it is going to stop
14299
10:51:39,360 --> 10:51:44,080
without having done any of the other
14300
10:51:41,756 --> 10:51:46,720
things that you have designed below so
14301
10:51:44,080 --> 10:51:47,916
this is really bad and another bad thing
14302
10:51:47,915 --> 10:51:53,435
you might have allocated some dynamic
14303
10:51:50,480 --> 10:51:56,640
memory beforehand and your program is
14304
10:51:53,436 --> 10:51:58,880
going to end before it even releases
14305
10:51:56,639 --> 10:52:01,436
that memory properly and returns that to
14306
10:51:58,879 --> 10:52:04,000
the operating system so this is bad you
14307
10:52:01,436 --> 10:52:07,200
don't want crashes in your programs and
14308
10:52:04,000 --> 10:52:10,400
don't ever try and use and reference
14309
10:52:07,199 --> 10:52:12,319
memory that you haven't initialized this
14310
10:52:10,400 --> 10:52:15,360
is one bad thing we're going to comment
14311
10:52:12,319 --> 10:52:18,080
this out i hope you really know how bad
14312
10:52:15,360 --> 10:52:21,915
this is and we're going to go down again
14313
10:52:18,080 --> 10:52:23,840
and uncomment what we have done here
14314
10:52:21,915 --> 10:52:26,079
and uh it's going to be another bad
14315
10:52:23,839 --> 10:52:27,755
thing because we are trying to write
14316
10:52:27,756 --> 10:52:32,239
initialized to null pqr okay here we
14317
10:52:30,400 --> 10:52:36,160
have a pointer this is called p number
14318
10:52:32,239 --> 10:52:38,720
three and it is initialized with no ptr
14319
10:52:36,160 --> 10:52:42,400
you can think of ptr as an address that
14320
10:52:38,720 --> 10:52:44,480
says i don't have any valid thing in me
14321
10:52:42,400 --> 10:52:46,160
don't use me that's what no ptr is
14322
10:52:46,160 --> 10:52:51,596
initialized to ptr but we are trying to
14323
10:52:48,879 --> 10:52:54,879
store something in here and you can
14324
10:52:51,595 --> 10:52:56,959
imagine how bad this is this is memory
14325
10:52:54,879 --> 10:52:58,719
that isn't really valid the memory
14326
10:52:56,959 --> 10:53:00,959
itself is saying i don't contain
14327
10:52:58,720 --> 10:53:02,720
anything valid don't try to use me and
14328
10:53:00,959 --> 10:53:05,040
if you try to use it bad things are
14329
10:53:02,720 --> 10:53:07,040
going to happen so if we try and compile
14330
10:53:05,040 --> 10:53:08,879
this program it is going to compile the
14331
10:53:07,040 --> 10:53:10,480
compiler is not going to stop us to do
14332
10:53:10,480 --> 10:53:14,720
and these are some things you need to be
14333
10:53:12,319 --> 10:53:16,480
aware of in c plus plus but if we try to
14334
10:53:14,720 --> 10:53:18,880
run it you're going to see that we are
14335
10:53:16,480 --> 10:53:21,040
also going to get a crash again let's
14336
10:53:18,879 --> 10:53:24,000
try and put a statement in front of this
14337
10:53:21,040 --> 10:53:25,275
failing line and uh below this line i
14338
10:53:30,319 --> 10:53:35,680
and both of the programs so that we can
14339
10:53:32,239 --> 10:53:39,040
see which std statements run and which
14340
10:53:35,680 --> 10:53:40,959
dot after our program crashes so we're
14341
10:53:39,040 --> 10:53:42,239
going to clear the world is good and run
14342
10:53:40,959 --> 10:53:44,639
rooster you're going to see it's going
14343
10:53:42,239 --> 10:53:46,720
to say what it's doing it's going to try
14344
10:53:44,639 --> 10:53:48,639
and fail and the operating system is
14345
10:53:46,720 --> 10:53:50,639
going to kill this program because it is
14346
10:53:48,639 --> 10:53:53,199
crazy it is doing what it shouldn't
14347
10:53:50,639 --> 10:53:55,756
really be doing so this is something bad
14348
10:53:53,199 --> 10:53:57,039
don't do it be aware of this thing okay
14349
10:53:55,756 --> 10:54:00,000
we're going to comment this out and
14350
10:53:57,040 --> 10:54:02,559
actually look at how we can dynamically
14351
10:54:00,000 --> 10:54:04,239
allocate memory from the heap and we're
14352
10:54:02,559 --> 10:54:05,360
going to put in a piece of code to play
14353
10:54:05,360 --> 10:54:09,840
it's not really complicated we have a
14354
10:54:07,040 --> 10:54:12,160
pointer we initialize it with no pointer
14355
10:54:09,839 --> 10:54:15,199
to say that this pointer doesn't point
14356
10:54:12,160 --> 10:54:16,080
to anywhere valid don't use it and we
14357
10:54:16,080 --> 10:54:21,520
calling new and when we do this the
14358
10:54:19,519 --> 10:54:23,839
operating system is going to give us a
14359
10:54:21,519 --> 10:54:25,519
new piece of memory on the heap
14360
10:54:23,839 --> 10:54:27,519
this piece of memory is going to have
14361
10:54:25,519 --> 10:54:29,680
the size enough to contain it so it's
14362
10:54:27,519 --> 10:54:31,680
going to be four bytes in memory and we
14363
10:54:29,680 --> 10:54:34,319
are going to be pointing to that piece
14364
10:54:31,680 --> 10:54:36,160
of memory using p number four here this
14365
10:54:34,319 --> 10:54:38,319
is what we are trying to say here the
14366
10:54:36,160 --> 10:54:40,640
moment we do this we own this piece of
14367
10:54:38,319 --> 10:54:42,480
memory and nobody else on the operating
14368
10:54:40,639 --> 10:54:44,720
system can use it so that's something
14369
10:54:42,480 --> 10:54:46,880
you should know once you have it you can
14370
10:54:44,720 --> 10:54:48,480
manipulate it through the pointer here
14371
10:54:46,879 --> 10:54:51,915
so here we can go through the the
14372
10:54:48,480 --> 10:54:53,596
reference operator and store in 77 and
14373
10:54:51,915 --> 10:54:55,915
if we print it out we're going to get
14374
10:54:53,595 --> 10:54:57,680
that printed out here okay this is
14375
10:54:55,915 --> 10:55:00,479
really cool this is the first time we
14376
10:54:57,680 --> 10:55:02,319
use hip memory and i am excited about
14377
10:55:00,480 --> 10:55:04,800
showing you this thanks we're going to
14378
10:55:02,319 --> 10:55:06,879
try and build this program and the build
14379
10:55:04,800 --> 10:55:08,080
is going to be good and we are going to
14380
10:55:08,080 --> 10:55:13,520
and if we run rooster we should see a 77
14381
10:55:13,519 --> 10:55:19,755
i'm going to get our 77 but this 77 is
14382
10:55:16,959 --> 10:55:21,839
stored on the heap now it is not stored
14383
10:55:19,756 --> 10:55:24,800
on the stack and this is really
14384
10:55:21,839 --> 10:55:27,115
really cool we can control when this
14385
10:55:24,800 --> 10:55:29,756
variable comes alive by allocating
14386
10:55:27,116 --> 10:55:32,639
memory on the heap and we exactly
14387
10:55:29,756 --> 10:55:34,319
control when this variable dies
14388
10:55:32,639 --> 10:55:36,800
if we want and we're going to see how we
14389
10:55:34,319 --> 10:55:39,040
can kill this variable from memory but
14390
10:55:36,800 --> 10:55:41,436
for now just take a moment and
14391
10:55:39,040 --> 10:55:43,595
appreciate how good it is to be able to
14392
10:55:41,436 --> 10:55:46,080
allocate stuff on the heap it is really
14393
10:55:43,595 --> 10:55:48,639
cool now that you have used the memory
14394
10:55:46,080 --> 10:55:50,800
it is really time to return it to the
14395
10:55:48,639 --> 10:55:52,639
system because we have no more use for
14396
10:55:50,800 --> 10:55:56,720
it the way you release memory to the
14397
10:55:52,639 --> 10:55:58,879
system is to call the delete keyword
14398
10:55:56,720 --> 10:56:01,436
and say the pointer pointing to the
14399
10:55:58,879 --> 10:56:03,199
memory that you are trying to release to
14400
10:56:01,436 --> 10:56:05,680
the system so we're going to say p
14401
10:56:03,199 --> 10:56:07,275
number four here let's bring this down a
14402
10:56:05,680 --> 10:56:09,840
little bit so that you can see the
14403
10:56:07,275 --> 10:56:11,915
entire story so we have a pointer here
14404
10:56:09,839 --> 10:56:13,915
and it is pointing to dynamically
14405
10:56:11,915 --> 10:56:15,915
allocated memory from the heap this
14406
10:56:15,915 --> 10:56:21,839
large because it stores an integer
14407
10:56:18,559 --> 10:56:24,399
we have it dynamically allocated we use
14408
10:56:21,839 --> 10:56:26,719
it here and it is time to return it to
14409
10:56:24,400 --> 10:56:28,880
the operating system okay i hope this is
14410
10:56:26,720 --> 10:56:30,319
clear the moment you call the delete
14411
10:56:30,319 --> 10:56:34,879
now the memory is going to be containing
14412
10:56:32,720 --> 10:56:37,200
some junk and you don't want to really
14413
10:56:34,879 --> 10:56:39,115
use that anymore if you try to use it
14414
10:56:37,199 --> 10:56:41,115
it's not your memory you're going to run
14415
10:56:39,116 --> 10:56:43,040
into trouble so for example after we
14416
10:56:41,116 --> 10:56:45,360
delete this memory if we try to use it
14417
10:56:43,040 --> 10:56:48,720
i'm going to show you here i think i can
14418
10:56:45,360 --> 10:56:50,959
let's say p number four and um storing
14419
10:56:48,720 --> 10:56:53,200
something notice that we are using the
14420
10:56:50,959 --> 10:56:55,519
the reference operator and let's try and
14421
10:56:55,519 --> 10:57:00,399
so let's build this with gcc as we
14422
10:56:58,080 --> 10:57:02,000
always do it is going to world compiler
14423
10:57:00,400 --> 10:57:03,916
is not going to stop you from doing
14424
10:57:03,915 --> 10:57:06,399
writing into memory that you have
14425
10:57:06,400 --> 10:57:12,000
released to the system but we're going
14426
10:57:08,800 --> 10:57:14,080
to see what happens so run rooster and
14427
10:57:12,000 --> 10:57:17,275
it is going to say done writing but you
14428
10:57:14,080 --> 10:57:20,400
see that the program has really crashed
14429
10:57:17,275 --> 10:57:22,559
because here we are trying to write into
14430
10:57:20,400 --> 10:57:25,520
memory that we don't really own and this
14431
10:57:22,559 --> 10:57:27,915
is bad don't do this so the moment you
14432
10:57:25,519 --> 10:57:29,595
delete the memory or the moment you
14433
10:57:27,915 --> 10:57:32,399
return the memory to the operating
14434
10:57:29,595 --> 10:57:35,040
system it is good practice to reset that
14435
10:57:32,400 --> 10:57:36,880
memory to no ptr so we're going to say p
14436
10:57:36,879 --> 10:57:42,799
make sure it contains no ptor
14437
10:57:40,639 --> 10:57:45,199
at least when we do this other people
14438
10:57:42,800 --> 10:57:47,436
have a chance to check and see that
14439
10:57:45,199 --> 10:57:49,755
that's valid memory before they use it
14440
10:57:47,436 --> 10:57:51,916
that's the use of resetting your memory
14441
10:57:49,756 --> 10:57:54,400
here so this is something you should do
14442
10:57:51,915 --> 10:57:56,399
again the flow to use dynamic memory is
14443
10:57:54,400 --> 10:57:58,720
really simple you set up a pointer that
14444
10:57:56,400 --> 10:57:59,916
is going to point to your memory
14445
10:57:59,915 --> 10:58:04,799
allocate the memory from the heap using
14446
10:58:02,400 --> 10:58:07,436
the new operator you're going to specify
14447
10:58:04,800 --> 10:58:08,960
the type you want to allocate memory for
14448
10:58:07,436 --> 10:58:10,400
the operating system is going to give
14449
10:58:08,959 --> 10:58:12,000
you that memory and you're going to be
14450
10:58:10,400 --> 10:58:14,319
pointing to that memory with your
14451
10:58:12,000 --> 10:58:16,720
pointer you are going to manipulate that
14452
10:58:14,319 --> 10:58:19,116
memory using your pointer and doing all
14453
10:58:16,720 --> 10:58:20,639
kinds of crazy things and after you are
14454
10:58:19,116 --> 10:58:23,596
done with that memory you're going to
14455
10:58:20,639 --> 10:58:24,639
release it to the operating system and
14456
10:58:24,639 --> 10:58:29,915
please remember to reset your pointers
14457
10:58:27,040 --> 10:58:31,840
after you have deleted them like this
14458
10:58:29,915 --> 10:58:34,559
that's going to make your life a whole
14459
10:58:31,839 --> 10:58:36,639
lot easier and other developers are
14460
10:58:34,559 --> 10:58:38,639
going to thank you for doing this
14461
10:58:36,639 --> 10:58:40,959
when they get to use your code because
14462
10:58:38,639 --> 10:58:43,040
your code is going to be much safer to
14463
10:58:40,959 --> 10:58:45,519
work with okay let's comment this out
14464
10:58:43,040 --> 10:58:47,840
and show you another example of what
14465
10:58:45,519 --> 10:58:49,915
cool things you can do with dynamic heap
14466
10:58:47,839 --> 10:58:51,519
memory we're going to go down and put in
14467
10:58:49,915 --> 10:58:52,879
a piece of code and show you that you
14468
10:58:52,879 --> 10:58:57,915
dynamically initialize your pointers at
14469
10:58:55,519 --> 10:59:00,000
declaration this is something you can do
14470
10:58:57,915 --> 10:59:02,079
the first one is not initialized so it's
14471
10:59:00,000 --> 10:59:03,756
going to contain junk volume p number
14472
10:59:02,080 --> 10:59:06,319
five if we try to print it we're going
14473
10:59:03,756 --> 10:59:08,400
to get some junk address print it out p
14474
10:59:06,319 --> 10:59:10,319
number six we're going to dereference it
14475
10:59:08,400 --> 10:59:12,239
and print the value inside so we're
14476
10:59:10,319 --> 10:59:14,159
going to see that and we can do the same
14477
10:59:12,239 --> 10:59:16,159
thing for p number six and p number
14478
10:59:14,160 --> 10:59:18,400
seven after we are done using the
14479
10:59:16,160 --> 10:59:20,320
pointers we are going to release the
14480
10:59:18,400 --> 10:59:22,480
memory here and notice that we are
14481
10:59:20,319 --> 10:59:24,239
resetting the pointers to no pointer to
14482
10:59:22,480 --> 10:59:27,040
say that they don't really contain
14483
10:59:24,239 --> 10:59:29,040
anything useful don't use them make sure
14484
10:59:27,040 --> 10:59:31,040
you have something valid and before you
14485
10:59:29,040 --> 10:59:32,720
use them this is the meaning here if
14486
10:59:31,040 --> 10:59:34,639
you're trying to run the program you can
14487
10:59:32,720 --> 10:59:36,800
guess what we're going to see so try and
14488
10:59:34,639 --> 10:59:38,879
guess and we're going to build we're
14489
10:59:36,800 --> 10:59:39,680
going to weld successfully going to
14490
10:59:39,680 --> 10:59:44,000
clear not clear and we're going to run
14491
10:59:42,080 --> 10:59:46,639
rooster and we're going to see that p
14492
10:59:44,000 --> 10:59:49,040
number five contains some junk address
14493
10:59:46,639 --> 10:59:51,519
okay and if we try to dereference that
14494
10:59:49,040 --> 10:59:54,000
we're going to get a junk value this is
14495
10:59:51,519 --> 10:59:56,479
really not useful don't use this value
14496
10:59:54,000 --> 10:59:58,400
because you didn't put this value in in
14497
10:59:56,480 --> 11:00:00,400
the first place you're going to see that
14498
10:59:58,400 --> 11:00:02,400
p number 6 is going to point to some
14499
11:00:00,400 --> 11:00:05,680
other address but we're going to have a
14500
11:00:02,400 --> 11:00:09,040
valid value inside because we have put
14501
11:00:05,680 --> 11:00:10,959
that n at initialization here the same
14502
11:00:09,040 --> 11:00:13,116
is true for p number seven it's going to
14503
11:00:10,959 --> 11:00:17,040
point to some address and we're going to
14504
11:00:13,116 --> 11:00:18,480
have 23 and because we put in our 23.
14505
11:00:17,040 --> 11:00:20,319
this is how you really use these
14506
11:00:18,480 --> 11:00:23,360
pointers another thing i want you to
14507
11:00:20,319 --> 11:00:26,480
know is that even if we have called
14508
11:00:23,360 --> 11:00:28,879
delete and reset these pointers they are
14509
11:00:26,480 --> 11:00:30,800
still available for use in our program
14510
11:00:28,879 --> 11:00:32,959
so if we want we can reuse these
14511
11:00:30,800 --> 11:00:34,800
pointers so for example p number five we
14512
11:00:34,800 --> 11:00:38,720
and use it to allocate new memory so we
14513
11:00:42,000 --> 11:00:46,400
okay so we can go down here and use that
14514
11:00:44,400 --> 11:00:47,680
this is going to be valid c plus plus
14515
11:00:47,680 --> 11:00:52,879
okay take a moment and look at it it is
14516
11:00:52,879 --> 11:00:56,399
and the visual studio code is going to
14517
11:00:54,559 --> 11:00:59,275
take this because it is valid c plus
14518
11:00:56,400 --> 11:01:01,756
plus code the memory has been returned
14519
11:00:59,275 --> 11:01:04,559
to the operating system and the pointer
14520
11:01:01,756 --> 11:01:06,800
has been reset to no ptr but we can
14521
11:01:04,559 --> 11:01:09,040
reuse this end pointer to allocate new
14522
11:01:06,800 --> 11:01:11,520
memory so we are allocating new memory
14523
11:01:09,040 --> 11:01:14,319
on the heap the memory is going to be
14524
11:01:14,319 --> 11:01:18,400
going to contain an integer and we are
14525
11:01:18,400 --> 11:01:22,880
to point to that new memory so this
14526
11:01:20,559 --> 11:01:23,595
pointer is being reused it was pointing
14527
11:01:23,595 --> 11:01:28,559
the memory that we allocated here which
14528
11:01:25,839 --> 11:01:30,239
was uninitialized and we are using that
14529
11:01:30,239 --> 11:01:35,199
memory location on the hip i really want
14530
11:01:32,239 --> 11:01:37,915
you to understand these things because
14531
11:01:35,199 --> 11:01:40,159
many beginners get them wrong and it is
14532
11:01:37,915 --> 11:01:43,115
hard to correct these things in your
14533
11:01:40,160 --> 11:01:45,276
mind once you have a wrong idea about
14534
11:01:43,116 --> 11:01:47,276
them in the first place so make sure you
14535
11:01:45,275 --> 11:01:50,239
understand this so if we print this
14536
11:01:47,275 --> 11:01:51,275
we're going to get the 81 printed out
14537
11:01:51,275 --> 11:01:55,756
we have allocated new memory we have to
14538
11:01:53,680 --> 11:01:58,160
remember to release it again so we have
14539
11:01:58,160 --> 11:02:03,040
p number five and we need to reset it to
14540
11:02:05,915 --> 11:02:09,680
once we do this we're going to be
14541
11:02:07,839 --> 11:02:12,239
playing it safe let's try and run and
14542
11:02:09,680 --> 11:02:14,160
see that we see the at1 printed out
14543
11:02:12,239 --> 11:02:16,000
we're going to build with gcc the world
14544
11:02:16,000 --> 11:02:21,199
and we are going to clear and run
14545
11:02:18,319 --> 11:02:23,839
rooster and you see that we see our 81
14546
11:02:21,199 --> 11:02:25,680
and we don't have any crazy crash for
14547
11:02:23,839 --> 11:02:28,559
example to prove that we don't have a
14548
11:02:25,680 --> 11:02:30,639
crash we can say that our program is
14549
11:02:34,959 --> 11:02:40,879
if the program has actually reached the
14550
11:02:37,839 --> 11:02:42,479
end before it dies we're going to build
14551
11:02:46,959 --> 11:02:51,595
and run rooster and you're going to see
14552
11:02:49,436 --> 11:02:53,360
that the program is ending well
14553
11:02:51,595 --> 11:02:57,435
the other thing i want you to see is
14554
11:02:53,360 --> 11:03:01,360
that it is really bad to call delete
14555
11:02:57,436 --> 11:03:04,800
twice on a pointer again it is really
14556
11:03:01,360 --> 11:03:06,559
bad to call delete twice on a pointer
14557
11:03:04,800 --> 11:03:08,560
don't do that okay we're going to see an
14558
11:03:08,559 --> 11:03:12,239
so we're going to allocate new memory
14559
11:03:10,160 --> 11:03:14,560
using p number five why not so we're
14560
11:03:12,239 --> 11:03:17,275
going to say p number five and we're
14561
11:03:14,559 --> 11:03:18,799
going to say new and going to allocate
14562
11:03:17,275 --> 11:03:22,239
new memory on the heap and we're going
14563
11:03:18,800 --> 11:03:24,720
to store in a 99 in that memory we can
14564
11:03:22,239 --> 11:03:26,959
print out the 99 so we're going to say
14565
11:03:24,720 --> 11:03:28,959
and after we are done using this memory
14566
11:03:26,959 --> 11:03:31,519
we are a good c plus plus citizen so
14567
11:03:33,756 --> 11:03:38,239
okay this is good it is going to work if
14568
11:03:35,839 --> 11:03:42,159
we will then run we're going to get what
14569
11:03:38,239 --> 11:03:45,680
we expect we should get a 99 printed out
14570
11:03:42,160 --> 11:03:47,916
last in our program before it ends and
14571
11:03:45,680 --> 11:03:49,915
we see that printed out here program
14572
11:03:47,915 --> 11:03:53,595
ending well this is really cool
14573
11:03:49,915 --> 11:03:56,079
but if we try to call delete twice
14574
11:03:56,080 --> 11:03:59,520
and try to boil you see that the
14575
11:03:57,595 --> 11:04:00,799
compiler is not going to stop us because
14576
11:04:02,720 --> 11:04:06,720
so this is something you need to be
14577
11:04:04,239 --> 11:04:07,839
aware of in c plus plus if we run this
14578
11:04:07,839 --> 11:04:11,839
you're going to see ah the program is
14579
11:04:09,756 --> 11:04:14,319
not going to end well the c plus plus
14580
11:04:11,839 --> 11:04:16,159
runtime or the operating system is going
14581
11:04:14,319 --> 11:04:18,400
to get here and see uh this guy is
14582
11:04:16,160 --> 11:04:20,560
trying to release memory twice and i
14583
11:04:18,400 --> 11:04:22,160
don't do that this is a bad program i am
14584
11:04:20,559 --> 11:04:24,639
going to kill it and it is going to be
14585
11:04:22,160 --> 11:04:27,116
killed the bad thing again is that
14586
11:04:24,639 --> 11:04:29,680
anything you have in your program after
14587
11:04:27,116 --> 11:04:31,840
these lines is not going to run because
14588
11:04:29,680 --> 11:04:34,639
the operating system is going to kill
14589
11:04:31,839 --> 11:04:37,199
your program at this line here so if you
14590
11:04:34,639 --> 11:04:39,839
had memory allocated that you planned to
14591
11:04:37,199 --> 11:04:41,435
release later on in your program your
14592
11:04:39,839 --> 11:04:43,435
memory is not going to be released
14593
11:04:41,436 --> 11:04:45,916
because those statements to release the
14594
11:04:43,436 --> 11:04:47,916
memory will never be run this is where
14595
11:04:45,915 --> 11:04:49,595
the program is going to be killed the
14596
11:04:47,915 --> 11:04:52,159
operating system is going to see that
14597
11:04:49,595 --> 11:04:55,199
you are a rug program and it is going to
14598
11:04:52,160 --> 11:04:57,276
kill the program so don't delete your
14599
11:04:55,199 --> 11:04:59,115
memory twice this is something you
14600
11:04:57,275 --> 11:05:01,115
should really watch out for and you
14601
11:04:59,116 --> 11:05:03,596
might think uh-huh i know this why would
14602
11:05:01,116 --> 11:05:06,080
i call delete twice in a single line
14603
11:05:03,595 --> 11:05:08,639
here well you may not do it like this
14604
11:05:06,080 --> 11:05:09,756
but your program might have multiple
14605
11:05:09,756 --> 11:05:13,680
where you have pointers pointing to the
14606
11:05:11,595 --> 11:05:15,839
same memory and if you try to delete
14607
11:05:13,680 --> 11:05:17,840
that memory twice you're going to get
14608
11:05:15,839 --> 11:05:19,679
this error and this is really good so
14609
11:05:17,839 --> 11:05:21,115
watch out for these kinds of things and
14610
11:05:19,680 --> 11:05:22,080
we're going to see different ways you
14611
11:05:22,080 --> 11:05:26,959
use to really make sure you are doing
14612
11:05:24,959 --> 11:05:28,400
things right in c plus plus this is
14613
11:05:26,959 --> 11:05:31,275
really all we set out to do in this
14614
11:05:28,400 --> 11:05:34,800
lecture giving you first-hand practice
14615
11:05:31,275 --> 11:05:37,040
on how to do dynamic memory allocation i
14616
11:05:34,800 --> 11:05:38,800
hope you found this useful we are going
14617
11:05:37,040 --> 11:05:40,559
to stop here in this lecture and the
14618
11:05:38,800 --> 11:05:42,240
next one we're going to learn about
14619
11:05:42,239 --> 11:05:46,799
go ahead and finish up here and we'd be
14620
11:05:44,720 --> 11:05:49,040
there in this lecture we're going to
14621
11:05:46,800 --> 11:05:51,360
focus on dangling pointers and show you
14622
11:05:49,040 --> 11:05:54,160
how they can be bad a dangling pointer
14623
11:05:51,360 --> 11:05:56,160
is a pointer that is pointing to a valid
14624
11:05:54,160 --> 11:05:58,160
address and we have seen a few examples
14625
11:05:56,160 --> 11:06:00,160
of this already but in this lecture
14626
11:05:58,160 --> 11:06:02,320
we're going to focus on that and show
14627
11:06:00,160 --> 11:06:04,800
you common solutions we can apply to
14628
11:06:02,319 --> 11:06:06,959
these problems here and download
14629
11:06:04,800 --> 11:06:09,040
pointers are really bad they are going
14630
11:06:06,959 --> 11:06:11,680
to lead you programs to undefined
14631
11:06:09,040 --> 11:06:13,275
behavior and we have seen that that can
14632
11:06:13,275 --> 11:06:17,915
many times there are three kinds of
14633
11:06:16,239 --> 11:06:19,915
dangling pointers we're going to look at
14634
11:06:17,915 --> 11:06:22,399
in this lecture the first one is a
14635
11:06:19,915 --> 11:06:25,360
pointer that is not initialized the
14636
11:06:22,400 --> 11:06:28,000
second one is a deleted pointer and the
14637
11:06:25,360 --> 11:06:29,915
third case may come if you have multiple
14638
11:06:28,000 --> 11:06:32,879
pointers pointing to the same memory
14639
11:06:29,915 --> 11:06:35,199
location and let's look at these cases
14640
11:06:32,879 --> 11:06:37,839
one by one here we have an example of a
14641
11:06:35,199 --> 11:06:40,159
pointer that is not properly initialized
14642
11:06:37,839 --> 11:06:40,959
this is p number five it is a pointer to
14643
11:06:40,959 --> 11:06:44,879
and it is not initialized it doesn't
14644
11:06:42,720 --> 11:06:47,275
really point anywhere and it is going to
14645
11:06:44,879 --> 11:06:49,040
contain junk address if we try to
14646
11:06:47,275 --> 11:06:51,360
dereference it we're going to get bad
14647
11:06:49,040 --> 11:06:54,239
things to happen because we don't really
14648
11:06:51,360 --> 11:06:56,160
know which address is stored in there
14649
11:06:54,239 --> 11:06:58,879
and putting something in there might
14650
11:06:56,160 --> 11:07:01,116
lead to a crash so this is something you
14651
11:06:58,879 --> 11:07:03,275
need to watch out for the second kind of
14652
11:07:01,116 --> 11:07:06,240
dangling pointer that can really lead
14653
11:07:03,275 --> 11:07:09,275
you to bad places is a deleted pointer
14654
11:07:06,239 --> 11:07:12,079
here is a pointer p number one it is
14655
11:07:09,275 --> 11:07:14,079
initialized with dynamic memory and we
14656
11:07:12,080 --> 11:07:16,240
can use it for example here we are
14657
11:07:14,080 --> 11:07:18,720
dereferencing the pointer and printing
14658
11:07:16,239 --> 11:07:21,275
the value inside and deleting the
14659
11:07:18,720 --> 11:07:23,840
pointer after we delete the pointer
14660
11:07:21,275 --> 11:07:26,319
don't really use it before you properly
14661
11:07:23,839 --> 11:07:28,799
initialize it with some kind of memory
14662
11:07:26,319 --> 11:07:31,275
if we try to do that this is going to be
14663
11:07:28,800 --> 11:07:33,756
undefined behavior and your program
14664
11:07:31,275 --> 11:07:36,079
might crash so make sure you don't do
14665
11:07:33,756 --> 11:07:38,080
something like this another case is if
14666
11:07:36,080 --> 11:07:40,880
you have multiple pointers pointing to
14667
11:07:38,080 --> 11:07:43,520
the same address and here is a simple
14668
11:07:40,879 --> 11:07:46,159
example to drive the point home we have
14669
11:07:43,519 --> 11:07:49,199
pointer three which is pointing to
14670
11:07:46,160 --> 11:07:52,560
dynamic memory here we are using new ant
14671
11:07:49,199 --> 11:07:55,360
in our braced initializer and we are
14672
11:07:52,559 --> 11:07:56,479
putting value 83 in that pointer
14673
11:07:56,480 --> 11:08:01,436
and here we set up another pointer p
14674
11:07:58,639 --> 11:08:03,680
number four and we initialize that with
14675
11:08:01,436 --> 11:08:05,200
another pointer and if we print these
14676
11:08:03,680 --> 11:08:07,275
things out we're going to get that they
14677
11:08:05,199 --> 11:08:08,799
contain the same address and they
14678
11:08:07,275 --> 11:08:09,839
contain the same value we're going to
14679
11:08:12,559 --> 11:08:16,959
and try to use p number four later we're
14680
11:08:15,040 --> 11:08:19,360
going to get problems because this
14681
11:08:16,959 --> 11:08:20,319
memory has been deleted by p number
14682
11:08:20,319 --> 11:08:24,800
but p number four is still pointing to
14683
11:08:22,800 --> 11:08:27,360
that and if it tries to use that it's
14684
11:08:24,800 --> 11:08:29,200
going to be deleted memory basically and
14685
11:08:27,360 --> 11:08:32,480
we're going to get undefined behavior so
14686
11:08:29,199 --> 11:08:34,879
be sure you know these problems and try
14687
11:08:32,480 --> 11:08:37,360
to avoid them in your programs okay
14688
11:08:34,879 --> 11:08:40,239
these are problems but how do we solve
14689
11:08:37,360 --> 11:08:42,400
them well there are a few solutions one
14690
11:08:40,239 --> 11:08:44,639
is to always initialize your pointers
14691
11:08:42,400 --> 11:08:46,959
the moment you declare a pointer make
14692
11:08:44,639 --> 11:08:48,800
sure it is initialized if you don't know
14693
11:08:46,959 --> 11:08:51,360
what you can initialize that pointer
14694
11:08:48,800 --> 11:08:53,200
with put in null pointer first and then
14695
11:08:51,360 --> 11:08:56,000
you're going to put in an address later
14696
11:08:53,199 --> 11:08:57,915
when you have a clear idea of which
14697
11:08:56,000 --> 11:09:00,720
address you can store in the second
14698
11:08:57,915 --> 11:09:04,239
solution is to reset your pointers to
14699
11:09:00,720 --> 11:09:06,000
now ptr after you delete the memory
14700
11:09:04,239 --> 11:09:08,319
that's the second thing you should do
14701
11:09:06,000 --> 11:09:10,400
every time you call delete that's going
14702
11:09:08,319 --> 11:09:12,879
to give other developers or even
14703
11:09:10,400 --> 11:09:14,480
yourself a chance to check and see if
14704
11:09:14,480 --> 11:09:19,436
contains a valid address before you do
14705
11:09:16,959 --> 11:09:22,080
that and for multiple pointers pointing
14706
11:09:19,436 --> 11:09:24,959
to the same address you have to choose
14707
11:09:22,080 --> 11:09:26,959
and make one pointer the master of the
14708
11:09:26,959 --> 11:09:32,080
and all pointers are basically going to
14709
11:09:29,116 --> 11:09:34,400
be slaves which can't release the memory
14710
11:09:32,080 --> 11:09:36,240
but they can read and do something with
14711
11:09:34,400 --> 11:09:39,275
that memory that they don't have the
14712
11:09:36,239 --> 11:09:41,199
task of releasing that memory and here
14713
11:09:39,275 --> 11:09:43,756
is how you can apply solution one for
14714
11:09:41,199 --> 11:09:45,839
example we have pointer number five and
14715
11:09:43,756 --> 11:09:48,639
we're going to brace initialize it this
14716
11:09:48,639 --> 11:09:53,275
null pointer the other thing you can do
14717
11:09:50,800 --> 11:09:55,276
is initialize the pointer with dynamic
14718
11:09:53,275 --> 11:09:57,436
memory like we are doing here with p
14719
11:09:55,275 --> 11:09:59,360
number six and this is going to put in
14720
11:09:57,436 --> 11:10:00,880
the value and we are going to be playing
14721
11:10:00,879 --> 11:10:05,435
now if your pointers are initialized
14722
11:10:03,519 --> 11:10:08,559
developers have a chance to check your
14723
11:10:05,436 --> 11:10:11,596
pointers against no ptr to see that they
14724
11:10:08,559 --> 11:10:13,915
contain something valid before they use
14725
11:10:11,595 --> 11:10:16,399
it and if they see that it contains no
14726
11:10:13,915 --> 11:10:19,040
ptr they are not going to try and use it
14727
11:10:16,400 --> 11:10:21,916
and this is going to be very safe for
14728
11:10:19,040 --> 11:10:24,400
the second problem with deleted pointers
14729
11:10:21,915 --> 11:10:26,159
we are going to reset our pointers after
14730
11:10:24,400 --> 11:10:28,480
we call delete for example here we have
14731
11:10:26,160 --> 11:10:31,756
pin number seven initialized with
14732
11:10:28,480 --> 11:10:33,916
dynamic memory and 82 is stored in we
14733
11:10:31,756 --> 11:10:35,840
can print it out all do things with it
14734
11:10:33,915 --> 11:10:38,479
when we delete the memory we're going to
14735
11:10:35,839 --> 11:10:40,799
reset it to null p2r so that other
14736
11:10:38,480 --> 11:10:43,596
developers or even ourselves can check
14737
11:10:40,800 --> 11:10:46,800
this memory against no ptr and if it's
14738
11:10:43,595 --> 11:10:48,799
different from no ptr we can use it if
14739
11:10:46,800 --> 11:10:50,560
it's equal to no ptr we're going to
14740
11:10:48,800 --> 11:10:53,116
leave it alone and do something else
14741
11:10:50,559 --> 11:10:55,040
this is going to be very safe if you
14742
11:10:53,116 --> 11:10:56,880
have multiple pointers pointing to the
14743
11:10:55,040 --> 11:10:58,720
same address like we have here then
14744
11:10:56,879 --> 11:11:01,115
you're going to have to decide which
14745
11:10:58,720 --> 11:11:03,200
pointer is the master pointer and other
14746
11:11:06,480 --> 11:11:10,800
all the other pointers are going to
14747
11:11:08,160 --> 11:11:13,116
check against the master pointer and see
14748
11:11:10,800 --> 11:11:15,276
that it contains valid memory because
14749
11:11:13,116 --> 11:11:17,436
the master pointer has the task of
14750
11:11:15,275 --> 11:11:19,275
deleting this memory let's go through
14751
11:11:17,436 --> 11:11:20,720
this and see how this could work in
14752
11:11:20,720 --> 11:11:26,239
so p number five is our master pointer
14753
11:11:23,680 --> 11:11:29,360
we are setting p number five and
14754
11:11:26,239 --> 11:11:31,360
initializing it with p number eight we
14755
11:11:29,360 --> 11:11:33,360
are creating things using p number eight
14756
11:11:31,360 --> 11:11:35,360
we can either use p number eight or pin
14757
11:11:33,360 --> 11:11:37,915
urban eye this is going to work but
14758
11:11:35,360 --> 11:11:40,080
before we use the memory location we're
14759
11:11:37,915 --> 11:11:42,319
going to check against the master
14760
11:11:40,080 --> 11:11:44,240
pointer if the master pointer contains
14761
11:11:42,319 --> 11:11:46,720
no ptr we're not going to use this
14762
11:11:44,239 --> 11:11:49,275
memory if the master pointer doesn't
14763
11:11:46,720 --> 11:11:51,116
contain now ptr we're going to use this
14764
11:11:49,275 --> 11:11:53,275
memory here okay if you go down you see
14765
11:11:51,116 --> 11:11:55,200
that the master pointer is going to be
14766
11:11:53,275 --> 11:11:58,159
releasing the memory and if we try to
14767
11:11:55,199 --> 11:11:59,839
use that memory after it was deleted
14768
11:11:58,160 --> 11:12:02,160
we're going to see that it contains now
14769
11:11:59,839 --> 11:12:04,319
ptr and we're not going to be using it
14770
11:12:02,160 --> 11:12:06,800
this is something cool and it is really
14771
11:12:04,319 --> 11:12:08,959
easy to implement this safety guidelines
14772
11:12:06,800 --> 11:12:10,639
in your programs now that you know about
14773
11:12:08,959 --> 11:12:13,116
this we're going to go to visual studio
14774
11:12:10,639 --> 11:12:16,159
code and show you this in action okay
14775
11:12:13,116 --> 11:12:18,880
here we are in our working directory the
14776
11:12:16,160 --> 11:12:21,116
current project is dangling pointers so
14777
11:12:18,879 --> 11:12:24,719
we're going to grab our template files
14778
11:12:21,116 --> 11:12:26,240
pretty quick and put that in our project
14779
11:12:24,720 --> 11:12:29,200
and we're going to open this in visual
14780
11:12:26,239 --> 11:12:31,519
studio code we are going to look at the
14781
11:12:29,199 --> 11:12:33,115
first case of a dangling pointer and
14782
11:12:31,519 --> 11:12:36,399
this is a pointer that is not
14783
11:12:33,116 --> 11:12:38,240
initialized properly like p number here
14784
11:12:36,400 --> 11:12:40,560
if we try to reference it we're going to
14785
11:12:40,559 --> 11:12:45,756
so let's see that and let's go down and
14786
11:12:43,040 --> 11:12:47,680
say that program is ending well just to
14787
11:12:45,756 --> 11:12:49,595
know that we didn't get a crash because
14788
11:12:47,680 --> 11:12:52,319
a crash is basically going to terminate
14789
11:12:49,595 --> 11:12:54,399
your program on the offending line
14790
11:12:52,319 --> 11:12:55,519
that's what it's going to do so if the
14791
11:12:55,519 --> 11:12:59,359
works well and ends well we're going to
14792
11:13:01,519 --> 11:13:06,479
gcc to build this program and let's open
14793
11:13:06,480 --> 11:13:09,436
run it we're going to clear the world
14794
11:13:09,436 --> 11:13:14,800
and we're going to run rooster
14795
11:13:11,519 --> 11:13:17,519
you see that the program didn't end well
14796
11:13:14,800 --> 11:13:18,960
it crashed and it crashed because we are
14797
11:13:18,959 --> 11:13:23,275
uninitialized memory when the operating
14798
11:13:21,519 --> 11:13:25,199
system is going to try and run this
14799
11:13:23,275 --> 11:13:27,756
thing it's going to see ah this guy is
14800
11:13:25,199 --> 11:13:29,755
trying to modify memory that doesn't
14801
11:13:27,756 --> 11:13:31,840
really belong to him it is a road
14802
11:13:29,756 --> 11:13:34,400
program i am going to kill it and it is
14803
11:13:31,839 --> 11:13:35,839
going to be terminated on this line here
14804
11:13:35,839 --> 11:13:40,079
you should avoid these kinds of
14805
11:13:37,199 --> 11:13:41,839
situations so don't do this we are going
14806
11:13:40,080 --> 11:13:44,400
to comment this out and show you another
14807
11:13:41,839 --> 11:13:47,595
offending event we can do in our program
14808
11:13:44,400 --> 11:13:48,800
and that is using a deleted pointer if
14809
11:13:47,595 --> 11:13:51,040
you do that you're going to get
14810
11:13:48,800 --> 11:13:53,916
something bad in your programs
14811
11:13:51,040 --> 11:13:57,275
so here we have a small example we have
14812
11:13:53,915 --> 11:13:59,360
a pointer to end we initialize this with
14813
11:13:57,275 --> 11:14:01,519
a dynamic piece of memory and we're
14814
11:14:01,519 --> 11:14:04,879
and we can print this out this is going
14815
11:14:05,680 --> 11:14:10,319
we delete the memory down here and we
14816
11:14:07,680 --> 11:14:12,639
try to use it after we have deleted the
14817
11:14:10,319 --> 11:14:14,480
memory so the operating system is not
14818
11:14:12,639 --> 11:14:17,199
going to be happy about this because
14819
11:14:14,480 --> 11:14:20,319
once the memory is deleted it is no
14820
11:14:17,199 --> 11:14:22,319
longer our memory so we have no business
14821
11:14:20,319 --> 11:14:24,720
the referencing pointer one and trying
14822
11:14:22,319 --> 11:14:26,000
to use that here and we're going to get
14823
11:14:26,000 --> 11:14:30,400
and this is something you should avoid
14824
11:14:27,680 --> 11:14:33,275
so let's try and build this and show you
14825
11:14:30,400 --> 11:14:35,275
this in action we are going to clear
14826
11:14:35,275 --> 11:14:39,756
and you're going to see that program is
14827
11:14:37,116 --> 11:14:42,639
ending well but in some cases it might
14828
11:14:39,756 --> 11:14:43,840
crash and hopefully this shows you the
14829
11:14:43,839 --> 11:14:49,039
that these things might put you into
14830
11:14:46,720 --> 11:14:51,756
sometimes your program is going to seem
14831
11:14:49,040 --> 11:14:54,160
working fine but sometimes when this
14832
11:14:51,756 --> 11:14:56,480
memory that we are pointing to in p
14833
11:14:54,160 --> 11:14:58,000
number one here is being used to do
14834
11:14:56,480 --> 11:15:00,400
something really important by the
14835
11:14:58,000 --> 11:15:02,720
operating system you are going to get a
14836
11:15:00,400 --> 11:15:05,275
crash so you're not guaranteed to get
14837
11:15:02,720 --> 11:15:07,360
the same behavior every time you run
14838
11:15:05,275 --> 11:15:09,915
your program some of you might be saying
14839
11:15:07,360 --> 11:15:13,275
aha the program is working here daniel
14840
11:15:09,915 --> 11:15:15,915
why are you making this such a big deal
14841
11:15:13,275 --> 11:15:18,239
well it is a big deal because you are
14842
11:15:15,915 --> 11:15:21,435
not guaranteed to get the same results
14843
11:15:18,239 --> 11:15:24,000
every time you run this program so be
14844
11:15:21,436 --> 11:15:26,000
sure you really avoid these kinds of
14845
11:15:24,000 --> 11:15:27,595
situations let's try and clear and run
14846
11:15:26,000 --> 11:15:30,639
the program again hopefully we're going
14847
11:15:27,595 --> 11:15:33,199
to see it crash but we're not okay so
14848
11:15:30,639 --> 11:15:35,116
let's clear and rebuild again
14849
11:15:33,199 --> 11:15:36,719
and see that we have a better luck that
14850
11:15:38,400 --> 11:15:43,116
and run rooster it is going to end well
14851
11:15:41,040 --> 11:15:45,595
but you notice that we are trying to use
14852
11:15:43,116 --> 11:15:48,480
a piece of memory that has already been
14853
11:15:45,595 --> 11:15:51,040
deleted and this is bad don't do this
14854
11:15:48,480 --> 11:15:52,640
make sure you don't do something like
14855
11:15:51,040 --> 11:15:55,200
this we're going to comment this out
14856
11:15:52,639 --> 11:15:57,915
again and show you another offending
14857
11:15:55,199 --> 11:16:00,159
thing we can do with our programs and
14858
11:15:57,915 --> 11:16:02,879
bad things might happen if you try to
14859
11:16:00,160 --> 11:16:04,640
have multiple pointers played into the
14860
11:16:02,879 --> 11:16:07,040
same address and that's what we have
14861
11:16:04,639 --> 11:16:09,595
here we have p number three and p number
14862
11:16:07,040 --> 11:16:12,080
four here p number three is allocating
14863
11:16:09,595 --> 11:16:15,680
new space and it is pointing to it we
14864
11:16:12,080 --> 11:16:17,840
have an 83 inside and a p number four is
14865
11:16:15,680 --> 11:16:20,319
initialized with p number three we can
14866
11:16:17,839 --> 11:16:23,435
do that so these two pointers are
14867
11:16:20,319 --> 11:16:24,720
basically pointing to the same memory
14868
11:16:24,720 --> 11:16:28,959
let's run this and show you that
14869
11:16:27,040 --> 11:16:32,080
we're going to comment out this delete
14870
11:16:28,959 --> 11:16:34,479
statement here and run the program first
14871
11:16:32,080 --> 11:16:36,720
to really prove that they are pointing
14872
11:16:34,480 --> 11:16:40,080
to the same addresses and they contain
14873
11:16:36,720 --> 11:16:43,200
the same values let's build and run
14874
11:16:40,080 --> 11:16:45,200
we're going to use gcc for that
14875
11:16:43,199 --> 11:16:46,719
and we're going to clear and run rooster
14876
11:16:46,720 --> 11:16:51,275
p number three the address is this and
14877
11:16:48,959 --> 11:16:52,799
it contains an 83 p number four contains
14878
11:16:52,800 --> 11:16:58,480
so let's see what happens if we try to
14879
11:16:58,480 --> 11:17:03,360
and using p number four later to try and
14880
11:17:01,519 --> 11:17:04,159
read stuff this is what we are doing
14881
11:17:04,160 --> 11:17:08,800
and we're going to see if the program
14882
11:17:08,800 --> 11:17:12,560
we're going to build again the world is
14883
11:17:10,480 --> 11:17:14,880
going to be good let's bring this up and
14884
11:17:14,879 --> 11:17:18,479
and you're going to see that the program
14885
11:17:18,480 --> 11:17:23,596
but we are using a deleted piece of
14886
11:17:21,116 --> 11:17:26,240
memory here and anything can really
14887
11:17:23,595 --> 11:17:28,479
happen okay so you might get garbage you
14888
11:17:26,239 --> 11:17:32,159
might have really any piece of junk
14889
11:17:28,480 --> 11:17:34,720
inside or you might get a crush in some
14890
11:17:32,160 --> 11:17:37,436
extreme cases so this is really bad
14891
11:17:34,720 --> 11:17:40,080
don't do it don't try to use a piece of
14892
11:17:37,436 --> 11:17:42,319
memory that you have already deleted
14893
11:17:40,080 --> 11:17:44,319
through a pointer and these are problems
14894
11:17:42,319 --> 11:17:47,116
you might run into in your programs if
14895
11:17:44,319 --> 11:17:49,756
you try to use dynamic memory allocation
14896
11:17:47,116 --> 11:17:51,040
let's look at how we can solve them
14897
11:17:53,680 --> 11:17:58,959
make sure you put a little ptr in a
14898
11:17:56,080 --> 11:18:01,116
pointer if you don't know what that
14899
11:17:58,959 --> 11:18:03,519
pointer is actually stored at okay let's
14900
11:18:01,116 --> 11:18:05,360
go down and look at solution one
14901
11:18:03,519 --> 11:18:08,239
solution one is to initialize your
14902
11:18:05,360 --> 11:18:10,160
pointer to no pointer every time if you
14903
11:18:08,239 --> 11:18:12,720
don't have a value you can put in use
14904
11:18:10,160 --> 11:18:15,360
null ptr that's what we are using here
14905
11:18:12,720 --> 11:18:18,080
implicitly but we can explicitly put
14906
11:18:15,360 --> 11:18:20,639
that end because it is good and before
14907
11:18:18,080 --> 11:18:23,436
you use a pointer you have to check and
14908
11:18:20,639 --> 11:18:26,000
see if it doesn't contain null pointer
14909
11:18:23,436 --> 11:18:28,160
this is how we do it if pointer six is
14910
11:18:26,000 --> 11:18:30,639
different from null pointer we're going
14911
11:18:28,160 --> 11:18:31,916
to use it if it is equal to no pointer
14912
11:18:30,639 --> 11:18:34,159
we're not going to use it and we're
14913
11:18:31,915 --> 11:18:35,680
going to be playing on the safe side and
14914
11:18:34,160 --> 11:18:38,160
you're going to see that the program is
14915
11:18:35,680 --> 11:18:41,360
going to end well here if we have a null
14916
11:18:44,400 --> 11:18:49,756
invalid address okay and that the user
14917
11:18:47,360 --> 11:18:52,319
is going to know that they are trying to
14918
11:18:49,756 --> 11:18:54,800
do something really bad so let's try and
14919
11:18:54,800 --> 11:19:00,800
so let's go and store a null pointer in
14920
11:18:57,756 --> 11:19:02,880
p number six to really try this out and
14921
11:19:00,800 --> 11:19:05,200
show you that we're going to get this
14922
11:19:02,879 --> 11:19:07,755
warning if we're trying to use it
14923
11:19:05,199 --> 11:19:10,239
and we're going to build with gcc and
14924
11:19:07,756 --> 11:19:12,319
we're going to clear and run rooster
14925
11:19:10,239 --> 11:19:14,639
you're going to see that invalid address
14926
11:19:12,319 --> 11:19:17,680
and the program is going to end well
14927
11:19:14,639 --> 11:19:19,680
and if we try to put this statement
14928
11:19:17,680 --> 11:19:21,519
somewhere where we're not shaking
14929
11:19:21,519 --> 11:19:26,079
no pointer we are going to get a crash
14930
11:19:23,915 --> 11:19:29,115
so let's comment this out so that it's
14931
11:19:26,080 --> 11:19:30,639
clear what it is we are running here
14932
11:19:29,116 --> 11:19:32,720
so if we run this we're going to get a
14933
11:19:30,639 --> 11:19:34,239
crash we have seen that but let's show
14934
11:19:34,239 --> 11:19:39,595
and really highlight that we are solving
14935
11:19:37,199 --> 11:19:41,519
the problem here if we run rooster the
14936
11:19:39,595 --> 11:19:43,159
program is going to crash because we are
14937
11:19:44,800 --> 11:19:50,880
memory but if we try and check against
14938
11:19:48,000 --> 11:19:52,800
no ptr like we are doing here let's do
14939
11:19:50,879 --> 11:19:54,799
that we're going to be playing on the
14940
11:19:52,800 --> 11:19:56,960
safe side because it's going to tell us
14941
11:19:54,800 --> 11:19:59,360
invalid address and we're not going to
14942
11:19:56,959 --> 11:20:01,199
get a crush and the program is going to
14943
11:19:59,360 --> 11:20:02,720
end well this is really cool so let's
14944
11:20:01,199 --> 11:20:05,115
try and do that again we're going to
14945
11:20:05,436 --> 11:20:10,000
the world is going to be good we can
14946
11:20:07,199 --> 11:20:13,519
clear and run rooster and the program is
14947
11:20:10,000 --> 11:20:15,839
going to end well okay so if we have a
14948
11:20:13,519 --> 11:20:18,319
value inside we're going to get that so
14949
11:20:15,839 --> 11:20:21,115
let's put that n and say new ant and put
14950
11:20:18,319 --> 11:20:23,040
in an 87 for example it doesn't really
14951
11:20:23,040 --> 11:20:26,879
so we're going to build again the work
14952
11:20:24,800 --> 11:20:29,200
is going to be good and we can run
14953
11:20:26,879 --> 11:20:31,915
rooster and you see that we are getting
14954
11:20:29,199 --> 11:20:34,639
a value here if we are not storing no
14955
11:20:31,915 --> 11:20:37,360
ptlr in p number six and you can do the
14956
11:20:34,639 --> 11:20:40,239
same checks against p number five but i
14957
11:20:37,360 --> 11:20:43,840
think this is really enough so this is
14958
11:20:40,239 --> 11:20:45,595
one way you can avoid dangling pointers
14959
11:20:43,839 --> 11:20:48,239
the next thing we're going to look at is
14960
11:20:45,595 --> 11:20:50,479
if we are using a deleted pointer and
14961
11:20:48,239 --> 11:20:52,879
again the solution is to set a pointer
14962
11:20:52,879 --> 11:20:59,040
after we delete it here we have p number
14963
11:20:55,595 --> 11:21:01,115
seven it has 82 inside we are using it
14964
11:20:59,040 --> 11:21:03,360
here and printing stuff out we're going
14965
11:21:01,116 --> 11:21:05,276
to delete it after we are done using it
14966
11:21:05,275 --> 11:21:11,115
the first thing we do is to reset it to
14967
11:21:07,839 --> 11:21:13,359
no ptr when we do that other people or
14968
11:21:11,116 --> 11:21:15,916
even ourselves have a chance to check it
14969
11:21:13,360 --> 11:21:18,319
against no ptr and we're going to know
14970
11:21:15,915 --> 11:21:19,360
that it doesn't contain anything
14971
11:21:19,360 --> 11:21:23,116
for our program and if we do something
14972
11:21:23,116 --> 11:21:27,276
we're not going to run into all these
14973
11:21:27,275 --> 11:21:30,799
and our program is going to have
14974
11:21:30,800 --> 11:21:34,639
across different runs and this is really
14975
11:21:32,959 --> 11:21:36,879
cool so we're going to run this we're
14976
11:21:34,639 --> 11:21:39,756
going to get things printed out and the
14977
11:21:36,879 --> 11:21:43,680
program is going to end well because
14978
11:21:39,756 --> 11:21:45,916
right now we are checking against no ptr
14979
11:21:43,680 --> 11:21:48,720
we can even be explicit in showing the
14980
11:21:45,915 --> 11:21:51,755
warning here we can say invalid memory
14981
11:21:48,720 --> 11:21:53,275
access and if you run this program
14982
11:21:51,756 --> 11:21:55,275
you're going to really know this so
14983
11:21:53,275 --> 11:21:57,839
let's finish this up and we're going to
14984
11:21:55,275 --> 11:21:59,839
bolt and the bulk is going to be good if
14985
11:21:57,839 --> 11:22:02,000
we run this and run rooster we're going
14986
11:21:59,839 --> 11:22:04,799
to know that we are doing any valid
14987
11:22:02,000 --> 11:22:06,480
memory access after we have deleted the
14988
11:22:04,800 --> 11:22:09,276
pointer and this is going to save you
14989
11:22:06,480 --> 11:22:11,916
from possible crashes that you might
14990
11:22:09,275 --> 11:22:14,400
experience if you don't do this so this
14991
11:22:11,915 --> 11:22:16,399
is a second solution you might want to
14992
11:22:16,400 --> 11:22:20,800
and i'm going to comment it out and show
14993
11:22:18,400 --> 11:22:23,436
you how you can get away from the
14994
11:22:23,436 --> 11:22:27,840
multiple pointers pointing to the same
14995
11:22:25,680 --> 11:22:29,915
address we are going to go down and put
14996
11:22:27,839 --> 11:22:32,559
in the code it is what you have seen in
14997
11:22:29,915 --> 11:22:34,959
the slides and it is really nothing new
14998
11:22:32,559 --> 11:22:37,275
so we have pointer eight and pointer
14999
11:22:34,959 --> 11:22:38,720
nine here and p number eight here is
15000
11:22:43,839 --> 11:22:48,079
p number nine is initialized with
15001
11:22:45,839 --> 11:22:49,359
whatever we have in p number eight so
15002
11:22:48,080 --> 11:22:52,639
they are going to be pointing to the
15003
11:22:49,360 --> 11:22:55,116
same addresses here but we have made p
15004
11:22:52,639 --> 11:22:57,040
number eight the master pointer so it is
15005
11:22:55,116 --> 11:22:59,680
the only pointer that is going to be
15006
11:22:57,040 --> 11:23:01,520
able to delete this memory location even
15007
11:22:59,680 --> 11:23:02,639
if we have multiple pointers pointing to
15008
11:23:02,639 --> 11:23:07,360
okay so every time we want to use this
15009
11:23:04,639 --> 11:23:09,595
memory we have the option to check
15010
11:23:07,360 --> 11:23:12,639
against the master pointer and see that
15011
11:23:09,595 --> 11:23:14,720
we have some valid data inside if it is
15012
11:23:12,639 --> 11:23:16,639
no pointer we're not going to use that
15013
11:23:14,720 --> 11:23:18,720
and we're going to be playing on the
15014
11:23:16,639 --> 11:23:20,559
safe side this is really what we are
15015
11:23:18,720 --> 11:23:22,239
doing here if we run this we're going to
15016
11:23:20,559 --> 11:23:23,360
see that the program is going to end
15017
11:23:23,360 --> 11:23:26,720
the world is going to be good and if we
15018
11:23:25,275 --> 11:23:28,479
run rooster we're going to see that we
15019
11:23:26,720 --> 11:23:29,916
get things printed out we're going to go
15020
11:23:28,480 --> 11:23:31,680
through p number eight we're going to
15021
11:23:29,915 --> 11:23:33,595
print stuff we're going to go through p
15022
11:23:31,680 --> 11:23:36,400
number nine we're going to print stuff
15023
11:23:33,595 --> 11:23:38,319
and if we try to use the pointer
15024
11:23:38,319 --> 11:23:42,879
memory has been deleted we're going to
15025
11:23:40,480 --> 11:23:45,116
get a clear warning that we are trying
15026
11:23:42,879 --> 11:23:48,159
to do something really bad and this is
15027
11:23:45,116 --> 11:23:50,880
really what you should aim for in your c
15028
11:23:48,160 --> 11:23:53,436
plus plus programs that use dynamic
15029
11:23:50,879 --> 11:23:55,040
memory allocation and pointers
15030
11:23:53,436 --> 11:23:56,959
this is really all we set out to do in
15031
11:23:55,040 --> 11:23:58,879
this lecture i hope you know how you can
15032
11:23:56,959 --> 11:24:00,959
avoid these problems with dangling
15033
11:23:58,879 --> 11:24:02,719
pointers we are going to stop here in
15034
11:24:00,959 --> 11:24:05,040
this lecture the next lecture we're
15035
11:24:07,360 --> 11:24:11,595
fails to give you the memory that you
15036
11:24:09,436 --> 11:24:14,239
want to allocate on the heap and that's
15037
11:24:11,595 --> 11:24:16,399
possible go ahead and finish up here
15038
11:24:14,239 --> 11:24:20,000
and meet me there in this lecture we're
15039
11:24:16,400 --> 11:24:22,400
going to explore what happens when new
15040
11:24:20,000 --> 11:24:25,040
fails in the last lecture we saw that we
15041
11:24:22,400 --> 11:24:28,000
could use the new operator to allocate
15042
11:24:25,040 --> 11:24:30,879
for new memory on the heap and use that
15043
11:24:28,000 --> 11:24:33,275
to do stuff and in most cases the new
15044
11:24:30,879 --> 11:24:36,399
operator is going to succeed but in some
15045
11:24:33,275 --> 11:24:38,400
rare cases it is going to fail and when
15046
11:24:36,400 --> 11:24:40,639
you don't do anything about that failure
15047
11:24:38,400 --> 11:24:42,800
your program is just going to crash and
15048
11:24:40,639 --> 11:24:45,756
you might want to do something about
15049
11:24:42,800 --> 11:24:48,080
that i have to say that it is very rare
15050
11:24:45,756 --> 11:24:50,880
for new to fail in practice so you're
15051
11:24:48,080 --> 11:24:53,360
going to see a lot of code out there
15052
11:24:50,879 --> 11:24:55,755
that just uses the new operator it
15053
11:24:55,756 --> 11:25:01,200
checking if the operation actually
15054
11:24:58,480 --> 11:25:03,520
failed or succeeded so this is a very
15055
11:25:01,199 --> 11:25:05,199
rare case but if you need to handle it
15056
11:25:03,519 --> 11:25:08,000
we're going to see how you can do that
15057
11:25:05,199 --> 11:25:10,879
in this lecture here is a simple example
15058
11:25:08,000 --> 11:25:12,559
that is going to try and force the new
15059
11:25:12,559 --> 11:25:17,360
in the first segment here we are using
15060
11:25:14,639 --> 11:25:20,639
the new operator but we are using a
15061
11:25:17,360 --> 11:25:23,756
syntax that is going to try and allocate
15062
11:25:20,639 --> 11:25:25,756
a lot of integers in one go you see that
15063
11:25:23,756 --> 11:25:27,680
it is an array but we haven't really
15064
11:25:25,756 --> 11:25:30,639
seen how we can use an array like this
15065
11:25:27,680 --> 11:25:33,199
so just think of this code as a piece of
15066
11:25:30,639 --> 11:25:35,595
code that is going to allocate a lot of
15067
11:25:33,199 --> 11:25:38,239
integers in one go and we're going to
15068
11:25:38,239 --> 11:25:42,720
i have to say that this may give you an
15069
11:25:40,400 --> 11:25:45,040
error on some compilers saying that you
15070
11:25:42,720 --> 11:25:46,800
are exceeding the array size if that's
15071
11:25:45,040 --> 11:25:49,040
the case no problem we're going to find
15072
11:25:46,800 --> 11:25:51,116
another way to get this new operator to
15073
11:25:49,040 --> 11:25:52,959
fail we are going to put a thing like
15074
11:25:51,116 --> 11:25:56,240
this in a loop and we're going to loop a
15075
11:25:52,959 --> 11:25:59,116
lot of times enough to exhaust the heap
15076
11:25:56,239 --> 11:26:00,479
that is allocated to our program here
15077
11:25:59,116 --> 11:26:02,400
and when that happens you're going to
15078
11:26:00,480 --> 11:26:05,840
see that the program is going to crash
15079
11:26:02,400 --> 11:26:08,720
and it is bad so new can fail and if you
15080
11:26:05,839 --> 11:26:09,679
need to play on the server side you're
15081
11:26:09,680 --> 11:26:15,040
handle that problem and we have two ways
15082
11:26:12,480 --> 11:26:17,596
we can handle this problem we can go
15083
11:26:15,040 --> 11:26:20,720
through the exception mechanism this is
15084
11:26:17,595 --> 11:26:23,115
a built-in way we have in c plus plus to
15085
11:26:20,720 --> 11:26:26,480
check for arrows and handle them we can
15086
11:26:23,116 --> 11:26:29,520
also use the std no throw setting
15087
11:26:26,480 --> 11:26:31,680
in our new operator and force it not to
15088
11:26:29,519 --> 11:26:33,915
throw an exception and it's going to
15089
11:26:31,680 --> 11:26:36,319
give us no pointer if the allocation
15090
11:26:33,915 --> 11:26:37,915
fails i know this might sound cryptic
15091
11:26:36,319 --> 11:26:39,680
right now but we're going to see an
15092
11:26:37,915 --> 11:26:41,915
example shortly and you're going to
15093
11:26:39,680 --> 11:26:43,756
understand this let's look at how we can
15094
11:26:41,915 --> 11:26:46,399
use the exception mechanism the
15095
11:26:43,756 --> 11:26:49,040
exception mechanism is there in c plus
15096
11:26:46,400 --> 11:26:51,840
plus to let you handle problems when
15097
11:26:49,040 --> 11:26:54,480
they arise and the way you use that you
15098
11:26:51,839 --> 11:26:56,159
wrap code that is potentially going to
15099
11:26:56,160 --> 11:27:01,916
and try and catch blocks you see here
15100
11:26:59,275 --> 11:27:04,400
inside the loop we are saying try
15101
11:27:01,915 --> 11:27:06,799
and inside the tri blocks we have the
15102
11:27:04,400 --> 11:27:07,916
code that could fail we have our new
15103
11:27:07,915 --> 11:27:13,360
and in the catch block you see we have a
15104
11:27:10,879 --> 11:27:15,915
catch block here we're going to
15105
11:27:15,915 --> 11:27:19,519
and we have a way of catching the
15106
11:27:17,519 --> 11:27:22,879
problem and if you look at this thing we
15107
11:27:19,519 --> 11:27:26,799
have in this parenthesis after catch we
15108
11:27:22,879 --> 11:27:29,275
have an ex variable and we can ask it
15109
11:27:29,275 --> 11:27:33,595
leading to this exception happening in
15110
11:27:31,519 --> 11:27:35,839
our code you can think of this like this
15111
11:27:33,595 --> 11:27:38,159
i realize we haven't really talked about
15112
11:27:35,839 --> 11:27:39,915
exceptions we are going to talk about
15113
11:27:38,160 --> 11:27:41,680
them later in the course when we have
15114
11:27:39,915 --> 11:27:43,755
enough tools to really understand what
15115
11:27:43,756 --> 11:27:49,275
think of them as a tool to handle
15116
11:27:46,720 --> 11:27:51,200
when the new operator fails and you're
15117
11:27:49,275 --> 11:27:53,360
not going to crash your program your
15118
11:27:51,199 --> 11:27:55,839
program will keep running it will go
15119
11:27:53,360 --> 11:27:58,400
through the end but the new operation
15120
11:27:55,839 --> 11:28:00,159
that you wanted to do here will fail and
15121
11:27:58,400 --> 11:28:02,239
you will be able to catch that and this
15122
11:28:00,160 --> 11:28:04,800
is a good thing if you don't want to use
15123
11:28:02,239 --> 11:28:06,159
exceptions you can use the std no throw
15124
11:28:06,160 --> 11:28:11,436
and this is a new version of the new
15125
11:28:08,239 --> 11:28:13,839
operator you can use to tell the c plus
15126
11:28:11,436 --> 11:28:16,160
plus system to not throw an exception
15127
11:28:13,839 --> 11:28:18,079
when the operation fails it is just
15128
11:28:16,160 --> 11:28:19,756
going to return no pointer and you can
15129
11:28:18,080 --> 11:28:22,560
check for that and know that memory
15130
11:28:19,756 --> 11:28:23,840
allocation actually failed this is what
15131
11:28:22,559 --> 11:28:25,680
we're going to talk about in this
15132
11:28:23,839 --> 11:28:27,519
lecture i hope you have an idea about
15133
11:28:25,680 --> 11:28:29,915
this we're going to head over to visual
15134
11:28:27,519 --> 11:28:32,959
studio code and actually try this in
15135
11:28:29,915 --> 11:28:35,199
action okay here we are in our working
15136
11:28:32,959 --> 11:28:36,400
directory the current project is when
15137
11:28:36,400 --> 11:28:41,436
we are going to grab our template files
15138
11:28:38,879 --> 11:28:44,559
like we always do and we're going to put
15139
11:28:41,436 --> 11:28:46,720
them in place so when new fails that's
15140
11:28:44,559 --> 11:28:49,199
the lecture so we're going to do that
15141
11:28:46,720 --> 11:28:51,436
and open this in visual studio code
15142
11:28:49,199 --> 11:28:54,239
pretty quick and we are going to try and
15143
11:28:51,436 --> 11:28:56,319
allocate a large piece of memory in one
15144
11:28:54,239 --> 11:28:57,595
go so the way you do that we can do say
15145
11:28:57,595 --> 11:29:02,479
let's call this data it really doesn't
15146
11:28:59,519 --> 11:29:04,239
matter and we're going to say new and
15147
11:29:02,480 --> 11:29:05,916
and we're going to say that we want a
15148
11:29:05,915 --> 11:29:11,115
let's try and do that and we're going to
15149
11:29:13,199 --> 11:29:19,519
we know when we are ending this program
15150
11:29:16,959 --> 11:29:21,756
properly so let's try and compile this
15151
11:29:19,519 --> 11:29:24,799
we're going to bring up the terminal and
15152
11:29:21,756 --> 11:29:26,800
we are going to weld with gcc as we
15153
11:29:24,800 --> 11:29:29,040
always do and the build is going to be
15154
11:29:26,800 --> 11:29:31,680
good let's try and increase this number
15155
11:29:29,040 --> 11:29:33,116
and push it to a really big number and
15156
11:29:33,116 --> 11:29:38,720
have made visual studio code mad here
15157
11:29:36,319 --> 11:29:39,839
array is too large so they can't really
15158
11:29:40,800 --> 11:29:45,520
a really large array in here okay so
15159
11:29:43,199 --> 11:29:47,519
let's bring this down a little bit
15160
11:29:45,519 --> 11:29:49,595
and if we're trying to compile the
15161
11:29:47,519 --> 11:29:53,115
bullet is going to be good and if we run
15162
11:29:49,595 --> 11:29:56,799
rooster you see that the program
15163
11:29:53,116 --> 11:29:59,116
is going to not end well okay so this is
15164
11:29:56,800 --> 11:30:01,520
really a case where new fails we can't
15165
11:30:01,519 --> 11:30:06,719
on the heap storage that is allocated to
15166
11:30:04,160 --> 11:30:09,596
this program here remember when we
15167
11:30:06,720 --> 11:30:11,436
revisited the memory map idea we saw
15168
11:30:09,595 --> 11:30:13,595
that each program is going to have its
15169
11:30:11,436 --> 11:30:15,436
own memory map the memory map is going
15170
11:30:13,595 --> 11:30:17,756
to have a lot of sections inside we have
15171
11:30:15,436 --> 11:30:20,239
the stack we have the heap our hip is
15172
11:30:17,756 --> 11:30:22,239
not infinite so we can run out and we
15173
11:30:20,239 --> 11:30:25,040
just ran out with this allocation that
15174
11:30:22,239 --> 11:30:26,959
we did here and our program is going to
15175
11:30:25,040 --> 11:30:28,480
terminate immediately you see that it is
15176
11:30:28,480 --> 11:30:33,436
if this is not working for whatever
15177
11:30:30,400 --> 11:30:35,680
compiler you are using we can go and do
15178
11:30:33,436 --> 11:30:36,400
this through a loop so what we can do we
15179
11:30:36,400 --> 11:30:40,959
comment this out and we can really loop
15180
11:30:38,639 --> 11:30:44,239
many many times enough to exhaust the
15181
11:30:40,959 --> 11:30:46,959
memory that is allocated for this
15182
11:30:46,959 --> 11:30:52,319
in the memory map in the hip section
15183
11:30:49,040 --> 11:30:54,639
that's what i mean and if we do this at
15184
11:30:52,319 --> 11:30:56,400
some point the program is going to fail
15185
11:30:54,639 --> 11:30:58,720
and we're going to get the same problem
15186
11:30:58,720 --> 11:31:04,000
we're going to build with gcc
15187
11:31:01,756 --> 11:31:05,520
and we are going to clear and run
15188
11:31:04,000 --> 11:31:07,116
rooster and we're going to see it's
15189
11:31:05,519 --> 11:31:09,275
going to loop loop loop and it's going
15190
11:31:09,275 --> 11:31:13,680
the failure in a minute and we need to
15191
11:31:11,275 --> 11:31:15,839
find a way to solve this problem we have
15192
11:31:13,680 --> 11:31:17,360
seen that we have two options let's
15193
11:31:17,360 --> 11:31:21,756
and uh look at those solutions here the
15194
11:31:19,839 --> 11:31:24,159
first option is to go through the
15195
11:31:21,756 --> 11:31:27,040
exception mechanism we can also use the
15196
11:31:24,160 --> 11:31:29,756
std no throw option we're going to try
15197
11:31:27,040 --> 11:31:31,360
the exception mechanism first and uh
15198
11:31:31,360 --> 11:31:38,080
is wrap possibly offending code in try
15199
11:31:34,879 --> 11:31:40,479
and catch blocks and we're going to say
15200
11:31:38,080 --> 11:31:41,520
try here and put a block and we're going
15201
11:31:41,519 --> 11:31:46,559
catch and we're going to say std
15202
11:31:44,160 --> 11:31:49,276
exception and we're going to put an
15203
11:31:46,559 --> 11:31:51,199
ampersand symbol here just use this like
15204
11:31:49,275 --> 11:31:53,595
this and we're going to get a chance to
15205
11:31:51,199 --> 11:31:56,000
really explain these things when we have
15206
11:31:53,595 --> 11:31:58,799
enough tools to understand this for now
15207
11:31:56,000 --> 11:32:01,040
think of this as if i have code that is
15208
11:32:01,040 --> 11:32:05,520
like the new operator here i am going to
15209
11:32:05,519 --> 11:32:10,799
and if something goes wrong we're going
15210
11:32:08,000 --> 11:32:12,959
to get the error in the catch block this
15211
11:32:10,800 --> 11:32:16,000
is the way we do these things here so
15212
11:32:12,959 --> 11:32:17,519
for example i can take my loop here
15213
11:32:21,519 --> 11:32:26,159
and i know that this line of code could
15214
11:32:26,160 --> 11:32:31,116
so i am going to wrap that inside try
15215
11:32:28,959 --> 11:32:32,159
and catch blocks so i am going to grab
15216
11:32:35,116 --> 11:32:38,639
let's do that and align this a little
15217
11:32:38,639 --> 11:32:43,436
and we are going to take the potentially
15218
11:32:45,595 --> 11:32:50,239
in the try block and when the operator
15219
11:32:50,239 --> 11:32:53,756
something goes wrong and we're going to
15220
11:32:51,839 --> 11:32:56,399
catch the problem in the catch block
15221
11:32:53,756 --> 11:32:58,720
this is what we mean here again we don't
15222
11:32:56,400 --> 11:33:00,319
have enough tools to understand why we
15223
11:32:58,720 --> 11:33:02,639
are doing this thing here what is the
15224
11:33:00,319 --> 11:33:04,239
meaning of this ampersand symbol we're
15225
11:33:02,639 --> 11:33:06,479
going to learn about that later in the
15226
11:33:04,239 --> 11:33:09,519
course but for now we want to put
15227
11:33:06,480 --> 11:33:13,200
together something good enough for this
15228
11:33:09,519 --> 11:33:14,799
program not to crash like it was doing
15229
11:33:13,199 --> 11:33:17,839
right here okay we're going to catch the
15230
11:33:14,800 --> 11:33:19,360
arrow and say something went wrong
15231
11:33:17,839 --> 11:33:21,199
and we're going to print out what
15232
11:33:19,360 --> 11:33:23,520
actually went wrong we're going to say
15233
11:33:23,519 --> 11:33:28,839
a function called what on this
15234
11:33:30,639 --> 11:33:36,080
let's hide this pen here because we want
15235
11:33:33,360 --> 11:33:38,720
to see clearly what is happening here
15236
11:33:36,080 --> 11:33:40,800
this is how you can prevent your program
15237
11:33:38,720 --> 11:33:42,840
from crashing and it is going to end
15238
11:33:40,800 --> 11:33:45,916
well because now we have handled the
15239
11:33:42,839 --> 11:33:46,959
problem and that we haven't caused a
15240
11:33:46,959 --> 11:33:51,436
like we were doing down here now we're
15241
11:33:49,360 --> 11:33:53,520
going to try and build this code let's
15242
11:33:51,436 --> 11:33:55,596
bring it up a little bit so that it is
15243
11:33:55,595 --> 11:33:59,756
and we're going to weld with gcc the
15244
11:33:57,756 --> 11:34:02,559
bolt is going to be good and we're going
15245
11:33:59,756 --> 11:34:04,160
to clear and run rooster and it is going
15246
11:34:02,559 --> 11:34:06,319
to do its thing it's going to keep
15247
11:34:06,319 --> 11:34:09,519
and it's going to say something went bad
15248
11:34:08,160 --> 11:34:11,756
it's going to hit a point where all
15249
11:34:09,519 --> 11:34:13,755
these allocations are going to fail and
15250
11:34:11,756 --> 11:34:15,595
if we really wait for it it is going to
15251
11:34:13,756 --> 11:34:16,959
end and we're going to see that it's
15252
11:34:16,959 --> 11:34:21,199
let's try and hit ctrl c and terminate
15253
11:34:19,680 --> 11:34:22,800
it because we don't want to wait for
15254
11:34:24,480 --> 11:34:27,916
down to 100 and increase this number
15255
11:34:27,915 --> 11:34:32,399
let's see if that actually works so
15256
11:34:30,480 --> 11:34:34,319
we're going to boil for now we just want
15257
11:34:32,400 --> 11:34:35,680
to see that the program is not really
15258
11:34:35,680 --> 11:34:38,959
so we're going to run rooster and you
15259
11:34:38,959 --> 11:34:42,319
it's going to keep running and at some
15260
11:34:42,319 --> 11:34:45,756
it's going to fail to allocate memory
15261
11:34:44,160 --> 11:34:48,000
and it's going to say something went
15262
11:34:45,756 --> 11:34:50,239
wrong but if you keep going down you're
15263
11:34:48,000 --> 11:34:51,116
going to see that the program is ending
15264
11:34:51,116 --> 11:34:56,160
so what is happening here is that
15265
11:34:53,680 --> 11:34:59,040
the new operator actually failed
15266
11:34:56,160 --> 11:35:02,160
but we code the problem and could handle
15267
11:34:59,040 --> 11:35:03,360
it in here so what is called handling
15268
11:35:03,360 --> 11:35:07,199
you're going to handle it in whatever
15269
11:35:04,879 --> 11:35:09,680
makes sense in your program if we were
15270
11:35:07,199 --> 11:35:10,639
for example trying to set up a color in
15271
11:35:10,639 --> 11:35:15,360
widgets in your application and the
15272
11:35:13,116 --> 11:35:17,360
color fails and you fail to set up the
15273
11:35:15,360 --> 11:35:19,680
color you may show your user interface
15274
11:35:17,360 --> 11:35:21,840
in black and white and keep running your
15275
11:35:19,680 --> 11:35:24,080
program instead of getting it crashed
15276
11:35:21,839 --> 11:35:26,000
this is just a way to show you
15277
11:35:26,000 --> 11:35:30,239
when new fails this is one way we can
15278
11:35:28,800 --> 11:35:31,916
solve the problem so we're going to look
15279
11:35:31,915 --> 11:35:36,239
the exception mechanism is the first
15280
11:35:34,639 --> 11:35:38,559
so we're going to comment this out
15281
11:35:36,239 --> 11:35:40,959
because we're going to see another way
15282
11:35:38,559 --> 11:35:44,639
and let's do that we can also use the
15283
11:35:40,959 --> 11:35:46,159
std no throw setting on our new operator
15284
11:35:46,160 --> 11:35:51,276
allocating for new memory so we're going
15285
11:35:48,639 --> 11:35:52,639
to do that and we're going to bring up
15286
11:35:52,639 --> 11:35:56,239
we're going to reuse that for this here
15287
11:35:54,639 --> 11:35:58,159
we're not going to be using the
15288
11:35:56,239 --> 11:36:00,400
exception mechanism so we're going to do
15289
11:35:58,160 --> 11:36:02,720
something like this get rid of the try
15290
11:36:00,400 --> 11:36:04,480
and catch block but we're going to still
15291
11:36:04,480 --> 11:36:10,400
so what we can do is pass the new
15292
11:36:07,040 --> 11:36:14,080
operator a parameter and say std no
15293
11:36:10,400 --> 11:36:16,639
throw and when we do this if new fails
15294
11:36:14,080 --> 11:36:18,639
we are going to get no pointer stored in
15295
11:36:16,639 --> 11:36:20,559
data here so we can check this against
15296
11:36:21,839 --> 11:36:27,839
data is different from null pointer
15297
11:36:25,519 --> 11:36:29,680
and we can do whatever we want to do we
15298
11:36:32,400 --> 11:36:35,916
get it allocated and we can try and
15299
11:36:35,915 --> 11:36:42,159
so what we're going to do is run this
15300
11:36:38,080 --> 11:36:43,520
through our compiler through gcc
15301
11:36:42,160 --> 11:36:45,756
and you're going to see that the world
15302
11:36:43,519 --> 11:36:47,595
is going to be good and you see that
15303
11:36:45,756 --> 11:36:49,436
visual studio code was giving us a
15304
11:36:47,595 --> 11:36:51,435
squiggly line because it can't really
15305
11:36:49,436 --> 11:36:53,596
understand this but this is going to go
15306
11:36:51,436 --> 11:36:56,319
through the compiler and it is going to
15307
11:36:56,319 --> 11:37:00,720
so let's try and run this program
15308
11:36:59,040 --> 11:37:02,480
we're going to ignore visual studio code
15309
11:37:00,720 --> 11:37:05,436
for now because the world was good we
15310
11:37:02,480 --> 11:37:08,640
could build with gcc and we saw that
15311
11:37:05,436 --> 11:37:10,080
this was welding successfully so we can
15312
11:37:10,080 --> 11:37:14,720
let's clear properly and run rooster and
15313
11:37:12,559 --> 11:37:16,559
it's going to say data allocated a few
15314
11:37:14,720 --> 11:37:18,880
other times and the program is going to
15315
11:37:16,559 --> 11:37:21,040
end you see that the program is not
15316
11:37:18,879 --> 11:37:23,360
crashing because we are also handling
15317
11:37:21,040 --> 11:37:25,520
the problem but we are going through a
15318
11:37:23,360 --> 11:37:28,639
new mechanism to do that and that's
15319
11:37:25,519 --> 11:37:31,115
using the std no throw option with our
15320
11:37:28,639 --> 11:37:32,959
new operator here this is really all we
15321
11:37:31,116 --> 11:37:35,840
set out to do in this lecture i hope it
15322
11:37:32,959 --> 11:37:38,559
is very clear that the new operator can
15323
11:37:35,839 --> 11:37:41,115
fail and you have a couple of options at
15324
11:37:38,559 --> 11:37:43,199
your hands to handle things when new
15325
11:37:41,116 --> 11:37:45,200
fails you can either go through the
15326
11:37:43,199 --> 11:37:47,755
exception mechanism by using try and
15327
11:37:45,199 --> 11:37:51,435
catch blocks like we did here or you can
15328
11:37:47,756 --> 11:37:53,595
use the std no throw option we are going
15329
11:37:51,436 --> 11:37:55,680
to stop here in this lecture and the
15330
11:37:53,595 --> 11:37:57,839
next one we are going to learn about no
15331
11:37:57,839 --> 11:38:02,319
go ahead and finish up here and meet me
15332
11:38:00,239 --> 11:38:05,519
there in this lecture we're going to
15333
11:38:02,319 --> 11:38:07,915
explore the concept called null pointer
15334
11:38:05,519 --> 11:38:10,399
safety and this is a series of measures
15335
11:38:07,915 --> 11:38:13,199
you take to make sure that when you are
15336
11:38:10,400 --> 11:38:15,040
using a pointer it contains a valid
15337
11:38:13,199 --> 11:38:17,039
address if you don't have a valid
15338
11:38:15,040 --> 11:38:19,436
address inside you don't use that
15339
11:38:17,040 --> 11:38:21,680
pointer and we do that through a series
15340
11:38:19,436 --> 11:38:23,360
of checks we can do against the null
15341
11:38:21,680 --> 11:38:25,915
pointer for example here we have a
15342
11:38:23,360 --> 11:38:26,879
pointer that is initialized to null
15343
11:38:26,879 --> 11:38:33,915
implicitly through braced initializers
15344
11:38:30,400 --> 11:38:35,436
and what we can do is check if p number
15345
11:38:35,436 --> 11:38:39,916
null pointer and this is how we say it
15346
11:38:36,959 --> 11:38:41,360
in c plus and if it contains no pointer
15347
11:38:39,915 --> 11:38:44,159
we're not going to use it we're going to
15348
11:38:41,360 --> 11:38:46,400
say it points to an invalid address this
15349
11:38:44,160 --> 11:38:49,200
is something you can do it is simple in
15350
11:38:46,400 --> 11:38:51,596
nature but it is going to save you lots
15351
11:38:49,199 --> 11:38:54,239
of trouble this is one version we can do
15352
11:38:51,595 --> 11:38:57,275
this on but we can also directly plug in
15353
11:38:54,239 --> 11:38:58,959
p number and use it like this if it
15354
11:38:57,275 --> 11:39:00,879
contains no pointer we're going to get
15355
11:38:58,959 --> 11:39:04,000
the message printed out that we have an
15356
11:39:00,879 --> 11:39:05,595
invalid address if we have something
15357
11:39:04,000 --> 11:39:07,519
other than no pointer we're going to
15358
11:39:05,595 --> 11:39:09,040
have a valid address and we can do
15359
11:39:07,519 --> 11:39:11,595
something with that this is going to
15360
11:39:09,040 --> 11:39:14,080
work because a pointer can also be
15361
11:39:11,595 --> 11:39:17,199
implicitly converted into a boolean
15362
11:39:14,080 --> 11:39:19,436
expression that our if statement expects
15363
11:39:17,199 --> 11:39:21,360
here and it is going to work exactly how
15364
11:39:19,436 --> 11:39:23,436
we want here so we're going to see this
15365
11:39:21,360 --> 11:39:25,680
in a minute when we hit visual studio
15366
11:39:23,436 --> 11:39:28,959
code before we do that though i want you
15367
11:39:25,680 --> 11:39:31,360
to be aware that you can call
15368
11:39:28,959 --> 11:39:33,595
delete on a pointer containing no
15369
11:39:31,360 --> 11:39:35,520
pointer without doing the check here it
15370
11:39:33,595 --> 11:39:37,519
is going to be okay we have seen many
15371
11:39:35,519 --> 11:39:40,000
rules about pointers and many students
15372
11:39:37,519 --> 11:39:42,399
will develop an intuition that you have
15373
11:39:40,000 --> 11:39:44,559
to check for no pointer before you do
15374
11:39:42,400 --> 11:39:46,880
anything on your pointer and they even
15375
11:39:44,559 --> 11:39:48,959
do that before they call delete i have
15376
11:39:46,879 --> 11:39:51,115
to break it to you that it is safe to
15377
11:39:48,959 --> 11:39:53,756
call delete on a pointer that contains
15378
11:39:51,116 --> 11:39:55,680
null pointer so you don't need to do
15379
11:39:53,756 --> 11:39:57,756
something like we have here say and
15380
11:39:55,680 --> 11:40:00,000
check if p number one and then delete p
15381
11:39:57,756 --> 11:40:02,160
number one and reset that to low pointer
15382
11:40:00,000 --> 11:40:04,160
this is really overkill you can call
15383
11:40:02,160 --> 11:40:06,720
delete on the pointer and it is going to
15384
11:40:04,160 --> 11:40:08,480
be fine even if it contains no pointer
15385
11:40:06,720 --> 11:40:10,880
now we're going to go to visual studio
15386
11:40:08,480 --> 11:40:13,756
code and see these things in action here
15387
11:40:10,879 --> 11:40:16,559
we are in our working directory the
15388
11:40:13,756 --> 11:40:18,880
current project is no pointer safety
15389
11:40:16,559 --> 11:40:20,559
we're going to grab our template project
15390
11:40:18,879 --> 11:40:23,435
and we're going to put that in the
15391
11:40:20,559 --> 11:40:24,159
current project that we are interested
15392
11:40:24,160 --> 11:40:28,800
and we are going to open this in visual
15393
11:40:26,319 --> 11:40:31,436
studio code open folder and we are going
15394
11:40:28,800 --> 11:40:33,680
to put in a verbose no pointer check
15395
11:40:31,436 --> 11:40:35,840
what we are doing here is nothing new we
15396
11:40:33,680 --> 11:40:39,116
have a pointer called p number it is a
15397
11:40:35,839 --> 11:40:41,839
pointer to ant and it is initialized to
15398
11:40:39,116 --> 11:40:44,360
null pointer through implicit
15399
11:40:41,839 --> 11:40:47,039
initialization here using braced
15400
11:40:44,360 --> 11:40:49,275
initialization and we are checking to
15401
11:40:47,040 --> 11:40:50,080
see if it contains null pointer if it
15402
11:40:50,080 --> 11:40:53,360
we're going to say it contains an
15403
11:40:51,519 --> 11:40:55,595
invalid address if it doesn't we're
15404
11:40:53,360 --> 11:40:57,520
going to say that it has a valid address
15405
11:40:55,595 --> 11:40:59,756
and you see that we are using a negation
15406
11:40:57,519 --> 11:41:01,435
here you can do this however you want if
15407
11:41:01,436 --> 11:41:07,040
with gcc let's see what we get
15408
11:41:04,559 --> 11:41:09,435
the vote is going to go through
15409
11:41:07,040 --> 11:41:12,080
and if we run rooster we're going to see
15410
11:41:09,436 --> 11:41:14,400
that p number points to an invalid
15411
11:41:14,400 --> 11:41:19,680
null pointer but if we try and set up a
15412
11:41:17,275 --> 11:41:21,436
new variable for example and say p
15413
11:41:21,436 --> 11:41:26,319
and let's use dynamic memory we have
15414
11:41:23,680 --> 11:41:28,720
learnt about that and initialize that
15415
11:41:26,319 --> 11:41:30,400
with a 7 for example and when it points
15416
11:41:28,720 --> 11:41:32,400
to a valid address we're going to print
15417
11:41:30,400 --> 11:41:35,520
whatever is in there we know how to do
15418
11:41:32,400 --> 11:41:37,520
that so we can say p number and we're
15419
11:41:35,519 --> 11:41:40,479
going to print whatever is inside and
15420
11:41:37,519 --> 11:41:43,199
say p number through the reference end
15421
11:41:40,480 --> 11:41:45,436
and we're going to say stdndl now the
15422
11:41:43,199 --> 11:41:47,915
pointer is not going to contain
15423
11:41:45,436 --> 11:41:48,959
no pointer because it contains the
15424
11:41:48,959 --> 11:41:52,639
of the memory that was allocated on the
15425
11:41:52,639 --> 11:41:57,839
but once we do that we have to remember
15426
11:41:55,275 --> 11:41:59,756
to release this memory so please
15427
11:41:57,839 --> 11:42:01,839
remember to release your memory after
15428
11:41:59,756 --> 11:42:04,959
you are done using it so we're going to
15429
11:42:01,839 --> 11:42:07,359
say delete p number after that and we
15430
11:42:04,959 --> 11:42:10,000
need to reset it to no pointer in this
15431
11:42:07,360 --> 11:42:11,520
case it really is useless because nobody
15432
11:42:10,000 --> 11:42:14,800
is going to be using this pointer
15433
11:42:11,519 --> 11:42:17,519
anymore the program is about to end but
15434
11:42:14,800 --> 11:42:20,400
it is a good practice to do this even in
15435
11:42:17,519 --> 11:42:23,680
this case because once this way of doing
15436
11:42:20,400 --> 11:42:25,596
events is burnt into your memory it has
15437
11:42:23,680 --> 11:42:28,400
become your habit you're going to be
15438
11:42:25,595 --> 11:42:30,079
writing cipher c plus plus code now
15439
11:42:28,400 --> 11:42:31,756
we're going to try and run this so we're
15440
11:42:30,080 --> 11:42:34,400
going to build again the bold is going
15441
11:42:31,756 --> 11:42:35,436
to go through and it is going to say
15442
11:42:35,436 --> 11:42:40,160
we have a valid address in memory which
15443
11:42:37,360 --> 11:42:42,959
is this guy and what is inside is a
15444
11:42:40,160 --> 11:42:45,756
seven and now we are writing cipher c
15445
11:42:42,959 --> 11:42:48,159
plus plus code through null pointer
15446
11:42:45,756 --> 11:42:51,040
safety here we can also do a direct
15447
11:42:48,160 --> 11:42:53,116
check using p number without checking if
15448
11:42:51,040 --> 11:42:55,915
it is equal to null pointer because this
15449
11:42:53,116 --> 11:42:57,916
is verbose but it is something you will
15450
11:42:55,915 --> 11:42:59,915
see in practice you can also do
15451
11:42:57,915 --> 11:43:01,595
something like this and say if p number
15452
11:42:59,915 --> 11:43:04,399
and you're going to get exactly the same
15453
11:43:01,595 --> 11:43:06,799
thing so if we have some valid
15454
11:43:04,400 --> 11:43:09,436
address inside we're going to print
15455
11:43:06,800 --> 11:43:10,400
that let's print the same thing as
15456
11:43:12,160 --> 11:43:16,480
and if we build and run we're going to
15457
11:43:18,160 --> 11:43:22,240
clear because the world is good let's
15458
11:43:20,319 --> 11:43:25,275
clear and run rooster you see that we
15459
11:43:22,239 --> 11:43:27,915
get exactly the same thing and if we
15460
11:43:25,275 --> 11:43:30,239
didn't initialize this guy with the new
15461
11:43:27,915 --> 11:43:32,719
dynamic piece of memory we're going to
15462
11:43:30,239 --> 11:43:34,239
get that the memory is invalid the
15463
11:43:32,720 --> 11:43:36,080
address we have in the pointer is going
15464
11:43:34,239 --> 11:43:38,239
to be invalid and we're going to print
15465
11:43:36,080 --> 11:43:41,116
that out through our code here
15466
11:43:41,116 --> 11:43:46,720
okay the last thing i want you to see is
15467
11:43:43,275 --> 11:43:48,799
that it is okay to call delete
15468
11:43:46,720 --> 11:43:50,800
on a null pointer and we're going to say
15469
11:43:48,800 --> 11:43:52,960
that here so we're going to go down here
15470
11:43:50,800 --> 11:43:55,360
and put in a piece of code we are
15471
11:43:52,959 --> 11:43:58,159
setting up a new pointer p number one
15472
11:43:55,360 --> 11:44:00,080
initialized with no pointer if we call
15473
11:43:58,160 --> 11:44:01,916
delete on it this is going to work
15474
11:44:00,080 --> 11:44:04,240
really well and you're not going to get
15475
11:44:01,915 --> 11:44:06,559
a crush or anything this is valid c plus
15476
11:44:04,239 --> 11:44:09,519
plus code so if we're trying to compile
15477
11:44:06,559 --> 11:44:11,915
this it is going to work fine and you
15478
11:44:11,915 --> 11:44:16,959
do a no pointer check before you delete
15479
11:44:14,639 --> 11:44:19,595
like this because that's overkill you
15480
11:44:16,959 --> 11:44:21,360
see that the program both successfully
15481
11:44:19,595 --> 11:44:23,040
and we can clear and run it and we're
15482
11:44:21,360 --> 11:44:25,520
going to get exactly the same things we
15483
11:44:23,040 --> 11:44:27,680
had before so some people are going to
15484
11:44:27,680 --> 11:44:31,756
they're going to check for no pointer
15485
11:44:29,595 --> 11:44:34,479
and they're going to say if p number one
15486
11:44:31,756 --> 11:44:36,160
for example is not equal to no pointer
15487
11:44:34,480 --> 11:44:38,080
and they're going to say something like
15488
11:44:36,160 --> 11:44:39,436
delete here and they're going to do
15489
11:44:39,436 --> 11:44:43,116
and this is going to work but it is
15490
11:44:41,436 --> 11:44:46,239
really overkill you don't need to do
15491
11:44:43,116 --> 11:44:49,276
this test because it is safe to call
15492
11:44:46,239 --> 11:44:51,756
delete on a pointer even if it contains
15493
11:44:49,275 --> 11:44:53,915
no pointer in the first place so you
15494
11:44:51,756 --> 11:44:56,400
don't need to do things like this this
15495
11:44:53,915 --> 11:44:59,275
is going to work just fine don't be
15496
11:44:56,400 --> 11:45:02,480
afraid to call delete on a pointer
15497
11:44:59,275 --> 11:45:04,879
because it might contain null pointer
15498
11:45:02,480 --> 11:45:06,960
this is really all we mean by null
15499
11:45:04,879 --> 11:45:09,519
pointer safety and i hope i gave you a
15500
11:45:06,959 --> 11:45:11,040
few examples to make this pretty clear
15501
11:45:09,519 --> 11:45:12,559
we are going to stop here in this
15502
11:45:11,040 --> 11:45:15,275
lecture the next one we're going to
15503
11:45:15,275 --> 11:45:19,595
go ahead and finish up here and meet me
15504
11:45:17,756 --> 11:45:21,840
there in this lecture we're going to
15505
11:45:21,839 --> 11:45:28,000
and a memory leak is when you have lost
15506
11:45:24,879 --> 11:45:30,639
access to a piece of memory that was
15507
11:45:28,000 --> 11:45:32,959
dynamically allocated to your program
15508
11:45:30,639 --> 11:45:35,116
you basically lose the pointer that was
15509
11:45:32,959 --> 11:45:37,199
pointing to that dynamically allocated
15510
11:45:35,116 --> 11:45:39,040
piece of memory here we have a few
15511
11:45:37,199 --> 11:45:41,275
examples of that for example here we
15512
11:45:39,040 --> 11:45:43,520
have p number which contains a
15513
11:45:41,275 --> 11:45:44,959
dynamically allocated piece of memory
15514
11:45:43,519 --> 11:45:47,359
which is going to contain an integer
15515
11:45:44,959 --> 11:45:50,639
it's going to be 4 byte the value inside
15516
11:45:47,360 --> 11:45:53,520
is going to be a 67. this p number is
15517
11:45:50,639 --> 11:45:55,756
our only key to manipulate that memory
15518
11:45:53,519 --> 11:45:58,639
and it is the key through which we even
15519
11:45:55,756 --> 11:46:01,360
go to release that memory and return
15520
11:45:58,639 --> 11:46:02,959
that to the operating system but notice
15521
11:46:02,959 --> 11:46:08,400
we are setting up a new number variable
15522
11:46:06,000 --> 11:46:09,915
it is an integer and it is allocated on
15523
11:46:08,400 --> 11:46:11,916
the stack because this is a local
15524
11:46:09,915 --> 11:46:15,115
variable it's not a pointer it's not
15525
11:46:11,915 --> 11:46:17,915
dynamically allocated and we take the
15526
11:46:15,116 --> 11:46:20,400
address of number and assign that to our
15527
11:46:17,915 --> 11:46:23,595
pointer the moment we do that
15528
11:46:20,400 --> 11:46:26,080
we have no way to release the memory
15529
11:46:23,595 --> 11:46:27,275
that was allocated to p number in the
15530
11:46:27,275 --> 11:46:31,756
and if we do that the operating system
15531
11:46:29,680 --> 11:46:34,879
is going to think that this memory is
15532
11:46:31,756 --> 11:46:37,116
ours but we don't have a way to release
15533
11:46:34,879 --> 11:46:38,239
this memory anymore because the pointer
15534
11:46:38,239 --> 11:46:43,519
helping us access this memory has been
15535
11:46:41,116 --> 11:46:45,840
repurposed to point to this number
15536
11:46:43,519 --> 11:46:47,755
variable here i hope you see that
15537
11:46:45,839 --> 11:46:49,839
and the memory leak is something like
15538
11:46:47,756 --> 11:46:52,400
this when you lose the pointer that
15539
11:46:49,839 --> 11:46:54,479
would otherwise be used to release the
15540
11:46:52,400 --> 11:46:56,639
memory and your program is basically
15541
11:46:54,480 --> 11:46:58,720
going to keep using this memory and the
15542
11:46:56,639 --> 11:47:01,199
operating system is not going to have a
15543
11:46:58,720 --> 11:47:03,756
way to reclaim this memory so it is
15544
11:47:01,199 --> 11:47:05,435
useless so you are no longer using this
15545
11:47:03,756 --> 11:47:07,436
memory because you can't access it and
15546
11:47:05,436 --> 11:47:09,596
do things with it and the operating
15547
11:47:07,436 --> 11:47:11,840
system can't use it either because it
15548
11:47:09,595 --> 11:47:14,319
fences your memory hopefully you can see
15549
11:47:11,839 --> 11:47:16,719
that this is a really bad situation and
15550
11:47:14,319 --> 11:47:19,839
you should avoid these things in your
15551
11:47:16,720 --> 11:47:21,200
application so do avoid memory leaks
15552
11:47:21,199 --> 11:47:25,755
this is one situation in which we can
15553
11:47:23,199 --> 11:47:28,399
have a memory leak here is another
15554
11:47:25,756 --> 11:47:30,639
example where we have double allocation
15555
11:47:28,400 --> 11:47:33,200
we have a pointer p number one it is
15556
11:47:30,639 --> 11:47:37,040
pointing to dynamically allocated memory
15557
11:47:33,199 --> 11:47:39,275
again and the value inside is a 55.
15558
11:47:37,040 --> 11:47:41,595
if we use this pointer to allocate new
15559
11:47:39,275 --> 11:47:43,839
memory the first memory that we were
15560
11:47:41,595 --> 11:47:46,720
pointing to is going to be leaked
15561
11:47:43,839 --> 11:47:49,755
again it is the same thing we have lost
15562
11:47:46,720 --> 11:47:52,559
access to the first memory now we are
15563
11:47:49,756 --> 11:47:54,880
pointing to the second dynamic
15564
11:47:52,559 --> 11:47:58,000
memory that was allocated to contain the
15565
11:47:54,879 --> 11:47:59,915
44 here and again this is a memory leak
15566
11:47:58,000 --> 11:48:03,199
your program has lost access to the
15567
11:47:59,915 --> 11:48:05,519
memory containing 55 here and the
15568
11:48:03,199 --> 11:48:08,479
operating system also thinks that you
15569
11:48:05,519 --> 11:48:11,199
are using this memory because you didn't
15570
11:48:08,480 --> 11:48:14,880
explicitly return it to the operating
15571
11:48:11,199 --> 11:48:17,755
system through the delete operator again
15572
11:48:14,879 --> 11:48:20,159
memory leaks are bad do avoid them in
15573
11:48:17,756 --> 11:48:22,160
your programs here is another simple
15574
11:48:20,160 --> 11:48:24,800
example of a case where you might have a
15575
11:48:22,160 --> 11:48:27,200
memory leak you go in a nested scope
15576
11:48:24,800 --> 11:48:29,840
like this and allocate a new piece of
15577
11:48:27,199 --> 11:48:32,719
memory dynamically of course and point
15578
11:48:29,839 --> 11:48:34,000
to that through p number two here but p
15579
11:48:34,000 --> 11:48:39,519
itself is a pointer and it is a local
15580
11:48:36,800 --> 11:48:41,756
variable nested in this scope
15581
11:48:39,519 --> 11:48:44,319
when this scope ends p number two is
15582
11:48:41,756 --> 11:48:46,639
going to die but the dynamic memory
15583
11:48:44,319 --> 11:48:48,720
itself is not going to die you just lost
15584
11:48:46,639 --> 11:48:50,959
access to it and you can't access it
15585
11:48:48,720 --> 11:48:53,275
again this is a memory leak and you
15586
11:48:50,959 --> 11:48:56,080
should avoid this in your programs
15587
11:48:53,275 --> 11:48:58,559
memory leaks are really bad and in
15588
11:48:56,080 --> 11:49:01,200
extreme cases they might even lead to
15589
11:48:58,559 --> 11:49:03,595
your program crashing if your program
15590
11:49:01,199 --> 11:49:06,399
keeps running for an extended period of
15591
11:49:03,595 --> 11:49:08,799
time think of programs like those
15592
11:49:06,400 --> 11:49:10,880
running in servers for example they can
15593
11:49:08,800 --> 11:49:14,000
even run for three months without
15594
11:49:10,879 --> 11:49:16,399
stopping and if your program is
15595
11:49:14,000 --> 11:49:18,160
increasingly leaking memory the
15596
11:49:16,400 --> 11:49:20,400
operating system is going to think that
15597
11:49:18,160 --> 11:49:22,640
you are taking too much hip memory it's
15598
11:49:20,400 --> 11:49:23,520
going to terminate your program like we
15599
11:49:23,519 --> 11:49:28,479
in the lecture where we learned on
15600
11:49:26,000 --> 11:49:31,436
conditions where the new operator failed
15601
11:49:28,480 --> 11:49:33,840
so if you allocate too much memory then
15602
11:49:31,436 --> 11:49:35,436
your program can really take the next
15603
11:49:33,839 --> 11:49:37,199
operations you're going to do with new
15604
11:49:35,436 --> 11:49:39,756
are going to fail and your program is
15605
11:49:37,199 --> 11:49:41,839
going to terminate the message here is
15606
11:49:39,756 --> 11:49:44,239
memory leaks are bad you should avoid
15607
11:49:41,839 --> 11:49:46,000
them in your programs and whenever you
15608
11:49:44,239 --> 11:49:48,559
think that you're no longer using a
15609
11:49:46,000 --> 11:49:50,720
piece of memory make sure you delete it
15610
11:49:48,559 --> 11:49:53,275
and return it to the operating system
15611
11:49:50,720 --> 11:49:55,200
you're going to be writing much safer c
15612
11:49:53,275 --> 11:49:57,519
plus plus code we're going to head over
15613
11:49:55,199 --> 11:50:00,559
to visual studio code and actually try
15614
11:49:57,519 --> 11:50:02,879
this here we are in our working
15615
11:50:00,559 --> 11:50:05,040
directory the current project is memory
15616
11:50:02,879 --> 11:50:06,879
leaks we're going to bring in our
15617
11:50:06,879 --> 11:50:12,079
and we're going to put them in place in
15618
11:50:08,959 --> 11:50:14,239
the lecture on memory leaks and we are
15619
11:50:12,080 --> 11:50:15,916
going to open this in visual studio code
15620
11:50:14,239 --> 11:50:18,319
we are going to clean this up a little
15621
11:50:15,915 --> 11:50:20,239
bit bring this up here we have a
15622
11:50:18,319 --> 11:50:22,879
variable called p number it is a pointer
15623
11:50:20,239 --> 11:50:25,756
to end and we initialize that with the
15624
11:50:22,879 --> 11:50:28,479
address of a piece of memory that is
15625
11:50:25,756 --> 11:50:31,916
allocated dynamically on the heap we
15626
11:50:28,480 --> 11:50:34,160
store a 67 inside and here down you see
15627
11:50:31,915 --> 11:50:37,115
we set up another variable on the stack
15628
11:50:34,160 --> 11:50:39,116
again this says a stack variable
15629
11:50:37,116 --> 11:50:41,116
it lives on the stack it's not on the
15630
11:50:39,116 --> 11:50:43,116
heap and we text the address of this
15631
11:50:41,116 --> 11:50:45,436
thing and assign that to our pointer
15632
11:50:43,116 --> 11:50:47,756
here the moment we do that we have no
15633
11:50:45,436 --> 11:50:50,319
more way we can access this dynamic
15634
11:50:47,756 --> 11:50:52,639
memory and we have leaked it and this is
15635
11:50:50,319 --> 11:50:54,000
really bad the thing is this program is
15636
11:50:54,000 --> 11:50:58,400
i don't think compilers have a way to
15637
11:50:56,160 --> 11:51:00,160
stop you from making mistakes like this
15638
11:50:58,400 --> 11:51:02,080
so you really have to be careful and
15639
11:51:00,160 --> 11:51:04,880
make sure that you are not leaking
15640
11:51:02,080 --> 11:51:06,639
memory in your program so if we run this
15641
11:51:04,879 --> 11:51:08,559
program it's going to run it's going to
15642
11:51:06,639 --> 11:51:11,680
run and finish let's say that it is
15643
11:51:08,559 --> 11:51:14,559
ending well okay so we're going to build
15644
11:51:11,680 --> 11:51:16,559
and see this run the build is good so we
15645
11:51:14,559 --> 11:51:18,559
can clear and run rooster and we're
15646
11:51:16,559 --> 11:51:20,720
going to see that the program is ending
15647
11:51:20,720 --> 11:51:24,880
leaking memory here because the
15648
11:51:22,879 --> 11:51:26,559
dynamically piece of memory that we
15649
11:51:26,559 --> 11:51:32,159
wasn't released to the system and when
15650
11:51:29,275 --> 11:51:34,559
we did this assignment here we just lost
15651
11:51:32,160 --> 11:51:36,400
access to it so the operating system is
15652
11:51:34,559 --> 11:51:39,435
going to thank this memory belongs to
15653
11:51:36,400 --> 11:51:41,756
this program that is ours here but your
15654
11:51:39,436 --> 11:51:44,239
program is either not going to be using
15655
11:51:41,756 --> 11:51:46,319
this piece of memory because we have
15656
11:51:46,319 --> 11:51:50,800
that would allow us to go and do
15657
11:51:48,160 --> 11:51:52,480
something useful with this memory here
15658
11:51:50,800 --> 11:51:55,200
so this is something bad and you should
15659
11:51:52,480 --> 11:51:57,680
avoid it the second example of memory
15660
11:51:55,199 --> 11:51:59,915
leaks is when you do double allocation
15661
11:51:57,680 --> 11:52:02,160
on a pointer for example here we have
15662
11:51:59,915 --> 11:52:04,079
pin number one again and we are going to
15663
11:52:05,595 --> 11:52:12,159
of a piece of memory that was allocated
15664
11:52:09,116 --> 11:52:15,116
dynamically on the heap the value inside
15665
11:52:12,160 --> 11:52:18,960
is going to be 55 but we are using this
15666
11:52:15,116 --> 11:52:22,000
pointer again to make it point to a new
15667
11:52:18,959 --> 11:52:25,116
piece of memory containing the address
15668
11:52:22,000 --> 11:52:27,680
of the newly allocated piece of memory
15669
11:52:25,116 --> 11:52:29,680
on the stack on the heap i mean and this
15670
11:52:27,680 --> 11:52:32,319
is really bad because again once we do
15671
11:52:29,680 --> 11:52:33,915
this we lose access to this memory here
15672
11:52:33,915 --> 11:52:37,595
the program here is not going to have
15673
11:52:35,595 --> 11:52:40,319
access to it and the operating system is
15674
11:52:37,595 --> 11:52:43,275
going to thank we own this memory and it
15675
11:52:40,319 --> 11:52:45,436
is going to be bad and uh down here
15676
11:52:43,275 --> 11:52:48,000
maybe you can go and say delete number
15677
11:52:45,436 --> 11:52:50,480
one p number one but this is not going
15678
11:52:48,000 --> 11:52:53,116
to release the memory here it is going
15679
11:52:50,480 --> 11:52:55,436
to release the memory here with the 44
15680
11:52:53,116 --> 11:52:58,160
and the memory containing 55 here is
15681
11:52:55,436 --> 11:53:00,720
going to be leaked let's be good c plus
15682
11:52:58,160 --> 11:53:02,880
plus citizens and reset our pointers
15683
11:53:00,720 --> 11:53:05,756
after we delete so we're going to say p
15684
11:53:02,879 --> 11:53:08,159
number one equals no pointer and we are
15685
11:53:05,756 --> 11:53:10,959
going to be playing it safe here and
15686
11:53:08,160 --> 11:53:12,400
again we just lift memory here and it is
15687
11:53:10,959 --> 11:53:15,199
something you should avoid in your
15688
11:53:12,400 --> 11:53:18,400
programs if you run this program it is
15689
11:53:15,199 --> 11:53:20,159
going to run just fine so let's see that
15690
11:53:18,400 --> 11:53:22,959
because i don't want to leave you with
15691
11:53:22,959 --> 11:53:27,680
if i run rooster again it's going to end
15692
11:53:25,040 --> 11:53:28,959
well but it is going to be leaking
15693
11:53:28,959 --> 11:53:33,915
so we don't want to leak memory avoid
15694
11:53:31,756 --> 11:53:35,520
this like a plague we're going to
15695
11:53:35,519 --> 11:53:40,000
and show you that you can also leak
15696
11:53:37,199 --> 11:53:42,319
memory when you have some nested scopes
15697
11:53:40,000 --> 11:53:44,800
in your programs okay let's go down here
15698
11:53:42,319 --> 11:53:47,360
and put that in and here is a simple
15699
11:53:44,800 --> 11:53:49,840
example we have a nested scope nested
15700
11:53:47,360 --> 11:53:52,160
inside the main function and inside the
15701
11:53:49,839 --> 11:53:53,275
scope here we are setting up a new
15702
11:53:53,275 --> 11:53:57,839
and it is going to be pointing to
15703
11:53:55,275 --> 11:54:00,319
dynamically allocated memory and that
15704
11:53:57,839 --> 11:54:02,399
memory is going to contain a 57.
15705
11:54:00,319 --> 11:54:05,595
the only key we have to this dynamic
15706
11:54:02,400 --> 11:54:08,239
memory is this p number two pointer here
15707
11:54:05,595 --> 11:54:11,275
but this p number two pointer lives on
15708
11:54:08,239 --> 11:54:13,199
the stack itself so when the scope here
15709
11:54:11,275 --> 11:54:15,756
is going to end p number two is no
15710
11:54:13,199 --> 11:54:17,755
longer going to be accessible and the
15711
11:54:15,756 --> 11:54:20,000
memory is going to be linked if you
15712
11:54:17,756 --> 11:54:22,080
really want to play it safe you can go
15713
11:54:20,000 --> 11:54:24,480
do whatever you want with the dynamic
15714
11:54:22,080 --> 11:54:26,800
memory and when you are done with that
15715
11:54:24,480 --> 11:54:28,800
you can delete that piece of memory here
15716
11:54:26,800 --> 11:54:30,400
while you still have access to p number
15717
11:54:31,756 --> 11:54:35,595
in the scope where this thing was
15718
11:54:35,595 --> 11:54:40,319
if you hit the end of this scope you're
15719
11:54:38,080 --> 11:54:42,480
going to lose access to this pointer and
15720
11:54:40,319 --> 11:54:44,400
you will be losing access to this
15721
11:54:44,400 --> 11:54:48,560
and you're going to be leaking memory
15722
11:54:46,080 --> 11:54:50,319
because you're not deleting it even if
15723
11:54:48,559 --> 11:54:52,720
you want to delete it you won't be able
15724
11:54:50,319 --> 11:54:54,159
to do that because you don't have a key
15725
11:54:52,720 --> 11:54:56,480
that is going to lead you to that
15726
11:54:54,160 --> 11:54:59,040
dynamic memory so if we try and do
15727
11:54:56,480 --> 11:55:01,040
delete p number two here this is not
15728
11:54:59,040 --> 11:55:03,520
going to compile because we don't have
15729
11:55:01,040 --> 11:55:06,639
access to p number two p number two is
15730
11:55:03,519 --> 11:55:09,755
scoped inside this nested scope here
15731
11:55:06,639 --> 11:55:12,959
this is what i mean so be sure you are
15732
11:55:09,756 --> 11:55:15,916
aware of this memory leak problem the
15733
11:55:12,959 --> 11:55:17,595
cases we have seen here are really
15734
11:55:15,915 --> 11:55:20,879
extensive enough to give you an
15735
11:55:17,595 --> 11:55:23,199
intuition on how this is bad and you're
15736
11:55:20,879 --> 11:55:24,959
going to be avoiding this new programs
15737
11:55:23,199 --> 11:55:28,000
and you're going to be on your way to
15738
11:55:24,959 --> 11:55:29,519
become a better c plus plus developer
15739
11:55:28,000 --> 11:55:31,436
this is really all we set out to do in
15740
11:55:29,519 --> 11:55:33,755
this lecture to learn about memory leads
15741
11:55:31,436 --> 11:55:36,000
show you a few examples of them i hope
15742
11:55:33,756 --> 11:55:37,680
now you understand them we are going to
15743
11:55:36,000 --> 11:55:38,959
stop here in this lecture and the next
15744
11:55:37,680 --> 11:55:42,080
one we're going to learn about
15745
11:55:42,080 --> 11:55:45,360
go ahead and finish up here and meet me
15746
11:55:45,360 --> 11:55:51,040
in this lecture we're going to look at
15747
11:55:47,360 --> 11:55:53,840
dynamic arrays and these are arrays you
15748
11:55:51,040 --> 11:55:55,840
can allocate on the heap and they're not
15749
11:55:53,839 --> 11:55:57,435
going to be stored on the stack like we
15750
11:55:55,839 --> 11:56:00,319
have seen before the arrays we have
15751
11:55:57,436 --> 11:56:03,040
learned about so far have been living on
15752
11:56:00,319 --> 11:56:05,436
the stack we want to see how we can
15753
11:56:03,040 --> 11:56:08,400
allocate arrays on the heap if we happen
15754
11:56:05,436 --> 11:56:10,800
to need that in our applications arrays
15755
11:56:08,400 --> 11:56:13,116
are allocated on the hip with the new
15756
11:56:10,800 --> 11:56:16,720
operator we can also use the sdd no
15757
11:56:13,116 --> 11:56:19,116
throw version of the new operator if we
15758
11:56:16,720 --> 11:56:21,916
don't want exceptions in our c plus plus
15759
11:56:19,116 --> 11:56:23,840
programs here is a simple example of how
15760
11:56:21,915 --> 11:56:25,595
you can do that we have a pointer called
15761
11:56:23,839 --> 11:56:28,319
p salaries it's going to be a pointer to
15762
11:56:25,595 --> 11:56:31,360
double and it is going to contain the
15763
11:56:28,319 --> 11:56:33,040
address to the dynamic memory that we
15764
11:56:31,360 --> 11:56:35,040
allocate on the heap which is going to
15765
11:56:35,040 --> 11:56:40,160
of doubles of this size here okay this
15766
11:56:38,400 --> 11:56:42,720
is an array that is going to be
15767
11:56:40,160 --> 11:56:45,040
initialized with junk values because we
15768
11:56:45,040 --> 11:56:49,360
explicitly so this is something you need
15769
11:56:47,116 --> 11:56:52,720
to be aware of okay p students is also
15770
11:56:49,360 --> 11:56:54,959
going to be containing the address of an
15771
11:56:52,720 --> 11:56:57,916
array that is going to be allocated on
15772
11:56:54,959 --> 11:57:00,400
the heap we are using the sdd nothro
15773
11:56:57,915 --> 11:57:02,399
version of the new operator because in
15774
11:57:00,400 --> 11:57:04,480
this case for example we might not want
15775
11:57:02,400 --> 11:57:06,000
exceptions and we're going to say that
15776
11:57:04,480 --> 11:57:09,116
it is an array of events it's going to
15777
11:57:06,000 --> 11:57:11,680
be this size but we are using breast
15778
11:57:09,116 --> 11:57:13,680
initializer so this is going to be
15779
11:57:13,680 --> 11:57:17,360
all the values inside are going to be
15780
11:57:15,436 --> 11:57:20,400
initialized to zero this is what we mean
15781
11:57:17,360 --> 11:57:22,800
here we also have a p scores array we
15782
11:57:20,400 --> 11:57:25,436
are using the std no throw version of
15783
11:57:22,800 --> 11:57:28,319
new and it is going to be this size and
15784
11:57:25,436 --> 11:57:29,436
initialized with one two three four five
15785
11:57:29,436 --> 11:57:33,200
the array is bigger than five the
15786
11:57:31,595 --> 11:57:35,915
remaining slots are going to be
15787
11:57:33,199 --> 11:57:37,839
initialized with zeros just like we saw
15788
11:57:35,915 --> 11:57:40,159
with the arrays we have learned about
15789
11:57:37,839 --> 11:57:41,839
previously that we're stored on the
15790
11:57:40,160 --> 11:57:44,000
stack this is really how you work with
15791
11:57:41,839 --> 11:57:46,799
these things and i hope it is super
15792
11:57:44,000 --> 11:57:47,915
clear again we are calling the new
15793
11:57:47,915 --> 11:57:53,360
this is going to allocate however memory
15794
11:57:50,720 --> 11:57:55,680
space is needed to store these things on
15795
11:57:53,360 --> 11:57:57,915
the heap so if this array is going to
15796
11:57:55,680 --> 11:58:00,239
contain 10 elements we're going to
15797
11:57:57,915 --> 11:58:02,399
allocate enough space to contain 10
15798
11:58:00,239 --> 11:58:04,879
double elements on the heap and we're
15799
11:58:02,400 --> 11:58:06,480
going to be pointing to that with the p
15800
11:58:04,879 --> 11:58:09,275
salaries pointer that's what we mean
15801
11:58:06,480 --> 11:58:11,916
here once you have your dynamic array
15802
11:58:09,275 --> 11:58:13,595
allocated on the hip you can try to do
15803
11:58:11,915 --> 11:58:15,275
things with it for example we can try
15804
11:58:13,595 --> 11:58:18,000
and loop through the squirrels and print
15805
11:58:15,275 --> 11:58:21,360
them out here you see that we are using
15806
11:58:18,000 --> 11:58:23,756
the angle bracket syntax and the
15807
11:58:21,360 --> 11:58:25,360
pointer arithmetic syntax it is going to
15808
11:58:23,756 --> 11:58:27,595
work equally well you can choose
15809
11:58:25,360 --> 11:58:29,680
whatever you want but i just wanted you
15810
11:58:27,595 --> 11:58:31,680
to see that you can use both versions
15811
11:58:29,680 --> 11:58:34,000
here the next logical thing to think
15812
11:58:31,680 --> 11:58:36,639
about when you talk about dynamic memory
15813
11:58:34,000 --> 11:58:38,800
allocation is how you release the memory
15814
11:58:36,639 --> 11:58:41,040
to the operating system when you're no
15815
11:58:38,800 --> 11:58:43,596
longer using it and this is the syntax
15816
11:58:41,040 --> 11:58:45,436
to do it with arrays you say delete you
15817
11:58:43,595 --> 11:58:48,239
put angle brackets and you say the
15818
11:58:45,436 --> 11:58:50,639
pointer that was used to allocate that
15819
11:58:48,239 --> 11:58:52,639
memory in the first place and after you
15820
11:58:50,639 --> 11:58:54,639
do that you have to remember to reset
15821
11:58:52,639 --> 11:58:57,595
the pointer to null pointer because you
15822
11:58:54,639 --> 11:58:59,436
are a good c plus plus citizen and this
15823
11:58:57,595 --> 11:59:01,199
is really all we had to say in this
15824
11:58:59,436 --> 11:59:04,480
lecture this is how you dynamically
15825
11:59:01,199 --> 11:59:06,639
allocate a raise on the hip before we
15826
11:59:04,480 --> 11:59:08,960
head over to visual studio code and play
15827
11:59:06,639 --> 11:59:11,839
with this though i want you to keep in
15828
11:59:08,959 --> 11:59:14,159
your mind that arrays you allocate
15829
11:59:11,839 --> 11:59:16,559
dynamically on the heap are very
15830
11:59:14,160 --> 11:59:18,480
different from the arrays that we have
15831
11:59:16,559 --> 11:59:21,360
learned about before and that's because
15832
11:59:18,480 --> 11:59:24,640
they don't work with std size and they
15833
11:59:21,360 --> 11:59:26,400
don't work for range based for loops
15834
11:59:24,639 --> 11:59:28,479
and that the reason for all these
15835
11:59:26,400 --> 11:59:30,639
limitations is that when you do
15836
11:59:28,480 --> 11:59:34,000
something like this the array really
15837
11:59:30,639 --> 11:59:36,800
decays into a pointer and it loses
15838
11:59:34,000 --> 11:59:39,275
information that would otherwise be used
15839
11:59:36,800 --> 11:59:41,840
to deduce the size that is used by sdd
15840
11:59:39,275 --> 11:59:44,639
size and there are other things that are
15841
11:59:41,839 --> 11:59:46,959
used by the range base for loop that
15842
11:59:44,639 --> 11:59:48,959
they lose when you store and refer to
15843
11:59:46,959 --> 11:59:51,519
them using a pointer like this that's
15844
11:59:48,959 --> 11:59:53,839
why we have this limitation keep this in
15845
11:59:51,519 --> 11:59:56,239
mind if you are using a dynamically
15846
11:59:53,839 --> 11:59:58,479
allocated array on the heap you're going
15847
11:59:56,239 --> 12:00:01,040
to be using other techniques to deduce
15848
11:59:58,480 --> 12:00:03,200
its size and it is not going to work
15849
12:00:01,040 --> 12:00:05,915
with a range base for loop so we will
15850
12:00:03,199 --> 12:00:08,000
have to use other kinds of loops that we
15851
12:00:05,915 --> 12:00:09,839
have learned about in this course and it
15852
12:00:09,839 --> 12:00:14,239
this is really all i had to share in
15853
12:00:11,915 --> 12:00:16,719
this lecture now i think it's time we
15854
12:00:14,239 --> 12:00:18,639
went to visual studio code and actually
15855
12:00:18,639 --> 12:00:24,319
here we are in our working folder the
15856
12:00:21,519 --> 12:00:25,435
current project is dynamically allocated
15857
12:00:25,436 --> 12:00:29,680
we are going to grab our template files
15858
12:00:29,680 --> 12:00:34,239
and we're going to put that in the
15859
12:00:31,436 --> 12:00:36,959
current project and open this in visual
15860
12:00:34,239 --> 12:00:39,360
studio code like we always do and we are
15861
12:00:36,959 --> 12:00:41,595
going to go down and put in some starter
15862
12:00:39,360 --> 12:00:43,756
code we can play with here we're going
15863
12:00:43,756 --> 12:00:48,880
file icon to remove this pane
15864
12:00:46,480 --> 12:00:50,560
and we're going to try and show the code
15865
12:00:48,879 --> 12:00:53,115
here and again you see that visual
15866
12:00:50,559 --> 12:00:55,360
studio code is freaking out when it sees
15867
12:00:53,116 --> 12:00:57,520
the std no throw version of the new
15868
12:00:55,360 --> 12:00:59,915
operator here but it is going to work
15869
12:00:57,519 --> 12:01:02,799
when we hit the compiler okay so we are
15870
12:00:59,915 --> 12:01:04,879
allocating three arrays on the heap
15871
12:01:02,800 --> 12:01:07,756
dynamically and we are going to be
15872
12:01:04,879 --> 12:01:10,239
storing the addresses to these arrays
15873
12:01:07,756 --> 12:01:12,639
and these pointers for example p
15874
12:01:10,239 --> 12:01:14,559
salaries is going to store the address
15875
12:01:12,639 --> 12:01:16,400
to this dynamic array which is going to
15876
12:01:14,559 --> 12:01:18,559
be leaving on the heap and it is going
15877
12:01:16,400 --> 12:01:20,880
to be the same case for p students here
15878
12:01:18,559 --> 12:01:23,360
and p scores i don't think there is much
15879
12:01:20,879 --> 12:01:25,040
to explain here because we have already
15880
12:01:23,360 --> 12:01:27,680
learned about arrays we know about the
15881
12:01:25,040 --> 12:01:29,915
size of an array we know that it is a
15882
12:01:27,680 --> 12:01:32,000
piece of contiguous memory location that
15883
12:01:29,915 --> 12:01:33,519
is going to be storing variables of the
15884
12:01:32,000 --> 12:01:34,720
same type this is really what we're
15885
12:01:34,720 --> 12:01:39,520
so let's try and compile this and see
15886
12:01:36,720 --> 12:01:42,239
that it actually goes through our gcc
15887
12:01:39,519 --> 12:01:44,079
compiler and it is going to work fine
15888
12:01:42,239 --> 12:01:46,720
and another thing you should notice is
15889
12:01:44,080 --> 12:01:49,360
that this is really compiling even if
15890
12:01:46,720 --> 12:01:52,639
what we are using to store the size of
15891
12:01:49,360 --> 12:01:55,040
the array is not const remember for
15892
12:01:52,639 --> 12:01:56,559
stack arrays or static arrays that we
15893
12:01:56,559 --> 12:01:59,756
we had to make sure this guy here is
15894
12:02:02,000 --> 12:02:07,275
a requirement and if you didn't fulfill
15895
12:02:04,480 --> 12:02:09,916
that your code wouldn't compile now you
15896
12:02:07,275 --> 12:02:12,479
see that with dynamic arrays the code is
15897
12:02:09,915 --> 12:02:14,159
actually compiling even if it's not cost
15898
12:02:12,480 --> 12:02:16,960
and this is something you should be
15899
12:02:14,160 --> 12:02:19,436
aware of let's build this again i just
15900
12:02:19,436 --> 12:02:23,756
and the world is good if we go down and
15901
12:02:22,319 --> 12:02:26,400
run it we're not going to see anything
15902
12:02:23,756 --> 12:02:28,639
really because we're not having any
15903
12:02:26,400 --> 12:02:30,160
output in this program but this is how
15904
12:02:30,160 --> 12:02:36,320
space for a dynamic array on the heap
15905
12:02:33,680 --> 12:02:38,559
now let's try and print some of the data
15906
12:02:36,319 --> 12:02:41,360
in this course here let's go down here
15907
12:02:38,559 --> 12:02:43,519
and actually do that we are going to do
15908
12:02:41,360 --> 12:02:45,275
a no pointer check because we want to
15909
12:02:43,519 --> 12:02:48,000
make sure that memory was actually
15910
12:02:45,275 --> 12:02:50,159
allocated for the p scores array
15911
12:02:48,000 --> 12:02:52,480
and after we do that we're going to loop
15912
12:02:52,480 --> 12:02:56,880
and we're going to be printing whatever
15913
12:02:54,080 --> 12:02:59,040
element is at each iteration the index
15914
12:02:56,879 --> 12:03:01,435
at each iteration and you see that we
15915
12:02:59,040 --> 12:03:04,639
can either use the angle brackets
15916
12:03:01,436 --> 12:03:06,560
notation or the pointer arithmetic
15917
12:03:04,639 --> 12:03:07,360
notation it is going to work equally
15918
12:03:08,959 --> 12:03:13,595
let's bring up our terminal we haven't
15919
12:03:10,800 --> 12:03:15,360
opened one and let's go down and clear
15920
12:03:20,639 --> 12:03:25,756
and we're going to be printing the data
15921
12:03:22,879 --> 12:03:28,000
first using the angle brackets notation
15922
12:03:25,756 --> 12:03:30,800
second using pointer arithmetic and you
15923
12:03:28,000 --> 12:03:32,879
see that it is working pretty well
15924
12:03:30,800 --> 12:03:34,480
one thing you should have noticed now is
15925
12:03:34,480 --> 12:03:37,840
released the memory that we have
15926
12:03:36,160 --> 12:03:39,756
allocated here and this is something
15927
12:03:37,839 --> 12:03:42,239
really bad so we're going to see how we
15928
12:03:39,756 --> 12:03:45,436
can do that we have allocated space for
15929
12:03:42,239 --> 12:03:47,275
salaries p students and scores so let's
15930
12:03:45,436 --> 12:03:48,959
go down and do that and we're going to
15931
12:03:48,959 --> 12:03:53,519
and we're going to have angular brackets
15932
12:03:50,720 --> 12:03:56,480
because this is an array we are
15933
12:03:53,519 --> 12:03:59,359
releasing memory for or to be exact a
15934
12:03:56,480 --> 12:04:01,916
dynamic array which was allocated on the
15935
12:04:03,680 --> 12:04:09,360
and we're going to reset that pointer
15936
12:04:06,639 --> 12:04:11,839
to no pointer because we are good c plus
15937
12:04:09,360 --> 12:04:13,915
plus citizens so we're going to do that
15938
12:04:11,839 --> 12:04:15,915
no pointer and we're going to do the
15939
12:04:17,680 --> 12:04:21,519
space for a dynamic array so the angle
15940
12:04:21,519 --> 12:04:27,915
the square brackets i should say and we
15941
12:04:24,400 --> 12:04:30,800
are going to delete p students i think
15942
12:04:27,915 --> 12:04:32,959
yes so we're going to say p student
15943
12:04:30,800 --> 12:04:35,520
and we're going to say p students and
15944
12:04:32,959 --> 12:04:37,116
we're going to reset this to no pointer
15945
12:04:35,519 --> 12:04:38,879
and we're going to do the same for p
15946
12:04:38,879 --> 12:04:44,079
let's grab this here that's what we want
15947
12:04:42,160 --> 12:04:46,480
no that's not what we want we're going
15948
12:04:44,080 --> 12:04:48,000
to say delete and say square brackets
15949
12:04:46,480 --> 12:04:50,720
ourselves and we're going to say p
15950
12:04:48,000 --> 12:04:52,959
scores and we're going to release that
15951
12:04:52,959 --> 12:04:57,915
and reset this to null pointer now we
15952
12:04:56,080 --> 12:05:00,319
are really playing it safe and our
15953
12:04:57,915 --> 12:05:02,479
program is going to release the memory
15954
12:05:00,319 --> 12:05:03,839
that we allocated in these three
15955
12:05:03,839 --> 12:05:07,435
if we build the program it is going to
15956
12:05:05,680 --> 12:05:10,239
go through well so we're going to build
15957
12:05:13,040 --> 12:05:17,680
and run rooster and it is going to run
15958
12:05:15,915 --> 12:05:18,719
pretty well you see that for peace
15959
12:05:18,720 --> 12:05:24,160
we initialized the first five elements
15960
12:05:22,160 --> 12:05:25,520
and the remaining elements were
15961
12:05:25,519 --> 12:05:29,755
implicitly by the compiler to zero and
15962
12:05:28,080 --> 12:05:32,000
you can see that here i don't think i
15963
12:05:29,756 --> 12:05:33,680
explained this but this is my chance to
15964
12:05:32,000 --> 12:05:35,915
explain this i hope you understand the
15965
12:05:33,680 --> 12:05:37,595
next thing i wanted to explore before we
15966
12:05:35,915 --> 12:05:40,079
close this video is the difference
15967
12:05:37,595 --> 12:05:42,479
between static arrays and dynamic arrays
15968
12:05:40,080 --> 12:05:44,319
a static array is an array you allocate
15969
12:05:42,480 --> 12:05:47,276
on the stack like we have been doing
15970
12:05:44,319 --> 12:05:49,839
before and you do it using a syntax like
15971
12:05:47,275 --> 12:05:51,839
let's say scores why not and it is going
15972
12:05:49,839 --> 12:05:54,079
to be an array that says it is going to
15973
12:05:54,080 --> 12:05:57,840
and we are going to put in our values in
15974
12:05:57,839 --> 12:06:01,839
and we're going to go all the way to 10
15975
12:06:00,080 --> 12:06:04,400
let's put in a 10 here and we're going
15976
12:06:04,400 --> 12:06:08,400
this array is cool and you can loop
15977
12:06:06,639 --> 12:06:10,479
through it you can do all kinds of crazy
15978
12:06:08,400 --> 12:06:13,200
things with it but i am going to
15979
12:06:10,480 --> 12:06:15,680
emphasize two differences we have with
15980
12:06:13,199 --> 12:06:17,519
dynamic arrays one is that this guy is
15981
12:06:15,680 --> 12:06:19,436
going to work with sdd size so we're
15982
12:06:19,436 --> 12:06:22,720
okay this is going to work if we compile
15983
12:06:22,720 --> 12:06:27,680
we're going to get a good world at least
15984
12:06:25,436 --> 12:06:30,239
i hope yes the world is good and if we
15985
12:06:30,239 --> 12:06:33,436
we're going to get scores the size is
15986
12:06:33,436 --> 12:06:37,520
the other thing is that you can use a
15987
12:06:35,436 --> 12:06:40,239
range based for loop to loop through
15988
12:06:37,519 --> 12:06:41,359
this guy here so for example we can say
15989
12:06:41,360 --> 12:06:47,915
auto score s for score in scores
15990
12:06:45,116 --> 12:06:50,000
and it is going to work so let's go down
15991
12:06:47,915 --> 12:06:52,959
and say what we are doing here or we can
15992
12:06:50,000 --> 12:06:55,360
even say a single line to separate fence
15993
12:06:52,959 --> 12:06:57,436
here i don't want to be confused so i am
15994
12:06:55,360 --> 12:07:00,000
going to do something like this so that
15995
12:06:57,436 --> 12:07:01,275
i know where my output here is going to
15996
12:07:01,275 --> 12:07:07,199
so i am going to build this
15997
12:07:03,839 --> 12:07:08,879
with gcc of course the world is going to
15998
12:07:12,319 --> 12:07:17,360
i am going to see that the size is 10
15999
12:07:14,480 --> 12:07:21,040
and i am going to print my elements here
16000
12:07:21,040 --> 12:07:25,436
okay let's see how these things behave
16001
12:07:23,199 --> 12:07:28,719
when we use a dynamic array we are going
16002
12:07:25,436 --> 12:07:31,436
to set up a similar array but on the hip
16003
12:07:28,720 --> 12:07:33,520
which is going to leave on the hip this
16004
12:07:31,436 --> 12:07:35,360
array here is the static array in that
16005
12:07:33,519 --> 12:07:37,359
it is going to live on the stack you
16006
12:07:35,360 --> 12:07:38,959
have to be aware of these differences
16007
12:07:37,360 --> 12:07:40,639
okay we're going to do another one which
16008
12:07:38,959 --> 12:07:43,040
is going to leave on the heap and the
16009
12:07:40,639 --> 12:07:45,360
way we do that we say end pointer let's
16010
12:07:43,040 --> 12:07:47,436
say p scores one to make sure this is
16011
12:07:45,360 --> 12:07:49,116
different from p squares that we have on
16012
12:07:47,436 --> 12:07:51,275
top here and we're going to have 10
16013
12:07:49,116 --> 12:07:53,840
elements inside and we can even
16014
12:07:51,275 --> 12:07:56,559
initialize this guy exactly like we are
16015
12:07:53,839 --> 12:07:58,639
doing here but the data is not going to
16016
12:07:56,559 --> 12:08:00,159
leave on the stack the data is going to
16017
12:08:00,160 --> 12:08:04,720
if we do something like this first let's
16018
12:08:02,959 --> 12:08:06,799
make sure that the code compiles we're
16019
12:08:08,319 --> 12:08:12,959
and watch the compiler output here the
16020
12:08:10,639 --> 12:08:14,400
bolt is good so this is valid c plus
16021
12:08:14,400 --> 12:08:21,040
we can try and use hdd size on that and
16022
12:08:17,595 --> 12:08:21,040
we're going to go down and do that
16023
12:08:21,360 --> 12:08:26,559
and if we do that we're going to say p
16024
12:08:26,559 --> 12:08:31,435
one size and say p scores if we try to
16025
12:08:29,595 --> 12:08:33,519
pass this pointer here you're going to
16026
12:08:31,436 --> 12:08:36,239
see that visual studio code is going to
16027
12:08:33,519 --> 12:08:37,435
freak out because this won't work
16028
12:08:37,436 --> 12:08:43,680
array here has decayed into a pointer
16029
12:08:40,879 --> 12:08:46,000
when we refer to it using a row pointer
16030
12:08:43,680 --> 12:08:48,800
like this so we can't really use it
16031
12:08:48,800 --> 12:08:53,040
so if we look at this we're going to get
16032
12:08:50,480 --> 12:08:54,880
a weird compiler error but this is going
16033
12:08:54,879 --> 12:09:00,159
okay so you can't do this with dynamic
16034
12:08:57,199 --> 12:09:03,039
arrays this is one limitation the other
16035
12:09:00,160 --> 12:09:06,160
is that you can't use dynamic arrays
16036
12:09:03,040 --> 12:09:09,680
like we are using a range based for loop
16037
12:09:06,160 --> 12:09:12,720
here so if we grab this loop and try to
16038
12:09:09,680 --> 12:09:14,959
work with it on p scores for example
16039
12:09:12,720 --> 12:09:15,680
this is something somebody might want to
16040
12:09:16,680 --> 12:09:21,040
pscores1 okay and try to print something
16041
12:09:19,595 --> 12:09:23,040
inside you're going to see that this is
16042
12:09:21,040 --> 12:09:25,595
not going to work the compiler visuals
16043
12:09:23,040 --> 12:09:29,840
video code is not going to like it first
16044
12:09:25,595 --> 12:09:31,839
and if we try and run this through gcc
16045
12:09:29,839 --> 12:09:34,000
we're also going to get a weird compiler
16046
12:09:31,839 --> 12:09:37,039
arrow and the problem is going to be
16047
12:09:34,000 --> 12:09:39,275
that p scores is really not an array it
16048
12:09:37,040 --> 12:09:42,000
is just a pointer that is pointing to
16049
12:09:39,275 --> 12:09:44,479
some location in memory that's all it is
16050
12:09:42,000 --> 12:09:46,720
and it doesn't have information that
16051
12:09:44,480 --> 12:09:47,756
could be used otherwise to loop through
16052
12:09:47,756 --> 12:09:54,800
like we can do for a real static array
16053
12:09:52,000 --> 12:09:57,360
that is leaving on the stack again let's
16054
12:09:54,800 --> 12:09:59,916
be super clear here and say that this
16055
12:09:59,915 --> 12:10:04,079
on the heap you have to understand these
16056
12:10:02,000 --> 12:10:06,879
things but this is really not a big
16057
12:10:04,080 --> 12:10:09,116
limitation because you can store the
16058
12:10:06,879 --> 12:10:11,360
size of this guy in some variable and
16059
12:10:09,116 --> 12:10:13,436
refer to it if you need that and you can
16060
12:10:11,360 --> 12:10:15,840
loop through the array exactly like we
16061
12:10:13,436 --> 12:10:18,480
did here using size and it is going to
16062
12:10:15,839 --> 12:10:20,879
work pretty well so don't be afraid to
16063
12:10:18,480 --> 12:10:23,200
store your arrays on the heap if that's
16064
12:10:20,879 --> 12:10:25,115
what you need in your application it is
16065
12:10:23,199 --> 12:10:28,079
going to work pretty well you just have
16066
12:10:25,116 --> 12:10:31,840
to be aware of some limitations that
16067
12:10:28,080 --> 12:10:33,596
come with doing things this way here
16068
12:10:31,839 --> 12:10:35,359
this is really all we set out to do in
16069
12:10:33,595 --> 12:10:38,559
this lecture i hope you have a better
16070
12:10:35,360 --> 12:10:40,959
idea about dynamic arrays you set them
16071
12:10:38,559 --> 12:10:43,360
up like this the size here doesn't have
16072
12:10:40,959 --> 12:10:45,839
to be cost like we have with static
16073
12:10:43,360 --> 12:10:48,480
arrays and they have a few differences
16074
12:10:45,839 --> 12:10:51,755
compared to static arrays that were
16075
12:10:48,480 --> 12:10:53,756
stored on the stack and that std size
16076
12:10:51,756 --> 12:10:57,200
doesn't work for them and they don't
16077
12:10:53,756 --> 12:10:59,916
work with range based for loops other
16078
12:10:57,199 --> 12:11:02,479
than that dynamic arrays are ridiculed
16079
12:10:59,915 --> 12:11:04,639
and you should use them when that helps
16080
12:11:02,480 --> 12:11:07,276
whatever it is you are designing
16081
12:11:04,639 --> 12:11:10,319
welcome to this new chapter where we are
16082
12:11:07,275 --> 12:11:12,479
going to be talking about references
16083
12:11:10,319 --> 12:11:15,680
references are a way you can set up
16084
12:11:12,480 --> 12:11:18,240
alliances for your variables and have
16085
12:11:15,680 --> 12:11:21,116
other variable names you can go through
16086
12:11:18,239 --> 12:11:23,436
to modify that same variable for example
16087
12:11:21,116 --> 12:11:25,840
here we have a variable called var it is
16088
12:11:23,436 --> 12:11:29,436
an integer it leaves at this address
16089
12:11:25,839 --> 12:11:32,559
here and the value inside is 33.
16090
12:11:29,436 --> 12:11:35,596
if we set up another alliance to it as
16091
12:11:32,559 --> 12:11:38,879
var elias we can go through this var
16092
12:11:35,595 --> 12:11:40,639
elias variable and use it in pretty much
16093
12:11:38,879 --> 12:11:42,559
the same way we use the original
16094
12:11:40,639 --> 12:11:45,839
valuable and this is going to come in
16095
12:11:42,559 --> 12:11:48,319
handy in many situations as we are about
16096
12:11:45,839 --> 12:11:50,319
to see in this chapter we are going to
16097
12:11:48,319 --> 12:11:52,400
start in the next lecture and see how we
16098
12:11:50,319 --> 12:11:54,400
can declare initialize and use
16099
12:11:55,680 --> 12:11:59,915
go ahead and finish up here and meet me
16100
12:11:58,000 --> 12:12:02,720
there in this lecture we're going to see
16101
12:11:59,915 --> 12:12:05,915
how we can declare and use references in
16102
12:12:02,720 --> 12:12:09,040
our c plus application again a reference
16103
12:12:05,915 --> 12:12:11,519
is an elias variable that you can use to
16104
12:12:09,040 --> 12:12:13,680
reference an original variable and use
16105
12:12:11,519 --> 12:12:16,799
that reference in pretty much the same
16106
12:12:13,680 --> 12:12:19,275
way you use the original variable let's
16107
12:12:16,800 --> 12:12:21,520
see how that can work in c plus plus
16108
12:12:19,275 --> 12:12:24,720
here is a simple example we have two
16109
12:12:21,519 --> 12:12:28,159
variables one is an integer we have 45 n
16110
12:12:24,720 --> 12:12:28,959
the other is a double we have 33.65
16111
12:12:28,959 --> 12:12:33,756
we want to set up references to this
16112
12:12:31,199 --> 12:12:34,719
variable and the syntax is ridiculously
16113
12:12:34,720 --> 12:12:39,840
for the edge value its reference is
16114
12:12:37,040 --> 12:12:42,639
going to be something like ant ampersand
16115
12:12:39,839 --> 12:12:45,039
you put the ampersand symbol you say the
16116
12:12:42,639 --> 12:12:48,080
name of the reference and you initialize
16117
12:12:45,040 --> 12:12:50,239
this with the value in the variable that
16118
12:12:48,080 --> 12:12:52,400
you want this to reference so reference
16119
12:12:50,239 --> 12:12:54,959
to h value is going to be referencing
16120
12:12:52,400 --> 12:12:58,880
our integer here and we can use this
16121
12:12:54,959 --> 12:13:00,799
name to reference this variable here and
16122
12:12:58,879 --> 12:13:03,275
it is going to be like we are using the
16123
12:13:00,800 --> 12:13:04,639
original variable which is interval here
16124
12:13:03,275 --> 12:13:06,639
we're going to see how this works in a
16125
12:13:04,639 --> 12:13:09,199
minute we can do the same using
16126
12:13:06,639 --> 12:13:11,116
assignment initialization and down here
16127
12:13:09,199 --> 12:13:13,435
you see that we have an example for the
16128
12:13:11,116 --> 12:13:15,680
double value and we have a reference to
16129
12:13:13,436 --> 12:13:17,680
it once we have these references we can
16130
12:13:17,680 --> 12:13:20,959
the original variables for example if
16131
12:13:19,436 --> 12:13:23,116
you come here you see we are printing
16132
12:13:20,959 --> 12:13:25,275
stuff out if we print any value we're
16133
12:13:23,116 --> 12:13:26,720
going to get the value printed out if we
16134
12:13:25,275 --> 12:13:28,879
print double value we're going to get
16135
12:13:26,720 --> 12:13:30,239
the value printed out we can also print
16136
12:13:28,879 --> 12:13:32,079
through references you're going to see
16137
12:13:30,239 --> 12:13:34,720
that they are going to print exactly the
16138
12:13:32,080 --> 12:13:36,000
same value as we have in the original
16139
12:13:36,000 --> 12:13:39,360
but the interesting thing is going to be
16140
12:13:39,360 --> 12:13:44,639
if you print the addresses through the
16141
12:13:41,519 --> 12:13:46,559
original values and print the addresses
16142
12:13:44,639 --> 12:13:49,040
through the references you're going to
16143
12:13:46,559 --> 12:13:51,680
get the same addresses printed out which
16144
12:13:49,040 --> 12:13:55,116
is really going to say this to variable
16145
12:13:51,680 --> 12:13:57,360
names are almost exactly the same thing
16146
12:13:55,116 --> 12:14:00,000
in c plus plus and this is really cool
16147
12:13:57,360 --> 12:14:02,639
you can use the reference as if you are
16148
12:14:00,000 --> 12:14:05,116
using the original variable name in your
16149
12:14:02,639 --> 12:14:06,879
c plus plus code we're even going to try
16150
12:14:05,116 --> 12:14:08,080
and go through the sizes and print them
16151
12:14:06,879 --> 12:14:10,399
out and you're going to see that they
16152
12:14:08,080 --> 12:14:12,240
are going to be exactly the same thing
16153
12:14:10,400 --> 12:14:15,040
and we are going to see how important
16154
12:14:12,239 --> 12:14:16,959
this can become in c plus plus code as
16155
12:14:15,040 --> 12:14:19,436
we go through this chapter okay now that
16156
12:14:16,959 --> 12:14:21,915
we have the reference declared we can go
16157
12:14:19,436 --> 12:14:24,160
through that and modify the value and if
16158
12:14:21,915 --> 12:14:27,115
we do that the changes are going to be
16159
12:14:24,160 --> 12:14:29,116
reflected in the original variables and
16160
12:14:27,116 --> 12:14:31,040
if we print stuff like this again we're
16161
12:14:29,116 --> 12:14:33,360
going to see that the changes are going
16162
12:14:31,040 --> 12:14:36,080
to be reflected in the original
16163
12:14:33,360 --> 12:14:38,639
variables okay if you modify the
16164
12:14:36,080 --> 12:14:41,116
original variable the changes are also
16165
12:14:38,639 --> 12:14:43,275
going to be reflected in our references
16166
12:14:41,116 --> 12:14:45,360
and this is exactly what we would expect
16167
12:14:43,275 --> 12:14:47,275
from our references okay so this is
16168
12:14:45,360 --> 12:14:49,840
really all there is about references
16169
12:14:47,275 --> 12:14:51,756
they are alliances to your variables and
16170
12:14:49,839 --> 12:14:54,159
you can use them pretty much the same
16171
12:14:51,756 --> 12:14:56,639
way you use your variables let's head
16172
12:14:54,160 --> 12:14:59,520
over to visual studio code and see some
16173
12:14:56,639 --> 12:15:02,080
of these things in action here we are in
16174
12:14:59,519 --> 12:15:04,639
our working directory the chapter is
16175
12:15:02,080 --> 12:15:06,880
references and the lecture is declaring
16176
12:15:04,639 --> 12:15:09,595
and using references we are going to
16177
12:15:09,595 --> 12:15:14,239
and we're going to put them in place and
16178
12:15:12,080 --> 12:15:16,400
we are going to open this in visual
16179
12:15:14,239 --> 12:15:19,275
studio code we are going to set up a new
16180
12:15:16,400 --> 12:15:21,520
variable let's call this data or it's
16181
12:15:19,275 --> 12:15:23,275
data this is going to be much more
16182
12:15:21,519 --> 12:15:26,559
descriptive and we're going to
16183
12:15:23,275 --> 12:15:28,559
initialize this with a 33 why not and
16184
12:15:26,559 --> 12:15:31,360
we're going to do a double and say
16185
12:15:28,559 --> 12:15:32,959
double data and we're going to put in a
16186
12:15:32,959 --> 12:15:36,799
and we're going to set up references to
16187
12:15:36,800 --> 12:15:41,840
and again a reference is an elias that
16188
12:15:39,680 --> 12:15:44,000
you can use in pretty much the same way
16189
12:15:41,839 --> 12:15:46,239
you use the original variable so we're
16190
12:15:44,000 --> 12:15:47,595
going to set up a reference to int data
16191
12:15:49,199 --> 12:15:54,559
reference mean reference by putting the
16192
12:15:51,595 --> 12:15:55,756
ampersand symbol here and we're going to
16193
12:15:56,879 --> 12:16:03,435
yeah and you initialize that
16194
12:16:00,239 --> 12:16:05,680
with the variable name you want this
16195
12:16:05,680 --> 12:16:10,480
and uh here we want to reference into
16196
12:16:07,839 --> 12:16:12,799
data so we're going to pass in into data
16197
12:16:10,480 --> 12:16:14,560
and this is going to be it our reference
16198
12:16:12,800 --> 12:16:16,800
is declared we can do the same for
16199
12:16:16,800 --> 12:16:20,480
double and we're going to say it's a
16200
12:16:18,400 --> 12:16:22,720
reference we're going to say rough
16201
12:16:20,480 --> 12:16:25,596
double data and we're going to reference
16202
12:16:22,720 --> 12:16:28,000
devo data here so let's do that okay
16203
12:16:25,595 --> 12:16:29,680
let's bring up our terminal and see if
16204
12:16:28,000 --> 12:16:32,480
we can compile this code here we're
16205
12:16:29,680 --> 12:16:35,360
going to compile with gcc like we always
16206
12:16:32,480 --> 12:16:37,756
do and let's close this then on the left
16207
12:16:37,756 --> 12:16:43,200
some of the space here the world is good
16208
12:16:40,800 --> 12:16:44,400
so this syntax is valid c plus plus
16209
12:16:44,400 --> 12:16:49,680
so what we can do is read values from
16210
12:16:47,756 --> 12:16:51,756
all these things and show you that they
16211
12:16:49,680 --> 12:16:54,000
really are the same things so we're
16212
12:16:51,756 --> 12:16:56,239
going to print stuff out and i am going
16213
12:16:54,000 --> 12:16:58,559
to put here some code and i am going to
16214
12:16:56,239 --> 12:17:01,115
come back when i have typed this i don't
16215
12:16:58,559 --> 12:17:03,680
want you to suffer watching me type
16216
12:17:01,116 --> 12:17:05,756
these things okay here i have the code
16217
12:17:03,680 --> 12:17:08,400
type down and you see that i am just
16218
12:17:05,756 --> 12:17:10,400
going to print dana through the original
16219
12:17:08,400 --> 12:17:12,480
variables i am going to print the actual
16220
12:17:10,400 --> 12:17:15,116
data and print the address of the
16221
12:17:12,480 --> 12:17:17,680
variable and do the same for the debo
16222
12:17:15,116 --> 12:17:20,000
data which is of type double
16223
12:17:17,680 --> 12:17:21,360
how convenient and we're going to print
16224
12:17:20,000 --> 12:17:23,199
references we're going to print the
16225
12:17:21,360 --> 12:17:25,199
reference and the address of the
16226
12:17:23,199 --> 12:17:28,559
reference and we're going to do the same
16227
12:17:25,199 --> 12:17:31,915
thing for our ref devil data here let's
16228
12:17:31,915 --> 12:17:35,275
so we're going to run the task to do
16229
12:17:35,275 --> 12:17:40,479
and we are going to clear the book is
16230
12:17:37,595 --> 12:17:43,040
good and run rooster if we run rooster
16231
12:17:40,480 --> 12:17:44,800
you see that let's put a separate end
16232
12:17:43,040 --> 12:17:45,915
line here so that we see the entire
16233
12:17:45,915 --> 12:17:51,275
i really like to see my fans easily
16234
12:17:49,040 --> 12:17:53,275
so let's do that and build again okay
16235
12:17:51,275 --> 12:17:55,519
the build is good we can clear and run
16236
12:17:53,275 --> 12:17:59,360
rooster now and we're going to see the
16237
12:17:55,519 --> 12:18:02,399
original data and data is 33 the address
16238
12:17:59,360 --> 12:18:05,275
is this guy here we have demo data the
16239
12:18:02,400 --> 12:18:07,040
value is 55 and this is the address if
16240
12:18:05,275 --> 12:18:09,115
we look at our references we have
16241
12:18:07,040 --> 12:18:11,595
exactly the same thing the addresses are
16242
12:18:09,116 --> 12:18:13,360
even the same it really is like we are
16243
12:18:11,595 --> 12:18:16,079
using the original variable and this is
16244
12:18:13,360 --> 12:18:18,720
really cool it can allow you to pass
16245
12:18:18,720 --> 12:18:23,360
using references and whatever you are
16246
12:18:21,040 --> 12:18:25,275
using when you have sent this data for
16247
12:18:23,360 --> 12:18:27,360
example to some other file or some other
16248
12:18:25,275 --> 12:18:29,680
function you're going to be
16249
12:18:27,360 --> 12:18:31,756
affecting the same data okay so you're
16250
12:18:29,680 --> 12:18:33,915
not going to be making copies and we're
16251
12:18:31,756 --> 12:18:36,000
going to see how cold this can be
16252
12:18:33,915 --> 12:18:38,639
especially when we get to working with
16253
12:18:36,000 --> 12:18:40,800
functions this is going to be super cool
16254
12:18:38,639 --> 12:18:43,519
okay now we have seen that the
16255
12:18:40,800 --> 12:18:46,400
references are really referencing the
16256
12:18:43,519 --> 12:18:48,079
original values let's try and modify the
16257
12:18:48,080 --> 12:18:51,436
the original values and see that the
16258
12:18:50,080 --> 12:18:53,436
references are going to pick up the
16259
12:18:51,436 --> 12:18:56,436
changes let's do that we're going to
16260
12:18:53,436 --> 12:18:58,959
take 80 data and change that to
16261
12:18:56,436 --> 12:19:03,360
111 and we're going to take the apple
16262
12:19:03,360 --> 12:19:07,436
why not and after we do this we're going
16263
12:19:05,199 --> 12:19:10,159
to print data again so we're going to
16264
12:19:11,519 --> 12:19:15,915
use that again here and we should see
16265
12:19:15,915 --> 12:19:20,319
so we're going to weld with dcc the bolt
16266
12:19:20,319 --> 12:19:24,639
as you see here and if we clear and run
16267
12:19:26,879 --> 12:19:33,199
the value is 55 let's put a separation
16268
12:19:30,319 --> 12:19:35,275
line in here this is cramped and it is
16269
12:19:33,199 --> 12:19:39,915
really hard to see what is happening
16270
12:19:35,275 --> 12:19:43,595
here so i am going to put an std endl in
16271
12:19:39,915 --> 12:19:46,000
here and weld again so let's do that and
16272
12:19:43,595 --> 12:19:48,399
the book is good so we can clear and run
16273
12:19:46,000 --> 12:19:50,800
rooster again and now we see things
16274
12:19:48,400 --> 12:19:53,596
separated out and it is easier on the
16275
12:19:50,800 --> 12:19:56,319
eye here we have empty data to b33 and
16276
12:19:53,595 --> 12:19:58,079
the depot data is 55 and we are going to
16277
12:19:56,319 --> 12:20:00,080
print our references which are going to
16278
12:19:58,080 --> 12:20:02,880
pick up the same things because a
16279
12:20:00,080 --> 12:20:05,116
reference is really analyzed to
16280
12:20:02,879 --> 12:20:06,639
the original variables but if you go
16281
12:20:05,116 --> 12:20:08,720
down you're going to see that the data
16282
12:20:06,639 --> 12:20:10,800
has actually changed and together has
16283
12:20:10,800 --> 12:20:16,560
and nabodana has changed to 67.2
16284
12:20:14,559 --> 12:20:18,799
and the interesting thing is that the
16285
12:20:16,559 --> 12:20:20,720
references have also picked up those
16286
12:20:18,800 --> 12:20:22,639
changes because they really are
16287
12:20:20,720 --> 12:20:24,239
referencing the same things in memory
16288
12:20:22,639 --> 12:20:26,800
it's like we are using the original
16289
12:20:26,800 --> 12:20:31,116
read these things like we are doing with
16290
12:20:29,199 --> 12:20:33,039
references here and this is really cool
16291
12:20:31,116 --> 12:20:35,360
here we have used the original variables
16292
12:20:33,040 --> 12:20:37,116
to modify data but we can also modify
16293
12:20:35,360 --> 12:20:38,959
the data through references and the
16294
12:20:37,116 --> 12:20:40,959
original variables are going to pick up
16295
12:20:38,959 --> 12:20:43,360
those changes so let's do that we're
16296
12:20:40,959 --> 12:20:45,040
going to say ref data and we're going to
16297
12:20:50,839 --> 12:20:57,039
1014 or 12. this is going to do we're
16298
12:20:53,680 --> 12:21:00,959
going to do ref double data and put in
16299
12:20:57,040 --> 12:21:02,879
another large number let's say 1000.45
16300
12:21:00,959 --> 12:21:04,839
why not and we're going to print the
16301
12:21:02,879 --> 12:21:08,559
data again so we're going to grab
16302
12:21:04,839 --> 12:21:10,719
this and print stuff out again so we're
16303
12:21:08,559 --> 12:21:12,319
going to go down and put in the code to
16304
12:21:10,720 --> 12:21:14,080
print stuff and you see it's going to
16305
12:21:12,319 --> 12:21:16,800
use the original variables and the
16306
12:21:14,080 --> 12:21:19,116
references and we should see the changes
16307
12:21:16,800 --> 12:21:20,560
reflected in our terminal here
16308
12:21:20,559 --> 12:21:24,639
and we're going to weld with gcc as we
16309
12:21:24,639 --> 12:21:28,639
the bullet is going to be cool we're
16310
12:21:26,319 --> 12:21:31,915
going to clear and run rooster we're
16311
12:21:28,639 --> 12:21:33,680
going to see that we have 33 and 55 the
16312
12:21:31,915 --> 12:21:35,595
references are going to pick that up
16313
12:21:33,680 --> 12:21:36,680
that's what we have here we're going to
16314
12:21:36,680 --> 12:21:41,519
111 and 67 through the original
16315
12:21:39,595 --> 12:21:43,595
variables and the references are going
16316
12:21:41,519 --> 12:21:46,319
to be picking that up and we're going to
16317
12:21:43,595 --> 12:21:48,799
use references and modify data you see
16318
12:21:46,319 --> 12:21:51,116
that the original variables are also
16319
12:21:48,800 --> 12:21:53,436
picking that up because we are really
16320
12:21:51,116 --> 12:21:55,680
modifying data in the same memory
16321
12:21:53,436 --> 12:21:57,840
location that's why these changes are
16322
12:21:55,680 --> 12:22:00,000
being shared between references and the
16323
12:21:57,839 --> 12:22:01,595
original variables and this is really
16324
12:22:00,000 --> 12:22:03,680
all we set out to do in this lecture to
16325
12:22:01,595 --> 12:22:06,399
show you how you can set up a reference
16326
12:22:03,680 --> 12:22:09,040
and prove that the changes we do either
16327
12:22:06,400 --> 12:22:11,275
through original data or references are
16328
12:22:09,040 --> 12:22:13,595
reflected between these two guys meaning
16329
12:22:11,275 --> 12:22:14,879
references and the original
16330
12:22:14,879 --> 12:22:18,000
we are going to stop here in this
16331
12:22:16,480 --> 12:22:20,560
lecture in the next one we're going to
16332
12:22:18,000 --> 12:22:23,360
do a comparison between pointers and
16333
12:22:20,559 --> 12:22:25,115
references because they seem to be doing
16334
12:22:25,116 --> 12:22:29,360
go ahead and finish up here
16335
12:22:27,040 --> 12:22:32,080
and meet me there and this lecture we're
16336
12:22:29,360 --> 12:22:34,239
going to be looking at the similarities
16337
12:22:32,080 --> 12:22:36,639
and the differences between references
16338
12:22:34,239 --> 12:22:38,479
and pointers okay we know that a pointer
16339
12:22:36,639 --> 12:22:40,879
is really something that is going to
16340
12:22:38,480 --> 12:22:43,276
store the address of the variable and we
16341
12:22:40,879 --> 12:22:45,595
can go through that pointer and modify
16342
12:22:43,275 --> 12:22:47,595
the original variable or really do
16343
12:22:45,595 --> 12:22:49,680
things with that but in the last lecture
16344
12:22:47,595 --> 12:22:52,559
we saw that we could also do the same
16345
12:22:49,680 --> 12:22:54,879
thing with references so why have these
16346
12:22:54,879 --> 12:22:59,839
and what are the differences between
16347
12:22:56,720 --> 12:23:02,160
them here is a simple slide that i put
16348
12:22:59,839 --> 12:23:04,879
together to put the important points
16349
12:23:02,160 --> 12:23:06,560
about references and pointers together
16350
12:23:04,879 --> 12:23:08,879
the first thing is that if you use
16351
12:23:06,559 --> 12:23:11,519
references you are not going to go
16352
12:23:08,879 --> 12:23:12,959
through the star symbol to the reference
16353
12:23:11,519 --> 12:23:15,435
and get to the value you are
16354
12:23:12,959 --> 12:23:17,436
manipulating so that's going to really
16355
12:23:15,436 --> 12:23:19,840
feel like you are using the original
16356
12:23:17,436 --> 12:23:21,596
variable but with pointers you are going
16357
12:23:19,839 --> 12:23:23,115
to go through the referencing so that's
16358
12:23:23,116 --> 12:23:27,916
another thing about references is that
16359
12:23:25,199 --> 12:23:30,399
you can't change them to reference
16360
12:23:27,915 --> 12:23:31,915
something else later but with pointers
16361
12:23:30,400 --> 12:23:34,639
we saw that we could do that we can
16362
12:23:31,915 --> 12:23:37,275
change a pointer to point somewhere else
16363
12:23:34,639 --> 12:23:39,519
if it happens to be a non-const pointer
16364
12:23:37,275 --> 12:23:41,756
the other thing is that for references
16365
12:23:39,519 --> 12:23:43,680
you have to initialize them at
16366
12:23:41,756 --> 12:23:46,160
declaration you can't declare a
16367
12:23:43,680 --> 12:23:47,595
reference and not initialize that if you
16368
12:23:46,160 --> 12:23:49,040
do that you're going to get a compiler
16369
12:23:47,595 --> 12:23:52,399
error and we're going to see that in a
16370
12:23:49,040 --> 12:23:54,559
minute but for pointers you can declare
16371
12:23:52,400 --> 12:23:57,040
a pointer and not initialize it and it
16372
12:23:54,559 --> 12:23:59,595
is going to just contain a junk address
16373
12:23:57,040 --> 12:24:01,840
and if you try to use that uninitialized
16374
12:23:59,595 --> 12:24:04,000
you are going to be setting yourself up
16375
12:24:01,839 --> 12:24:06,079
for trouble so we saw that so these are
16376
12:24:04,000 --> 12:24:08,480
the main differences between pointers
16377
12:24:06,080 --> 12:24:11,520
and references and now we are just going
16378
12:24:08,480 --> 12:24:14,000
to be looking at how these translate in
16379
12:24:11,519 --> 12:24:15,755
code here is a simple example we have a
16380
12:24:14,000 --> 12:24:17,915
variable called double value which
16381
12:24:15,756 --> 12:24:20,639
happens to be double and we have a
16382
12:24:17,915 --> 12:24:22,879
reference to it and a pointer to it so
16383
12:24:20,639 --> 12:24:25,680
you already know these concepts
16384
12:24:22,879 --> 12:24:27,915
now if we want to read the value in here
16385
12:24:25,680 --> 12:24:30,559
through our pointer and references we're
16386
12:24:27,915 --> 12:24:32,799
going to be using two different syntaxes
16387
12:24:30,559 --> 12:24:35,115
if we go through the reference we can
16388
12:24:32,800 --> 12:24:38,080
use this reference variable name
16389
12:24:35,116 --> 12:24:39,916
directly and read the value or change it
16390
12:24:39,915 --> 12:24:44,639
ref double value to print that out this
16391
12:24:42,400 --> 12:24:47,200
is going to work but if we want to go
16392
12:24:44,639 --> 12:24:49,275
through the pointer we will have to go
16393
12:24:47,199 --> 12:24:50,399
through the referencing and this is
16394
12:24:50,400 --> 12:24:55,116
you know sometimes people don't like
16395
12:24:52,400 --> 12:24:57,840
this syntax they think that it is not
16396
12:24:55,116 --> 12:25:00,160
direct enough so they prefer to use
16397
12:24:57,839 --> 12:25:02,319
references to do these kinds of things
16398
12:25:00,160 --> 12:25:04,240
but pointers are still important as we
16399
12:25:02,319 --> 12:25:06,720
will see later as we progress in the
16400
12:25:04,239 --> 12:25:08,559
course so this is one difference with
16401
12:25:06,720 --> 12:25:11,040
references you don't have to go through
16402
12:25:08,559 --> 12:25:13,360
the dereferencing mechanism to use this
16403
12:25:11,040 --> 12:25:15,840
star here to print stuff or even
16404
12:25:13,360 --> 12:25:17,360
manipulate the data inside you just use
16405
12:25:15,839 --> 12:25:19,915
the variable name and it is going to
16406
12:25:17,360 --> 12:25:21,520
work with pointers you have to reference
16407
12:25:19,915 --> 12:25:23,115
because if you don't the reference
16408
12:25:21,519 --> 12:25:25,755
you're going to be referring to the
16409
12:25:23,116 --> 12:25:28,080
address stored in this pointer this is
16410
12:25:25,756 --> 12:25:30,880
the first difference and we see that the
16411
12:25:28,080 --> 12:25:33,916
same applies if we are trying to
16412
12:25:30,879 --> 12:25:35,595
write data into our variable if we go
16413
12:25:33,915 --> 12:25:37,839
through the pointer we will have to
16414
12:25:35,595 --> 12:25:39,115
dereference and use this dollar symbol
16415
12:25:39,116 --> 12:25:44,080
if we are using a reference we can do
16416
12:25:41,116 --> 12:25:46,800
that directly as if we are modifying the
16417
12:25:44,080 --> 12:25:48,639
original variable so this syntax is much
16418
12:25:46,800 --> 12:25:51,200
more readable the other difference is
16419
12:25:48,639 --> 12:25:53,275
that we can't make a reference
16420
12:25:51,199 --> 12:25:55,039
reference something else but we can
16421
12:25:53,275 --> 12:25:57,680
change a pointer to point to something
16422
12:25:55,040 --> 12:25:59,595
else let's look at an example here we
16423
12:25:57,680 --> 12:26:01,680
have ref double value which is a
16424
12:26:02,959 --> 12:26:07,839
we are doing an assignment to this thing
16425
12:26:05,519 --> 12:26:09,519
here we are saying either double value
16426
12:26:09,519 --> 12:26:15,039
to our reference but what we are doing
16427
12:26:12,559 --> 12:26:17,595
here is not making ref double value
16428
12:26:15,040 --> 12:26:19,680
reference this other variable we are
16429
12:26:17,595 --> 12:26:21,595
just grabbing the value in other double
16430
12:26:19,680 --> 12:26:24,319
value and assigning that to our
16431
12:26:21,595 --> 12:26:26,720
reference and the value in either double
16432
12:26:24,319 --> 12:26:29,040
value is going to be reflected in the
16433
12:26:26,720 --> 12:26:31,916
original value here so this is what we
16434
12:26:29,040 --> 12:26:33,915
are doing we are not reassigning to our
16435
12:26:31,915 --> 12:26:36,239
reference to make it reference something
16436
12:26:33,915 --> 12:26:38,799
else we are assigning the value to the
16437
12:26:36,239 --> 12:26:40,639
reference as it is now and it is going
16438
12:26:38,800 --> 12:26:43,040
to be still referencing the same
16439
12:26:40,639 --> 12:26:44,400
variable in memory if you print out the
16440
12:26:43,040 --> 12:26:46,879
address in memory you're going to see
16441
12:26:44,400 --> 12:26:48,880
that the address of the reference here
16442
12:26:46,879 --> 12:26:50,799
hasn't changed so this is something you
16443
12:26:48,879 --> 12:26:52,879
should keep in mind but we know that a
16444
12:26:50,800 --> 12:26:54,720
pointer can point somewhere else if we
16445
12:26:52,879 --> 12:26:57,755
have a pointer here for example p double
16446
12:26:54,720 --> 12:27:00,559
value we can reassign it another address
16447
12:26:57,756 --> 12:27:02,239
and make it point to that new address so
16448
12:27:00,559 --> 12:27:05,040
in this regard we can think of
16449
12:27:02,239 --> 12:27:07,839
references as cost pointers because cost
16450
12:27:05,040 --> 12:27:09,595
pointers can't also be made to point
16451
12:27:07,839 --> 12:27:11,915
somewhere else and if you're trying to
16452
12:27:09,595 --> 12:27:15,756
do that for example here we have a cost
16453
12:27:11,915 --> 12:27:17,519
pointer it is called cost p double value
16454
12:27:15,756 --> 12:27:19,520
and if we try and make it point
16455
12:27:17,519 --> 12:27:21,595
somewhere else through this assignment
16456
12:27:19,519 --> 12:27:24,159
here we're going to get a compiler error
16457
12:27:21,595 --> 12:27:26,239
okay so this is really all in terms of
16458
12:27:24,160 --> 12:27:28,400
the comparisons that we had to make
16459
12:27:26,239 --> 12:27:30,000
between references and pointers now
16460
12:27:28,400 --> 12:27:32,160
we're going to head over to visual
16461
12:27:30,000 --> 12:27:35,360
studio code and see how these things
16462
12:27:32,160 --> 12:27:37,840
work in real code so here we are in our
16463
12:27:35,360 --> 12:27:40,400
working folder the current project is
16464
12:27:37,839 --> 12:27:43,199
comparing pointers and references we are
16465
12:27:40,400 --> 12:27:44,800
going to grab our template files and put
16466
12:27:44,800 --> 12:27:50,400
and we are going to open this project in
16467
12:27:47,519 --> 12:27:52,159
visual studio code like we always do we
16468
12:27:50,400 --> 12:27:54,720
are going to go down and put in some
16469
12:27:52,160 --> 12:27:56,080
starter code and let's align this a
16470
12:27:56,080 --> 12:28:00,720
so and we can close this pane so that we
16471
12:27:58,480 --> 12:28:03,116
have some breathing room here we have a
16472
12:28:00,720 --> 12:28:05,360
variable of double type and we set up a
16473
12:28:03,116 --> 12:28:07,116
reference to it and a pointer to it this
16474
12:28:05,360 --> 12:28:08,160
is how we do this thanks you already
16475
12:28:08,160 --> 12:28:12,880
and we can try and read through
16476
12:28:11,199 --> 12:28:15,595
the original variable through the
16477
12:28:12,879 --> 12:28:18,959
reference and through the pointer and
16478
12:28:15,595 --> 12:28:21,519
see how these syntaxes differ and how
16479
12:28:18,959 --> 12:28:24,479
one might be better than the other for
16480
12:28:21,519 --> 12:28:26,319
example if we look at how we are using
16481
12:28:24,480 --> 12:28:28,400
the reference it's really like we are
16482
12:28:26,319 --> 12:28:30,800
using the original value here we don't
16483
12:28:28,400 --> 12:28:32,560
have to do reference if we try to print
16484
12:28:30,800 --> 12:28:34,800
the pointer directly like this without
16485
12:28:32,559 --> 12:28:37,839
the referencing this is going to print
16486
12:28:34,800 --> 12:28:40,160
the actual address stored in this
16487
12:28:37,839 --> 12:28:43,435
pointer it's not going to print the
16488
12:28:40,160 --> 12:28:45,360
actual value stored in the address
16489
12:28:43,436 --> 12:28:47,840
pointed to by this pointer i really want
16490
12:28:45,360 --> 12:28:50,080
this to be clear so this is the syntax
16491
12:28:47,839 --> 12:28:52,319
we can use for reading stuff either
16492
12:28:50,080 --> 12:28:54,639
through references or pointers we can
16493
12:28:52,319 --> 12:28:56,959
also use these syntaxes to write stuff
16494
12:28:54,639 --> 12:28:58,800
into our variables for example here we
16495
12:28:56,959 --> 12:29:01,116
can go through the pointer and we have
16496
12:28:58,800 --> 12:29:03,200
to the reference and we can go through
16497
12:29:01,116 --> 12:29:04,800
the reference to really do the same
16498
12:29:03,199 --> 12:29:07,039
thing and we're going to see that our
16499
12:29:04,800 --> 12:29:08,080
syntaxes here are going to pick up the
16500
12:29:08,080 --> 12:29:13,756
regardless of whether we write through
16501
12:29:10,720 --> 12:29:15,040
pointer or a reference because all these
16502
12:29:13,756 --> 12:29:18,480
things really are going to be
16503
12:29:15,040 --> 12:29:21,756
referencing the same location in memory
16504
12:29:18,480 --> 12:29:24,560
let's try and bring up a terminal here
16505
12:29:21,756 --> 12:29:26,800
and we are going to world with gcc let's
16506
12:29:24,559 --> 12:29:29,435
do that the build is going to be good
16507
12:29:26,800 --> 12:29:31,200
and we're going to clear and run rooster
16508
12:29:29,436 --> 12:29:33,436
and you're going to see that at first
16509
12:29:35,199 --> 12:29:39,595
that's going to be the value we can get
16510
12:29:37,040 --> 12:29:42,160
it through original value the reference
16511
12:29:39,595 --> 12:29:44,799
or the pointer through the referencing
16512
12:29:42,160 --> 12:29:46,320
and the address is this one here
16513
12:29:44,800 --> 12:29:48,240
if we change the value through the
16514
12:29:46,319 --> 12:29:50,400
pointer we're going to see the changes
16515
12:29:48,239 --> 12:29:52,159
reflected here and if we change the
16516
12:29:50,400 --> 12:29:54,239
value through the reference we're going
16517
12:29:52,160 --> 12:29:56,560
to see the changes reflected in here so
16518
12:29:54,239 --> 12:29:59,040
this is how you can use pointers and
16519
12:29:56,559 --> 12:30:00,720
references to do these things here and
16520
12:29:59,040 --> 12:30:02,559
you can really choose what makes sense
16521
12:30:00,720 --> 12:30:04,880
for your application they mostly do the
16522
12:30:02,559 --> 12:30:07,360
same things but some people say that the
16523
12:30:04,879 --> 12:30:09,595
syntax to the reference the pointer here
16524
12:30:07,360 --> 12:30:11,840
is really ugly that's why most people
16525
12:30:09,595 --> 12:30:14,319
prefer to use references like this but
16526
12:30:11,839 --> 12:30:16,639
references have other benefits as well
16527
12:30:14,319 --> 12:30:18,319
as we're going to see as we progress in
16528
12:30:16,639 --> 12:30:20,239
the course another thing i want you to
16529
12:30:18,319 --> 12:30:22,959
see is that you can't change a reference
16530
12:30:20,239 --> 12:30:24,720
to reference something else in memory
16531
12:30:22,959 --> 12:30:27,756
for example here we have our reference
16532
12:30:24,720 --> 12:30:30,160
which is ref double value if we try and
16533
12:30:27,756 --> 12:30:31,916
make it reference something else
16534
12:30:30,160 --> 12:30:33,840
we're not going to get that result let's
16535
12:30:33,839 --> 12:30:38,799
so we're going to set up another double
16536
12:30:38,800 --> 12:30:42,880
make our ref double value reference this
16537
12:30:42,879 --> 12:30:46,879
the syntax that comes to mind is saying
16538
12:30:46,879 --> 12:30:51,360
double value and assign that the some
16539
12:30:51,360 --> 12:30:55,680
double value here now let's see what
16540
12:30:53,519 --> 12:30:58,479
happens if we do that we're going to try
16541
12:30:55,680 --> 12:31:00,319
and print whatever we have in memory
16542
12:31:00,319 --> 12:31:06,480
ref double value here let's grab this
16543
12:31:04,000 --> 12:31:08,800
and go down here and say that we are
16544
12:31:06,480 --> 12:31:11,040
changing the reference making the
16545
12:31:08,800 --> 12:31:13,436
reference reference something else let's
16546
12:31:11,040 --> 12:31:15,756
say that so if we try to build this
16547
12:31:13,436 --> 12:31:18,239
let's see what we get we're going to run
16548
12:31:18,239 --> 12:31:22,799
and we're going to try and run this
16549
12:31:20,720 --> 12:31:24,080
clear not clear and we're going to run
16550
12:31:25,680 --> 12:31:31,639
the last line of output here say 78.45
16551
12:31:31,756 --> 12:31:38,000
but the address is still the same so we
16552
12:31:35,116 --> 12:31:40,480
are still referencing the same memory
16553
12:31:38,000 --> 12:31:43,360
with our reference and what we just did
16554
12:31:40,480 --> 12:31:45,116
here was just grab the value in some
16555
12:31:45,116 --> 12:31:49,916
and assign that in here but the
16556
12:31:46,959 --> 12:31:52,239
reference is referencing the same memory
16557
12:31:49,915 --> 12:31:55,199
location it's been referencing so in c
16558
12:31:52,239 --> 12:31:56,319
plus plus you don't have a way you can
16559
12:31:56,319 --> 12:32:01,360
to make a reference reference something
16560
12:31:58,800 --> 12:32:03,360
else the only chance you have to make it
16561
12:32:01,360 --> 12:32:06,720
reference something is through
16562
12:32:03,360 --> 12:32:09,436
declaration here and that's the reason
16563
12:32:06,720 --> 12:32:10,959
you can't declare a reference and not
16564
12:32:09,436 --> 12:32:13,040
initialize it if you do that you're
16565
12:32:10,959 --> 12:32:14,400
going to get a compiler error so let's
16566
12:32:13,040 --> 12:32:16,879
try and do something like this we're
16567
12:32:14,400 --> 12:32:18,239
going to take out this double value and
16568
12:32:16,879 --> 12:32:20,079
the moment we do this you're going to
16569
12:32:18,239 --> 12:32:22,639
see that visual studio code is going to
16570
12:32:20,080 --> 12:32:24,880
be unhappy you see the squiggly line and
16571
12:32:22,639 --> 12:32:27,436
it is going to say initial value of
16572
12:32:24,879 --> 12:32:29,115
reference to non-cos must be an l value
16573
12:32:29,116 --> 12:32:33,680
okay if we take out the initialization
16574
12:32:31,595 --> 12:32:35,839
altogether it's going to give us a
16575
12:32:33,680 --> 12:32:38,800
better error i think reference variable
16576
12:32:35,839 --> 12:32:41,435
requires an initializer so every time
16577
12:32:38,800 --> 12:32:44,639
you declare a reference you have to
16578
12:32:41,436 --> 12:32:46,959
initialize it and we should do like we
16579
12:32:44,639 --> 12:32:49,116
just did before here and we're going to
16580
12:32:46,959 --> 12:32:51,756
be fine again you can't declare a
16581
12:32:49,116 --> 12:32:53,276
reference and not initialize it if you
16582
12:32:51,756 --> 12:32:56,080
do that you're going to get a compiler
16583
12:32:53,275 --> 12:32:58,239
error and the reason is that
16584
12:32:56,080 --> 12:33:00,880
this is the only shot you get to make
16585
12:32:58,239 --> 12:33:02,559
your reference reference something else
16586
12:33:00,879 --> 12:33:05,839
okay if there was a way for you to
16587
12:33:02,559 --> 12:33:08,000
bypass this and let the compiler compile
16588
12:33:05,839 --> 12:33:09,915
this you would never get another chance
16589
12:33:08,000 --> 12:33:12,080
to make this guy actually reference
16590
12:33:09,915 --> 12:33:14,319
something and it would really be a
16591
12:33:12,080 --> 12:33:16,319
useless reference so make sure you
16592
12:33:14,319 --> 12:33:19,116
understand this you can't make a
16593
12:33:16,319 --> 12:33:21,275
reference reference something else and
16594
12:33:19,116 --> 12:33:23,116
if you try to do something through a
16595
12:33:23,116 --> 12:33:27,756
you're going to be assigning the value
16596
12:33:24,959 --> 12:33:29,436
of whatever variable you have to the
16597
12:33:27,756 --> 12:33:31,916
reference you're not going to be making
16598
12:33:29,436 --> 12:33:33,360
the reference referencing something else
16599
12:33:31,915 --> 12:33:35,595
the reference is going to keep
16600
12:33:33,360 --> 12:33:37,915
referencing the same variable in memory
16601
12:33:35,595 --> 12:33:39,915
as we have seen here so let's say what
16602
12:33:37,915 --> 12:33:42,399
we were trying to do here but we know
16603
12:33:39,915 --> 12:33:44,719
that we can make pointers reference
16604
12:33:42,400 --> 12:33:45,596
something else so here we have a pointer
16605
12:33:45,595 --> 12:33:50,000
this pointer called the p double value
16606
12:33:47,756 --> 12:33:51,040
and it has the address of double value
16607
12:33:51,040 --> 12:33:57,275
but we can set up another variable
16608
12:33:53,915 --> 12:33:58,959
okay so we can make that reference this
16609
12:33:57,275 --> 12:34:00,479
other variable here and let's do that
16610
12:33:58,959 --> 12:34:02,319
you're going to see that our pointer now
16611
12:34:00,480 --> 12:34:04,960
is going to be containing another
16612
12:34:07,436 --> 12:34:10,880
which is our new pointer and we're going
16613
12:34:10,879 --> 12:34:19,595
the address of some other double value
16614
12:34:15,040 --> 12:34:22,239
and if we print the data now and go down
16615
12:34:19,595 --> 12:34:24,239
we are going to say make the pointer
16616
12:34:22,239 --> 12:34:26,479
point to something else that's what we
16617
12:34:24,239 --> 12:34:29,115
are doing here and we're going to say
16618
12:34:26,480 --> 12:34:31,040
the same thing here through a comma and
16619
12:34:29,116 --> 12:34:32,400
if we print this try to guess what we're
16620
12:34:32,400 --> 12:34:36,720
the pointer is going to contain a
16621
12:34:34,239 --> 12:34:38,400
completely new address because we can do
16622
12:34:42,480 --> 12:34:48,560
and we're going to see our data here
16623
12:34:44,959 --> 12:34:51,519
let's make sure we see the entire fan
16624
12:34:48,559 --> 12:34:53,435
okay i think this is the data we have
16625
12:34:53,436 --> 12:34:58,639
there's no harm in that so we have our
16626
12:34:56,000 --> 12:35:01,839
fence that we have seen before but what
16627
12:34:58,639 --> 12:35:05,040
is going to be important here is that pw
16628
12:35:01,839 --> 12:35:07,915
value now contains a new address
16629
12:35:05,040 --> 12:35:10,239
okay so this is really important and you
16630
12:35:07,915 --> 12:35:12,159
have to understand that so we made the
16631
12:35:10,239 --> 12:35:14,959
pointer successfully point to something
16632
12:35:12,160 --> 12:35:16,160
else and if we change the data in the
16633
12:35:16,160 --> 12:35:20,880
we're not going to be affecting the data
16634
12:35:18,559 --> 12:35:23,360
we have in here in double value we're
16635
12:35:20,879 --> 12:35:25,755
going to be affecting the data we have
16636
12:35:23,360 --> 12:35:27,436
and some other double value here let's
16637
12:35:25,756 --> 12:35:28,959
do that we're going to change the data
16638
12:35:27,436 --> 12:35:31,200
through the pointer so we're going to
16639
12:35:28,959 --> 12:35:32,559
say p double value and we're going to
16640
12:35:35,199 --> 12:35:39,915
and now we can print the data and see
16641
12:35:37,519 --> 12:35:42,000
that things have changed in memory and
16642
12:35:39,915 --> 12:35:44,719
we can print this to see the differences
16643
12:35:42,000 --> 12:35:46,879
here but before we do that let's also
16644
12:35:44,720 --> 12:35:49,116
print the address of the original
16645
12:35:46,879 --> 12:35:52,239
variable and the address because for now
16646
12:35:49,116 --> 12:35:54,160
we are just printing only the address
16647
12:35:52,239 --> 12:35:58,079
through the pointer so what we can do
16648
12:35:54,160 --> 12:36:00,320
here is grab htdc out and say
16649
12:35:58,080 --> 12:36:03,116
address of double volume and we're going
16650
12:36:00,319 --> 12:36:04,879
to put that out through htdc out here
16651
12:36:03,116 --> 12:36:07,276
we're going to do that and we're going
16652
12:36:04,879 --> 12:36:08,959
to print the address of the reference
16653
12:36:08,959 --> 12:36:13,519
ref double value and we're going to put
16654
12:36:11,680 --> 12:36:15,275
that out as well i'm going to say
16655
12:36:16,480 --> 12:36:21,360
and we're going to say std endn and
16656
12:36:19,199 --> 12:36:24,159
after that we are going to grab the
16657
12:36:21,360 --> 12:36:27,436
entire thing here and print it out after
16658
12:36:24,160 --> 12:36:29,360
we modify the value in the pointer
16659
12:36:27,436 --> 12:36:30,639
i hope this is going to show thanks in a
16660
12:36:30,639 --> 12:36:36,479
clear way so we're going to weld this
16661
12:36:33,040 --> 12:36:39,275
with gcc let's do that the build is good
16662
12:36:36,480 --> 12:36:41,360
so let's clear and run rooster and what
16663
12:36:39,275 --> 12:36:42,400
you're going to see is that
16664
12:36:42,400 --> 12:36:47,520
the original variable is living at
16665
12:36:47,519 --> 12:36:51,435
which we can see in our reference but
16666
12:36:49,436 --> 12:36:52,319
the pointer now is pointing to something
16667
12:36:52,319 --> 12:36:56,080
no wonder that the changes we did
16668
12:36:54,480 --> 12:36:58,160
through the pointer are not being
16669
12:36:56,080 --> 12:37:00,240
reflected in our double value because
16670
12:37:00,239 --> 12:37:05,519
are living in different memory locations
16671
12:37:03,436 --> 12:37:08,239
i really hope you see that and this is
16672
12:37:05,519 --> 12:37:10,239
really all we had to share in terms
16673
12:37:08,239 --> 12:37:12,639
of the differences between pointers and
16674
12:37:10,239 --> 12:37:15,519
references i hope you have a clear
16675
12:37:12,639 --> 12:37:16,720
picture of what these two things are and
16676
12:37:15,519 --> 12:37:18,879
we are going to stop here in this
16677
12:37:16,720 --> 12:37:21,520
lecture this one we're going to see how
16678
12:37:18,879 --> 12:37:22,955
the const key world works with
16679
12:37:22,955 --> 12:37:27,116
go ahead and finish up here and meet me
16680
12:37:25,199 --> 12:37:30,159
there in this lecture we're going to see
16681
12:37:27,116 --> 12:37:31,436
how the const key world can be used with
16682
12:37:31,436 --> 12:37:37,520
and again the idea is to set up an alias
16683
12:37:34,000 --> 12:37:40,080
to a variable and make it const so that
16684
12:37:37,519 --> 12:37:42,479
we can't go through it to modify the
16685
12:37:40,080 --> 12:37:44,800
original variable this is the syntax we
16686
12:37:42,480 --> 12:37:47,040
used to set up a non-const reference
16687
12:37:44,800 --> 12:37:50,080
that we have seen so far so for example
16688
12:37:47,040 --> 12:37:52,955
we can say int age put in a value 27 in
16689
12:37:50,080 --> 12:37:54,880
this case and set up a reference to age
16690
12:37:54,879 --> 12:37:59,915
with the age variable once we do this
16691
12:37:57,360 --> 12:38:02,239
riff edge can be used to modify
16692
12:37:59,915 --> 12:38:05,115
this edge variable here and whatever is
16693
12:38:02,239 --> 12:38:08,159
inside for example we can go through ref
16694
12:38:05,116 --> 12:38:10,400
age to increment the age and if we print
16695
12:38:08,160 --> 12:38:12,956
the edge now we should get a 28 printed
16696
12:38:10,400 --> 12:38:15,680
out because this reference is going to
16697
12:38:12,955 --> 12:38:18,159
change these two things at the same time
16698
12:38:15,680 --> 12:38:20,879
or another way to say this these two
16699
12:38:18,160 --> 12:38:22,720
things age and ref age are referencing
16700
12:38:22,720 --> 12:38:27,040
in your computer so if you change one
16701
12:38:25,116 --> 12:38:28,880
the other is going to pick up the change
16702
12:38:27,040 --> 12:38:31,436
we can also set up accounts reference
16703
12:38:28,879 --> 12:38:34,079
and the syntax is ridiculously easy you
16704
12:38:31,436 --> 12:38:36,955
say constant reference like this and
16705
12:38:34,080 --> 12:38:39,436
your reference is suddenly caused and
16706
12:38:36,955 --> 12:38:40,879
you can't go through it to modify the
16707
12:38:40,879 --> 12:38:44,559
if you need something like this in your
16708
12:38:42,639 --> 12:38:46,479
application this is how you do it you
16709
12:38:44,559 --> 12:38:48,559
can also duplicate the behavior with
16710
12:38:46,480 --> 12:38:51,200
count references with pointers and for
16711
12:38:48,559 --> 12:38:53,680
that we can use a construct like const
16712
12:38:51,199 --> 12:38:56,399
end pointer cost this is going to set up
16713
12:38:53,680 --> 12:38:58,319
a cost pointer to cost which we can't
16714
12:38:56,400 --> 12:38:59,520
use to modify the value that we are
16715
12:38:59,519 --> 12:39:04,239
but it can't also be used to point to
16716
12:39:02,160 --> 12:39:06,000
something else so this is going to
16717
12:39:04,239 --> 12:39:08,159
simulate the behavior we have with
16718
12:39:06,000 --> 12:39:10,400
references and you can do that if you
16719
12:39:08,160 --> 12:39:13,436
want and please know that we have no
16720
12:39:10,400 --> 12:39:15,360
such thing as constant reference cost
16721
12:39:13,436 --> 12:39:17,756
this is going to give you a compiler
16722
12:39:15,360 --> 12:39:20,800
error because we have no such concept in
16723
12:39:17,756 --> 12:39:23,200
c plus plus and my head is hurting right
16724
12:39:20,800 --> 12:39:25,520
now trying to think about what this
16725
12:39:23,199 --> 12:39:27,680
would even mean and another thing i want
16726
12:39:25,519 --> 12:39:30,319
to make clear before we head over to
16727
12:39:27,680 --> 12:39:32,879
vg's video code and play with us is that
16728
12:39:30,319 --> 12:39:34,559
the const key world is going to apply to
16729
12:39:34,559 --> 12:39:39,199
that you apply it to for example here we
16730
12:39:37,275 --> 12:39:42,400
have cost reference age which is going
16731
12:39:39,199 --> 12:39:44,879
to be a const reference but this doesn't
16732
12:39:42,400 --> 12:39:46,239
mean that the edge variable here has to
16733
12:39:46,239 --> 12:39:51,115
okay it can be cost or it may not be
16734
12:39:48,559 --> 12:39:53,839
cost but the cost here applies to this
16735
12:39:51,116 --> 12:39:55,916
variable name constraint age and we
16736
12:39:53,839 --> 12:39:58,079
can't go through this variable name and
16737
12:39:55,915 --> 12:40:00,319
modify the age if you're trying to do
16738
12:39:58,080 --> 12:40:02,400
that we're going to get a compiler error
16739
12:40:00,319 --> 12:40:05,839
now we can head over to visual studio
16740
12:40:02,400 --> 12:40:08,639
code and play with us here we are in our
16741
12:40:05,839 --> 12:40:11,359
working directory the current project is
16742
12:40:08,639 --> 12:40:14,080
reference and cost we're going to grab
16743
12:40:11,360 --> 12:40:14,879
our template files pretty quick let's do
16744
12:40:14,879 --> 12:40:20,000
and we're going to put them in place
16745
12:40:17,756 --> 12:40:22,559
and we are going to open this in visual
16746
12:40:20,000 --> 12:40:24,955
studio code we are going to review the
16747
12:40:22,559 --> 12:40:27,275
references we have seen so far in this
16748
12:40:24,955 --> 12:40:30,319
little example here we have the edge
16749
12:40:27,275 --> 12:40:33,040
variable it has a 27 inside and it is a
16750
12:40:30,319 --> 12:40:35,680
net and we have a reference to it
16751
12:40:33,040 --> 12:40:37,756
and this reference is not const so we
16752
12:40:35,680 --> 12:40:40,400
can go through this reference modify the
16753
12:40:37,756 --> 12:40:42,160
age and if we do that this is going to
16754
12:40:40,400 --> 12:40:45,116
work and if we print the edge here we're
16755
12:40:42,160 --> 12:40:48,480
going to see that it has turned into a
16756
12:40:45,116 --> 12:40:50,720
28 and we can try and print this through
16757
12:40:48,480 --> 12:40:53,116
the terminal so that you can see this
16758
12:40:50,720 --> 12:40:55,116
for yourself so let's run the task to
16759
12:40:59,756 --> 12:41:04,400
and if we do that you're going to see
16760
12:41:01,199 --> 12:41:06,955
edge is 27 now it is 28 and we have
16761
12:41:04,400 --> 12:41:08,319
successfully modified data through our
16762
12:41:08,319 --> 12:41:12,480
but if we change this reference to be
16763
12:41:10,559 --> 12:41:14,639
const we won't be able to do that
16764
12:41:12,480 --> 12:41:15,680
anymore so let's try and make it a const
16765
12:41:15,680 --> 12:41:19,756
if we do that we're going to get a
16766
12:41:17,680 --> 12:41:22,239
compiler error if we try to do something
16767
12:41:19,756 --> 12:41:24,239
like this because this is now a const
16768
12:41:22,239 --> 12:41:26,239
reference we can't go through it to
16769
12:41:24,239 --> 12:41:28,159
modify our data here and we're going to
16770
12:41:26,239 --> 12:41:30,955
get a compiler error here we have visual
16771
12:41:28,160 --> 12:41:34,480
studio called complaining here but if we
16772
12:41:30,955 --> 12:41:36,000
ignore that and go through the compiler
16773
12:41:34,480 --> 12:41:38,560
we're going to see that we get the same
16774
12:41:36,000 --> 12:41:41,040
compiler error we can't implement a read
16775
12:41:38,559 --> 12:41:43,435
only reference which is this ref age
16776
12:41:41,040 --> 12:41:45,436
here so this is what a cost reference
16777
12:41:43,436 --> 12:41:48,319
really is you can't go through it to
16778
12:41:45,436 --> 12:41:49,916
modify the data that is being referenced
16779
12:41:48,319 --> 12:41:52,239
and another thing i want you to really
16780
12:41:49,915 --> 12:41:55,040
understand is that this const keyword
16781
12:41:52,239 --> 12:41:57,275
here has nothing to do with the original
16782
12:41:55,040 --> 12:41:59,360
variable this is a constant reference we
16783
12:41:57,275 --> 12:42:02,720
can't go through it to modify the edge
16784
12:41:59,360 --> 12:42:04,879
variable but this doesn't matter if age
16785
12:42:02,720 --> 12:42:08,319
is either const or not const the
16786
12:42:04,879 --> 12:42:11,435
constants here applies to this variable
16787
12:42:08,319 --> 12:42:13,199
name here so this cost h may be cost if
16788
12:42:11,436 --> 12:42:14,955
it's cost it's going to work equally
16789
12:42:13,199 --> 12:42:17,360
well and we're going to still get a
16790
12:42:14,955 --> 12:42:19,436
compiler error here if it's not cost
16791
12:42:17,360 --> 12:42:22,480
it's going to be the same the cost we
16792
12:42:19,436 --> 12:42:24,400
have on our reference applies to this
16793
12:42:22,480 --> 12:42:26,956
reference variable name here this is
16794
12:42:24,400 --> 12:42:29,840
what i want you to understand okay this
16795
12:42:26,955 --> 12:42:32,479
is what a cost reference really is
16796
12:42:29,839 --> 12:42:34,159
another thing we want you to see
16797
12:42:32,480 --> 12:42:35,276
is that we can simulate the same
16798
12:42:35,275 --> 12:42:40,400
with pointers so let's set up a const
16799
12:42:37,839 --> 12:42:41,755
pointer to const on this edge here and
16800
12:42:40,400 --> 12:42:43,680
we're going to see that we can have the
16801
12:42:41,756 --> 12:42:45,756
same behavior but for that we're going
16802
12:42:43,680 --> 12:42:48,080
to have to comment this out because we
16803
12:42:45,756 --> 12:42:50,880
don't want noise output and we're going
16804
12:42:48,080 --> 12:42:53,360
to go on top here and comment this out
16805
12:42:50,879 --> 12:42:56,639
and say what we are intending to do we
16806
12:42:53,360 --> 12:42:58,639
can say that we are simulating reference
16807
12:42:56,639 --> 12:42:59,915
behavior with pointers and the way we're
16808
12:42:58,639 --> 12:43:02,879
going to do that we're going to say
16809
12:42:59,915 --> 12:43:04,479
const and pointer cost and we're going
16810
12:43:04,480 --> 12:43:09,116
and we're going to initialize this with
16811
12:43:06,480 --> 12:43:12,480
our age variable or the address of our
16812
12:43:09,116 --> 12:43:15,200
age to be super clear okay so we have
16813
12:43:12,480 --> 12:43:17,436
our pointer set up let's try and go
16814
12:43:15,199 --> 12:43:19,755
through it and modify the age let's see
16815
12:43:17,436 --> 12:43:21,756
what happens we the reference because
16816
12:43:19,756 --> 12:43:25,520
this is a pointer and we're going to say
16817
12:43:21,756 --> 12:43:28,559
ph and say plus plus or even change this
16818
12:43:25,519 --> 12:43:29,680
to another age let's say 45 and if we do
16819
12:43:28,559 --> 12:43:33,360
this we're going to get the same
16820
12:43:29,680 --> 12:43:36,879
compiler error so if we build this
16821
12:43:33,360 --> 12:43:38,559
let's clear here clear not clear
16822
12:43:36,879 --> 12:43:40,879
and above again we're going to get
16823
12:43:38,559 --> 12:43:43,360
another compiler error saying that we
16824
12:43:40,879 --> 12:43:46,159
can't modify something that is read only
16825
12:43:43,360 --> 12:43:50,400
assignment of read only location this
16826
12:43:46,160 --> 12:43:53,840
pointer can't be used to modify the data
16827
12:43:50,400 --> 12:43:56,560
in this age location here so this is the
16828
12:43:53,839 --> 12:43:58,955
same behavior with references because
16829
12:43:56,559 --> 12:44:01,756
the reference by default can't be made
16830
12:43:58,955 --> 12:44:04,639
to point somewhere else we had to make
16831
12:44:01,756 --> 12:44:07,040
this pointer also a const pointer
16832
12:44:04,639 --> 12:44:08,955
preventing us from making it point to
16833
12:44:07,040 --> 12:44:12,400
other locations so this is how you can
16834
12:44:08,955 --> 12:44:14,239
simulate references with pointers and
16835
12:44:12,400 --> 12:44:15,680
this is really all we set out to do in
16836
12:44:14,239 --> 12:44:16,879
this lecture i hope you found it
16837
12:44:16,879 --> 12:44:21,839
the main idea was to let you know how
16838
12:44:19,519 --> 12:44:23,359
you can work with cost references and
16839
12:44:21,839 --> 12:44:25,519
once you have your const reference you
16840
12:44:23,360 --> 12:44:27,756
can't go through it to modify the
16841
12:44:25,519 --> 12:44:29,595
original data if you do that you're
16842
12:44:27,756 --> 12:44:31,360
going to get a compiler error
16843
12:44:29,595 --> 12:44:34,879
welcome to this new chapter where we
16844
12:44:31,360 --> 12:44:36,720
will be doing cool stuff with text data
16845
12:44:34,879 --> 12:44:39,275
we have seen that we can model a
16846
12:44:36,720 --> 12:44:41,595
character array and store in a bunch of
16847
12:44:39,275 --> 12:44:43,436
characters and we could for example call
16848
12:44:41,595 --> 12:44:45,756
this character array message and
16849
12:44:43,436 --> 12:44:47,840
manipulate it in memory in this
16850
12:44:45,756 --> 12:44:50,559
structure we will see that this is
16851
12:44:47,839 --> 12:44:52,879
actually the way text data is stored in
16852
12:44:50,559 --> 12:44:55,115
c plus plus and we have a lot of
16853
12:44:52,879 --> 12:44:57,839
facilities built on top of this
16854
12:44:55,116 --> 12:45:01,040
character already construct to make it
16855
12:44:57,839 --> 12:45:03,199
easy to work with text data we will see
16856
12:45:01,040 --> 12:45:05,840
that we can use character arrays to
16857
12:45:03,199 --> 12:45:09,680
model c strings which are a facility we
16858
12:45:05,839 --> 12:45:12,079
use in c plus plus to handle text data
16859
12:45:09,680 --> 12:45:13,915
and we will see that there are a few
16860
12:45:12,080 --> 12:45:16,080
built-in facilities we can use to
16861
12:45:13,915 --> 12:45:18,079
manipulate that we can get the length of
16862
12:45:16,080 --> 12:45:20,480
a string we can concatenate strings and
16863
12:45:18,080 --> 12:45:22,955
put them together we can copy strings we
16864
12:45:20,480 --> 12:45:25,200
can search for data inside strings we
16865
12:45:22,955 --> 12:45:27,680
can do all kinds of crazy things but we
16866
12:45:25,199 --> 12:45:30,319
will see that c strings are not that
16867
12:45:27,680 --> 12:45:32,800
easy or convenient to work with for
16868
12:45:30,319 --> 12:45:35,519
example you need to keep track of how
16869
12:45:32,800 --> 12:45:38,160
big the string is in memory you need to
16870
12:45:35,519 --> 12:45:39,915
also remember to make sure it ends
16871
12:45:38,160 --> 12:45:42,320
correctly and we will see the details
16872
12:45:39,915 --> 12:45:44,799
about that in this chapter long story
16873
12:45:42,319 --> 12:45:47,360
short c strings are not safe or
16874
12:45:44,800 --> 12:45:50,000
convenient to work with in c plus plus
16875
12:45:47,360 --> 12:45:52,639
and c plus plus provide another type
16876
12:45:50,000 --> 12:45:55,519
that really builds on top of character
16877
12:45:52,639 --> 12:45:58,159
arrays but it gives us an easier
16878
12:45:55,519 --> 12:46:00,479
interface to work with and we can just
16879
12:45:58,160 --> 12:46:03,520
focus on storing in the data and doing
16880
12:46:00,480 --> 12:46:05,200
stuff with it in our c plus programs and
16881
12:46:03,519 --> 12:46:08,000
the big idea about what we're going to
16882
12:46:05,199 --> 12:46:10,719
be doing in this chapter is learn about
16883
12:46:08,000 --> 12:46:13,436
the facilities we have in c plus plus to
16884
12:46:10,720 --> 12:46:15,520
handle text data in our c plus plus
16885
12:46:13,436 --> 12:46:17,360
programs in the next lecture we're going
16886
12:46:15,519 --> 12:46:18,399
to start and show you how you can
16887
12:46:18,400 --> 12:46:21,520
individual characters in a character
16888
12:46:21,519 --> 12:46:24,719
go ahead and finish up here and meet me
16889
12:46:24,720 --> 12:46:28,239
in this lecture we're going to be
16890
12:46:25,915 --> 12:46:30,559
learning about some facilities in the c
16891
12:46:30,559 --> 12:46:35,915
that can help us manipulate characters
16892
12:46:33,915 --> 12:46:38,319
and here are a few things you might want
16893
12:46:35,915 --> 12:46:40,879
to do with those facilities for example
16894
12:46:38,319 --> 12:46:43,595
you might want to know if a character is
16895
12:46:40,879 --> 12:46:45,915
alphanumeric or if it's a number or a
16896
12:46:43,595 --> 12:46:48,159
character you might want to know if it
16897
12:46:45,915 --> 12:46:50,559
is alphabetic you might want to know if
16898
12:46:48,160 --> 12:46:52,640
it's a blank character you might want to
16899
12:46:50,559 --> 12:46:54,399
know if it's a lowercase or uppercase
16900
12:46:52,639 --> 12:46:56,800
character depending on what you want to
16901
12:46:54,400 --> 12:46:58,800
do in your application of course there
16902
12:46:56,800 --> 12:47:01,840
are facilities to check if characters
16903
12:46:58,800 --> 12:47:04,160
are digits there are even those that
16904
12:47:01,839 --> 12:47:06,479
help us you know transform characters
16905
12:47:04,160 --> 12:47:07,840
make them lowercase or uppercase and
16906
12:47:07,839 --> 12:47:11,879
these examples here all of these are
16907
12:47:11,879 --> 12:47:17,115
cppreference.com so you can go there and
16908
12:47:14,239 --> 12:47:19,839
find the documentation here is the same
16909
12:47:17,116 --> 12:47:23,360
link opened in my browser you see that
16910
12:47:19,839 --> 12:47:25,275
they leave in the cc type library so you
16911
12:47:23,360 --> 12:47:27,756
need this included if you want to use
16912
12:47:25,275 --> 12:47:30,159
them and you see that there is quite a
16913
12:47:27,756 --> 12:47:32,559
bunch of them we are going to cover just
16914
12:47:30,160 --> 12:47:34,880
a section of them and i will leave you
16915
12:47:32,559 --> 12:47:37,275
to use the documentation if you need to
16916
12:47:34,879 --> 12:47:39,360
use any more of these guys our first
16917
12:47:37,275 --> 12:47:42,400
example here is going to help us check
16918
12:47:39,360 --> 12:47:44,080
if a character is alpha numeric and the
16919
12:47:42,400 --> 12:47:48,160
function we're going to use from the c
16920
12:47:44,080 --> 12:47:48,955
plus plus standard library is std is l
16921
12:47:48,955 --> 12:47:54,400
and you just pass it a parameter of a
16922
12:47:51,839 --> 12:47:57,275
character and it's going to tell you if
16923
12:47:54,400 --> 12:47:59,200
a character is either alphanumeric or if
16924
12:47:57,275 --> 12:48:00,879
it's not if it is alphanumeric you're
16925
12:47:59,199 --> 12:48:02,955
going to get a value that is different
16926
12:48:00,879 --> 12:48:04,955
from zero which can be treated like a
16927
12:48:02,955 --> 12:48:07,275
true if it's not you're going to get a
16928
12:48:04,955 --> 12:48:09,756
value that you can treat like a zero and
16929
12:48:07,275 --> 12:48:12,559
how do i know this well we can check the
16930
12:48:09,756 --> 12:48:13,840
documentation so if i come back to our
16931
12:48:13,839 --> 12:48:19,679
and there is a function here is i'll num
16932
12:48:16,639 --> 12:48:21,519
i can open it in another tab and it is
16933
12:48:19,680 --> 12:48:23,595
going to tell me what this function does
16934
12:48:21,519 --> 12:48:26,275
checks if the given character that you
16935
12:48:23,595 --> 12:48:29,040
pass as a parameter here is an
16936
12:48:26,275 --> 12:48:30,879
alphanumeric character as classified by
16937
12:48:31,756 --> 12:48:34,955
it's going to tell us if the character
16938
12:48:34,955 --> 12:48:40,159
alphanumeric or not you give it a
16939
12:48:37,360 --> 12:48:42,160
character and what you get from it is
16940
12:48:40,160 --> 12:48:44,800
the return value here it's going to
16941
12:48:42,160 --> 12:48:47,916
return a non-zero value if the character
16942
12:48:44,800 --> 12:48:49,756
is alpha numeric so this non-zero value
16943
12:48:47,915 --> 12:48:51,839
which is an integer because that's what
16944
12:48:49,756 --> 12:48:53,840
we get out of this function is going to
16945
12:48:53,839 --> 12:48:58,639
and if this character here is not alpha
16946
12:48:56,160 --> 12:49:00,480
numeric we're going to get zero that we
16947
12:48:58,639 --> 12:49:01,915
can treat like a false this is really
16948
12:49:00,480 --> 12:49:03,840
cool and if you go down here you're
16949
12:49:01,915 --> 12:49:06,000
going to find a few examples i don't
16950
12:49:03,839 --> 12:49:06,879
want you to worry about this c local
16951
12:49:10,955 --> 12:49:14,479
say more about the meaning of the
16952
12:49:12,800 --> 12:49:16,240
characters that you are storing in
16953
12:49:14,480 --> 12:49:18,956
memory but for now we're just going to
16954
12:49:16,239 --> 12:49:21,199
be happy with the defaults and use this
16955
12:49:18,955 --> 12:49:23,595
function as is it is going to work
16956
12:49:21,199 --> 12:49:26,639
enough well okay here is our function
16957
12:49:23,595 --> 12:49:28,720
again so here c is alphanumeric we
16958
12:49:28,720 --> 12:49:33,116
different from zero because c is
16959
12:49:30,720 --> 12:49:35,756
alphanumeric and the second example here
16960
12:49:33,116 --> 12:49:38,400
is not alphanumeric so we expect to get
16961
12:49:35,756 --> 12:49:40,720
a value that is equal to zero and we can
16962
12:49:38,400 --> 12:49:42,880
use the return of this function
16963
12:49:40,720 --> 12:49:44,720
in a test for example we can say a
16964
12:49:42,879 --> 12:49:48,719
character we put in a star here it is
16965
12:49:44,720 --> 12:49:50,800
called input car and we say f is al num
16966
12:49:48,720 --> 12:49:52,800
and we pass this character we're going
16967
12:49:50,800 --> 12:49:54,956
to print out this character is alpha
16968
12:49:52,800 --> 12:49:57,200
numeric if it's not we're going to print
16969
12:49:54,955 --> 12:49:59,680
is not alpha numeric you can do that and
16970
12:49:57,199 --> 12:50:02,399
you can do all kinds of crazy tests in
16971
12:49:59,680 --> 12:50:04,720
your c plus plus applications here is
16972
12:50:02,400 --> 12:50:08,400
another example that we can use to know
16973
12:50:04,720 --> 12:50:11,040
if the character is alphabetic so it's
16974
12:50:08,400 --> 12:50:14,160
going to return a value different from
16975
12:50:11,040 --> 12:50:16,955
zero if the character is a an alphabet
16976
12:50:14,160 --> 12:50:19,520
character a through z that's going to
16977
12:50:16,955 --> 12:50:21,519
return something different from zero and
16978
12:50:19,519 --> 12:50:22,719
if we pass something that is not for
16979
12:50:22,720 --> 12:50:27,595
this second line here or the seven at
16980
12:50:25,436 --> 12:50:29,916
the third line here we're going to get a
16981
12:50:27,595 --> 12:50:32,159
value equal to zero because that's not
16982
12:50:29,915 --> 12:50:34,719
alphabetic we have another facility to
16983
12:50:32,160 --> 12:50:37,040
help check if a character is a black
16984
12:50:34,720 --> 12:50:39,040
character and we see an example that
16985
12:50:37,040 --> 12:50:41,116
here we have a character array called
16986
12:50:39,040 --> 12:50:44,559
message we have a couple of blanks
16987
12:50:41,116 --> 12:50:47,596
inside and we can hunt for them using
16988
12:50:44,559 --> 12:50:49,680
the ease blank facility from the c plus
16989
12:50:47,595 --> 12:50:51,756
plus standard library here we have a
16990
12:50:49,680 --> 12:50:54,639
variable that is going to keep track of
16991
12:50:51,756 --> 12:50:56,239
how many black characters are in here it
16992
12:50:54,639 --> 12:50:58,639
is initialized to zero and we're going
16993
12:50:56,239 --> 12:51:02,400
to loop around okay and we're going to
16994
12:50:58,639 --> 12:51:04,720
look by the amount equal to the size of
16995
12:51:02,400 --> 12:51:07,200
the message array here we can use std
16996
12:51:04,720 --> 12:51:09,916
size again because this is a row array
16997
12:51:07,199 --> 12:51:11,755
it is a static array and we can use sdd
16998
12:51:09,915 --> 12:51:13,915
size it is going to give us how many
16999
12:51:11,756 --> 12:51:16,319
characters we have in this array you
17000
12:51:13,915 --> 12:51:19,040
already know this and if we get inside
17001
12:51:16,319 --> 12:51:20,800
we are going to try and check and see if
17002
12:51:20,800 --> 12:51:26,319
is a blank if it is we're going to print
17003
12:51:23,519 --> 12:51:29,839
that out and we're going to increment
17004
12:51:26,319 --> 12:51:32,239
our blank account by the time this loop
17005
12:51:29,839 --> 12:51:34,879
is done we will have printed out a lot
17006
12:51:32,239 --> 12:51:37,595
of blank characters if we happen to
17007
12:51:34,879 --> 12:51:39,435
have them in our message and at the end
17008
12:51:37,595 --> 12:51:41,680
we're going to say in total we found
17009
12:51:39,436 --> 12:51:43,040
however many blank characters this is
17010
12:51:43,040 --> 12:51:47,116
if we run this program and hopefully you
17011
12:51:47,116 --> 12:51:52,240
this can be in text processing
17012
12:51:49,275 --> 12:51:54,319
applications if that happens to be what
17013
12:51:52,239 --> 12:51:56,479
you are working on we're going to run
17014
12:51:54,319 --> 12:51:58,480
this example in visual studio code in a
17015
12:51:56,480 --> 12:52:00,400
minute here is another example that we
17016
12:51:58,480 --> 12:52:02,319
can use to check if a character is
17017
12:52:02,319 --> 12:52:07,595
lowercase we have an array of characters
17018
12:52:04,955 --> 12:52:10,239
here inside we have some text
17019
12:52:07,595 --> 12:52:12,955
and we have a few variables to keep
17020
12:52:10,239 --> 12:52:15,680
track of how many characters are
17021
12:52:12,955 --> 12:52:17,595
lowercase or uppercase we're going to
17022
12:52:15,680 --> 12:52:20,400
set up a loop which is going to be a
17023
12:52:17,595 --> 12:52:22,955
range based for loop and we know that
17024
12:52:22,955 --> 12:52:27,275
we're going to increment the lowercase
17025
12:52:25,275 --> 12:52:29,040
count if it is uppercase we're going to
17026
12:52:27,275 --> 12:52:30,639
increment the uppercase count this is
17027
12:52:30,639 --> 12:52:35,116
and we are going to print that
17028
12:52:32,879 --> 12:52:37,435
information when the loop here is done
17029
12:52:35,116 --> 12:52:38,955
okay we still have a few examples ahead
17030
12:52:37,436 --> 12:52:40,800
the current one is going to check if a
17031
12:52:38,955 --> 12:52:43,275
character is a digit if you want to do
17032
12:52:40,800 --> 12:52:45,520
that you can use this and we have a
17033
12:52:43,275 --> 12:52:49,519
character array here and we're going to
17034
12:52:45,519 --> 12:52:51,595
have for digits inside this message here
17035
12:52:49,519 --> 12:52:53,519
so we're going to do basically the same
17036
12:52:51,595 --> 12:52:56,399
thing we're going to set up a variable
17037
12:52:53,519 --> 12:52:59,115
that is going to keep track of how many
17038
12:52:56,400 --> 12:53:01,275
digits we have in this message we are
17039
12:52:59,116 --> 12:53:03,596
going to loop around using a range based
17040
12:53:01,275 --> 12:53:05,680
for loop we're going to check if the
17041
12:53:03,595 --> 12:53:06,879
current character is a digit and we're
17042
12:53:08,480 --> 12:53:12,880
our variable here if it happens to be
17043
12:53:10,639 --> 12:53:16,080
the case and at the end we're going to
17044
12:53:12,879 --> 12:53:18,639
say how many digits we found in our
17045
12:53:16,080 --> 12:53:20,639
message here it is this simple the last
17046
12:53:18,639 --> 12:53:23,839
example we're going to look at is to
17047
12:53:20,639 --> 12:53:26,319
help us turn a character into lowercase
17048
12:53:23,839 --> 12:53:28,879
or uppercase and here is an example that
17049
12:53:26,319 --> 12:53:30,480
is going to help us play with us we're
17050
12:53:30,480 --> 12:53:35,276
character array called home the feeling
17051
12:53:33,040 --> 12:53:38,080
of belonging and we will set up a
17052
12:53:35,275 --> 12:53:40,159
destination character array
17053
12:53:38,080 --> 12:53:41,916
that we're going to store whatever we
17054
12:53:41,915 --> 12:53:47,115
here you see a loop that is going to
17055
12:53:43,436 --> 12:53:49,596
turn our message here into uppercase
17056
12:53:47,116 --> 12:53:52,000
and you see we're going to loop around
17057
12:53:49,595 --> 12:53:52,955
by this amount the size of original
17058
12:53:52,955 --> 12:53:57,915
and we're going to be grabbing each
17059
12:53:57,915 --> 12:54:04,079
and turning that to uppercase this is
17060
12:54:00,720 --> 12:54:06,639
what std to upper function does the
17061
12:54:04,080 --> 12:54:09,200
result of that is going to be stored in
17062
12:54:06,639 --> 12:54:11,519
our destination string and by the time
17063
12:54:09,199 --> 12:54:14,399
we are done here original string is
17064
12:54:11,519 --> 12:54:16,955
going to be however it was but uppercase
17065
12:54:14,400 --> 12:54:19,360
string is going to be stored in our
17066
12:54:16,955 --> 12:54:21,839
destination array and if we print it out
17067
12:54:19,360 --> 12:54:24,239
we should see this thing printed in
17068
12:54:21,839 --> 12:54:27,519
uppercase we can basically do the same
17069
12:54:24,239 --> 12:54:29,680
thing and turn the string into lowercase
17070
12:54:27,519 --> 12:54:31,595
and our destination string is going to
17071
12:54:29,680 --> 12:54:34,000
be now lowercase and you're going to see
17072
12:54:31,595 --> 12:54:36,955
that this works out pretty well
17073
12:54:34,000 --> 12:54:39,116
now that you have a basic understanding
17074
12:54:36,955 --> 12:54:41,519
about how these things work we're going
17075
12:54:39,116 --> 12:54:44,480
to head over to vg studio code and play
17076
12:54:41,519 --> 12:54:46,239
with us okay here we are in our working
17077
12:54:44,480 --> 12:54:48,319
directory the current project is
17078
12:54:48,319 --> 12:54:53,040
we are going to grab our template files
17079
12:54:50,800 --> 12:54:55,200
like we always do and we're going to put
17080
12:54:53,040 --> 12:54:57,840
this in place and we're going to open
17081
12:54:55,199 --> 12:54:59,839
this in visual studio code pretty quick
17082
12:54:57,839 --> 12:55:02,159
and we are going to go down and put in
17083
12:54:59,839 --> 12:55:06,239
our first example this example is going
17084
12:55:02,160 --> 12:55:08,160
to be using the std is al num facility
17085
12:55:06,239 --> 12:55:10,000
and this is going to be checking if the
17086
12:55:08,160 --> 12:55:12,240
character is alpha numeric we're going
17087
12:55:10,000 --> 12:55:14,800
to see what we get from this if we print
17088
12:55:12,239 --> 12:55:17,040
this out we're going to check if c the
17089
12:55:14,800 --> 12:55:18,880
character c is alphanumeric we're going
17090
12:55:17,040 --> 12:55:21,275
to see what we get and we're going to
17091
12:55:18,879 --> 12:55:23,755
check if this character here i don't
17092
12:55:21,275 --> 12:55:25,595
know how to pronounce it i'm sorry
17093
12:55:23,756 --> 12:55:27,595
we're going to check if it is
17094
12:55:25,595 --> 12:55:29,680
alpha numeric we're going to see that
17095
12:55:27,595 --> 12:55:31,680
and we're going to use this in at
17096
12:55:29,680 --> 12:55:34,000
condition we're going to check and see
17097
12:55:31,680 --> 12:55:35,756
if our star character here is
17098
12:55:34,000 --> 12:55:37,436
alphanumeric and we're going to print
17099
12:55:35,756 --> 12:55:39,520
that out we're going to say it is alpha
17100
12:55:37,436 --> 12:55:41,756
numeric or it is not from the
17101
12:55:39,519 --> 12:55:44,239
documentation we know that this thing
17102
12:55:44,239 --> 12:55:49,115
library so we may want to include that
17103
12:55:46,720 --> 12:55:51,520
but it is possible that it is coming
17104
12:55:49,116 --> 12:55:52,639
from iostream here that's why we don't
17105
12:55:52,639 --> 12:55:56,879
visual studio code complaining here as
17106
12:55:54,639 --> 12:55:58,479
an example if we try and comment out
17107
12:56:00,559 --> 12:56:06,000
this is not going to make sense anymore
17108
12:56:02,879 --> 12:56:09,360
okay so the include needed to use these
17109
12:56:06,000 --> 12:56:11,839
guys here is coming from io stream okay
17110
12:56:09,360 --> 12:56:15,756
so we're not going to include that here
17111
12:56:11,839 --> 12:56:18,799
we are going to open up a terminal
17112
12:56:15,756 --> 12:56:20,720
and build this with gcc and you're going
17113
12:56:18,800 --> 12:56:23,756
to see that the block is good if we go
17114
12:56:20,720 --> 12:56:26,239
down and clear let's clear properly and
17115
12:56:23,756 --> 12:56:28,639
run rooster we're going to see that c is
17116
12:56:26,239 --> 12:56:30,955
alphanumeric because we have a one the
17117
12:56:28,639 --> 12:56:33,040
one can be treated like a true and the
17118
12:56:30,955 --> 12:56:35,680
character here is not alphanumeric
17119
12:56:35,680 --> 12:56:40,480
and you see that the star here is also
17120
12:56:37,839 --> 12:56:42,799
not alpha numeric and we know this
17121
12:56:40,480 --> 12:56:44,956
through our test here and you see that
17122
12:56:44,955 --> 12:56:50,639
with this facility here if you want to
17123
12:56:47,756 --> 12:56:53,680
get true or false from this function you
17124
12:56:50,639 --> 12:56:55,756
can turn this into booleans using static
17125
12:56:53,680 --> 12:56:58,239
cast but we're not going to do that here
17126
12:56:55,756 --> 12:57:00,319
you already know that we can comment
17127
12:56:58,239 --> 12:57:02,559
this out for now and look at another
17128
12:57:02,559 --> 12:57:07,115
cctype library there are many of these
17129
12:57:05,436 --> 12:57:09,520
we're going to look at quite a few of
17130
12:57:07,116 --> 12:57:12,400
them we're going to comment this out and
17131
12:57:09,519 --> 12:57:14,559
go down and put in a code here and this
17132
12:57:12,400 --> 12:57:17,040
is going to check if a character is
17133
12:57:14,559 --> 12:57:18,079
alphabetic so if it is an alphabet
17134
12:57:18,080 --> 12:57:23,680
a from z lowercase and uppercase
17135
12:57:21,116 --> 12:57:26,400
c is alphabetic the character here is
17136
12:57:23,680 --> 12:57:29,436
not alphabetic and seven here is not
17137
12:57:26,400 --> 12:57:31,680
alphabetic so for the first one here
17138
12:57:29,436 --> 12:57:34,720
we're going to get something
17139
12:57:31,680 --> 12:57:37,840
not equal to zero we should get a one
17140
12:57:34,720 --> 12:57:39,360
that's what they use in most cases for
17141
12:57:37,839 --> 12:57:41,275
this we're going to get a zero the
17142
12:57:39,360 --> 12:57:43,595
second one and for the third one we're
17143
12:57:41,275 --> 12:57:44,639
going to also get a zero this is what we
17144
12:57:44,639 --> 12:57:50,239
we are going to build with gcc of course
17145
12:57:47,756 --> 12:57:51,436
and we are going to clear and run
17146
12:57:51,436 --> 12:57:56,720
and we're going to get that c is
17147
12:57:53,595 --> 12:57:59,595
alphabetic this guy is not alphabetic
17148
12:57:56,720 --> 12:58:01,680
and seven is not alphabetic if we change
17149
12:58:03,839 --> 12:58:07,115
and both again you're going to see that
17150
12:58:05,519 --> 12:58:09,680
the results are going to be what we
17151
12:58:09,680 --> 12:58:14,400
let's clear and run rooster this is
17152
12:58:12,239 --> 12:58:16,799
going to be exactly what we expect but
17153
12:58:14,400 --> 12:58:19,596
you see that it is not a one and this is
17154
12:58:16,800 --> 12:58:21,756
not guaranteed to always give you a one
17155
12:58:19,595 --> 12:58:24,399
it is guaranteed to give you something
17156
12:58:21,756 --> 12:58:27,916
different from zero if the character is
17157
12:58:24,400 --> 12:58:30,160
alphabetic and zero if not and we can
17158
12:58:31,595 --> 12:58:37,839
we can say f sdd is alpha and if we're
17159
12:58:35,595 --> 12:58:40,079
boiled the both is going to be good and
17160
12:58:37,839 --> 12:58:42,879
we're going to clear and run rooster and
17161
12:58:40,080 --> 12:58:45,276
you see e is alphabetic i should put a
17162
12:58:42,879 --> 12:58:47,360
space here i do encourage you to change
17163
12:58:45,275 --> 12:58:49,436
these characters up and see what you get
17164
12:58:47,360 --> 12:58:52,319
here and see how you can use this that's
17165
12:58:49,436 --> 12:58:54,239
in tests that's the best way to learn
17166
12:58:52,319 --> 12:58:56,720
okay before we continue i do encourage
17167
12:58:54,239 --> 12:58:58,955
you to try and run these methods through
17168
12:58:56,720 --> 12:59:01,916
different compilers for example here we
17169
12:58:58,955 --> 12:59:04,239
also have an msvc compiler from
17170
12:59:01,915 --> 12:59:06,799
microsoft setup so we can use that and
17171
12:59:04,239 --> 12:59:09,915
try to build this thing here but before
17172
12:59:06,800 --> 12:59:11,400
we do that let's bring up our pen here
17173
12:59:14,239 --> 12:59:19,756
we don't want to override it we're going
17174
12:59:19,756 --> 12:59:24,480
and i am going to remove this and move
17175
12:59:24,480 --> 12:59:28,560
and i am going to clear whatever i have
17176
12:59:28,559 --> 12:59:32,639
and i am going to go there i am going to
17177
12:59:32,639 --> 12:59:37,040
and i am going to choose world with msvc
17178
12:59:37,040 --> 12:59:41,520
i am going to use that it is going to
17179
12:59:39,199 --> 12:59:44,479
build my thang you see the output here
17180
12:59:44,480 --> 12:59:49,680
and it should say that the world is good
17181
12:59:46,800 --> 12:59:51,520
in a minute world finished successfully
17182
12:59:49,680 --> 12:59:54,400
microsoft is going to give us a lot of
17183
12:59:51,519 --> 12:59:55,199
output here but no problem the build is
17184
13:00:01,199 --> 13:00:05,199
in our folder here you're going to see
17185
13:00:02,639 --> 13:00:07,436
that we have these files one of them is
17186
13:00:07,436 --> 13:00:11,840
if we run it we are going to get the
17187
13:00:10,000 --> 13:00:14,400
outputs that we expect and you see that
17188
13:00:11,839 --> 13:00:16,399
it is exactly the same thing we got
17189
13:00:16,400 --> 13:00:19,756
i am telling you to try and use
17190
13:00:17,839 --> 13:00:23,115
different compilers because some
17191
13:00:19,756 --> 13:00:25,756
compilers are going to flat some of the
17192
13:00:25,756 --> 13:00:31,200
or those that start with c as unsafe
17193
13:00:29,275 --> 13:00:33,199
because there are some tanks that can
17194
13:00:31,199 --> 13:00:34,799
really throw you off about them and
17195
13:00:33,199 --> 13:00:37,039
we're going to learn about them in this
17196
13:00:34,800 --> 13:00:38,800
chapter as we move forward just know
17197
13:00:37,040 --> 13:00:41,275
that it is a good idea to try these
17198
13:00:38,800 --> 13:00:43,200
things on different compilers and see
17199
13:00:41,275 --> 13:00:45,595
the errors you get and make yourself
17200
13:00:45,595 --> 13:00:48,879
for now we're going to move on and we
17201
13:00:48,879 --> 13:00:53,680
gcc because that's my favorite compiler
17202
13:00:51,839 --> 13:00:55,435
you can use whatever compiler you want
17203
13:00:53,680 --> 13:00:58,000
the next example is going to check if
17204
13:00:55,436 --> 13:00:58,880
the character is blank let's close this
17205
13:01:00,720 --> 13:01:05,275
and give ourselves some breathing room
17206
13:01:03,756 --> 13:01:06,800
we're going to bring this down a little
17207
13:01:05,275 --> 13:01:09,115
bit and we're going to check if the
17208
13:01:06,800 --> 13:01:11,596
character is blank the facility for that
17209
13:01:11,595 --> 13:01:15,040
and if it's a blank character we're
17210
13:01:13,360 --> 13:01:17,275
going to get something different than
17211
13:01:15,040 --> 13:01:19,436
zero and we can use that in a test like
17212
13:01:17,275 --> 13:01:21,839
this and if it's not a black we're going
17213
13:01:19,436 --> 13:01:24,000
to get something equal to zero and this
17214
13:01:21,839 --> 13:01:25,359
test here is going to fail so what this
17215
13:01:24,000 --> 13:01:27,436
example here is going to do it's going
17216
13:01:25,360 --> 13:01:28,879
to count how many blank characters we
17217
13:01:28,879 --> 13:01:33,040
message here and we're going to print
17218
13:01:31,199 --> 13:01:34,955
the counter of that on the console using
17219
13:01:33,040 --> 13:01:36,400
this line here so let's go through this
17220
13:01:34,955 --> 13:01:39,436
loop and see what it does the first
17221
13:01:36,400 --> 13:01:41,756
thing we do is initialize blank count to
17222
13:01:39,436 --> 13:01:44,560
0 and we are using an integer and
17223
13:01:41,756 --> 13:01:47,200
because this is a count i think blank
17224
13:01:44,559 --> 13:01:50,319
count is of wrong type because it can be
17225
13:01:47,199 --> 13:01:52,000
negative so to really be safe in our
17226
13:01:50,319 --> 13:01:54,800
program here we should make this
17227
13:01:54,800 --> 13:01:59,040
this is better okay so let's use size
17228
13:01:59,040 --> 13:02:04,955
because this is a size and size t is a
17229
13:02:01,915 --> 13:02:07,519
good type to keep track of sizes in your
17230
13:02:04,955 --> 13:02:09,360
c plus plus programs so make sure you
17231
13:02:11,436 --> 13:02:15,756
is go in the loop at each iteration
17232
13:02:13,519 --> 13:02:17,680
we're going to check if each character
17233
13:02:15,756 --> 13:02:19,756
at each iteration is a blank if it is
17234
13:02:17,680 --> 13:02:22,955
we're going to fall in here and say that
17235
13:02:19,756 --> 13:02:24,880
we found a blank character at this index
17236
13:02:24,879 --> 13:02:28,955
and we're going to increment our blank
17237
13:02:26,800 --> 13:02:30,720
account and by the time this loop is
17238
13:02:28,955 --> 13:02:32,799
done we're going to have the blank
17239
13:02:30,720 --> 13:02:34,639
account stored in this blank account
17240
13:02:32,800 --> 13:02:36,400
variable and we're going to print that
17241
13:02:36,400 --> 13:02:42,400
now we can build with gcc let's do that
17242
13:02:39,839 --> 13:02:43,839
we're going to world with our gcc
17243
13:02:43,839 --> 13:02:47,199
and the world is going to be good can
17244
13:02:50,879 --> 13:02:54,955
it's going to say we found a blank
17245
13:02:59,595 --> 13:03:04,399
and in total we have found nine blank
17246
13:03:01,839 --> 13:03:08,239
characters do we have that many let's
17247
13:03:04,400 --> 13:03:11,040
count so one one blank character
17248
13:03:08,239 --> 13:03:12,000
we have two here we have three we have
17249
13:03:17,199 --> 13:03:21,039
eight and nine if you count you're going
17250
13:03:18,955 --> 13:03:25,040
to find that we have them and the first
17251
13:03:21,040 --> 13:03:27,595
one is at index five so index zero is h
17252
13:03:25,040 --> 13:03:30,400
one two three four the first one is at
17253
13:03:27,595 --> 13:03:33,040
index five and this is doing exactly
17254
13:03:30,400 --> 13:03:36,319
what we want we can go down and check if
17255
13:03:33,040 --> 13:03:39,436
a character is uppercase or lowercase we
17256
13:03:36,319 --> 13:03:41,756
can do that through an example like this
17257
13:03:39,436 --> 13:03:44,880
and the facility is going to be std
17258
13:03:41,756 --> 13:03:46,160
lower and std is upper we have a message
17259
13:03:46,160 --> 13:03:50,000
we're going to loop around using a range
17260
13:03:48,080 --> 13:03:52,720
based for loop and we're going to check
17261
13:03:50,000 --> 13:03:53,915
if each character is either lowercase or
17262
13:03:53,915 --> 13:03:57,595
and if the test is good we're going to
17263
13:03:55,915 --> 13:04:00,079
jump in the loop and we're going to
17264
13:03:57,595 --> 13:04:03,115
increment lowercase count which are a
17265
13:04:00,080 --> 13:04:05,040
few variables to keep track of how many
17266
13:04:03,116 --> 13:04:07,436
uppercase and lowercase characters we
17267
13:04:05,040 --> 13:04:09,436
have in here and again these variables
17268
13:04:07,436 --> 13:04:10,560
are going to store counts so it is
17269
13:04:10,559 --> 13:04:16,079
to use a size t or some unsigned integer
17270
13:04:13,839 --> 13:04:18,479
type but now we're going to use size t
17271
13:04:16,080 --> 13:04:20,319
because it is good so we're going to
17272
13:04:18,480 --> 13:04:22,480
keep this stored in here and we're going
17273
13:04:20,319 --> 13:04:26,000
to build this and see what we get
17274
13:04:22,480 --> 13:04:29,680
before we run we want to clear
17275
13:04:26,000 --> 13:04:31,839
and we are going to build with gcc
17276
13:04:29,680 --> 13:04:34,080
the bolt is going to be good we're going
17277
13:04:34,080 --> 13:04:38,720
and you see that the original strand is
17278
13:04:36,800 --> 13:04:40,400
this guy here what we're going to do
17279
13:04:38,720 --> 13:04:42,639
we're going to print whatever character
17280
13:04:40,400 --> 13:04:45,360
we are at i'm going to put a space in
17281
13:04:42,639 --> 13:04:48,400
front of that and we're going to see
17282
13:04:45,360 --> 13:04:50,639
increment this is the output why do we
17283
13:04:48,400 --> 13:04:52,400
have this method here because we are
17284
13:04:52,400 --> 13:04:57,596
each character and we are not printing
17285
13:04:55,116 --> 13:05:00,400
the upper case ones we are printing
17286
13:04:57,595 --> 13:05:02,399
lowercase ones that's why you see
17287
13:05:00,400 --> 13:05:04,639
this guy here this is really interesting
17288
13:05:02,400 --> 13:05:06,800
you can keep this in if you want i am
17289
13:05:04,639 --> 13:05:09,436
going to keep this on the important
17290
13:05:06,800 --> 13:05:11,756
message is that we found lowercase
17291
13:05:09,436 --> 13:05:14,239
characters and uppercase characters and
17292
13:05:11,756 --> 13:05:16,080
we have five uppercase characters if we
17293
13:05:14,239 --> 13:05:18,239
go in and count we're going to find that
17294
13:05:18,239 --> 13:05:24,319
two and three and four and five five
17295
13:05:22,160 --> 13:05:26,720
uppercase characters and if you count
17296
13:05:24,319 --> 13:05:29,360
the lowercase characters one by one i am
17297
13:05:26,720 --> 13:05:30,800
sure that you're going to get a 47 like
17298
13:05:29,360 --> 13:05:33,360
we did here we're going to comment this
17299
13:05:30,800 --> 13:05:35,596
out because this was just an example
17300
13:05:33,360 --> 13:05:37,756
i am leaving this in here so that you
17301
13:05:35,595 --> 13:05:40,239
can use this as a reference if you want
17302
13:05:37,756 --> 13:05:41,916
we can also check if a character is a
17303
13:05:41,915 --> 13:05:46,719
and we're going to use std is digit to
17304
13:05:44,955 --> 13:05:48,559
check that the return type is going to
17305
13:05:48,559 --> 13:05:52,879
if the test succeeds if it fails we're
17306
13:05:51,116 --> 13:05:55,916
going to get a zero and we can use that
17307
13:05:52,879 --> 13:05:58,799
like this so we have a message here
17308
13:05:55,915 --> 13:06:00,000
stored in the character array called
17309
13:06:00,000 --> 13:06:04,800
and we're going to loop around checking
17310
13:06:02,160 --> 13:06:06,720
if each character we are at is actually
17311
13:06:04,800 --> 13:06:08,319
a digit or not if it's a digit we're
17312
13:06:06,720 --> 13:06:10,160
going to say found a digit i'm going to
17313
13:06:08,319 --> 13:06:12,400
say whatever digit we found and we're
17314
13:06:10,160 --> 13:06:14,320
going to increment the digits count and
17315
13:06:12,400 --> 13:06:17,275
we're going to store that information in
17316
13:06:14,319 --> 13:06:19,199
this digit count variable here we don't
17317
13:06:17,275 --> 13:06:21,436
want to make it an end so we're going to
17318
13:06:21,436 --> 13:06:24,080
and we're going to build and run this
17319
13:06:24,080 --> 13:06:28,800
and see how many digits we found you
17320
13:06:26,955 --> 13:06:30,159
know it is this number here i'm not
17321
13:06:30,160 --> 13:06:34,840
we're going to let our program figure
17322
13:06:32,400 --> 13:06:38,560
this out so rooster and we're going to
17323
13:06:34,839 --> 13:06:40,879
find two two and one so we found three
17324
13:06:38,559 --> 13:06:41,915
digits and it is exactly what we expect
17325
13:06:41,915 --> 13:06:46,319
we're going to comment this out and show
17326
13:06:43,839 --> 13:06:48,000
you another example and in the last
17327
13:06:46,319 --> 13:06:49,756
example we're going to be showing you
17328
13:06:48,000 --> 13:06:52,319
that you can change the case of a
17329
13:06:49,756 --> 13:06:54,400
character if it's lowercase make it
17330
13:06:52,319 --> 13:06:56,480
uppercase if it's uppercase make it
17331
13:06:54,400 --> 13:06:59,520
lowercase and you can do things like
17332
13:06:56,480 --> 13:07:02,720
that we have a message here stored in
17333
13:06:59,519 --> 13:07:04,639
our character array called original str
17334
13:07:02,720 --> 13:07:08,160
we set up another array which is going
17335
13:07:04,639 --> 13:07:10,000
to store our message that is transformed
17336
13:07:08,160 --> 13:07:12,800
and we're going to loop around turning
17337
13:07:10,000 --> 13:07:14,879
everything we come across uppercase
17338
13:07:12,800 --> 13:07:17,116
the way we do that we're going to say
17339
13:07:17,116 --> 13:07:21,200
and we're going to pass in the character
17340
13:07:19,116 --> 13:07:23,520
that we want to turn to uppercase if we
17341
13:07:21,199 --> 13:07:26,000
do that we're going to get an uppercase
17342
13:07:23,519 --> 13:07:28,799
character out of that and we're going to
17343
13:07:28,800 --> 13:07:33,040
array at this index here it is this
17344
13:07:31,199 --> 13:07:35,519
simple after that we're going to print
17345
13:07:33,040 --> 13:07:37,680
the original strand and the uppercase
17346
13:07:35,519 --> 13:07:39,519
string we should get that printed out
17347
13:07:42,160 --> 13:07:46,560
and we're going to do the reverse and
17348
13:07:46,559 --> 13:07:50,559
we're going to grab the original
17349
13:07:47,839 --> 13:07:52,479
strength loop over it and at each
17350
13:07:50,559 --> 13:07:53,435
iteration we're going to get whatever we
17351
13:07:53,436 --> 13:07:57,436
and turn that to uppercase to lowercase
17352
13:07:57,436 --> 13:08:02,880
and the result of that is going to be
17353
13:07:59,756 --> 13:08:04,639
stored back in our destination strand so
17354
13:08:02,879 --> 13:08:07,435
we're going to overwrite whatever we
17355
13:08:04,639 --> 13:08:08,955
have in our destination string here and
17356
13:08:07,436 --> 13:08:11,040
after that we're going to branch the
17357
13:08:08,955 --> 13:08:12,720
lowercase string and we should get that
17358
13:08:11,040 --> 13:08:14,879
printed out this is how the example
17359
13:08:12,720 --> 13:08:17,360
works and if you have any problem
17360
13:08:14,879 --> 13:08:20,159
understanding this i am always around
17361
13:08:17,360 --> 13:08:22,800
please do ask i will do the best i can
17362
13:08:20,160 --> 13:08:24,240
to help you out for now we are going to
17363
13:08:24,239 --> 13:08:28,319
with gcc the builder is going to be good
17364
13:08:26,800 --> 13:08:31,116
we're going to clear and we're going to
17365
13:08:28,319 --> 13:08:33,275
run booster and we're going to see that
17366
13:08:31,116 --> 13:08:35,520
the message is here it is turned
17367
13:08:33,275 --> 13:08:38,079
uppercase it is turned lower case and
17368
13:08:35,519 --> 13:08:41,199
this is how you can do these things here
17369
13:08:38,080 --> 13:08:43,520
so we have looked at a few of this
17370
13:08:41,199 --> 13:08:45,755
facilities from cctime i don't really
17371
13:08:43,519 --> 13:08:48,799
want to look at all of them because that
17372
13:08:45,756 --> 13:08:50,955
would be really boring i hope you have
17373
13:08:48,800 --> 13:08:52,560
an idea about how they work and if you
17374
13:08:50,955 --> 13:08:55,199
want to look at all of them all you have
17375
13:08:52,559 --> 13:08:56,799
to do is come to the documentation here
17376
13:08:56,800 --> 13:09:01,360
open it up and look at the documentation
17377
13:08:59,360 --> 13:09:04,000
and in most cases they are going to have
17378
13:09:01,360 --> 13:09:05,360
examples down here that you can look at
17379
13:09:05,360 --> 13:09:08,639
for now we are going to stop here in
17380
13:09:06,879 --> 13:09:11,275
this lecture this is really all we set
17381
13:09:08,639 --> 13:09:14,080
out to do to play with many of these
17382
13:09:11,275 --> 13:09:15,680
facilities from the cctype library in
17383
13:09:14,080 --> 13:09:18,400
the next lecture we're going to look at
17384
13:09:15,680 --> 13:09:20,720
how we can manipulate c strings and by
17385
13:09:18,400 --> 13:09:23,116
that we mean concatenating them or
17386
13:09:20,720 --> 13:09:25,840
putting them together copying them out
17387
13:09:23,116 --> 13:09:28,160
and doing all kinds of crazy things
17388
13:09:25,839 --> 13:09:29,039
go ahead and finish up here and meet me
17389
13:09:29,040 --> 13:09:33,116
in this lecture we're going to look at
17390
13:09:30,559 --> 13:09:36,079
the facilities from the c plus plus
17391
13:09:33,116 --> 13:09:38,160
standard library to play with c strings
17392
13:09:36,080 --> 13:09:40,560
all of these are going to be leaving in
17393
13:09:38,160 --> 13:09:42,956
the c string library you can go and
17394
13:09:40,559 --> 13:09:44,399
check it out at cpp reference and we're
17395
13:09:42,955 --> 13:09:47,116
going to start and look at a few
17396
13:09:44,400 --> 13:09:49,596
examples of some of the things we can do
17397
13:09:47,116 --> 13:09:51,436
with this library i mean c string the
17398
13:09:49,595 --> 13:09:53,756
first thing we're going to look at is an
17399
13:09:51,436 --> 13:09:56,560
example of how we can check the length
17400
13:09:53,756 --> 13:09:58,720
of a strength here we have a character
17401
13:09:56,559 --> 13:10:01,040
array called message one it is a
17402
13:09:58,720 --> 13:10:04,800
character array and you see that we made
17403
13:10:01,040 --> 13:10:07,360
it const we also have another array that
17404
13:10:04,800 --> 13:10:09,200
is pointed to by pointer you know that
17405
13:10:07,360 --> 13:10:11,520
if we do things like this this array is
17406
13:10:09,199 --> 13:10:13,360
going to decay into a pointer and there
17407
13:10:11,519 --> 13:10:16,479
are a few things we can do with that for
17408
13:10:13,360 --> 13:10:19,275
example we can't use it with std size
17409
13:10:16,480 --> 13:10:21,916
and we can't use a range based for loop
17410
13:10:19,275 --> 13:10:22,720
to loop through this message to thank
17411
13:10:23,519 --> 13:10:28,955
sdr then is going to help us check the
17412
13:10:26,480 --> 13:10:33,436
length of this thing here so we can use
17413
13:10:28,955 --> 13:10:34,799
it for example if we do hdd sdr lam
17414
13:10:33,436 --> 13:10:36,720
message one we're going to get the
17415
13:10:38,000 --> 13:10:42,559
string here this is not going to count
17416
13:10:40,400 --> 13:10:44,880
the null character though so the null
17417
13:10:42,559 --> 13:10:46,879
character that is implicitly added in by
17418
13:10:44,879 --> 13:10:48,079
the compiler is not going to be counted
17419
13:10:46,879 --> 13:10:50,479
in here you're going to see this in a
17420
13:10:48,080 --> 13:10:52,955
minute when we hit visual studio code to
17421
13:10:50,480 --> 13:10:55,840
play with this thanks but this facility
17422
13:10:52,955 --> 13:10:58,319
can work regardless of whether you are
17423
13:10:55,839 --> 13:11:00,799
using a row array like this or even for
17424
13:10:58,319 --> 13:11:02,720
pointers like this and it is really cool
17425
13:11:00,800 --> 13:11:05,116
so we can use it like this we're going
17426
13:11:02,720 --> 13:11:08,319
to get it printed out please note that
17427
13:11:05,116 --> 13:11:10,400
we can also use the size of operator to
17428
13:11:08,319 --> 13:11:13,436
get the same thing so it is going to
17429
13:11:10,400 --> 13:11:15,360
work almost the same way but the size of
17430
13:11:13,436 --> 13:11:17,840
operator is going to include the null
17431
13:11:15,360 --> 13:11:20,639
character you need to be aware of this
17432
13:11:17,839 --> 13:11:23,039
the good thing about str lan here is
17433
13:11:20,639 --> 13:11:25,595
that it still works for a decade arrays
17434
13:11:23,040 --> 13:11:26,480
so if we use it on message 2 we're going
17435
13:11:26,480 --> 13:11:30,480
the correct output we're going to get
17436
13:11:28,400 --> 13:11:31,680
the number of characters in here which
17437
13:11:31,680 --> 13:11:35,680
and we can also try and print out the
17438
13:11:35,680 --> 13:11:39,915
message two but here we're going to get
17439
13:11:37,519 --> 13:11:43,359
the size of a pointer printed out okay
17440
13:11:39,915 --> 13:11:45,755
that's how hdr lan works it lets you
17441
13:11:43,360 --> 13:11:49,360
evaluate the length of a strand here is
17442
13:11:45,756 --> 13:11:51,595
another example and it is str cmp or
17443
13:11:49,360 --> 13:11:53,275
string compare it is used to compare
17444
13:11:51,595 --> 13:11:56,159
strings what you're going to do with
17445
13:11:53,275 --> 13:11:58,479
this facility is give it two strands c
17446
13:11:58,480 --> 13:12:04,240
and one is this guy here l h ace or left
17447
13:12:02,239 --> 13:12:06,639
hand string i think that's what this
17448
13:12:04,239 --> 13:12:08,799
stands for and we're going to give it a
17449
13:12:06,639 --> 13:12:11,275
right hand strand and by the way these
17450
13:12:08,800 --> 13:12:13,436
signatures are copied straight from the
17451
13:12:11,275 --> 13:12:15,839
documentation so that we can look at
17452
13:12:13,436 --> 13:12:17,916
this in one slide to make it really easy
17453
13:12:15,839 --> 13:12:20,879
to follow this is going to return a
17454
13:12:17,915 --> 13:12:22,639
negative value if the first guy happens
17455
13:12:22,639 --> 13:12:28,159
the second guy in lexicographical order
17456
13:12:26,000 --> 13:12:30,720
so it is something like a comes in front
17457
13:12:28,160 --> 13:12:33,200
of b c comes in front of d or something
17458
13:12:30,720 --> 13:12:34,955
like that if the two strands are equal
17459
13:12:34,955 --> 13:12:38,000
zero and it's going to return a positive
17460
13:12:38,000 --> 13:12:41,839
if the first guy appears after the
17461
13:12:41,839 --> 13:12:46,239
okay and we're going to try it out we
17462
13:12:43,680 --> 13:12:48,559
have two strings alabama and la bama
17463
13:12:46,239 --> 13:12:50,879
here and they are stored in character
17464
13:12:48,559 --> 13:12:52,955
arrays that are pointed to by these two
17465
13:12:50,879 --> 13:12:55,199
pointers string data one and string data
17466
13:12:52,955 --> 13:12:56,879
two and we can do something like this
17467
13:12:55,199 --> 13:12:58,079
below here so we're going to print
17468
13:12:58,080 --> 13:13:02,080
and we're going to say std string
17469
13:13:00,239 --> 13:13:04,319
compare and we're going to pass in the
17470
13:13:02,080 --> 13:13:06,319
first string and the second string for
17471
13:13:04,319 --> 13:13:07,756
now i want you to pause a little bit and
17472
13:13:06,319 --> 13:13:09,199
try to guess what we're going to get
17473
13:13:09,199 --> 13:13:14,239
the first string is alabama the second
17474
13:13:11,275 --> 13:13:16,159
one is blah blah so the first one comes
17475
13:13:16,160 --> 13:13:21,116
and we see that we're going to get a
17476
13:13:18,080 --> 13:13:23,756
negative value if the first guy comes in
17477
13:13:21,116 --> 13:13:25,916
front of the second guy so alabama comes
17478
13:13:25,915 --> 13:13:30,159
and we would expect to get something
17479
13:13:27,839 --> 13:13:31,519
negative from this thing we are doing
17480
13:13:31,519 --> 13:13:35,275
and again if we try and change them up a
17481
13:13:33,360 --> 13:13:38,239
little bit you see that alabama still
17482
13:13:38,239 --> 13:13:41,595
so we're going to get a negative value
17483
13:13:39,915 --> 13:13:43,519
pointed out and we can change these
17484
13:13:41,595 --> 13:13:46,000
things up to see what we get it is
17485
13:13:43,519 --> 13:13:48,000
really simple if you know how to use
17486
13:13:46,000 --> 13:13:50,000
them we can also use another version of
17487
13:13:48,000 --> 13:13:52,239
string compare which is going to let us
17488
13:13:50,000 --> 13:13:54,160
specify the number of characters that we
17489
13:13:54,160 --> 13:13:58,956
we can specify that we want to compare n
17490
13:13:57,116 --> 13:14:01,436
characters in this case it is three
17491
13:13:58,955 --> 13:14:04,319
characters and it is going to compare a
17492
13:14:01,436 --> 13:14:07,040
section of the strings that you specify
17493
13:14:04,319 --> 13:14:09,116
as a first and second parameter here so
17494
13:14:07,040 --> 13:14:12,319
for example if we change string that i
17495
13:14:09,116 --> 13:14:16,000
want to be a a i a and string data two
17496
13:14:12,319 --> 13:14:17,680
to b a a a n c a and we are comparing
17497
13:14:16,000 --> 13:14:20,559
three characters in here so we are
17498
13:14:17,680 --> 13:14:22,239
comparing aaa to aaa we're going to see
17499
13:14:20,559 --> 13:14:24,639
that they are equal and we're going to
17500
13:14:22,239 --> 13:14:26,720
get a 0 printed out here you're going to
17501
13:14:24,639 --> 13:14:28,800
see that this is exactly the case when
17502
13:14:26,720 --> 13:14:30,319
we get to play with us in visual studio
17503
13:14:30,319 --> 13:14:34,720
we have a facility that we can use to
17504
13:14:32,800 --> 13:14:37,840
search in a string and search for a
17505
13:14:34,720 --> 13:14:40,955
character the facility for that is sdr
17506
13:14:37,839 --> 13:14:43,519
chr and it is going to find the first
17507
13:14:40,955 --> 13:14:45,595
occurrence of a character in a string
17508
13:14:43,519 --> 13:14:46,479
and the documentation for this is right
17509
13:14:46,480 --> 13:14:50,560
and please note that this example is
17510
13:14:50,559 --> 13:14:55,360
straight from the documentation
17511
13:14:52,879 --> 13:14:57,275
okay so we have a message here
17512
13:14:55,360 --> 13:15:00,160
it is a character array and it is
17513
13:14:57,275 --> 13:15:02,639
pointed to by a const car pointer called
17514
13:15:00,160 --> 13:15:04,240
hdr and we have a target character that
17515
13:15:04,239 --> 13:15:09,915
and the result is going to be stored in
17516
13:15:06,639 --> 13:15:12,159
the result character array here and we
17517
13:15:09,915 --> 13:15:14,079
have a variable called iterations that
17518
13:15:12,160 --> 13:15:16,720
is going to keep track of how many
17519
13:15:14,080 --> 13:15:19,276
iterations we did to find our target
17520
13:15:16,720 --> 13:15:22,720
here the way this guy works it is going
17521
13:15:19,275 --> 13:15:24,879
to return a pointer to what you find
17522
13:15:22,720 --> 13:15:28,080
if it is found for example in here if we
17523
13:15:24,879 --> 13:15:29,680
find this first t this function here or
17524
13:15:28,080 --> 13:15:32,240
this facility is going to return a
17525
13:15:32,239 --> 13:15:36,400
if it doesn't find what we want it is
17526
13:15:34,480 --> 13:15:38,480
going to return a null pointer that's
17527
13:15:36,400 --> 13:15:40,720
how it works and you can see that in the
17528
13:15:38,480 --> 13:15:42,956
documentation here we are going to take
17529
13:15:40,720 --> 13:15:44,955
advantage of how it works in this while
17530
13:15:42,955 --> 13:15:46,879
loop here and the way you use this
17531
13:15:44,955 --> 13:15:49,040
facility you give it the strength you
17532
13:15:46,879 --> 13:15:51,680
want to search in and you give it the
17533
13:15:49,040 --> 13:15:53,680
character that you are looking for so if
17534
13:15:51,680 --> 13:15:55,595
we look at how it works in the while
17535
13:15:53,680 --> 13:15:56,400
loop here we are going to call the
17536
13:15:56,400 --> 13:16:01,596
and we are going to store the result in
17537
13:15:58,720 --> 13:16:03,916
our character pointer here and if we go
17538
13:16:01,595 --> 13:16:06,239
inside we're going to hit the first
17539
13:16:03,915 --> 13:16:08,479
character here at the first iteration so
17540
13:16:06,239 --> 13:16:10,319
we're going to find this t here and when
17541
13:16:08,480 --> 13:16:12,880
we find it the result of this is going
17542
13:16:10,319 --> 13:16:15,116
to be stored back in result here
17543
13:16:12,879 --> 13:16:17,435
i hope this makes sense so we're going
17544
13:16:15,116 --> 13:16:19,436
to find it we're going to print it and
17545
13:16:17,436 --> 13:16:21,596
we're going to increment result to make
17546
13:16:19,436 --> 13:16:24,880
it point to the next character this is
17547
13:16:21,595 --> 13:16:26,559
pointer arithmetic in action here
17548
13:16:24,879 --> 13:16:28,399
and after we do that we're going to
17549
13:16:26,559 --> 13:16:30,720
increment the iterations so we should
17550
13:16:28,400 --> 13:16:33,116
have one iteration by now and we're
17551
13:16:30,720 --> 13:16:34,880
going to jump into the loop again so the
17552
13:16:33,116 --> 13:16:37,276
string we search in is going to be
17553
13:16:37,275 --> 13:16:42,239
so we're going to try and find
17554
13:16:39,436 --> 13:16:45,360
an uppercase tn and it is going to find
17555
13:16:42,239 --> 13:16:48,319
this uppercase t here so it is going to
17556
13:16:45,360 --> 13:16:50,239
point to it and the pointer to this t
17557
13:16:48,319 --> 13:16:52,559
is going to be stored in this result
17558
13:16:50,239 --> 13:16:54,559
here okay and we're going to jump into
17559
13:16:52,559 --> 13:16:57,275
our body here we're going to say that we
17560
13:16:54,559 --> 13:16:59,360
found this t we're going to print it out
17561
13:16:57,275 --> 13:17:01,756
and we're going to increment results if
17562
13:16:59,360 --> 13:17:04,720
we increment reserved now research is
17563
13:17:01,756 --> 13:17:06,480
going to be pointing to the h here
17564
13:17:06,480 --> 13:17:11,276
say how many iterations we did to find
17565
13:17:08,800 --> 13:17:13,276
our thing we will have printed out the t
17566
13:17:11,275 --> 13:17:15,040
that we have found and we're going to
17567
13:17:13,275 --> 13:17:17,199
jump to the next iteration which is
17568
13:17:17,199 --> 13:17:20,639
in the reminder of the string here it's
17569
13:17:19,116 --> 13:17:22,955
not going to find it of course it's
17570
13:17:20,639 --> 13:17:24,879
going to return no pointer and the test
17571
13:17:22,955 --> 13:17:27,040
here is going to fail and we're going to
17572
13:17:24,879 --> 13:17:29,435
fall down here and say how many
17573
13:17:27,040 --> 13:17:31,840
iterations we found i realize this
17574
13:17:29,436 --> 13:17:34,080
example can be really confusing i am
17575
13:17:31,839 --> 13:17:36,719
going to try and explain it again when
17576
13:17:34,080 --> 13:17:39,520
we hit visual studio code for now note
17577
13:17:36,720 --> 13:17:41,360
that this facility can help you find
17578
13:17:39,519 --> 13:17:43,199
characters in a string that's the
17579
13:17:41,360 --> 13:17:45,680
message here there is also another
17580
13:17:43,199 --> 13:17:48,559
function that helps you find the last
17581
13:17:45,680 --> 13:17:50,239
occurrence of a character in a string
17582
13:17:48,559 --> 13:17:51,199
for example here we have a character
17583
13:17:51,199 --> 13:17:56,639
it is a path to a file on some limit
17584
13:17:56,639 --> 13:18:01,756
and we have an output character pointer
17585
13:17:59,839 --> 13:18:04,559
which is going to store the pointer to
17586
13:18:01,756 --> 13:18:06,080
the character that we found okay if we
17587
13:18:04,559 --> 13:18:08,239
find the character we're going to store
17588
13:18:06,080 --> 13:18:10,240
in the pointer to that character if we
17589
13:18:08,239 --> 13:18:12,319
don't find it we're going to return no
17590
13:18:10,239 --> 13:18:13,275
pointer i think that's how this thing
17591
13:18:13,275 --> 13:18:18,639
so what we really want here
17592
13:18:15,519 --> 13:18:20,955
is to hunt for the file name in this
17593
13:18:18,639 --> 13:18:23,436
path here and this is really interesting
17594
13:18:20,955 --> 13:18:26,080
so we're going to search for the
17595
13:18:23,436 --> 13:18:28,560
backslash the last one and this string
17596
13:18:26,080 --> 13:18:30,639
here and it is going to find this guy
17597
13:18:28,559 --> 13:18:32,319
here because that's the last occurrence
17598
13:18:32,319 --> 13:18:37,275
in our input string here once we find it
17599
13:18:34,879 --> 13:18:39,839
we're going to get a pointer to this guy
17600
13:18:37,275 --> 13:18:41,756
stored in the output character pointer
17601
13:18:39,839 --> 13:18:43,115
here and we're going to print it out
17602
13:18:41,756 --> 13:18:45,436
what we're going to do we're going to
17603
13:18:43,116 --> 13:18:47,276
use pointer arithmetic to move this
17604
13:18:45,436 --> 13:18:49,360
pointer to the next guy because that's
17605
13:18:47,275 --> 13:18:51,360
what we really want we want to print
17606
13:18:49,360 --> 13:18:52,800
starting from the edge here and that's
17607
13:18:51,360 --> 13:18:53,915
what we're going to get when we print
17608
13:18:53,915 --> 13:18:58,319
now that we have looked at all these
17609
13:18:56,080 --> 13:19:00,480
examples i think it is time we headed to
17610
13:18:58,319 --> 13:19:02,955
visual studio code and actually played
17611
13:19:00,480 --> 13:19:05,680
with them okay here we are in our
17612
13:19:02,955 --> 13:19:07,915
working folder the current project is c
17613
13:19:05,680 --> 13:19:10,000
string manipulation that's what we're
17614
13:19:07,915 --> 13:19:12,079
going to work on we're going to copy our
17615
13:19:10,000 --> 13:19:14,480
template files and we're going to put
17616
13:19:14,480 --> 13:19:19,116
and we're going to open this in visual
17617
13:19:16,400 --> 13:19:20,720
studio code pretty quick let's include c
17618
13:19:19,116 --> 13:19:22,800
string because that's what we're going
17619
13:19:20,720 --> 13:19:24,639
to be using many of the things we're
17620
13:19:22,800 --> 13:19:26,800
going to be playing with in this lecture
17621
13:19:24,639 --> 13:19:29,040
are documented in this piece of
17622
13:19:26,800 --> 13:19:31,360
documentation here so you can come here
17623
13:19:29,040 --> 13:19:33,595
and get more details than we could even
17624
13:19:31,360 --> 13:19:35,199
cover in a course like this let's bring
17625
13:19:33,595 --> 13:19:37,519
this up a little bit and we're going to
17626
13:19:35,199 --> 13:19:40,319
go in our main function and put in the
17627
13:19:37,519 --> 13:19:43,115
first piece of code we can play with the
17628
13:19:40,319 --> 13:19:45,519
str land facility is going to find the
17629
13:19:43,116 --> 13:19:48,080
length of the strength and it's going to
17630
13:19:45,519 --> 13:19:50,879
work regardless of whether you are using
17631
13:19:48,080 --> 13:19:52,800
a row array like this or even if you are
17632
13:19:50,879 --> 13:19:55,115
using the character pointer to point to
17633
13:19:52,800 --> 13:19:57,436
your array and this is pretty cool so
17634
13:19:55,116 --> 13:19:58,639
here we have strlen message one we're
17635
13:19:57,436 --> 13:20:00,319
going to print that out we're going to
17636
13:19:58,639 --> 13:20:01,680
print how many characters we have in
17637
13:20:01,680 --> 13:20:06,160
we're going to also use the size of
17638
13:20:03,915 --> 13:20:08,559
operator to try and compare these things
17639
13:20:06,160 --> 13:20:10,240
but please know that the null character
17640
13:20:08,559 --> 13:20:13,115
is going to be included if you use
17641
13:20:13,116 --> 13:20:19,360
this is very important to know
17642
13:20:16,319 --> 13:20:21,595
but one interesting thing about hdr lan
17643
13:20:19,360 --> 13:20:23,680
is that it is also going to work if you
17644
13:20:23,680 --> 13:20:28,879
and something that is pointed to by
17645
13:20:25,680 --> 13:20:30,639
pointer so even decayed pointers
17646
13:20:28,879 --> 13:20:33,435
are going to be usable here and this is
17647
13:20:30,639 --> 13:20:35,360
pretty cool so we can also try and print
17648
13:20:33,436 --> 13:20:37,840
the size of message 2 which is pointed
17649
13:20:35,360 --> 13:20:39,520
to by a row pointer and we're going to
17650
13:20:37,839 --> 13:20:41,199
see what we get but we know that we're
17651
13:20:39,519 --> 13:20:43,680
going to get the size of a pointer
17652
13:20:41,199 --> 13:20:46,000
because that's what it really is message
17653
13:20:43,680 --> 13:20:48,160
two here is just a pointer okay let's
17654
13:20:48,160 --> 13:20:51,520
and we are going to bring up our
17655
13:20:51,519 --> 13:20:55,915
and i try and build this with gcc we're
17656
13:20:54,160 --> 13:20:57,596
going to do that so we're going to use
17657
13:20:57,595 --> 13:21:01,595
the world is going to go through
17658
13:20:59,519 --> 13:21:02,559
and we're going to clear and run rooster
17659
13:21:02,559 --> 13:21:07,756
and this is going to give us what we
17660
13:21:07,756 --> 13:21:12,319
size of message 1 is 17 because sizeof
17661
13:21:12,319 --> 13:21:18,400
the null character htrlen message2 you
17662
13:21:21,040 --> 13:21:26,160
that is pointed to by a pointer and this
17663
13:21:23,915 --> 13:21:28,639
is really useful if you happen to need
17664
13:21:26,160 --> 13:21:30,800
the size of an array like this you can
17665
13:21:28,639 --> 13:21:33,915
use hdr then and you're going to get the
17666
13:21:30,800 --> 13:21:36,160
size of data in there but know that the
17667
13:21:33,915 --> 13:21:39,680
null terminating character is not
17668
13:21:36,160 --> 13:21:42,160
counted if you use hdr ln here and size
17669
13:21:39,680 --> 13:21:44,400
of message 2 is going to be 8 because
17670
13:21:42,160 --> 13:21:47,276
that's the size of a pointer on our
17671
13:21:44,400 --> 13:21:48,639
system here so know that this guy is
17672
13:21:51,199 --> 13:21:55,079
we are going to comment this out the
17673
13:21:52,879 --> 13:21:57,755
next thing we're going to look at is
17674
13:21:55,080 --> 13:21:59,040
strcmp which can be used to compare
17675
13:21:59,040 --> 13:22:04,000
so it works exactly like we say it's
17676
13:22:01,839 --> 13:22:06,719
going to return something negative if
17677
13:22:04,000 --> 13:22:08,955
the first string happens to come in
17678
13:22:06,720 --> 13:22:10,480
front of the second string in
17679
13:22:25,360 --> 13:22:29,595
for example here we have a few variables
17680
13:22:26,955 --> 13:22:31,680
we have alabama and blabama there are
17681
13:22:34,639 --> 13:22:40,239
and we have a couple of other strings
17682
13:22:37,436 --> 13:22:42,080
stored in row arrays like this and by
17683
13:22:40,239 --> 13:22:44,479
doing this i want to prove that this
17684
13:22:42,080 --> 13:22:46,880
facility is going to work regardless of
17685
13:22:44,480 --> 13:22:50,160
how your array or your c string is
17686
13:22:46,879 --> 13:22:51,839
stored so we're going to use that here
17687
13:22:51,839 --> 13:22:56,239
c string pointer 2 by pointers
17688
13:22:54,480 --> 13:22:58,319
we're going to try and compare whatever
17689
13:22:58,319 --> 13:23:04,319
with string data two string data one has
17690
13:23:01,199 --> 13:23:06,399
alabama string data two has blah blah so
17691
13:23:04,319 --> 13:23:09,436
if we compare these guys we expect to
17692
13:23:06,400 --> 13:23:10,720
get a negative value out of this thing
17693
13:23:12,480 --> 13:23:19,520
because alabama comes in front of
17694
13:23:16,160 --> 13:23:21,596
blabama in our alphabet so a is in front
17695
13:23:19,519 --> 13:23:23,915
of b so we're going to get a negative
17696
13:23:21,595 --> 13:23:25,680
value out of this and we expect to get
17697
13:23:23,915 --> 13:23:27,839
the same thing in the second example
17698
13:23:25,680 --> 13:23:30,400
here which is going to be using what we
17699
13:23:30,400 --> 13:23:34,560
so make sure you understand this and
17700
13:23:32,639 --> 13:23:38,239
we're going to try and build this to see
17701
13:23:34,559 --> 13:23:39,915
that it passes through our gcc compiler
17702
13:23:42,000 --> 13:23:46,000
and run rooster and you're going to see
17703
13:23:46,000 --> 13:23:50,720
i want you to play with this thanks and
17704
13:23:47,756 --> 13:23:52,639
try and change for example the 8 with c
17705
13:23:52,639 --> 13:23:56,879
okay we're going to try and build but
17706
13:23:54,559 --> 13:23:59,595
before we do try to expect to see what
17707
13:23:56,879 --> 13:24:01,360
you get c comes after blah blah
17708
13:24:01,360 --> 13:24:06,480
if we look at this description here we
17709
13:24:03,915 --> 13:24:08,799
should get a positive value because
17710
13:24:08,800 --> 13:24:13,840
the second guy in lexicographical order
17711
13:24:11,595 --> 13:24:17,040
so we should get a positive value
17712
13:24:13,839 --> 13:24:19,039
for the first thing that we print here
17713
13:24:17,040 --> 13:24:21,520
okay let's weld and see if that's the
17714
13:24:19,040 --> 13:24:24,080
case we're going to build successfully
17715
13:24:21,519 --> 13:24:26,399
we're going to clear and run rooster and
17716
13:24:24,080 --> 13:24:27,520
you see that the first guy prints a one
17717
13:24:27,519 --> 13:24:32,479
cla gamma comes before blah blah
17718
13:24:30,559 --> 13:24:35,275
and the second one is going to
17719
13:24:32,480 --> 13:24:36,080
still be a negative one because we still
17720
13:24:36,080 --> 13:24:40,240
whatever we had before in there okay
17721
13:24:38,080 --> 13:24:42,800
this is how you work with this thanks
17722
13:24:40,239 --> 13:24:45,360
let's turn this back to alabama
17723
13:24:47,116 --> 13:24:51,916
working on this and the next piece of
17724
13:24:50,160 --> 13:24:54,000
code we are going to try and modify
17725
13:24:51,915 --> 13:24:56,955
whatever is stored in string data 1 and
17726
13:24:54,000 --> 13:24:58,000
string data 2 and print the comparisons
17727
13:24:58,000 --> 13:25:02,800
for example we have alabama and album
17728
13:25:00,639 --> 13:25:04,159
and by the way we are able to modify
17729
13:25:04,160 --> 13:25:09,200
because it is a pointer to a strength
17730
13:25:07,360 --> 13:25:11,360
and notice that this is not the
17731
13:25:09,199 --> 13:25:13,199
conspirator so we can really change
17732
13:25:11,360 --> 13:25:15,436
where this guy is pointing and that's
17733
13:25:13,199 --> 13:25:17,915
what we are doing here but we can't do
17734
13:25:15,436 --> 13:25:20,880
that with string data 3 and string data
17735
13:25:17,915 --> 13:25:23,360
4 because these are arrays and remember
17736
13:25:20,879 --> 13:25:25,915
you can't change where an array points
17737
13:25:23,360 --> 13:25:28,239
so this is going to compile nice but if
17738
13:25:25,915 --> 13:25:30,719
we try and do the same thing with string
17739
13:25:30,720 --> 13:25:33,436
let's do that you're going to get a
17740
13:25:33,436 --> 13:25:37,360
so we're going to put this guy here and
17741
13:25:39,116 --> 13:25:43,436
and we should see visual studio code
17742
13:25:41,199 --> 13:25:45,360
complaining here because this is not
17743
13:25:43,436 --> 13:25:46,319
allowed you're not allowed to make an
17744
13:25:46,319 --> 13:25:50,000
point to another location and this is
17745
13:25:50,000 --> 13:25:55,436
character array or cost character array
17746
13:25:52,639 --> 13:25:57,199
in memory that we want this pointers to
17747
13:25:55,436 --> 13:25:59,040
point to or this array to point to and
17748
13:25:57,199 --> 13:26:00,879
this is not possible so we're going to
17749
13:25:59,040 --> 13:26:03,116
get a compiler error if we do this this
17750
13:26:00,879 --> 13:26:05,680
is something i wanted you to know that's
17751
13:26:03,116 --> 13:26:07,756
why i set up this example here so if we
17752
13:26:05,680 --> 13:26:10,559
run this we're going to see the first
17753
13:26:10,559 --> 13:26:16,720
or i think i should comment that out
17754
13:26:14,639 --> 13:26:18,319
or let's not comment it out now if we
17755
13:26:16,720 --> 13:26:21,360
run this program we're going to get the
17756
13:26:18,319 --> 13:26:24,639
output for obama and alabama printed out
17757
13:26:21,360 --> 13:26:27,116
and alabama comes after alabama so we
17758
13:26:24,639 --> 13:26:28,955
expect to get a negative one because the
17759
13:26:27,116 --> 13:26:30,400
first guy here comes in front of the
17760
13:26:28,955 --> 13:26:31,680
second guy so we're going to get a
17761
13:26:34,239 --> 13:26:39,199
thing we are doing here let's try in
17762
13:26:39,199 --> 13:26:43,595
the builder is going to be good so we're
17763
13:26:41,199 --> 13:26:45,275
going to clear and run rooster and we're
17764
13:26:43,595 --> 13:26:49,275
going to see that we have a negative one
17765
13:26:45,275 --> 13:26:51,519
here alabama comes in front of a lab
17766
13:26:49,275 --> 13:26:53,436
so this is cool so we can try and put in
17767
13:26:51,519 --> 13:26:55,039
many other examples for you to play with
17768
13:26:53,436 --> 13:26:56,880
i am going to do that because i don't
17769
13:26:55,040 --> 13:26:58,400
want to type all this thanks and we're
17770
13:26:56,879 --> 13:27:00,719
going to print the results out for
17771
13:26:58,400 --> 13:27:02,800
example we put in india and france we
17772
13:27:00,720 --> 13:27:04,955
put in kigali and kigali and we're going
17773
13:27:02,800 --> 13:27:08,160
to get things printed out here so let's
17774
13:27:04,955 --> 13:27:10,000
build this so that we don't waste time
17775
13:27:08,160 --> 13:27:11,436
we're going to clear and we're going to
17776
13:27:11,436 --> 13:27:15,680
and we're going to see that we get these
17777
13:27:13,275 --> 13:27:17,519
things here alakama comes after alabama
17778
13:27:17,519 --> 13:27:23,199
india comes after france we get a one
17779
13:27:20,720 --> 13:27:24,880
shigari comes together with kigali and
17780
13:27:23,199 --> 13:27:27,275
we get a zero you can try and put in
17781
13:27:24,879 --> 13:27:30,079
whatever you want these are just a few
17782
13:27:27,275 --> 13:27:31,839
examples for you to play with and by now
17783
13:27:30,080 --> 13:27:34,400
i hope you really understand how this
17784
13:27:31,839 --> 13:27:37,039
function works or this facility works so
17785
13:27:34,400 --> 13:27:38,319
we're going to comment it out whatever
17786
13:27:38,319 --> 13:27:42,639
so we're going to comment all this out
17787
13:27:40,400 --> 13:27:44,955
so that we don't have noise output in
17788
13:27:42,639 --> 13:27:47,116
whatever we want to do next and what we
17789
13:27:44,955 --> 13:27:49,116
want to look at next is this function
17790
13:27:47,116 --> 13:27:51,596
here which is going to compare
17791
13:27:49,116 --> 13:27:54,480
strings in the same ways but we're going
17792
13:27:51,595 --> 13:27:56,079
to tell it to compare however many
17793
13:27:54,480 --> 13:27:58,080
characters in the string and you see
17794
13:27:56,080 --> 13:28:01,276
that my string here has been commented
17795
13:27:58,080 --> 13:28:03,520
up i can quickly take it and bring it
17796
13:28:01,275 --> 13:28:04,639
down here let's do that i can't find
17797
13:28:04,639 --> 13:28:10,400
let's find that and copy it down
17798
13:28:08,400 --> 13:28:12,080
and we're going to find them here so i'm
17799
13:28:12,080 --> 13:28:16,319
and bring that down here so that i can
17800
13:28:13,915 --> 13:28:19,115
compare these things so let's come down
17801
13:28:16,319 --> 13:28:20,955
here and print and put in our
17802
13:28:19,116 --> 13:28:23,520
declarations for this strengths and you
17803
13:28:20,955 --> 13:28:25,756
see that visual studio code is happy now
17804
13:28:23,519 --> 13:28:28,955
so what we're going to do is compare a
17805
13:28:25,756 --> 13:28:31,200
set of characters in these strings here
17806
13:28:28,955 --> 13:28:32,879
okay so we're going to compare any
17807
13:28:31,199 --> 13:28:36,479
characters in our strengths so we're
17808
13:28:32,879 --> 13:28:38,319
going to compare allah to blah here and
17809
13:28:36,480 --> 13:28:39,756
allah is going to come in front of black
17810
13:28:38,319 --> 13:28:42,239
so we're going to have a negative one
17811
13:28:39,756 --> 13:28:46,080
printed out here but if we change the
17812
13:28:42,239 --> 13:28:48,639
strengths to aaa and aaa here and
17813
13:28:46,080 --> 13:28:50,560
compare the first three characters we're
17814
13:28:48,639 --> 13:28:53,275
going to get a zero printed out because
17815
13:28:50,559 --> 13:28:55,115
the first three characters are equal and
17816
13:28:53,275 --> 13:28:56,955
again the special thing about this
17817
13:28:55,116 --> 13:28:58,160
function is that it allows you to
17818
13:28:58,160 --> 13:29:03,040
a number of characters you want compared
17819
13:29:00,720 --> 13:29:04,880
in these two strings so you can say i
17820
13:29:03,040 --> 13:29:06,720
want to compare three strands you can
17821
13:29:04,879 --> 13:29:07,755
say i want to compare four strings or
17822
13:29:07,756 --> 13:29:12,000
just make sure that you don't go over
17823
13:29:09,680 --> 13:29:13,595
the size of the string and if you do
17824
13:29:12,000 --> 13:29:15,839
that it's not going to make sense what
17825
13:29:13,595 --> 13:29:17,519
you are trying to do here if we go down
17826
13:29:15,839 --> 13:29:19,519
here we're going to change n to 5 and
17827
13:29:17,519 --> 13:29:21,359
we're going to be comparing all these
17828
13:29:19,519 --> 13:29:22,319
things in here and we're going to get
17829
13:29:22,319 --> 13:29:28,559
the first one comes in front of the
17830
13:29:24,639 --> 13:29:32,000
second one because i comes in front of n
17831
13:29:28,559 --> 13:29:33,680
in our alphabet if we change the data to
17832
13:29:33,680 --> 13:29:38,480
o is going to come after n and we're
17833
13:29:35,915 --> 13:29:40,955
going to get a positive number printed
17834
13:29:38,480 --> 13:29:45,116
out here we're going to try and run this
17835
13:29:40,955 --> 13:29:47,199
so let's run the task to build with jcc
17836
13:29:45,116 --> 13:29:49,840
the bullet is going to be good and we're
17837
13:29:47,199 --> 13:29:51,680
going to clear and run rooster
17838
13:29:49,839 --> 13:29:55,275
and we're going to see that alabama
17839
13:29:51,680 --> 13:29:58,480
comes in front of blabama because we are
17840
13:29:55,275 --> 13:30:01,275
comparing the first three characters
17841
13:29:58,480 --> 13:30:02,720
if we have aaa in here and we compare
17842
13:30:01,275 --> 13:30:04,879
the three characters you're going to see
17843
13:30:02,720 --> 13:30:06,559
that they are equal we get a zero
17844
13:30:06,559 --> 13:30:11,915
and n here we're going to get a negative
17845
13:30:09,040 --> 13:30:14,720
one because i comes in front of n
17846
13:30:11,915 --> 13:30:17,595
if we use o here and n we're going to
17847
13:30:14,720 --> 13:30:19,916
get a one because o comes after n this
17848
13:30:17,595 --> 13:30:22,159
is really simple to understand now that
17849
13:30:19,915 --> 13:30:24,639
we know how to use the first version of
17850
13:30:22,160 --> 13:30:27,436
string compare this version is just
17851
13:30:24,639 --> 13:30:29,360
going to allow us to specify how many
17852
13:30:27,436 --> 13:30:31,756
characters in the string we want
17853
13:30:29,360 --> 13:30:34,720
compared so we're going to comment this
17854
13:30:31,756 --> 13:30:37,840
out and we are going to go down and do
17855
13:30:34,720 --> 13:30:40,239
another example that allows us to search
17856
13:30:40,239 --> 13:30:45,040
and the method we use to do that is std
17857
13:30:46,559 --> 13:30:50,955
so this guy is going to find whatever
17858
13:30:48,480 --> 13:30:52,880
target you want to find and if it finds
17859
13:30:50,955 --> 13:30:55,595
that it's going to return you a pointer
17860
13:30:52,879 --> 13:30:58,079
to dot's target if it doesn't find it
17861
13:30:55,595 --> 13:31:00,559
it's going to return you no pointer so
17862
13:30:58,080 --> 13:31:03,756
we set up an array here and we store
17863
13:31:00,559 --> 13:31:06,479
that in a location that is pointed to by
17864
13:31:03,756 --> 13:31:08,319
the pointer to character here and we say
17865
13:31:06,480 --> 13:31:11,360
whatever target we are looking for in
17866
13:31:08,319 --> 13:31:13,595
this case we want to find this t here
17867
13:31:11,360 --> 13:31:16,080
we are going to set up another character
17868
13:31:13,595 --> 13:31:17,756
array that is going to store our results
17869
13:31:16,080 --> 13:31:19,520
the result is really going to be a
17870
13:31:17,756 --> 13:31:22,239
pointer which is going to be pointing to
17871
13:31:19,519 --> 13:31:24,079
something valid if we find the target
17872
13:31:22,239 --> 13:31:26,159
and it's going to be no equator if we
17873
13:31:24,080 --> 13:31:28,000
didn't find the target and we set up
17874
13:31:26,160 --> 13:31:30,160
another variable which is going to store
17875
13:31:28,000 --> 13:31:32,480
how many iterations we did we should
17876
13:31:30,160 --> 13:31:35,116
really make this an unsigned integer or
17877
13:31:32,480 --> 13:31:37,200
size t so let's make that here and we're
17878
13:31:35,116 --> 13:31:38,800
going to loop here so the first time
17879
13:31:37,199 --> 13:31:40,955
we'll open here we're going to call this
17880
13:31:38,800 --> 13:31:41,916
guy we're going to say i want to find a
17881
13:31:41,915 --> 13:31:45,519
and result here and the result is going
17882
13:31:43,680 --> 13:31:47,915
to be pointing to this line here because
17883
13:31:45,519 --> 13:31:49,839
we did the assignment here so it's going
17884
13:31:47,915 --> 13:31:52,879
to go and try to find the t it's going
17885
13:31:49,839 --> 13:31:55,679
to find the guy here at the first index
17886
13:31:52,879 --> 13:31:57,680
and the test here is going to succeed
17887
13:31:55,680 --> 13:31:59,519
when it succeeds it's not going to be
17888
13:31:57,680 --> 13:32:01,595
equal to no pointer it's going to be
17889
13:32:01,595 --> 13:32:07,756
and it's going to succeed and return the
17890
13:32:04,879 --> 13:32:09,435
pointer to be stored in resort after
17891
13:32:07,756 --> 13:32:11,520
this guide returns the pointer is going
17892
13:32:09,436 --> 13:32:13,040
to be stored in the result here and
17893
13:32:11,519 --> 13:32:15,039
that's going to be a pointer to this
17894
13:32:13,040 --> 13:32:16,879
team and we're going to jump in the body
17895
13:32:15,040 --> 13:32:18,639
here i really want you to understand how
17896
13:32:18,639 --> 13:32:22,239
once we get to the body we're going to
17897
13:32:20,080 --> 13:32:24,880
say uh-huh we found our target that's
17898
13:32:22,239 --> 13:32:26,955
going to be our t print it out and it's
17899
13:32:24,879 --> 13:32:29,115
going to start at this location
17900
13:32:26,955 --> 13:32:32,080
okay and we're going to print starting
17901
13:32:29,116 --> 13:32:34,880
from the t here because that's what our
17902
13:32:32,080 --> 13:32:36,720
result here is pointing to after we do
17903
13:32:34,879 --> 13:32:39,199
that we're going to increment the result
17904
13:32:36,720 --> 13:32:41,360
to make it point to the next character
17905
13:32:39,199 --> 13:32:43,435
if we do that with pointer arithmetic
17906
13:32:41,360 --> 13:32:44,400
now we're going to be pointing to the r
17907
13:32:44,400 --> 13:32:48,480
i hope this makes sense and we're going
17908
13:32:46,720 --> 13:32:51,200
to increment our iterations so we're
17909
13:32:48,480 --> 13:32:52,640
going to say we have done one iteration
17910
13:32:51,199 --> 13:32:55,115
and we're going to try and run this
17911
13:32:52,639 --> 13:32:58,319
again and by the time we get in here
17912
13:32:55,116 --> 13:33:00,955
we're going to have this string here in
17913
13:32:58,319 --> 13:33:03,436
which we are searching for a t
17914
13:33:00,955 --> 13:33:06,319
and it is going to be found starting at
17915
13:33:03,436 --> 13:33:08,480
this second t here there here
17916
13:33:08,480 --> 13:33:14,560
it's going to store the pointer to it to
17917
13:33:11,756 --> 13:33:16,160
resort here or i should say the search
17918
13:33:14,559 --> 13:33:18,720
is going to be successful so we're going
17919
13:33:16,160 --> 13:33:21,436
to find the pointer to this t
17920
13:33:18,720 --> 13:33:23,275
and return it from this function here
17921
13:33:21,436 --> 13:33:24,639
and the pointer is going to be stored in
17922
13:33:24,639 --> 13:33:29,199
pointer here we're going to jump in the
17923
13:33:26,800 --> 13:33:31,040
body and we're going to print we found
17924
13:33:29,199 --> 13:33:33,680
the target starting at this t we're
17925
13:33:31,040 --> 13:33:35,756
going to print that out and stdc out is
17926
13:33:33,680 --> 13:33:37,360
going to print until it meets an old
17927
13:33:35,756 --> 13:33:39,275
character so we're going to print this
17928
13:33:37,360 --> 13:33:42,080
thing through the end and we're going to
17929
13:33:39,275 --> 13:33:43,680
put a slash n which is going to move us
17930
13:33:42,080 --> 13:33:45,916
to the next line after we do that we're
17931
13:33:45,915 --> 13:33:50,399
and uh result now is going to point to
17932
13:33:50,400 --> 13:33:54,480
and we're going to increment iterations
17933
13:33:52,480 --> 13:33:57,040
now we're going to have done two
17934
13:33:54,480 --> 13:33:59,200
iterations by now and we're going to run
17935
13:33:57,040 --> 13:34:01,520
the loop again this time the loop is
17936
13:33:59,199 --> 13:34:03,199
going to fail because starting from here
17937
13:34:03,199 --> 13:34:07,755
and that this function is going to
17938
13:34:04,720 --> 13:34:09,840
return no pointer and this test here is
17939
13:34:07,756 --> 13:34:12,239
going to fail okay we are going to
17940
13:34:09,839 --> 13:34:14,239
return no pointer no pointer is not
17941
13:34:12,239 --> 13:34:16,319
going to be different from no pointer so
17942
13:34:14,239 --> 13:34:18,079
this is going to fail and we're going to
17943
13:34:16,319 --> 13:34:20,000
fall down here and say how many
17944
13:34:18,080 --> 13:34:22,240
iterations we're going to find so in
17945
13:34:20,000 --> 13:34:24,559
total we're going to do two iterations
17946
13:34:22,239 --> 13:34:26,079
and we are going to find two t's and
17947
13:34:24,559 --> 13:34:28,079
we're going to print whatever we find
17948
13:34:26,080 --> 13:34:28,880
here make sure you really understand
17949
13:34:28,879 --> 13:34:34,399
and i put in this example on purpose
17950
13:34:31,519 --> 13:34:36,879
because it is a little complicated but
17951
13:34:34,400 --> 13:34:39,520
it is going to really bring your game up
17952
13:34:36,879 --> 13:34:41,680
in how you use these functions from the
17953
13:34:39,519 --> 13:34:43,915
c plus plus standard library and you
17954
13:34:41,680 --> 13:34:45,436
really need to know this if you have any
17955
13:34:45,436 --> 13:34:49,116
be sure to ask me i will do the best i
17956
13:34:47,519 --> 13:34:51,115
can to help you out so we're going to
17957
13:34:49,116 --> 13:34:53,916
build this and run this we're going to
17958
13:34:51,116 --> 13:34:56,160
build with gcc as always and we are
17959
13:34:53,915 --> 13:34:57,680
going to clear and run rooster and
17960
13:34:56,160 --> 13:34:58,720
you're going to see that we are looking
17961
13:34:58,720 --> 13:35:04,319
we are going to say we found t starting
17962
13:35:01,116 --> 13:35:06,480
at the t here so we're going to say try
17963
13:35:04,319 --> 13:35:08,480
okay we're going to print all the
17964
13:35:06,480 --> 13:35:10,080
message out and the second iteration is
17965
13:35:10,080 --> 13:35:14,880
starting at this location here and we're
17966
13:35:12,559 --> 13:35:16,399
going to do two iterations in total
17967
13:35:14,879 --> 13:35:18,639
we're going to comment this out and
17968
13:35:16,400 --> 13:35:20,800
again if you don't understand this
17969
13:35:18,639 --> 13:35:23,199
please go through it again and if you
17970
13:35:20,800 --> 13:35:25,040
still don't understand be sure to ask me
17971
13:35:23,199 --> 13:35:28,719
i am going to do the best i can to help
17972
13:35:25,040 --> 13:35:30,955
you out and some of you might be asking
17973
13:35:28,720 --> 13:35:34,080
why did we go through the trouble to
17974
13:35:38,559 --> 13:35:43,680
and the explanation i can come up with
17975
13:35:40,879 --> 13:35:45,360
is that you don't really want to modify
17976
13:35:43,680 --> 13:35:47,199
this guy here because somebody is going
17977
13:35:45,360 --> 13:35:50,239
to look at this thing and say
17978
13:35:47,199 --> 13:35:52,319
this is the message i have in sdr here
17979
13:35:50,239 --> 13:35:53,915
but if you try and modify this in the
17980
13:35:52,319 --> 13:35:55,519
loop it's going to be messed up because
17981
13:35:53,915 --> 13:35:57,435
you're going to be incrementing it and
17982
13:35:55,519 --> 13:36:00,079
doing all kinds of crazy things on it so
17983
13:35:57,436 --> 13:36:02,955
you don't really want to modify this so
17984
13:36:00,080 --> 13:36:05,436
a better way to even do this is to mark
17985
13:36:02,955 --> 13:36:08,000
this as a const pointer and we know how
17986
13:36:05,436 --> 13:36:10,560
to do that so we can say cost here and
17987
13:36:08,000 --> 13:36:12,720
if you even try to increment htr
17988
13:36:10,559 --> 13:36:13,680
somewhere you're going to get a compiler
17989
13:36:13,680 --> 13:36:19,199
so let's make sure we see that for
17990
13:36:16,080 --> 13:36:20,560
example we try and do plus plus sdr
17991
13:36:19,199 --> 13:36:22,955
we're going to get a compiler error
17992
13:36:20,559 --> 13:36:25,199
because this is a const pointer by now
17993
13:36:26,400 --> 13:36:31,200
we're going to comment this out and show
17994
13:36:28,080 --> 13:36:32,880
you something that might throw off many
17995
13:36:31,199 --> 13:36:35,755
of you guys so we're going to comment
17996
13:36:32,879 --> 13:36:38,000
this out and i am going to bring that in
17997
13:36:38,000 --> 13:36:41,116
and we are going to do basically the
17998
13:36:43,199 --> 13:36:48,239
and use str in the first place here
17999
13:36:46,720 --> 13:36:50,239
okay this is how we're going to do this
18000
13:36:48,239 --> 13:36:51,680
we're going to have our string we're
18001
13:36:50,239 --> 13:36:53,595
going to have our target we're going to
18002
13:36:51,680 --> 13:36:56,319
have our result here which is equal to
18003
13:36:53,595 --> 13:36:58,159
null pointer and we have our iterations
18004
13:36:56,319 --> 13:37:00,239
which is an integer let's make this a
18005
13:36:58,160 --> 13:37:03,916
size t and what we're going to do in
18006
13:37:00,239 --> 13:37:06,239
here we're going to use htr to search
18007
13:37:03,915 --> 13:37:08,319
okay and we're going to basically do the
18008
13:37:06,239 --> 13:37:10,799
same checks we're going to jump in here
18009
13:37:08,319 --> 13:37:13,756
and say we found the target starting at
18010
13:37:10,800 --> 13:37:16,800
result and we're going to increment hdr
18011
13:37:13,756 --> 13:37:18,800
here because it is not a constrainer now
18012
13:37:16,800 --> 13:37:21,596
try to go through this thing here and
18013
13:37:18,800 --> 13:37:24,956
see how many times you're going to loop
18014
13:37:21,595 --> 13:37:26,955
okay go through it and when you are done
18015
13:37:24,955 --> 13:37:28,879
we're going to try and run this we're
18016
13:37:26,955 --> 13:37:31,839
going to build with gcc the build is
18017
13:37:28,879 --> 13:37:34,719
going to be good we are going to clear
18018
13:37:31,839 --> 13:37:37,199
and run rooster and you see that this
18019
13:37:34,720 --> 13:37:39,595
guy is going to look 25 times
18020
13:37:37,199 --> 13:37:41,435
and this is crazy why is this happening
18021
13:37:41,436 --> 13:37:48,239
what we really are doing here we are not
18022
13:37:44,639 --> 13:37:49,915
assigning the result in this trend that
18023
13:37:49,915 --> 13:37:53,755
okay let's try and go through this a
18024
13:37:51,595 --> 13:37:56,239
couple of times so the first time we're
18025
13:37:53,756 --> 13:37:58,480
going to do our search okay so we're
18026
13:37:58,480 --> 13:38:03,916
and if we find our target we're going to
18027
13:38:01,275 --> 13:38:05,115
return the pointer to the target
18028
13:38:03,915 --> 13:38:07,040
if we don't find it we're going to
18029
13:38:05,116 --> 13:38:09,200
return a null pointer the first time
18030
13:38:07,040 --> 13:38:10,639
we're going to find this t here okay and
18031
13:38:09,199 --> 13:38:13,039
we're going to return a pointer to it
18032
13:38:13,040 --> 13:38:17,360
okay so after we do this we're going to
18033
13:38:17,360 --> 13:38:21,275
and we're going to say we found t
18034
13:38:19,040 --> 13:38:23,116
starting at this location here that's
18035
13:38:21,275 --> 13:38:27,040
going to work and we're going to
18036
13:38:23,116 --> 13:38:29,200
implement str okay notice that we're not
18037
13:38:29,199 --> 13:38:34,479
if we increment sdr it's going to point
18038
13:38:31,915 --> 13:38:35,595
to the next character which is r here
18039
13:38:35,595 --> 13:38:38,319
and we're going to increment our
18040
13:38:36,879 --> 13:38:39,435
iterations and we're going to start in
18041
13:38:39,436 --> 13:38:43,116
we're going to search in here
18042
13:38:41,436 --> 13:38:44,800
and we're going to be searching from
18043
13:38:44,800 --> 13:38:48,480
and we're going to find the t starting
18044
13:38:46,559 --> 13:38:50,639
at this location we are going to find
18045
13:38:48,480 --> 13:38:53,200
this t here and we're going to
18046
13:38:50,639 --> 13:38:55,360
return that and store that in reserved
18047
13:38:53,199 --> 13:38:58,159
but the problem is that what we are
18048
13:38:55,360 --> 13:39:00,559
incrementing here but the problem here
18049
13:38:58,160 --> 13:39:03,680
is that we are incrementing one by one
18050
13:39:00,559 --> 13:39:06,000
we are not jumping to this t here and we
18051
13:39:06,000 --> 13:39:11,040
by assigning the result into the same
18052
13:39:09,199 --> 13:39:13,680
variable that we are searching in okay
18053
13:39:11,040 --> 13:39:16,400
so this is going to loop 25 times and it
18054
13:39:13,680 --> 13:39:18,319
is not really good and some of you might
18055
13:39:16,400 --> 13:39:20,720
try to set up something like this and it
18056
13:39:18,319 --> 13:39:22,000
is really not going to be good try to go
18057
13:39:20,720 --> 13:39:25,520
through this and you're going to see the
18058
13:39:22,000 --> 13:39:27,275
reason why it is looping 25 times okay i
18059
13:39:25,519 --> 13:39:28,955
wanted you to see this don't do
18060
13:39:27,275 --> 13:39:30,479
something like this and we are going to
18061
13:39:28,955 --> 13:39:32,879
comment this out the next thing we're
18062
13:39:30,480 --> 13:39:35,040
going to see is how we can find the last
18063
13:39:32,879 --> 13:39:37,040
occurrence of the character and this is
18064
13:39:35,040 --> 13:39:39,756
a really cool example i like it it is
18065
13:39:37,040 --> 13:39:41,680
going to do something very practical we
18066
13:39:39,756 --> 13:39:43,756
are going to take a path which is going
18067
13:39:41,680 --> 13:39:46,239
to be an array basically stored in this
18068
13:39:43,756 --> 13:39:47,756
input array and we're going to strip off
18069
13:39:46,239 --> 13:39:50,400
all the things we don't need and we're
18070
13:39:47,756 --> 13:39:53,040
going to hunt down for the file name
18071
13:39:50,400 --> 13:39:55,520
from a full path and this can be useful
18072
13:39:53,040 --> 13:39:57,436
in whatever application you are doing so
18073
13:39:55,519 --> 13:40:00,159
we are going to hunt for the last
18074
13:39:57,436 --> 13:40:03,116
occurrence of a backslash character
18075
13:40:03,116 --> 13:40:08,080
chr facility in the ziploc squad
18076
13:40:06,080 --> 13:40:09,916
standard library and you can find the
18077
13:40:08,080 --> 13:40:11,436
documentation on this guy here i'm not
18078
13:40:09,915 --> 13:40:13,755
going to go there you should really
18079
13:40:11,436 --> 13:40:16,160
practice to go there and read what these
18080
13:40:13,756 --> 13:40:18,000
things do that's why i am living in the
18081
13:40:16,160 --> 13:40:20,000
lens to the documentation you should go
18082
13:40:18,000 --> 13:40:22,319
there and read and if you have a problem
18083
13:40:20,000 --> 13:40:24,000
you can ask me i will do the best i can
18084
13:40:24,000 --> 13:40:27,275
so this line here is going to hunt for
18085
13:40:27,275 --> 13:40:31,115
backslash it's going to find this guy
18086
13:40:29,275 --> 13:40:33,680
here and we're going to store a pointer
18087
13:40:31,116 --> 13:40:35,756
to that in our output character pointer
18088
13:40:33,680 --> 13:40:38,400
here after we do that we're going to say
18089
13:40:35,756 --> 13:40:40,559
if we found something useful if this is
18090
13:40:38,400 --> 13:40:42,880
not no pointer we're going to print that
18091
13:40:40,559 --> 13:40:44,879
out but we don't want to print starting
18092
13:40:42,879 --> 13:40:47,040
from the backslash we are going to use
18093
13:40:44,879 --> 13:40:49,199
pointer arithmetic and move to the next
18094
13:40:47,040 --> 13:40:51,360
character which is going to be this h
18095
13:40:49,199 --> 13:40:54,079
here so if we print this out we're going
18096
13:40:51,360 --> 13:40:56,800
to have hello cpp printed out because
18097
13:40:54,080 --> 13:40:57,680
sddc out is going to print until it
18098
13:40:57,680 --> 13:41:03,040
the last now character and that's going
18099
13:41:00,319 --> 13:41:05,680
to be after the last p here because this
18100
13:41:03,040 --> 13:41:07,275
is a c string let's roll here okay we're
18101
13:41:05,680 --> 13:41:09,756
going to build this the build is going
18102
13:41:07,275 --> 13:41:11,436
to be good we're going to clear
18103
13:41:09,756 --> 13:41:13,756
and run rooster and you're going to see
18104
13:41:13,756 --> 13:41:17,595
printed out here okay this is really all
18105
13:41:15,915 --> 13:41:19,595
we set out to do in this lecture i
18106
13:41:17,595 --> 13:41:22,000
apologize that it turned out to be
18107
13:41:19,595 --> 13:41:24,159
lengthy these things can take long to
18108
13:41:22,000 --> 13:41:27,519
explain and i really wanted you guys to
18109
13:41:24,160 --> 13:41:28,720
have as many explanations as i could
18110
13:41:28,720 --> 13:41:31,916
we are going to stop here in this
18111
13:41:30,239 --> 13:41:34,879
lecture the next one we're going to see
18112
13:41:31,915 --> 13:41:38,079
how we can copy and concatenate
18113
13:41:34,879 --> 13:41:41,040
c strings using the facilities from c
18114
13:41:38,080 --> 13:41:42,560
string here go ahead and finish up here
18115
13:41:42,559 --> 13:41:47,435
in this lecture we're going to look at
18116
13:41:44,720 --> 13:41:50,239
a few more facilities from the c string
18117
13:41:47,436 --> 13:41:53,116
library and those are going to allow us
18118
13:41:50,239 --> 13:41:54,955
to concatenate and copy strings over the
18119
13:41:53,116 --> 13:41:57,116
documentation for what we're going to be
18120
13:41:54,955 --> 13:41:58,879
talking about can be found here if you
18121
13:41:57,116 --> 13:42:00,639
go there you're going to fall on this
18122
13:41:58,879 --> 13:42:03,435
link here and you're going to
18123
13:42:00,639 --> 13:42:07,040
find that c string was originally in the
18124
13:42:03,436 --> 13:42:10,160
c standard library as string dot h but
18125
13:42:07,040 --> 13:42:11,756
in c plus plus we can use it like this
18126
13:42:10,160 --> 13:42:14,720
we have a couple of functions we can
18127
13:42:11,756 --> 13:42:17,040
copy stuff we can concatenate we can get
18128
13:42:14,720 --> 13:42:18,955
the string length we have seen this but
18129
13:42:17,040 --> 13:42:21,756
now we're going to look at things that
18130
13:42:18,955 --> 13:42:22,639
allow us to copy and concatenate stuff
18131
13:42:22,639 --> 13:42:26,239
that's something you may want to do a
18132
13:42:24,720 --> 13:42:27,559
lot the first example we're going to
18133
13:42:27,559 --> 13:42:32,399
stdstr cat which is going to allow you
18134
13:42:34,160 --> 13:42:38,480
documentation here and see more about
18135
13:42:36,080 --> 13:42:40,639
this facility here and you're going to
18136
13:42:38,480 --> 13:42:42,000
see all about it for now we're just
18137
13:42:40,639 --> 13:42:44,559
going to play with it we're going to set
18138
13:42:42,000 --> 13:42:45,519
up two arrays one is going to be called
18139
13:42:45,519 --> 13:42:49,275
it's going to contain hello the other is
18140
13:42:47,839 --> 13:42:51,595
going to be source here and it's going
18141
13:42:49,275 --> 13:42:54,479
to contain worlds notice that these are
18142
13:42:51,595 --> 13:42:55,435
row static arrays that are stored on the
18143
13:42:55,436 --> 13:42:59,916
and uh that's how we set them up here
18144
13:42:57,756 --> 13:43:02,160
okay so we can concatenate strengths
18145
13:42:59,915 --> 13:43:04,955
using the syntax like this we're going
18146
13:43:02,160 --> 13:43:07,116
to say hdd hdr cache we're going to say
18147
13:43:04,955 --> 13:43:09,275
the destination string and we're going
18148
13:43:07,116 --> 13:43:11,360
to say the source string we want to copy
18149
13:43:09,275 --> 13:43:13,680
from okay so after we do this the
18150
13:43:11,360 --> 13:43:16,955
destination is going to contain
18151
13:43:13,680 --> 13:43:19,595
these two strings joined together and
18152
13:43:16,955 --> 13:43:22,000
before you do this you have to be sure
18153
13:43:19,595 --> 13:43:24,559
that your destination strength is big
18154
13:43:22,000 --> 13:43:26,480
enough and this is a problem because you
18155
13:43:24,559 --> 13:43:29,115
have to really keep track of your
18156
13:43:26,480 --> 13:43:31,680
destination strength and it is easy to
18157
13:43:29,116 --> 13:43:34,160
put in many more characters that can
18158
13:43:31,680 --> 13:43:36,000
really fit in the destinations rank
18159
13:43:34,160 --> 13:43:38,480
that's the reason many of these
18160
13:43:36,000 --> 13:43:40,559
functions here are considered unsafe by
18161
13:43:38,480 --> 13:43:42,560
many compilers i don't think you can
18162
13:43:40,559 --> 13:43:45,040
compile this on visual studio it's going
18163
13:43:42,559 --> 13:43:46,159
to stop you from doing this because of
18164
13:43:47,116 --> 13:43:51,276
you have to keep track of things
18165
13:43:48,879 --> 13:43:53,680
yourself but i am just showing you so
18166
13:43:51,275 --> 13:43:55,436
that you know how to avoid these
18167
13:43:53,680 --> 13:43:57,595
problems if you happen to be on a
18168
13:43:55,436 --> 13:43:59,596
compiler that doesn't protect you from
18169
13:43:57,595 --> 13:44:02,479
this so we're going to append goodbye
18170
13:43:59,595 --> 13:44:04,239
world to whatever is in dust and down
18171
13:44:02,480 --> 13:44:06,720
here if we print this we're going to
18172
13:44:04,239 --> 13:44:08,479
have hello world goodbye world printed
18173
13:44:06,720 --> 13:44:10,239
out we are going to play with this in a
18174
13:44:08,480 --> 13:44:13,116
visual studio code in a minute don't
18175
13:44:10,239 --> 13:44:15,115
worry if any of this doesn't make sense
18176
13:44:13,116 --> 13:44:18,639
yet here is another example of how we
18177
13:44:15,116 --> 13:44:20,955
can join strengths through strcat
18178
13:44:18,639 --> 13:44:22,955
we have two strengths and we set them up
18179
13:44:20,955 --> 13:44:25,756
with a simple characters like this you
18180
13:44:22,955 --> 13:44:28,000
can do this and put in your own now
18181
13:44:25,756 --> 13:44:30,319
terminating character this is a legal c
18182
13:44:28,000 --> 13:44:32,559
plus plus could and notice that this
18183
13:44:30,319 --> 13:44:34,559
array is a dynamic array it's going to
18184
13:44:32,559 --> 13:44:37,199
leave on the hip because of this new
18185
13:44:34,559 --> 13:44:39,115
operator here we also have a source
18186
13:44:37,199 --> 13:44:42,000
array which is also going to leave on
18187
13:44:39,116 --> 13:44:44,400
the hip it is 30 characters long so it
18188
13:44:42,000 --> 13:44:46,639
is really long and we're going to try
18189
13:44:44,400 --> 13:44:48,080
and concatenate stance here but before
18190
13:44:46,639 --> 13:44:50,080
we do that we're going to check their
18191
13:44:48,080 --> 13:44:52,240
length we're going to print them out and
18192
13:44:50,080 --> 13:44:55,040
we are going to concatenate the syntax
18193
13:44:52,239 --> 13:44:57,436
is the same you are going to say hdr cat
18194
13:44:55,040 --> 13:44:58,800
you're going to specify your destination
18195
13:44:57,436 --> 13:45:01,436
and your source you're going to be
18196
13:44:58,800 --> 13:45:03,840
copying stuff from and you are going to
18197
13:45:01,436 --> 13:45:05,360
store the result in destination here
18198
13:45:03,839 --> 13:45:08,159
what this is going to do it's going to
18199
13:45:05,360 --> 13:45:09,840
grab whatever is in source and copy it
18200
13:45:08,160 --> 13:45:11,916
so it's going to copy the entire thing
18201
13:45:09,839 --> 13:45:13,679
here from source and it's going to
18202
13:45:11,915 --> 13:45:17,275
append that to whatever we have in
18203
13:45:13,680 --> 13:45:19,116
destination starting from the last null
18204
13:45:17,275 --> 13:45:21,519
character here so it's going to
18205
13:45:19,116 --> 13:45:23,916
overwrite from this null character and
18206
13:45:21,519 --> 13:45:26,399
it's going to basically copy everything
18207
13:45:23,915 --> 13:45:28,079
and the destination here and if we print
18208
13:45:26,400 --> 13:45:30,239
whatever we have in destination here
18209
13:45:30,239 --> 13:45:33,519
the phoenix kind of printed out and
18210
13:45:32,160 --> 13:45:36,080
you're going to see that this is going
18211
13:45:33,519 --> 13:45:37,839
to be the case when we hit visual studio
18212
13:45:36,080 --> 13:45:40,720
code in a minute you can also use a
18213
13:45:37,839 --> 13:45:42,799
version of the sdr cat version that is
18214
13:45:40,720 --> 13:45:45,756
going to allow you to specify
18215
13:45:42,800 --> 13:45:48,240
how many characters you want to
18216
13:45:45,756 --> 13:45:50,000
concatenate from the source string in
18217
13:45:48,239 --> 13:45:51,839
this case we have destination which is
18218
13:45:50,000 --> 13:45:53,595
hello and we have source which is there
18219
13:45:55,040 --> 13:46:00,400
and down here you see that we do hdr and
18220
13:45:58,319 --> 13:46:03,040
cat we save the destination we save the
18221
13:46:00,400 --> 13:46:06,319
source and we say how many characters we
18222
13:46:03,040 --> 13:46:08,480
want copied from the source here and we
18223
13:46:06,319 --> 13:46:10,080
say six characters so we are going to
18224
13:46:08,480 --> 13:46:12,560
count from the source we're going to say
18225
13:46:10,080 --> 13:46:14,880
one two three four five six we're going
18226
13:46:12,559 --> 13:46:17,115
to grab this their string with this
18227
13:46:14,879 --> 13:46:18,955
space here and we're going to append
18228
13:46:17,116 --> 13:46:21,520
that to the source and that's what we're
18229
13:46:18,955 --> 13:46:24,080
going to get in here we're going to say
18230
13:46:21,519 --> 13:46:26,239
hello space and there and that's what
18231
13:46:24,080 --> 13:46:29,276
we're going to have printed out here if
18232
13:46:26,239 --> 13:46:32,239
we print dust we can also copy stuff and
18233
13:46:29,275 --> 13:46:34,159
the str cpy function here is going to do
18234
13:46:32,239 --> 13:46:37,680
that and here we have an example that is
18235
13:46:34,160 --> 13:46:39,520
going to try and drive this home for you
18236
13:46:37,680 --> 13:46:41,756
we have a source strength which is c
18237
13:46:39,519 --> 13:46:44,000
plus plus is a multi-purpose programming
18238
13:46:41,756 --> 13:46:46,080
language okay guest three here is going
18239
13:46:44,000 --> 13:46:48,720
to be the same length as the source we
18240
13:46:46,080 --> 13:46:50,880
made sure of that in here because we're
18241
13:46:48,720 --> 13:46:53,436
going to grab the length of the source
18242
13:46:50,879 --> 13:46:54,879
strength please remember that sdrlam is
18243
13:46:54,879 --> 13:46:59,680
the null character that's why we are
18244
13:46:57,436 --> 13:47:01,916
adding a one here to account for the
18245
13:46:59,680 --> 13:47:03,680
noun terminating character here okay
18246
13:47:01,915 --> 13:47:07,915
after that we're going to jump down here
18247
13:47:03,680 --> 13:47:10,319
and say htr cpy dest 3 and source 3 we
18248
13:47:07,915 --> 13:47:12,399
are basically going to be copying from
18249
13:47:12,400 --> 13:47:16,480
in destination here that's what we are
18250
13:47:14,160 --> 13:47:17,916
doing if we print destination we're
18251
13:47:16,480 --> 13:47:20,800
going to see that now it's going to
18252
13:47:17,915 --> 13:47:22,719
contain whatever we had in source and
18253
13:47:20,800 --> 13:47:25,040
this is how you can use these methods
18254
13:47:25,040 --> 13:47:29,116
with which we can specify how many
18255
13:47:27,275 --> 13:47:31,519
characters we want copied from the
18256
13:47:29,116 --> 13:47:33,756
source here we have a source string
18257
13:47:31,519 --> 13:47:36,479
which is hello we have a destination
18258
13:47:33,756 --> 13:47:38,319
string which is zest 4 and we are going
18259
13:47:36,480 --> 13:47:40,480
to copy stuff we're going to copy from
18260
13:47:38,319 --> 13:47:42,559
the source we're going to paste in the
18261
13:47:40,480 --> 13:47:45,520
destination and we are just going to
18262
13:47:42,559 --> 13:47:48,079
copy five characters what this is going
18263
13:47:45,519 --> 13:47:51,275
to do is copy everything from the source
18264
13:47:48,080 --> 13:47:54,160
and paste in our destination and it is
18265
13:47:51,275 --> 13:47:57,040
going to override whatever we have in
18266
13:47:54,160 --> 13:47:59,840
the starting indexes in destination here
18267
13:47:57,040 --> 13:48:02,955
so we're going to have a b c d e here
18268
13:47:59,839 --> 13:48:05,679
replaced by hello and if we print this
18269
13:48:02,955 --> 13:48:08,080
here we're going to have hello f printed
18270
13:48:05,680 --> 13:48:10,319
out this is how these things work and if
18271
13:48:08,080 --> 13:48:12,639
you wonder how i know how these things
18272
13:48:10,319 --> 13:48:15,360
work i just come and read the
18273
13:48:12,639 --> 13:48:17,680
documentation here for example htr and
18274
13:48:15,360 --> 13:48:19,520
cpy here if we click on it we are going
18275
13:48:17,680 --> 13:48:22,239
to get the documentation this is going
18276
13:48:19,519 --> 13:48:23,915
to say copies at most count characters
18277
13:48:23,915 --> 13:48:28,799
source including the null terminating
18278
13:48:26,480 --> 13:48:30,880
character to the character array pointed
18279
13:48:28,800 --> 13:48:33,040
to by desk that's what it does we have
18280
13:48:30,879 --> 13:48:34,719
the destination we have the source and
18281
13:48:33,040 --> 13:48:36,720
we have how many characters we want
18282
13:48:34,720 --> 13:48:38,800
copied and they say a few things you
18283
13:48:36,720 --> 13:48:41,595
need to be careful about this guy here
18284
13:48:38,800 --> 13:48:43,436
one thing that you usually care about is
18285
13:48:41,595 --> 13:48:45,595
the return value you see that the return
18286
13:48:43,436 --> 13:48:47,756
value is going to be the destination
18287
13:48:45,595 --> 13:48:50,079
strength so if you want this pointer you
18288
13:48:47,756 --> 13:48:52,800
can use it and you can go down and look
18289
13:48:50,080 --> 13:48:55,276
at a few examples here and play with
18290
13:48:52,800 --> 13:48:57,276
them to really drive the point home okay
18291
13:48:55,275 --> 13:48:59,436
now that you have an idea about how
18292
13:48:57,275 --> 13:49:02,000
these guys work we are going to head
18293
13:48:59,436 --> 13:49:02,880
over to visual studio code and play with
18294
13:49:02,879 --> 13:49:08,319
right away okay here we are in our
18295
13:49:05,275 --> 13:49:10,559
working folder the current project is c
18296
13:49:08,319 --> 13:49:12,400
string concatenation and copy that's
18297
13:49:10,559 --> 13:49:15,360
what we are doing here we're going to
18298
13:49:12,400 --> 13:49:18,160
copy our template files and uh jump to
18299
13:49:15,360 --> 13:49:20,800
our current project and put them in
18300
13:49:18,160 --> 13:49:22,880
place we're going to open this in visual
18301
13:49:20,800 --> 13:49:24,639
studio code pretty quick we are going to
18302
13:49:22,879 --> 13:49:26,399
include c string because that's what
18303
13:49:24,639 --> 13:49:28,400
we're going to be using here we are
18304
13:49:26,400 --> 13:49:30,560
going to bring this up a little bit and
18305
13:49:28,400 --> 13:49:32,800
we are going to put in our first example
18306
13:49:32,800 --> 13:49:37,520
destination and source and you see that
18307
13:49:35,199 --> 13:49:39,915
we tried and made sure that they are
18308
13:49:37,519 --> 13:49:42,079
large enough to contain however many
18309
13:49:39,915 --> 13:49:44,639
characters we want to put in
18310
13:49:42,080 --> 13:49:47,756
and they are row arrays stored on the
18311
13:49:44,639 --> 13:49:49,199
stack because they are set up like this
18312
13:49:47,756 --> 13:49:51,200
and again you can check out the
18313
13:49:49,199 --> 13:49:53,360
documentation here if you want to know
18314
13:49:51,199 --> 13:49:57,755
how this function works and we are going
18315
13:49:53,360 --> 13:50:00,559
to call strcat here to concatenate the
18316
13:49:57,756 --> 13:50:02,756
source to our destination here so if we
18317
13:50:00,559 --> 13:50:05,756
do this we're going to have world here
18318
13:50:02,756 --> 13:50:07,916
concatenated to what we have in hello
18319
13:50:05,756 --> 13:50:10,480
here and we're going to have hello world
18320
13:50:07,915 --> 13:50:13,755
in place for example if we try and print
18321
13:50:10,480 --> 13:50:16,160
this out i'm going to try and do that
18322
13:50:13,756 --> 13:50:18,319
after we do the first concatenation here
18323
13:50:16,160 --> 13:50:20,880
let's do that that's going to be better
18324
13:50:18,319 --> 13:50:23,116
to show you how these things work okay
18325
13:50:20,879 --> 13:50:26,399
after the first function here runs we're
18326
13:50:23,116 --> 13:50:28,639
going to have source concatenated to
18327
13:50:26,400 --> 13:50:30,880
destination here so what we're going to
18328
13:50:28,639 --> 13:50:32,559
have is hello world stored in
18329
13:50:32,559 --> 13:50:37,360
concatenation here is going to append
18330
13:50:34,720 --> 13:50:39,436
goodbye world to whatever we have in
18331
13:50:37,360 --> 13:50:42,559
destination here so what we're going to
18332
13:50:39,436 --> 13:50:44,955
have printed down is if we print that of
18333
13:50:42,559 --> 13:50:46,399
course is hello world and goodbye world
18334
13:50:44,955 --> 13:50:49,040
okay we're going to have this written
18335
13:50:46,400 --> 13:50:51,520
down let's try and run this and actually
18336
13:50:49,040 --> 13:50:53,520
make sure that that's the case and then
18337
13:50:51,519 --> 13:50:56,159
we're going to see how this function can
18338
13:50:53,519 --> 13:50:58,239
be unsafe for some compilers we're going
18339
13:50:56,160 --> 13:51:00,240
to build this with gcc you see that it's
18340
13:51:00,239 --> 13:51:04,319
and if we run this we're going to have
18341
13:51:01,839 --> 13:51:06,879
hello world hello world goodbye world
18342
13:51:04,319 --> 13:51:07,756
printed out this is what we expect and
18343
13:51:07,756 --> 13:51:12,480
this function here sdr cat is going to
18344
13:51:10,239 --> 13:51:14,639
have whatever you have in source and it
18345
13:51:12,480 --> 13:51:17,200
is going to append that to whatever you
18346
13:51:14,639 --> 13:51:19,360
have in destination and for this to work
18347
13:51:17,199 --> 13:51:22,639
you have to be sure that the destination
18348
13:51:19,360 --> 13:51:25,275
is modifiable for example if it was an
18349
13:51:22,639 --> 13:51:27,040
array of cost core let's do that and
18350
13:51:25,275 --> 13:51:29,680
show you the compiler error we should
18351
13:51:27,040 --> 13:51:32,319
get a compiler error because now
18352
13:51:29,680 --> 13:51:34,955
destination is not modifiable it is an
18353
13:51:32,319 --> 13:51:37,595
array of cost characters and we can't
18354
13:51:37,595 --> 13:51:42,720
the destination array is modifiable and
18355
13:51:40,559 --> 13:51:44,479
in this case it is okay please note that
18356
13:51:42,720 --> 13:51:47,680
some of these functions can be treated
18357
13:51:44,480 --> 13:51:50,720
as unsafe by some compilers but i tried
18358
13:51:47,680 --> 13:51:52,955
this out on both on gcc and the compiler
18359
13:51:50,720 --> 13:51:54,955
from microsoft and they work pretty well
18360
13:51:52,955 --> 13:51:57,360
so you can try them out here to prove
18361
13:51:54,955 --> 13:51:59,915
that let's go and try and build with the
18362
13:51:57,360 --> 13:52:01,275
compiler from microsoft we have it
18363
13:52:01,275 --> 13:52:05,595
so we're going to run the task to build
18364
13:52:05,595 --> 13:52:08,879
and you're going to see that the world
18365
13:52:06,879 --> 13:52:11,040
is going to be good the world finished
18366
13:52:08,879 --> 13:52:12,559
successfully and if we go and we're
18367
13:52:12,559 --> 13:52:16,399
and run rooster you're going to see that
18368
13:52:14,160 --> 13:52:18,160
it is going to do exactly the same thing
18369
13:52:16,400 --> 13:52:20,080
but some compilers might give you
18370
13:52:18,160 --> 13:52:22,480
warnings or errors if you try to do
18371
13:52:20,080 --> 13:52:24,160
something like this and the reason is
18372
13:52:22,480 --> 13:52:26,720
you really have to be careful using
18373
13:52:24,160 --> 13:52:29,276
these functions because if for example
18374
13:52:26,720 --> 13:52:32,000
destination array is not large enough
18375
13:52:29,275 --> 13:52:33,839
you may do some crazy things running
18376
13:52:32,000 --> 13:52:36,480
over the balance of your array and it
18377
13:52:33,839 --> 13:52:38,479
can be really bad for example if we try
18378
13:52:36,480 --> 13:52:41,040
and make destination array here for
18379
13:52:38,480 --> 13:52:43,680
example a size of three it is possible
18380
13:52:41,040 --> 13:52:46,800
to do that and you see that we get a
18381
13:52:43,680 --> 13:52:49,436
warning from visual studio code and if
18382
13:52:46,800 --> 13:52:51,520
we try and build this with gcc let's try
18383
13:52:49,436 --> 13:52:54,000
and remove the garbage we have from
18384
13:52:51,519 --> 13:52:58,079
visual studio first now that this is
18385
13:52:54,000 --> 13:53:00,000
clean we can uh try and build with gcc
18386
13:52:58,080 --> 13:53:02,560
let's do that our compiler we're going
18387
13:53:00,000 --> 13:53:03,839
to choose gcc and you're going to see
18388
13:53:02,559 --> 13:53:05,756
that it's going to give you an error
18389
13:53:03,839 --> 13:53:08,159
it's going to actually protect us from
18390
13:53:05,756 --> 13:53:10,160
doing something like this but in some
18391
13:53:08,160 --> 13:53:12,400
cases some compilers are not going to
18392
13:53:10,160 --> 13:53:15,276
stop you from doing this but any
18393
13:53:12,400 --> 13:53:17,680
compiler that really respects itself
18394
13:53:15,275 --> 13:53:19,360
it's going to have these safety checks
18395
13:53:17,680 --> 13:53:21,360
in and it's going to protect you from
18396
13:53:19,360 --> 13:53:23,680
doing something crazy like this okay
18397
13:53:21,360 --> 13:53:27,840
this is how you can do concatenation
18398
13:53:23,680 --> 13:53:29,436
using hdr cat like we did here let's try
18399
13:53:27,839 --> 13:53:31,275
and weld and see that now we are
18400
13:53:29,436 --> 13:53:33,756
building fine because i don't like these
18401
13:53:31,275 --> 13:53:36,000
red lines here the world is good and we
18402
13:53:33,756 --> 13:53:37,275
are all fine now i am going to comment
18403
13:53:37,275 --> 13:53:41,436
and we're going to see another example
18404
13:53:38,800 --> 13:53:43,276
of how we can concatenate stuff we are
18405
13:53:41,436 --> 13:53:45,596
going to go down here let's bring this
18406
13:53:45,595 --> 13:53:49,915
and we are going to put in our simple
18407
13:53:47,839 --> 13:53:52,239
example exactly the same thing we saw in
18408
13:53:52,239 --> 13:53:57,756
character arrays they are dynamic arrays
18409
13:53:55,116 --> 13:54:00,000
but we initialize them with characters
18410
13:53:57,756 --> 13:54:00,880
like this and we make sure to put in our
18411
13:54:00,879 --> 13:54:05,275
terminator we have our source strength
18412
13:54:05,275 --> 13:54:08,955
femix king and it's going to have a
18413
13:54:08,955 --> 13:54:13,275
and what we're going to do we're going
18414
13:54:10,319 --> 13:54:15,519
to take soros and concatenate that to
18415
13:54:13,275 --> 13:54:17,680
our destination so what is really going
18416
13:54:15,519 --> 13:54:19,680
to happen we are going to overwrite the
18417
13:54:17,680 --> 13:54:22,639
null terminator here and we're going to
18418
13:54:19,680 --> 13:54:24,955
start pasting in things from source here
18419
13:54:22,639 --> 13:54:27,360
so after the concatenation is done what
18420
13:54:24,955 --> 13:54:29,595
we are doing here we are concatenating
18421
13:54:29,595 --> 13:54:35,360
we are going to have fire lord the
18422
13:54:32,400 --> 13:54:36,480
phoenix kang stored in our destination
18423
13:54:36,480 --> 13:54:42,319
and notice that we made sure that
18424
13:54:39,756 --> 13:54:44,239
large enough to contain our characters
18425
13:54:42,319 --> 13:54:46,879
here and if we print it out we're going
18426
13:54:44,239 --> 13:54:49,595
to have the thing printed out we can try
18427
13:54:46,879 --> 13:54:51,755
and weld with gcc that's going to go
18428
13:54:49,595 --> 13:54:52,639
through let's bring this up the bulb is
18429
13:54:52,639 --> 13:54:57,595
if you go down here the build is good
18430
13:54:54,800 --> 13:54:59,276
we're going to clear and run rooster
18431
13:54:57,595 --> 13:55:01,839
okay this is the output here you see
18432
13:54:59,275 --> 13:55:05,275
that the destination is eight characters
18433
13:55:01,839 --> 13:55:08,079
long if we count one two three four five
18434
13:55:05,275 --> 13:55:10,319
six seven eight remember sdrl lan
18435
13:55:08,080 --> 13:55:12,400
doesn't count the null character so this
18436
13:55:10,319 --> 13:55:14,559
is what we expect eight characters the
18437
13:55:12,400 --> 13:55:16,000
source is going to be 17 characters if
18438
13:55:14,559 --> 13:55:17,199
you count all this that's what you're
18439
13:55:17,199 --> 13:55:21,595
and if we concatenate them now this
18440
13:55:24,000 --> 13:55:28,879
in the eyes of hdr land and you see that
18441
13:55:26,955 --> 13:55:31,595
we print the destination and it is
18442
13:55:28,879 --> 13:55:34,000
exactly what we expect fire lord the
18443
13:55:31,595 --> 13:55:35,595
phoenix gang okay we're going to comment
18444
13:55:34,000 --> 13:55:37,595
this out i just wanted you to see an
18445
13:55:35,595 --> 13:55:40,399
example of this and the one thing i
18446
13:55:37,595 --> 13:55:42,799
really want to stress in this example
18447
13:55:40,400 --> 13:55:45,916
is that strcat is going to start
18448
13:55:42,800 --> 13:55:49,756
overriding whatever is in dust starting
18449
13:55:45,915 --> 13:55:52,239
at the last null character okay so this
18450
13:55:49,756 --> 13:55:54,160
guy is going to be overridden by the
18451
13:55:52,239 --> 13:55:55,839
comma here and we're going to start and
18452
13:55:54,160 --> 13:55:58,080
putting stuff and that's what we're
18453
13:55:55,839 --> 13:56:00,159
going to see here let's comment this out
18454
13:55:58,080 --> 13:56:02,240
because we want to move on and show you
18455
13:56:00,160 --> 13:56:04,640
a few other examples okay the next thing
18456
13:56:02,239 --> 13:56:08,400
we're going to look at is a new version
18457
13:56:04,639 --> 13:56:09,915
of str cat that allows you to specify
18458
13:56:11,436 --> 13:56:16,639
from source for example here we have two
18459
13:56:13,756 --> 13:56:19,756
strengths destination and source and
18460
13:56:16,639 --> 13:56:22,879
here we are basically saying i want to
18461
13:56:19,756 --> 13:56:24,639
concatenate six characters from source
18462
13:56:22,879 --> 13:56:26,799
and put them at the end of the
18463
13:56:24,639 --> 13:56:30,800
destination here and what it's going to
18464
13:56:26,800 --> 13:56:33,040
do it's going to grab one two three four
18465
13:56:30,800 --> 13:56:35,040
five six it's going to grab this entire
18466
13:56:33,040 --> 13:56:37,200
thing and it's going to append that to
18467
13:56:35,040 --> 13:56:40,160
hello and we're going to have hello
18468
13:56:37,199 --> 13:56:42,479
there stored in the destination and the
18469
13:56:40,160 --> 13:56:44,956
return value is going to be a pointer to
18470
13:56:42,480 --> 13:56:47,360
destination 2. and how do i know the
18471
13:56:44,955 --> 13:56:50,080
return value well i know that from the
18472
13:56:47,360 --> 13:56:51,879
documentation if you go in your favorite
18473
13:56:51,879 --> 13:56:57,115
stdstr and cat and you're going to see a
18474
13:56:54,955 --> 13:56:58,639
link here if you click on it from cpp
18475
13:56:57,116 --> 13:57:00,160
reference it's going to give you
18476
13:56:58,639 --> 13:57:02,639
everything you need to know about this
18477
13:57:00,160 --> 13:57:05,916
function here it's going to append
18478
13:57:02,639 --> 13:57:07,756
source to destination and and count
18479
13:57:05,915 --> 13:57:09,519
characters are going to be copied so the
18480
13:57:07,756 --> 13:57:11,916
third parameter here is going to be how
18481
13:57:09,519 --> 13:57:14,559
many characters you want copied and
18482
13:57:11,915 --> 13:57:16,639
pasted into our destination
18483
13:57:14,559 --> 13:57:18,319
and the return value is going to be dest
18484
13:57:16,639 --> 13:57:20,479
okay if we try this out we're going to
18485
13:57:18,319 --> 13:57:22,159
see hello there printed out we're going
18486
13:57:20,480 --> 13:57:24,240
to print it out directly and we're going
18487
13:57:24,239 --> 13:57:29,040
using the destination pointer that is
18488
13:57:26,955 --> 13:57:30,955
going to be returned from this guy here
18489
13:57:29,040 --> 13:57:33,436
so if we try and build this we're going
18490
13:57:30,955 --> 13:57:35,756
to build with gcc the bullet is going to
18491
13:57:33,436 --> 13:57:37,040
be good we're going to clear and run
18492
13:57:35,756 --> 13:57:39,436
rooster and you're going to see that we
18493
13:57:37,040 --> 13:57:41,436
have hello there twice here and this is
18494
13:57:41,436 --> 13:57:48,000
we are going to comment this out and we
18495
13:57:43,436 --> 13:57:51,040
are going to go down and look at sdr cpi
18496
13:57:48,000 --> 13:57:53,595
i should say sdr cpy which is going to
18497
13:57:51,040 --> 13:57:57,040
copy stuff from the source and paste
18498
13:57:53,595 --> 13:57:59,199
those in the destination and one thing
18499
13:57:57,040 --> 13:58:01,275
you should know is that the copy is
18500
13:57:59,199 --> 13:58:03,595
going to happen starting from the start
18501
13:58:01,275 --> 13:58:06,000
of the destination array here we have
18502
13:58:03,595 --> 13:58:08,559
two arrays one is called source three
18503
13:58:06,000 --> 13:58:11,116
the other is called destination three
18504
13:58:08,559 --> 13:58:12,879
destination 3 is set up on the heap
18505
13:58:11,116 --> 13:58:15,276
using the new operator so it is a
18506
13:58:12,879 --> 13:58:17,519
dynamic array and you see that we make
18507
13:58:15,275 --> 13:58:18,639
sure that it is the same size as the
18508
13:58:18,639 --> 13:58:23,436
we are using sdr lan to figure out how
18509
13:58:21,275 --> 13:58:26,159
many characters we have in here
18510
13:58:23,436 --> 13:58:28,239
and remember that sdr land doesn't
18511
13:58:26,160 --> 13:58:30,720
account for the null character so we are
18512
13:58:28,239 --> 13:58:32,639
adding one to account for the null
18513
13:58:30,720 --> 13:58:34,559
character that's what we are doing here
18514
13:58:32,639 --> 13:58:38,159
and after that we are going to do std
18515
13:58:34,559 --> 13:58:41,275
str cpy and what that is going to do is
18516
13:58:38,160 --> 13:58:42,956
copy stuff from source to destination
18517
13:58:41,275 --> 13:58:46,159
character by character so we are
18518
13:58:42,955 --> 13:58:48,639
basically going to have this guy pasted
18519
13:58:46,160 --> 13:58:50,000
into destination here and if we print
18520
13:58:48,639 --> 13:58:52,720
things out we're going to see that
18521
13:58:50,000 --> 13:58:55,595
destination contains the same thing as
18522
13:58:52,720 --> 13:58:57,200
source here if we built this with gcc
18523
13:58:55,595 --> 13:58:58,799
let's do that the build is going to be
18524
13:58:58,800 --> 13:59:03,200
and run rooster and you're going to see
18525
13:59:00,879 --> 13:59:05,275
that the destination has exactly the
18526
13:59:03,199 --> 13:59:08,159
same thing we had in the source and if
18527
13:59:05,275 --> 13:59:11,199
you need to copy stuff from arrays sdr
18528
13:59:08,160 --> 13:59:13,040
cpui is going to be very helpful
18529
13:59:11,199 --> 13:59:15,115
we are going to comment this out because
18530
13:59:13,040 --> 13:59:15,915
we still have a few things we want to
18531
13:59:15,915 --> 13:59:20,955
so let's comment this out we are going
18532
13:59:18,879 --> 13:59:23,595
to go down and see that we can also use
18533
13:59:20,955 --> 13:59:25,915
a another version that allows us to
18534
13:59:23,595 --> 13:59:28,239
specify how many characters we want
18535
13:59:25,915 --> 13:59:31,680
copied from the source okay in this
18536
13:59:28,239 --> 13:59:34,559
example here we are using std str and
18537
13:59:31,680 --> 13:59:38,080
cpy and this n here means that we can
18538
13:59:34,559 --> 13:59:39,115
specify the count of characters we do
18539
13:59:39,116 --> 13:59:43,916
the current function is doing here okay
18540
13:59:41,360 --> 13:59:46,800
so we are specifying i want five
18541
13:59:43,915 --> 13:59:49,275
characters copied from source and i want
18542
13:59:46,800 --> 13:59:51,436
those pasted into destination here
18543
13:59:49,275 --> 13:59:53,275
that's what we are saying here and the
18544
13:59:51,436 --> 13:59:54,800
source is going to contain hello
18545
13:59:53,275 --> 13:59:57,275
destination is going to contain the
18546
13:59:54,800 --> 14:00:00,240
world and the copy is going to happen
18547
13:59:57,275 --> 14:00:02,079
starting at the first index here so
18548
14:00:00,239 --> 14:00:05,436
we're going to have hello override
18549
14:00:02,080 --> 14:00:07,916
whatever we have in a b c d e because
18550
14:00:05,436 --> 14:00:10,639
that's five characters here and the dust
18551
14:00:07,915 --> 14:00:12,955
is going to contain hello f if we print
18552
14:00:10,639 --> 14:00:14,479
it out let's build this and see if
18553
14:00:12,955 --> 14:00:16,400
that's what we're going to get we're
18554
14:00:14,480 --> 14:00:17,840
going to build with gcc the build is
18555
14:00:17,839 --> 14:00:22,000
we are going to clear and run rooster
18556
14:00:20,080 --> 14:00:23,116
and you see that that's exactly what we
18557
14:00:23,116 --> 14:00:27,040
okay this is how these methods work
18558
14:00:25,360 --> 14:00:27,915
there are many more functions you can
18559
14:00:27,915 --> 14:00:32,079
from the c string library and again if
18560
14:00:32,080 --> 14:00:36,319
a list of them all you can go through
18561
14:00:36,319 --> 14:00:40,080
favorite search engine and search for c
18562
14:00:40,080 --> 14:00:45,436
and we can specify cpp reference here
18563
14:00:43,040 --> 14:00:47,840
let's try and do that okay we can find a
18564
14:00:45,436 --> 14:00:49,680
link to that we can click on that and
18565
14:00:47,839 --> 14:00:52,000
it's going to open up and show us many
18566
14:00:49,680 --> 14:00:53,840
more functions we can use and if you
18567
14:00:52,000 --> 14:00:55,915
need to know about a special function
18568
14:00:53,839 --> 14:00:57,519
you can click on it and see what it does
18569
14:00:55,915 --> 14:00:59,839
and if you go down you're going to find
18570
14:00:57,519 --> 14:01:01,435
even an example of how you can use it
18571
14:00:59,839 --> 14:01:03,039
for now we are going to stop here in
18572
14:01:01,436 --> 14:01:05,360
this lecture and this is actually going
18573
14:01:03,040 --> 14:01:07,116
to be the last lecture we see on c
18574
14:01:05,360 --> 14:01:10,160
strings the next one we're going to
18575
14:01:07,116 --> 14:01:12,639
start and look at std strength which is
18576
14:01:10,160 --> 14:01:13,680
a compound type that makes working with
18577
14:01:16,319 --> 14:01:20,559
go ahead and finish up here and meet me
18578
14:01:18,720 --> 14:01:23,360
there in this lecture we're going to
18579
14:01:20,559 --> 14:01:25,435
start and learn about hdd strength which
18580
14:01:23,360 --> 14:01:28,239
is a type that is going to make it super
18581
14:01:25,436 --> 14:01:30,080
easy to work with string data we have
18582
14:01:28,239 --> 14:01:32,639
seen many ways we can work with
18583
14:01:30,080 --> 14:01:35,200
character arrays by now we can use row
18584
14:01:32,639 --> 14:01:37,595
rays we can point to them with pointers
18585
14:01:35,199 --> 14:01:40,639
we can even allocate arrays on the hip
18586
14:01:37,595 --> 14:01:43,756
but all these character arrays had a few
18587
14:01:40,639 --> 14:01:46,400
problems that are really a pain in the
18588
14:01:43,756 --> 14:01:48,480
neck to deal with on a daily basis
18589
14:01:46,400 --> 14:01:50,319
one of those problems was that you had
18590
14:01:48,480 --> 14:01:51,756
to keep the size in check you have to
18591
14:01:51,756 --> 14:01:57,680
elements you have in the character array
18592
14:01:54,639 --> 14:02:00,319
and that was defining the bounds that
18593
14:01:57,680 --> 14:02:02,720
you can work in if you go over bounds we
18594
14:02:00,319 --> 14:02:04,955
have seen that that can cause crashes of
18595
14:02:02,720 --> 14:02:07,275
your program and you don't want that
18596
14:02:04,955 --> 14:02:09,436
another problem was that we had 3d to
18597
14:02:07,275 --> 14:02:11,915
remember to keep track of the null
18598
14:02:09,436 --> 14:02:13,680
character if we don't have it in place
18599
14:02:11,915 --> 14:02:16,079
we're going to have problems when our
18600
14:02:13,680 --> 14:02:18,400
string is printed out and it's really
18601
14:02:16,080 --> 14:02:21,040
annoying to always have to think about
18602
14:02:18,400 --> 14:02:24,400
these little details when all you really
18603
14:02:21,040 --> 14:02:27,520
want is to store a strand so c plus plus
18604
14:02:24,400 --> 14:02:29,756
offers a high level type that we can use
18605
14:02:27,519 --> 14:02:32,799
and it is going to hide all these little
18606
14:02:29,756 --> 14:02:35,275
details underground and all we have to
18607
14:02:32,800 --> 14:02:37,276
do is put in our string and use it and
18608
14:02:35,275 --> 14:02:39,436
we can be on our merry way and do
18609
14:02:37,275 --> 14:02:41,519
whatever we want to do with string data
18610
14:02:39,436 --> 14:02:42,639
in our c plus plus application so that's
18611
14:02:41,519 --> 14:02:44,955
what we're going to do we're going to
18612
14:02:42,639 --> 14:02:47,680
have a type that is going to wrap on top
18613
14:02:44,955 --> 14:02:50,400
of the ugly array computations we have
18614
14:02:47,680 --> 14:02:52,639
been doing on character arrays we're
18615
14:02:50,400 --> 14:02:54,955
going to call that std string and we're
18616
14:02:52,639 --> 14:02:57,756
going to be able to do many of the
18617
14:02:54,955 --> 14:02:59,915
things we were doing with c strings but
18618
14:02:57,756 --> 14:03:01,916
in a much better way we can concatenate
18619
14:02:59,915 --> 14:03:04,000
we can search we can copy we can do all
18620
14:03:01,915 --> 14:03:06,239
kinds of crazy things really but it's
18621
14:03:04,000 --> 14:03:08,080
going to be in a way that you don't have
18622
14:03:06,239 --> 14:03:10,479
to worry about these little details
18623
14:03:08,080 --> 14:03:12,955
about array bounds the null character
18624
14:03:10,480 --> 14:03:16,000
you're going to just use it for what you
18625
14:03:12,955 --> 14:03:17,595
want which is storing character or text
18626
14:03:16,000 --> 14:03:19,275
data okay so that's what we're going to
18627
14:03:17,595 --> 14:03:21,275
be doing in the next few lectures we're
18628
14:03:19,275 --> 14:03:22,955
going to be learning about std string
18629
14:03:21,275 --> 14:03:25,040
and how you can use it in your c plus
18630
14:03:22,955 --> 14:03:27,595
plus applications and it's going to make
18631
14:03:25,040 --> 14:03:29,436
your life a whole lot easier we are
18632
14:03:27,595 --> 14:03:30,879
going to stop here in this lecture the
18633
14:03:29,436 --> 14:03:34,160
next one we're going to see how you can
18634
14:03:30,879 --> 14:03:36,319
declare initialize and use std strength
18635
14:03:34,160 --> 14:03:39,276
in your c plus plus application go ahead
18636
14:03:36,319 --> 14:03:40,639
and finish up here and meet me there and
18637
14:03:39,275 --> 14:03:43,436
this lecture we're going to see how you
18638
14:03:40,639 --> 14:03:45,519
can declare and use hdd strength in your
18639
14:03:45,519 --> 14:03:49,519
std strength is a type that is going to
18640
14:03:47,436 --> 14:03:51,360
wrap on top of arrays and give us a
18641
14:03:53,116 --> 14:03:58,080
store string data without having to deal
18642
14:03:55,839 --> 14:04:00,479
with the ugly little details like
18643
14:03:58,080 --> 14:04:02,480
keeping track of array bound remembering
18644
14:04:00,480 --> 14:04:04,720
to keep in check the null character and
18645
14:04:02,480 --> 14:04:07,040
things like that to use std strength you
18646
14:04:04,720 --> 14:04:09,040
will need to include the string library
18647
14:04:07,040 --> 14:04:11,915
and after you do this you can declare
18648
14:04:09,040 --> 14:04:14,480
and use your strings just like this here
18649
14:04:11,915 --> 14:04:16,639
we have a series of examples just to get
18650
14:04:14,480 --> 14:04:18,319
you started on this you declare your
18651
14:04:16,639 --> 14:04:20,400
strengths just like you declare any
18652
14:04:18,319 --> 14:04:22,400
other time you specify the type on the
18653
14:04:20,400 --> 14:04:24,720
left the type is going to be std
18654
14:04:22,400 --> 14:04:26,955
strength by the way you'll have to
18655
14:04:24,720 --> 14:04:28,800
remember to use std column column like
18656
14:04:26,955 --> 14:04:32,080
this and we will have a chance to
18657
14:04:28,800 --> 14:04:34,319
explain why in a few chapters ahead but
18658
14:04:32,080 --> 14:04:37,116
for now we're just going to think of std
18659
14:04:34,319 --> 14:04:39,680
strength as a type so we declare a
18660
14:04:37,116 --> 14:04:41,840
string type we call it full name and we
18661
14:04:39,680 --> 14:04:43,915
can leave it like this uninitialized and
18662
14:04:41,839 --> 14:04:46,319
it is going to be an empty strand we can
18663
14:04:43,915 --> 14:04:48,719
also put in our string and initialize
18664
14:04:46,319 --> 14:04:51,199
that with a string literal and it is
18665
14:04:48,720 --> 14:04:53,360
going to work another way of doing this
18666
14:04:51,199 --> 14:04:55,360
is initializing a string with another
18667
14:04:53,360 --> 14:04:57,199
string which we are doing down here you
18668
14:04:55,360 --> 14:04:59,680
can also set up another string and
18669
14:04:57,199 --> 14:05:02,000
initialize it with part of another
18670
14:04:59,680 --> 14:05:04,160
string literal so for example message
18671
14:05:02,000 --> 14:05:06,480
here is going to be hello and it's only
18672
14:05:04,160 --> 14:05:08,000
going to grab five characters from this
18673
14:05:06,480 --> 14:05:09,436
string literal this is something you
18674
14:05:09,436 --> 14:05:12,955
if it makes sense for whatever
18675
14:05:10,955 --> 14:05:15,436
application you are doing here we can
18676
14:05:12,955 --> 14:05:18,159
also initialize our strength with
18677
14:05:15,436 --> 14:05:20,639
multiple copies of one character and
18678
14:05:18,160 --> 14:05:22,240
this is the syntax to do it you say
18679
14:05:20,639 --> 14:05:23,839
the name of your variable you say
18680
14:05:22,239 --> 14:05:25,915
however many times you want the
18681
14:05:23,839 --> 14:05:28,559
character repeated and you say which
18682
14:05:25,915 --> 14:05:31,595
character it is just like this we can
18683
14:05:28,559 --> 14:05:34,159
also initialize a string with part of
18684
14:05:31,595 --> 14:05:36,720
another existing string so for example
18685
14:05:34,160 --> 14:05:39,200
here we have saying hello and it is
18686
14:05:36,720 --> 14:05:41,520
initialized with part of what we have in
18687
14:05:39,199 --> 14:05:44,000
greeting here so we're going to start at
18688
14:05:44,000 --> 14:05:51,199
0 1 2 3 4 5 6 on the w here and we're
18689
14:05:48,639 --> 14:05:53,116
going to grab five characters so one two
18690
14:05:51,199 --> 14:05:54,955
three four five and that's what we're
18691
14:05:53,116 --> 14:05:56,955
going to use to initialize this saying
18692
14:05:54,955 --> 14:05:59,436
hello here and if we print it out we're
18693
14:05:56,955 --> 14:06:01,519
going to see that this is going to be
18694
14:05:59,436 --> 14:06:03,436
exactly the case so hopefully you can
18695
14:06:01,519 --> 14:06:05,039
see that it is easier you don't have to
18696
14:06:03,436 --> 14:06:08,000
use pointers you don't have to use
18697
14:06:05,040 --> 14:06:10,559
arrays and the best part is std strength
18698
14:06:08,000 --> 14:06:12,879
can grow automatically if you happen to
18699
14:06:10,559 --> 14:06:15,275
store in more characters than you
18700
14:06:12,879 --> 14:06:16,955
initialized it with in the first place
18701
14:06:15,275 --> 14:06:19,040
and that's pretty cool so now we're
18702
14:06:16,955 --> 14:06:20,955
going to head over to visual studio code
18703
14:06:19,040 --> 14:06:23,756
and play with us so that you can see for
18704
14:06:20,955 --> 14:06:26,319
yourself okay here we are in our working
18705
14:06:23,756 --> 14:06:28,559
folder the current project is declaring
18706
14:06:26,319 --> 14:06:30,400
and using std strength which is what we
18707
14:06:28,559 --> 14:06:32,319
are doing here we're going to grab our
18708
14:06:30,400 --> 14:06:34,239
template files pretty quick and we're
18709
14:06:32,319 --> 14:06:36,480
going to go and store in the files and
18710
14:06:34,239 --> 14:06:38,879
we're going to open the folder and we're
18711
14:06:36,480 --> 14:06:41,596
going to include the strength library
18712
14:06:38,879 --> 14:06:44,399
let's do that okay this is how we do it
18713
14:06:41,595 --> 14:06:47,199
and now that we have it included in our
18714
14:06:44,400 --> 14:06:48,720
project we can start declaring and using
18715
14:06:48,720 --> 14:06:53,040
types in our c plus plus program we are
18716
14:06:51,275 --> 14:06:55,115
going to go down and put in the code to
18717
14:06:53,040 --> 14:06:57,520
play with this a little bit so you can
18718
14:06:55,116 --> 14:06:59,680
declare an empty string like this and
18719
14:06:57,519 --> 14:07:02,000
it's not going to have anything inside
18720
14:06:59,680 --> 14:07:04,800
you can declare a string and put in a
18721
14:07:02,000 --> 14:07:07,595
string literal like we are doing here
18722
14:07:04,800 --> 14:07:09,520
and std string knows how to handle this
18723
14:07:07,595 --> 14:07:12,079
so it's going to store it inside using a
18724
14:07:09,519 --> 14:07:14,079
character array but we don't have to
18725
14:07:12,080 --> 14:07:16,639
really worry about that character array
18726
14:07:14,080 --> 14:07:20,800
is going to work we're just going to use
18727
14:07:16,639 --> 14:07:23,436
std string here we can set up a string
18728
14:07:20,800 --> 14:07:26,160
using another string in our initializer
18729
14:07:26,160 --> 14:07:29,756
part of a literal to initialize the
18730
14:07:29,756 --> 14:07:33,520
this string literal here we're going to
18731
14:07:31,519 --> 14:07:35,519
grab part of it and we're going to grab
18732
14:07:33,519 --> 14:07:38,479
five characters and use those to
18733
14:07:35,519 --> 14:07:40,799
initialize our message std string here
18734
14:07:38,480 --> 14:07:42,560
and this is pretty cool we can also use
18735
14:07:40,800 --> 14:07:44,560
multiple characters to initialize a
18736
14:07:42,559 --> 14:07:46,479
string like this we say however many
18737
14:07:44,559 --> 14:07:48,159
copies we want of this character in this
18738
14:07:46,480 --> 14:07:50,400
string here and it is going to be
18739
14:07:48,160 --> 14:07:51,680
exactly what we want so it's going to be
18740
14:07:54,239 --> 14:07:58,479
and we can initialize the string with
18741
14:07:56,319 --> 14:08:01,040
part of another string and this is
18742
14:07:58,480 --> 14:08:03,520
really cool and it may come in handy in
18743
14:08:01,040 --> 14:08:06,319
many applications so for example here
18744
14:08:03,519 --> 14:08:08,879
saying hello is going to contain
18745
14:08:06,319 --> 14:08:10,800
world here and we are saying that this
18746
14:08:08,879 --> 14:08:13,680
is what we want by saying we want to
18747
14:08:10,800 --> 14:08:17,200
start at index six in this string here
18748
14:08:13,680 --> 14:08:20,400
so if we go zero one two three four five
18749
14:08:17,199 --> 14:08:22,719
six this is going to be our character at
18750
14:08:20,400 --> 14:08:24,319
index six and from this index we're
18751
14:08:22,720 --> 14:08:27,116
going to grab five characters so we're
18752
14:08:24,319 --> 14:08:29,360
going to count one two three four five
18753
14:08:27,116 --> 14:08:31,520
and that's going to be what's stored in
18754
14:08:29,360 --> 14:08:33,360
this string here and if you don't
18755
14:08:31,519 --> 14:08:35,039
believe me we can print all these things
18756
14:08:33,360 --> 14:08:37,360
out and they are going to be exactly
18757
14:08:35,040 --> 14:08:39,595
what we expect and by this you can even
18758
14:08:37,360 --> 14:08:41,840
see that we can print std strengths
18759
14:08:41,839 --> 14:08:46,239
very conveniently like this and this is
18760
14:08:44,080 --> 14:08:49,200
very cool okay so we can try and weld
18761
14:08:46,239 --> 14:08:50,559
this with gcc the build is going to go
18762
14:08:49,199 --> 14:08:52,719
through so we're going to bring up a
18763
14:08:50,559 --> 14:08:55,839
terminal so that we can run this and
18764
14:08:52,720 --> 14:08:57,275
we're going to clear and let's see what
18765
14:08:57,275 --> 14:09:02,559
run rooster here so we're going to print
18766
14:09:00,080 --> 14:09:04,400
the full name the full name is empty
18767
14:09:02,559 --> 14:09:06,239
okay so we're not going to see anything
18768
14:09:04,400 --> 14:09:08,800
because it is empty we're going to see
18769
14:09:06,239 --> 14:09:11,680
planet planet is this thing we have in
18770
14:09:08,800 --> 14:09:14,480
here planet where the sky is blue so
18771
14:09:11,680 --> 14:09:17,199
this is what we expect we can say
18772
14:09:14,480 --> 14:09:19,200
preferred planet and put in the text for
18773
14:09:17,199 --> 14:09:20,799
the planet here so we're going to get
18774
14:09:20,800 --> 14:09:24,956
and if we have a message and say hello
18775
14:09:24,955 --> 14:09:29,275
first characters in this string literal
18776
14:09:27,436 --> 14:09:31,680
message is going to say hello which is
18777
14:09:29,275 --> 14:09:33,199
what we are saying here let's go down
18778
14:09:31,680 --> 14:09:35,519
and look at where the message is going
18779
14:09:33,199 --> 14:09:39,039
to be for ease which is what we have
18780
14:09:35,519 --> 14:09:41,519
here and we can initialize saying hello
18781
14:09:39,040 --> 14:09:44,559
with part of what we have in greeting
18782
14:09:41,519 --> 14:09:46,719
and we have targeted this word string
18783
14:09:44,559 --> 14:09:49,199
here and it is what we see here and this
18784
14:09:46,720 --> 14:09:51,520
is pretty cool the good thing about hdd
18785
14:09:49,199 --> 14:09:53,595
string however is that you can
18786
14:09:51,519 --> 14:09:57,199
store in more characters than we
18787
14:09:53,595 --> 14:09:59,519
initialize this guy with so for example
18788
14:09:57,199 --> 14:10:00,639
here we have this message here but we
18789
14:10:00,639 --> 14:10:05,116
planet let's go down here and say it
18790
14:10:02,800 --> 14:10:07,360
we're going to change std string at run
18791
14:10:05,116 --> 14:10:08,880
time so we're going to say planet and
18792
14:10:07,360 --> 14:10:10,720
we're going to assign something to it
18793
14:10:08,879 --> 14:10:12,799
we're going to put in whatever was in
18794
14:10:10,720 --> 14:10:14,880
there first and we're going to paste
18795
14:10:12,800 --> 14:10:16,956
that in multiple times let's do three
18796
14:10:14,879 --> 14:10:19,595
times i think that's going to be enough
18797
14:10:16,955 --> 14:10:21,839
or we can even bring this back so that
18798
14:10:19,595 --> 14:10:24,159
we see the entire thing here doesn't
18799
14:10:21,839 --> 14:10:27,275
really matter all we want is for this
18800
14:10:24,160 --> 14:10:28,560
thing to be larger than it was initially
18801
14:10:28,559 --> 14:10:33,040
in a planet here so we're going to
18802
14:10:31,040 --> 14:10:35,520
remove these quotes because they are
18803
14:10:33,040 --> 14:10:37,436
making things ugly for us and now it's
18804
14:10:35,519 --> 14:10:40,879
going to be a valid strength let's wait
18805
14:10:37,436 --> 14:10:42,800
for visual studio code to realize that
18806
14:10:40,879 --> 14:10:45,199
and it's going to remove these squiggly
18807
14:10:42,800 --> 14:10:47,756
lines now we are good std string is
18808
14:10:45,199 --> 14:10:48,719
automatically going to take care of the
18809
14:10:48,720 --> 14:10:53,436
to make this string grow we don't have
18810
14:10:51,360 --> 14:10:55,116
to worry about that and if we print
18811
14:10:53,436 --> 14:10:57,596
planet now we're going to see the same
18812
14:10:55,116 --> 14:11:00,319
details and taken care of okay this is
18813
14:10:57,595 --> 14:11:01,756
really cool and it makes it super easy
18814
14:11:01,756 --> 14:11:07,200
text and string data like you see here
18815
14:11:04,559 --> 14:11:08,319
so let's build again so that our changes
18816
14:11:08,319 --> 14:11:13,199
reflected in our output we're going to
18817
14:11:10,639 --> 14:11:15,839
clear and run rooster and we're going to
18818
14:11:13,199 --> 14:11:17,115
see that planet is now really large okay
18819
14:11:17,116 --> 14:11:21,360
this thing the size of this thing at
18820
14:11:19,199 --> 14:11:23,519
runtime and this is something we
18821
14:11:21,360 --> 14:11:25,840
couldn't do with arrays so for example
18822
14:11:23,519 --> 14:11:28,559
if we go down here and use a row array
18823
14:11:25,839 --> 14:11:30,639
to do something like this this code is
18824
14:11:28,559 --> 14:11:32,479
going to run but try to think about what
18825
14:11:30,639 --> 14:11:35,360
is really happening here we have an
18826
14:11:32,480 --> 14:11:38,160
array which contains this text here
18827
14:11:35,360 --> 14:11:40,559
and it is pointed to by this cost card
18828
14:11:38,160 --> 14:11:42,800
pointer that we have if we try and do an
18829
14:11:40,559 --> 14:11:46,079
assignment like this this is really
18830
14:11:42,800 --> 14:11:49,040
going to be to make it point to another
18831
14:11:46,080 --> 14:11:50,880
character array in memory and this piece
18832
14:11:49,040 --> 14:11:54,559
of memory here is basically going to be
18833
14:11:50,879 --> 14:11:57,360
wasted because we think we have our
18834
14:11:57,360 --> 14:12:01,840
this is not the case with std strength
18835
14:11:59,915 --> 14:12:04,239
because std strength when we do
18836
14:12:01,839 --> 14:12:06,559
something like this the initial memory
18837
14:12:06,559 --> 14:12:11,595
planet here is going to be returned to
18838
14:12:08,720 --> 14:12:13,756
the operand system and a new memory is
18839
14:12:11,595 --> 14:12:16,319
going to be allocated to contain this
18840
14:12:13,756 --> 14:12:19,360
new thing so the waste we're doing here
18841
14:12:16,319 --> 14:12:21,756
by just leaving this in memory and not
18842
14:12:19,360 --> 14:12:23,360
using it is not being done here so if we
18843
14:12:21,756 --> 14:12:26,239
try to print we're going to get the same
18844
14:12:23,360 --> 14:12:29,840
output but inside and how our memory is
18845
14:12:26,239 --> 14:12:32,159
managed hdd string is better in that the
18846
14:12:29,839 --> 14:12:34,879
memory that was used to initialize this
18847
14:12:34,879 --> 14:12:39,199
here with array what we really are doing
18848
14:12:37,040 --> 14:12:42,080
is just make this planet pointer point
18849
14:12:39,199 --> 14:12:43,755
to another string and leaving this to be
18850
14:12:42,080 --> 14:12:46,080
wasted in memory this is what we are
18851
14:12:43,756 --> 14:12:47,756
doing here and we can avoid that with
18852
14:12:47,756 --> 14:12:52,400
in this lecture we're going to learn
18853
14:12:49,275 --> 14:12:55,519
about the one definition rule and this
18854
14:12:52,400 --> 14:12:58,800
is a rule that says definitions can't
18855
14:12:55,519 --> 14:13:01,839
show up more than once in your entire c
18856
14:12:58,800 --> 14:13:04,240
plus plus program or in some cases a
18857
14:13:01,839 --> 14:13:06,559
definition can show up more than once in
18858
14:13:04,239 --> 14:13:08,720
a translation unit we are going to look
18859
14:13:06,559 --> 14:13:10,955
at the one definition rule in the
18860
14:13:08,720 --> 14:13:13,916
context of freestanding variables
18861
14:13:10,955 --> 14:13:17,116
functions classes member functions and
18862
14:13:13,915 --> 14:13:19,595
static members in our classes in most
18863
14:13:17,116 --> 14:13:22,240
cases a definition can't really show up
18864
14:13:19,595 --> 14:13:24,955
more than once in your entire c-plus
18865
14:13:22,239 --> 14:13:27,680
plus program but we have exceptions to
18866
14:13:24,955 --> 14:13:30,319
this rule and the exception is for
18867
14:13:27,680 --> 14:13:34,000
classes a definition for a class can
18868
14:13:30,319 --> 14:13:35,360
show up in multiple translation unit and
18869
14:13:35,360 --> 14:13:39,915
we need to create objects of those
18870
14:13:37,360 --> 14:13:42,239
classes so each translation unit really
18871
14:13:39,915 --> 14:13:45,115
needs to see the definition for the
18872
14:13:42,239 --> 14:13:47,839
class and we are going to try and make
18873
14:13:45,116 --> 14:13:50,400
this super clear with examples once we
18874
14:13:47,839 --> 14:13:52,639
hit visual studio code okay so it is
18875
14:13:50,400 --> 14:13:55,275
time to head over to visual studio code
18876
14:13:52,639 --> 14:13:57,839
and shed some more light on the one
18877
14:13:55,275 --> 14:13:59,839
definition rule here we are in our
18878
14:13:57,839 --> 14:14:01,915
working folder the current project is
18879
14:13:59,839 --> 14:14:04,879
one definition rule we're going to grab
18880
14:14:01,915 --> 14:14:06,639
our template files like we always do
18881
14:14:04,879 --> 14:14:08,479
we're going to put them in place and
18882
14:14:06,639 --> 14:14:10,400
we're going to open this little guy in
18883
14:14:08,480 --> 14:14:12,000
visual studio code let's do that i'm
18884
14:14:10,400 --> 14:14:13,756
going to drag and drop and we're going
18885
14:14:12,000 --> 14:14:15,595
to have our main cpp file here we're
18886
14:14:13,756 --> 14:14:17,520
going to clean it up that's what we
18887
14:14:17,519 --> 14:14:22,079
and now we want to explore the one
18888
14:14:20,239 --> 14:14:24,639
definition rule in the context of
18889
14:14:22,080 --> 14:14:27,040
variables so we have a freestanding
18890
14:14:27,040 --> 14:14:30,720
and that's going to be the same variable
18891
14:14:28,800 --> 14:14:33,116
we had in the last lecture we're going
18892
14:14:30,720 --> 14:14:36,080
to initialize this and this is really
18893
14:14:33,116 --> 14:14:38,000
good we can use it we can go in main and
18894
14:14:36,080 --> 14:14:39,116
use it however we want we can print the
18895
14:14:39,116 --> 14:14:43,916
and if we won't run this program it is
18896
14:14:41,360 --> 14:14:46,955
going to work but the one definition
18897
14:14:43,915 --> 14:14:50,159
rule says we can't have more than one
18898
14:14:46,955 --> 14:14:52,080
definition for anything and for this
18899
14:14:50,160 --> 14:14:54,320
variable here we have seen that this is
18900
14:14:54,319 --> 14:14:59,595
and a definition so we can't have more
18901
14:14:57,040 --> 14:15:02,160
than one definition for the weight name
18902
14:14:59,595 --> 14:15:04,479
here for example if we try and grab it
18903
14:15:02,160 --> 14:15:06,240
and copy and paste it here so we're
18904
14:15:04,480 --> 14:15:08,560
going to try and build this program
18905
14:15:08,559 --> 14:15:12,115
we're going to see that we have a
18906
14:15:09,756 --> 14:15:13,756
problem and the problem is going to say
18907
14:15:13,756 --> 14:15:18,400
of double weight and it is not going to
18908
14:15:16,319 --> 14:15:20,639
help even if you take this and put that
18909
14:15:18,400 --> 14:15:22,319
in another file so let's create another
18910
14:15:20,639 --> 14:15:26,159
file to really show you that we're going
18911
14:15:22,319 --> 14:15:29,199
to call it some other file that cpp and
18912
14:15:26,160 --> 14:15:31,436
we're going to grab our redefinition
18913
14:15:31,436 --> 14:15:35,756
and you're going to see that if we try
18914
14:15:35,756 --> 14:15:39,200
we're going to get the same problem
18915
14:15:37,040 --> 14:15:40,879
we're going to have redefinition so
18916
14:15:40,879 --> 14:15:44,639
what is the problem here the compiler
18917
14:15:42,639 --> 14:15:47,595
error is a little bit different but it
18918
14:15:44,639 --> 14:15:48,400
is going to say multiple definitions of
18919
14:15:48,400 --> 14:15:53,916
and it's going to say one is defined in
18920
14:15:50,639 --> 14:15:56,400
the main cpp file so this is a linker
18921
14:15:53,915 --> 14:15:58,879
error this was caught by the laker
18922
14:15:56,400 --> 14:16:01,520
because the redefinition is showing up
18923
14:15:58,879 --> 14:16:03,755
in multiple files so the linker was
18924
14:16:01,519 --> 14:16:06,000
linking this program and it needed to
18925
14:16:03,756 --> 14:16:09,040
see a definition for weight and it had
18926
14:16:06,000 --> 14:16:10,955
seen one definition in the main cpp file
18927
14:16:09,040 --> 14:16:13,275
and it has seen another definition and
18928
14:16:10,955 --> 14:16:15,040
some other file and this is a problem
18929
14:16:13,275 --> 14:16:17,275
the linker doesn't know which one to
18930
14:16:15,040 --> 14:16:19,200
choose so it's going to throw an error
18931
14:16:17,275 --> 14:16:21,595
and you can't really have multiple
18932
14:16:19,199 --> 14:16:23,839
definitions for a variable in your c
18933
14:16:21,595 --> 14:16:26,559
plus plus program and this is the one
18934
14:16:23,839 --> 14:16:28,559
definition rule and the context of
18935
14:16:26,559 --> 14:16:31,435
freestanding variables like the weight
18936
14:16:28,559 --> 14:16:34,319
here but this is the same in the context
18937
14:16:31,436 --> 14:16:36,639
of functions if we go down and put up
18938
14:16:34,319 --> 14:16:37,595
our add function here we're going to say
18939
14:16:38,400 --> 14:16:43,756
and double b here and we're going to put
18940
14:16:40,955 --> 14:16:45,275
the definition below the main cpp file
18941
14:16:45,275 --> 14:16:49,915
we can copy this and put this in the
18942
14:16:48,160 --> 14:16:51,436
code here i'm going to remove this
18943
14:16:49,915 --> 14:16:53,435
little thing we don't want it we're
18944
14:16:51,436 --> 14:16:56,160
going to put in our body and we're going
18945
14:16:53,436 --> 14:16:58,720
to return a plus b here okay so this is
18946
14:16:56,160 --> 14:17:00,956
our function it is working we can take
18947
14:16:58,720 --> 14:17:03,275
out what we had here because it has
18948
14:17:00,955 --> 14:17:05,756
served its purpose you can say double
18949
14:17:03,275 --> 14:17:08,239
result and we're going to add up 10 and
18950
14:17:05,756 --> 14:17:10,955
20 like we did in the last lecture
18951
14:17:08,239 --> 14:17:12,720
no problem and we can try and print out
18952
14:17:12,720 --> 14:17:16,639
if we build and run this program it is
18953
14:17:14,559 --> 14:17:19,756
going to work without a problem because
18954
14:17:16,639 --> 14:17:20,720
we only have one definition for the add
18955
14:17:20,720 --> 14:17:25,756
what is the problem here we have weight
18956
14:17:23,519 --> 14:17:27,519
defined multiple times we're going to
18957
14:17:25,756 --> 14:17:28,955
comment out one the definition for
18958
14:17:28,955 --> 14:17:33,116
and we're going to build again
18959
14:17:31,360 --> 14:17:35,360
now the build is good and we can run
18960
14:17:35,360 --> 14:17:39,520
kill our terminal here and bring up
18961
14:17:37,519 --> 14:17:42,399
another one and run rooster you're going
18962
14:17:39,519 --> 14:17:45,199
to see that the result is 30 and the
18963
14:17:42,400 --> 14:17:47,360
program is working just fine but if we
18964
14:17:45,199 --> 14:17:50,799
set up another definition for add even
18965
14:17:47,360 --> 14:17:52,800
if we put this in the same file
18966
14:17:50,800 --> 14:17:55,596
we're going to get a problem because we
18967
14:17:52,800 --> 14:17:57,116
are violating the one definition rule
18968
14:17:57,116 --> 14:18:00,319
you're going to see the problem here
18969
14:17:58,480 --> 14:18:02,720
we're going to see redefinition
18970
14:18:00,319 --> 14:18:04,559
redefinition of the add function this is
18971
14:18:02,720 --> 14:18:07,200
not allowed your program is not going to
18972
14:18:04,559 --> 14:18:08,955
compile we see the compiler error here
18973
14:18:07,199 --> 14:18:11,199
even if you put the definition in
18974
14:18:08,955 --> 14:18:13,360
another file that's not going to help
18975
14:18:11,199 --> 14:18:15,755
we're going to take this and put this in
18976
14:18:15,756 --> 14:18:19,436
and try to compile the program
18977
14:18:20,400 --> 14:18:24,319
we're going to get a linker error and it
18978
14:18:22,319 --> 14:18:27,116
is going to say multiple definition of
18979
14:18:24,319 --> 14:18:29,436
the add function and this is not allowed
18980
14:18:27,116 --> 14:18:31,680
this is a linker error in this time if
18981
14:18:29,436 --> 14:18:33,596
we comment out one definition let's do
18982
14:18:31,680 --> 14:18:35,680
that we're going to comment out the one
18983
14:18:33,595 --> 14:18:38,799
in the main function this is going to
18984
14:18:35,680 --> 14:18:41,360
work and we want to be violating the one
18985
14:18:38,800 --> 14:18:43,436
definition rule so this is good the
18986
14:18:43,436 --> 14:18:48,000
and run rooster we're going to see our
18987
14:18:45,360 --> 14:18:50,559
result here so the one definition rule
18988
14:18:48,000 --> 14:18:51,360
says you can't have multiple definitions
18989
14:18:51,360 --> 14:18:55,840
freestanding variables or even functions
18990
14:18:54,239 --> 14:18:58,079
and reserve that if you do that you're
18991
14:18:55,839 --> 14:19:00,399
going to get a compiler error let's look
18992
14:18:58,080 --> 14:19:01,840
at this in the context of classes we're
18993
14:19:00,400 --> 14:19:04,080
going to do a class we're going to say
18994
14:19:01,839 --> 14:19:06,639
struct and we're going to call this
18995
14:19:06,639 --> 14:19:10,479
mostly we're going to call this point
18996
14:19:08,879 --> 14:19:13,199
and we're going to put in a few member
18997
14:19:10,480 --> 14:19:15,436
variables one is going to be mx the
18998
14:19:15,436 --> 14:19:18,319
and this is going to be our definition
18999
14:19:18,319 --> 14:19:23,116
but what you're going to see
19000
14:19:20,480 --> 14:19:26,080
is that it is possible to have multiple
19001
14:19:23,116 --> 14:19:28,480
definitions for classes for example if
19002
14:19:28,480 --> 14:19:32,319
have a copy of this in another file
19003
14:19:30,800 --> 14:19:34,880
we're going to do that we're going to
19004
14:19:34,879 --> 14:19:39,275
and we're going to try and build this
19005
14:19:36,839 --> 14:19:41,199
program you're going to see that it is
19006
14:19:39,275 --> 14:19:44,079
working we have multiple definitions of
19007
14:19:41,199 --> 14:19:46,079
these guys we can go in main for example
19008
14:19:47,199 --> 14:19:51,360
and we can up weld and see that the
19009
14:19:49,116 --> 14:19:54,319
program is going to work okay so if you
19010
14:19:51,360 --> 14:19:56,160
go in here for example and try to print
19011
14:19:56,160 --> 14:20:01,116
p1 and the print x we're going to do
19012
14:19:58,559 --> 14:20:03,040
that we're going to say p1 mx we're
19013
14:20:01,116 --> 14:20:05,360
going to be able to use this because
19014
14:20:03,040 --> 14:20:08,000
this is a struct the member variables
19015
14:20:05,360 --> 14:20:09,520
are public by default we can do this
19016
14:20:13,116 --> 14:20:20,400
p1y my let's do that and we can say
19017
14:20:16,800 --> 14:20:23,840
stdndl what is the problem here we need
19018
14:20:20,400 --> 14:20:25,596
to put our output stream operator
19019
14:20:23,839 --> 14:20:26,559
i think now the compiler is going to be
19020
14:20:30,400 --> 14:20:34,000
we're going to see that if we run the
19021
14:20:31,915 --> 14:20:36,159
program we're going to see our things
19022
14:20:34,000 --> 14:20:38,400
here and we have some junk values inside
19023
14:20:36,160 --> 14:20:40,800
because these things are not initialized
19024
14:20:38,400 --> 14:20:43,116
but if we initialize them to zero using
19025
14:20:40,800 --> 14:20:45,276
the braced initialization here
19026
14:20:45,275 --> 14:20:51,360
and we should see zero inside so let's
19027
14:20:47,839 --> 14:20:53,679
clear and run rooster now we have 0 in x
19028
14:20:51,360 --> 14:20:55,595
and y for our object here this is
19029
14:20:53,680 --> 14:20:58,639
working fine and we have multiple
19030
14:20:55,595 --> 14:21:01,199
definitions for our class but the
19031
14:20:58,639 --> 14:21:03,915
definitions can't show up in a single
19032
14:21:01,199 --> 14:21:06,000
translation unit for example if we took
19033
14:21:06,000 --> 14:21:10,160
and brought that back in main and put
19034
14:21:10,160 --> 14:21:15,040
our structure here if we try to weld the
19035
14:21:13,199 --> 14:21:17,755
compiler is going to complain because
19036
14:21:15,040 --> 14:21:20,879
now we have multiple definitions for the
19037
14:21:17,756 --> 14:21:22,319
same class in the same translation unit
19038
14:21:22,319 --> 14:21:27,756
we can have multiple definitions but the
19039
14:21:24,800 --> 14:21:29,680
definitions have to show up in different
19040
14:21:27,756 --> 14:21:31,436
translation units and that's what i want
19041
14:21:31,436 --> 14:21:36,319
redefinition of our point struct and it
19042
14:21:34,239 --> 14:21:38,639
is not good it is going to violate the
19043
14:21:36,319 --> 14:21:40,800
one definition rule okay now that you
19044
14:21:38,639 --> 14:21:43,040
have seen this we also want to see this
19045
14:21:43,040 --> 14:21:47,040
that also has some static member
19046
14:21:45,116 --> 14:21:49,200
variables we're going to take this out
19047
14:21:47,040 --> 14:21:51,840
because we have already seen this and
19048
14:21:49,199 --> 14:21:54,079
we're going to bring in our person class
19049
14:21:51,839 --> 14:21:56,239
like we used in the last lecture we're
19050
14:21:54,080 --> 14:21:59,040
going to add in a new header file it's
19051
14:22:02,879 --> 14:22:09,360
what did we do is this folder let's
19052
14:22:06,239 --> 14:22:11,436
remove this we didn't want a folder
19053
14:22:09,360 --> 14:22:13,360
we're going to delete this folder we
19054
14:22:13,360 --> 14:22:18,879
and we're going to just add a file
19055
14:22:18,879 --> 14:22:22,639
that's all file here and we're going to
19056
14:22:20,559 --> 14:22:24,479
put in the content the content is going
19057
14:22:22,639 --> 14:22:26,720
to be our personal class let's close
19058
14:22:24,480 --> 14:22:29,596
this so that you can see more of this
19059
14:22:26,720 --> 14:22:32,080
class here okay so we have our person
19060
14:22:29,595 --> 14:22:34,720
class here we have our include card we
19061
14:22:32,080 --> 14:22:36,480
have our person class definition we have
19062
14:22:34,720 --> 14:22:37,916
a constructor and we have a printer
19063
14:22:36,480 --> 14:22:40,080
phone function we have our member
19064
14:22:37,915 --> 14:22:42,319
variables and down below here you see
19065
14:22:40,080 --> 14:22:44,480
that we have a static variable which is
19066
14:22:42,319 --> 14:22:47,040
person account we need to put in the
19067
14:22:44,480 --> 14:22:49,520
definition for these guys so let's go
19068
14:22:47,040 --> 14:22:51,520
down and do that we're going to put in
19069
14:22:51,519 --> 14:22:56,559
constructor we're going to go on top
19070
14:22:53,519 --> 14:22:58,239
here and include our person header file
19071
14:22:56,559 --> 14:23:00,159
and we're going to put in place our
19072
14:22:58,239 --> 14:23:03,040
constructor we can go down and do that
19073
14:23:00,160 --> 14:23:04,956
we can say person and say person
19074
14:23:03,040 --> 14:23:07,436
that's going to be our constructor we're
19075
14:23:04,955 --> 14:23:09,595
going to go back to the class and grab
19076
14:23:07,436 --> 14:23:11,680
the parameters because i don't want to
19077
14:23:11,680 --> 14:23:14,800
so let's do that we're going to put them
19078
14:23:14,800 --> 14:23:19,840
we are going to put in our initializer
19079
14:23:17,436 --> 14:23:22,160
list i think we should also delete a
19080
14:23:19,839 --> 14:23:24,399
parenthesis here we're going to go down
19081
14:23:22,160 --> 14:23:26,240
and put in our initializer list we're
19082
14:23:24,400 --> 14:23:28,720
going to say full name we're going to
19083
14:23:26,239 --> 14:23:32,239
initialize this with name param
19084
14:23:28,720 --> 14:23:34,000
and we're going to also put in our age
19085
14:23:32,239 --> 14:23:36,079
and we're going to initialize this with
19086
14:23:34,000 --> 14:23:39,040
edge param the parameter we have from
19087
14:23:36,080 --> 14:23:41,916
the function and this is going to be all
19088
14:23:39,040 --> 14:23:43,680
inside the body we're going to implement
19089
14:23:41,915 --> 14:23:46,159
the static variable we're going to say
19090
14:23:43,680 --> 14:23:48,800
increment person count okay now select
19091
14:23:46,160 --> 14:23:51,360
that here and this is going to be good
19092
14:23:48,800 --> 14:23:52,956
we also need to initialize our static
19093
14:23:51,360 --> 14:23:56,160
variables so we're going to say ends
19094
14:23:52,955 --> 14:23:58,159
person person account let's do person
19095
14:23:56,160 --> 14:24:00,240
account and we're going to initialize
19096
14:23:58,160 --> 14:24:03,436
this to maybe eight like we did in the
19097
14:24:00,239 --> 14:24:05,915
last lecture and this should be all we
19098
14:24:03,436 --> 14:24:08,480
need here so if we build and run this
19099
14:24:05,915 --> 14:24:10,799
program i think it's going to run
19100
14:24:08,480 --> 14:24:12,640
let's select the main function here
19101
14:24:10,800 --> 14:24:14,400
and what problem do we have here let's
19102
14:24:12,639 --> 14:24:16,800
build and see we're going to let the
19103
14:24:16,800 --> 14:24:20,639
we're going to see that the world is
19104
14:24:18,239 --> 14:24:22,479
good and we can create person objects
19105
14:24:20,639 --> 14:24:24,639
and really use them in our program so
19106
14:24:22,480 --> 14:24:27,276
let's come down here and delete whatever
19107
14:24:24,639 --> 14:24:28,800
we had we're going to include the person
19108
14:24:27,275 --> 14:24:30,239
and we're going to go down here and
19109
14:24:28,800 --> 14:24:32,160
create a person object we're going to
19110
14:24:32,160 --> 14:24:37,040
p1 and we're going to specify the name
19111
14:24:37,040 --> 14:24:41,116
and we're going to say that they are
19112
14:24:41,116 --> 14:24:45,756
and we can preach information about this
19113
14:24:42,955 --> 14:24:48,000
person we can say person principle and
19114
14:24:45,756 --> 14:24:50,000
if we try to build this program let's
19115
14:24:50,000 --> 14:24:54,480
the world is going to be good as you see
19116
14:24:54,480 --> 14:24:58,080
and run rooster we're going to see jon
19117
14:24:58,080 --> 14:25:02,955
35 years old so this is working just
19118
14:25:02,955 --> 14:25:09,199
multiple definitions for the same class
19119
14:25:06,400 --> 14:25:11,040
in the same translation unit here for
19120
14:25:09,199 --> 14:25:13,680
example if we come in the main function
19121
14:25:11,040 --> 14:25:15,840
notice we are including a person so this
19122
14:25:13,680 --> 14:25:19,199
is bringing in the definition for a
19123
14:25:15,839 --> 14:25:21,275
person we have in our person.h here if
19124
14:25:19,199 --> 14:25:22,799
we also try to declare another class
19125
14:25:22,800 --> 14:25:28,400
even if we don't put anything in the
19126
14:25:25,915 --> 14:25:31,040
compiler is going to complain because we
19127
14:25:28,400 --> 14:25:34,720
have two definitions for the same name
19128
14:25:31,040 --> 14:25:36,319
which is person here if we try to build
19129
14:25:34,720 --> 14:25:38,480
i think we are going to get a compiler
19130
14:25:36,319 --> 14:25:41,040
error saying that we have a definition
19131
14:25:38,480 --> 14:25:42,880
you see we have a redefinition of person
19132
14:25:41,040 --> 14:25:45,360
so this is not allowed we can't really
19133
14:25:42,879 --> 14:25:48,719
do this but notice that this person
19134
14:25:45,360 --> 14:25:50,800
class is included both in some other
19135
14:25:48,720 --> 14:25:54,160
file which is a separate translation
19136
14:25:50,800 --> 14:25:56,319
unit and main we have it included here
19137
14:25:54,160 --> 14:25:58,956
so it is really in a separate
19138
14:25:56,319 --> 14:26:01,116
translation unit we have the definition
19139
14:25:58,955 --> 14:26:03,519
for the class in separate translation
19140
14:26:01,116 --> 14:26:05,680
units and that's not a problem but if
19141
14:26:03,519 --> 14:26:09,039
you try and put the same definition
19142
14:26:05,680 --> 14:26:10,955
multiple times in a single translation
19143
14:26:09,040 --> 14:26:13,360
unit you're going to get a problem and
19144
14:26:10,955 --> 14:26:16,080
you need to be aware of that what i want
19145
14:26:13,360 --> 14:26:18,559
you to see right here is that you can't
19146
14:26:16,080 --> 14:26:22,400
also have multiple definitions
19147
14:26:18,559 --> 14:26:25,595
for your static variables and the member
19148
14:26:22,400 --> 14:26:28,160
functions of your class for example if
19149
14:26:28,160 --> 14:26:32,880
and also put that in our main function
19150
14:26:30,559 --> 14:26:35,115
we can do that why not we're going to
19151
14:26:32,879 --> 14:26:37,595
come in our main function here and we're
19152
14:26:35,116 --> 14:26:39,040
going to put the same definitions here
19153
14:26:37,595 --> 14:26:40,955
now we're going to have a problem
19154
14:26:39,040 --> 14:26:43,680
because the linker is going to see two
19155
14:26:40,955 --> 14:26:45,680
definitions for the static variable and
19156
14:26:43,680 --> 14:26:47,275
the constructor for a person here and
19157
14:26:45,680 --> 14:26:49,840
this is going to be a problem you can't
19158
14:26:47,275 --> 14:26:50,955
really do that if we build we're going
19159
14:26:50,955 --> 14:26:55,436
a problem we're going to see
19160
14:26:55,436 --> 14:26:59,756
we have multiple definitions for the
19161
14:26:57,199 --> 14:27:02,479
constructor and we have multiple
19162
14:26:59,756 --> 14:27:04,559
definitions for person account and this
19163
14:27:02,480 --> 14:27:07,200
is not allowed you can't really do that
19164
14:27:04,559 --> 14:27:09,839
you can either remove the one from some
19165
14:27:07,199 --> 14:27:11,115
other file.cpp for example if we comment
19166
14:27:11,116 --> 14:27:16,160
let's do that we can come on top here
19167
14:27:13,915 --> 14:27:18,399
and comment this out and try to build
19168
14:27:16,160 --> 14:27:20,720
the program now the program is going to
19169
14:27:18,400 --> 14:27:22,800
work because we have one definition for
19170
14:27:20,720 --> 14:27:25,360
these guys you see the world is good we
19171
14:27:22,800 --> 14:27:28,000
can even run the program to show you
19172
14:27:25,360 --> 14:27:31,116
that it works or we can remove the one
19173
14:27:28,000 --> 14:27:33,680
in the main cpp file and we can leave
19174
14:27:31,116 --> 14:27:36,560
this alive so let's go back in the cpp
19175
14:27:33,680 --> 14:27:38,639
file the main cpp file i should say and
19176
14:27:36,559 --> 14:27:40,799
remove this and if we work we're going
19177
14:27:38,639 --> 14:27:42,479
to see that this is going to work and
19178
14:27:42,480 --> 14:27:49,040
compliant with what the c plus plus
19179
14:27:45,275 --> 14:27:50,720
standard expects us to do in our c plus
19180
14:27:49,040 --> 14:27:52,480
plus programs if we're around we're
19181
14:27:50,720 --> 14:27:54,400
going to see that this is going to work
19182
14:27:52,480 --> 14:27:56,956
and this is really cool this is really
19183
14:27:54,400 --> 14:27:59,275
all i wanted you to see in this lecture
19184
14:27:56,955 --> 14:28:02,879
the one definition rule which says that
19185
14:27:59,275 --> 14:28:06,079
you can't have multiple definitions for
19186
14:28:02,879 --> 14:28:09,360
the same name in your entire c plus plus
19187
14:28:06,080 --> 14:28:12,240
program but for classes we can violate
19188
14:28:09,360 --> 14:28:14,800
this rule a little bit and make the same
19189
14:28:12,239 --> 14:28:17,275
definition show up in multiple
19190
14:28:14,800 --> 14:28:19,276
translation units we are going to stop
19191
14:28:17,275 --> 14:28:22,000
here in this lecture in the next one
19192
14:28:19,275 --> 14:28:24,319
we're going to learn about linkage
19193
14:28:22,000 --> 14:28:25,360
go ahead and finish up here and make me
19194
14:28:25,360 --> 14:28:29,520
in this lecture we're going to learn
19195
14:28:26,800 --> 14:28:31,756
about functions a function is a reusable
19196
14:28:29,519 --> 14:28:35,435
piece of code that you can use multiple
19197
14:28:31,756 --> 14:28:38,400
times to do different things it can take
19198
14:28:35,436 --> 14:28:40,880
input and once it has input it can do
19199
14:28:38,400 --> 14:28:43,756
some processing and when the processing
19200
14:28:40,879 --> 14:28:46,079
is done the function can optionally give
19201
14:28:43,756 --> 14:28:48,480
you a result you can think of a function
19202
14:28:46,080 --> 14:28:50,955
as a machine which can take input and
19203
14:28:48,480 --> 14:28:52,480
give you some output when you give input
19204
14:28:50,955 --> 14:28:54,799
to the machine the machine is going to
19205
14:28:52,480 --> 14:28:57,520
do some processing and then it's going
19206
14:28:54,800 --> 14:28:59,680
to give you the output and the output is
19207
14:28:57,519 --> 14:29:01,595
going to be dependent on the input that
19208
14:28:59,680 --> 14:29:04,239
you gave to the machine this is really
19209
14:29:01,595 --> 14:29:06,399
how a function works in c plus plus and
19210
14:29:04,239 --> 14:29:09,115
once you have the machine set up you can
19211
14:29:06,400 --> 14:29:11,275
really reuse it however many times you
19212
14:29:09,116 --> 14:29:13,680
want let's look at how a function looks
19213
14:29:11,275 --> 14:29:16,239
in c plus plus the syntax is this you
19214
14:29:13,680 --> 14:29:18,879
first specify the return type which may
19215
14:29:16,239 --> 14:29:20,720
be and double or whatever after that
19216
14:29:18,879 --> 14:29:21,680
you're going to specify the function
19217
14:29:21,680 --> 14:29:25,756
and after that you're going to have a
19218
14:29:23,519 --> 14:29:27,275
pair of parentheses inside this
19219
14:29:25,756 --> 14:29:29,520
parenthesis you're going to have your
19220
14:29:27,275 --> 14:29:32,319
parameters which is going to be a comma
19221
14:29:29,519 --> 14:29:35,435
separated list of things you pass to the
19222
14:29:32,319 --> 14:29:37,756
function and after all these parameters
19223
14:29:35,436 --> 14:29:40,639
you're going to have a pair of curly
19224
14:29:37,756 --> 14:29:42,319
braces and inside those curly braces
19225
14:29:40,639 --> 14:29:44,319
we're going to have the body of the
19226
14:29:42,319 --> 14:29:46,639
function we're going to be doing our
19227
14:29:44,319 --> 14:29:49,680
processing in the body and when the
19228
14:29:46,639 --> 14:29:52,479
processing is done we can get the result
19229
14:29:49,680 --> 14:29:55,040
of the function through this return
19230
14:29:52,480 --> 14:29:57,200
mechanism here so if we want to get
19231
14:29:55,040 --> 14:29:59,520
something out of the function we have to
19232
14:29:57,199 --> 14:30:03,115
return that thing and it is going to be
19233
14:29:59,519 --> 14:30:05,435
visible to whoever used this function
19234
14:30:03,116 --> 14:30:08,480
here is a simple example of a function
19235
14:30:05,436 --> 14:30:10,720
with no input and output the syntax is
19236
14:30:08,480 --> 14:30:12,800
going to be this void means that this
19237
14:30:10,720 --> 14:30:15,275
function is not going to return anything
19238
14:30:12,800 --> 14:30:18,480
and you notice that our pair of
19239
14:30:15,275 --> 14:30:21,275
parentheses is empty because we have no
19240
14:30:18,480 --> 14:30:24,000
input in this function we have our curly
19241
14:30:21,275 --> 14:30:25,839
braces and inside these curly braces is
19242
14:30:24,000 --> 14:30:28,160
going to be the body of this function
19243
14:30:25,839 --> 14:30:30,719
it's going to do some processing and
19244
14:30:28,160 --> 14:30:33,116
when processing is done we return out of
19245
14:30:30,720 --> 14:30:34,955
this function now remember that i said
19246
14:30:33,116 --> 14:30:39,116
that this function doesn't return
19247
14:30:34,955 --> 14:30:41,116
anything because it is of void type here
19248
14:30:39,116 --> 14:30:43,680
but we can return and i'm going to show
19249
14:30:41,116 --> 14:30:46,080
you the exact syntax of how you can do
19250
14:30:43,680 --> 14:30:48,400
that okay so we can have many functions
19251
14:30:46,080 --> 14:30:50,560
in c plus plus but each function has to
19252
14:30:48,400 --> 14:30:53,040
be unique otherwise you're going to have
19253
14:30:50,559 --> 14:30:55,756
problems in your c plus plus programs a
19254
14:30:53,040 --> 14:30:58,080
function is going to be unique based on
19255
14:30:55,756 --> 14:31:00,000
its signature and the signature is
19256
14:31:00,000 --> 14:31:05,199
plus the function parameters if we go
19257
14:31:02,639 --> 14:31:06,955
back to our example here and try to
19258
14:31:05,199 --> 14:31:10,000
figure out the signature of this
19259
14:31:06,955 --> 14:31:12,559
function it's going to be function name
19260
14:31:10,000 --> 14:31:15,275
and plus the parameters and you see that
19261
14:31:12,559 --> 14:31:18,399
we have no parameters in here so this
19262
14:31:15,275 --> 14:31:21,519
signature is going to uniquely identify
19263
14:31:18,400 --> 14:31:23,436
this function in our c plus plus program
19264
14:31:21,519 --> 14:31:25,680
if we set up another function that has
19265
14:31:23,436 --> 14:31:27,436
this same function name and doesn't take
19266
14:31:25,680 --> 14:31:30,160
any parameter we're going to have
19267
14:31:27,436 --> 14:31:33,200
problems even if we happen to have a
19268
14:31:30,160 --> 14:31:35,360
different return value for the function
19269
14:31:33,199 --> 14:31:38,159
and don't worry if this is not making
19270
14:31:35,360 --> 14:31:40,319
sense yet we will see a lot of examples
19271
14:31:38,160 --> 14:31:42,560
and i am sure by the time we are done
19272
14:31:40,319 --> 14:31:45,040
with this lecture you will be a master
19273
14:31:42,559 --> 14:31:47,435
at using functions okay now that we have
19274
14:31:45,040 --> 14:31:49,520
seen how we can declare or define a
19275
14:31:47,436 --> 14:31:51,200
function in c plus plus let's see how we
19276
14:31:51,199 --> 14:31:55,519
and when you call a function in most
19277
14:31:53,199 --> 14:31:58,479
cases you will want to get something out
19278
14:31:55,519 --> 14:32:00,639
of that function so suppose here result
19279
14:31:58,480 --> 14:32:02,319
var is a variable that is going to catch
19280
14:32:02,319 --> 14:32:05,680
and we're going to call the function
19281
14:32:03,680 --> 14:32:08,160
with the syntax like this we're going to
19282
14:32:05,680 --> 14:32:11,199
say the function name we're going to put
19283
14:32:08,160 --> 14:32:13,680
our pair of parentheses here and we are
19284
14:32:11,199 --> 14:32:16,559
going to pass in the arguments or of the
19285
14:32:13,680 --> 14:32:18,800
values of our parameters this is the
19286
14:32:16,559 --> 14:32:20,479
syntax it is going to call the function
19287
14:32:18,800 --> 14:32:24,160
and the result of the function is going
19288
14:32:20,480 --> 14:32:26,800
to be assigned to this result var
19289
14:32:24,160 --> 14:32:28,956
variable of hours here is how you can
19290
14:32:26,800 --> 14:32:31,040
call a function that doesn't take any
19291
14:32:28,955 --> 14:32:33,360
parameter the parameter list is
19292
14:32:31,040 --> 14:32:35,436
basically going to be empty and now
19293
14:32:33,360 --> 14:32:38,239
we're going to look at a few examples of
19294
14:32:35,436 --> 14:32:40,480
how you can really declare functions in
19295
14:32:38,239 --> 14:32:43,199
your c plus plus program for example
19296
14:32:40,480 --> 14:32:45,360
here we have a function called into bar
19297
14:32:43,199 --> 14:32:47,595
it doesn't return anything so we can't
19298
14:32:45,360 --> 14:32:50,160
catch the result of this function and
19299
14:32:47,595 --> 14:32:53,115
it's going to have one input in the form
19300
14:32:50,160 --> 14:32:56,080
of an integer so the parameter is called
19301
14:32:53,116 --> 14:32:58,720
h here it's an integer and inside the
19302
14:32:56,080 --> 14:33:02,080
function we are going to test if
19303
14:32:58,720 --> 14:33:04,319
somebody is old enough to enter a bar so
19304
14:33:02,080 --> 14:33:06,639
we do a test to see if the age is
19305
14:33:04,319 --> 14:33:10,559
greater than 18 if it is we're going to
19306
14:33:06,639 --> 14:33:12,479
tell them please proceed f the h is not
19307
14:33:10,559 --> 14:33:15,040
greater than 18 we're going to tell them
19308
14:33:12,480 --> 14:33:16,956
you cannot enter this is an example of a
19309
14:33:15,040 --> 14:33:19,275
function you can set up in your c plus
19310
14:33:16,955 --> 14:33:21,040
plus programs here is another function
19311
14:33:19,275 --> 14:33:23,595
that is going to compute the maximum
19312
14:33:21,040 --> 14:33:26,239
between two numbers it is going to give
19313
14:33:23,595 --> 14:33:29,199
us a result so the return value is an
19314
14:33:26,239 --> 14:33:31,199
integer here the function name is max
19315
14:33:29,199 --> 14:33:33,839
and we're going to put in our list of
19316
14:33:31,199 --> 14:33:36,719
parameters and again these are the
19317
14:33:33,839 --> 14:33:37,755
parameters when you are defining your
19318
14:33:37,756 --> 14:33:42,955
this comma separated list of things we
19319
14:33:40,319 --> 14:33:45,040
have in this parenthesis are called
19320
14:33:42,955 --> 14:33:47,839
parameters and when you call the
19321
14:33:45,040 --> 14:33:50,319
function the values that you pass in the
19322
14:33:47,839 --> 14:33:53,039
places of these parameters are called
19323
14:33:50,319 --> 14:33:55,275
arguments so these are a few terms that
19324
14:33:53,040 --> 14:33:58,000
can really throw you off and i just want
19325
14:33:55,275 --> 14:33:59,595
you to be super clear about these things
19326
14:33:58,000 --> 14:34:01,839
once we have the signature of the
19327
14:33:59,595 --> 14:34:03,680
function set up we jump in the body and
19328
14:34:01,839 --> 14:34:06,239
we do whatever we want this function to
19329
14:34:03,680 --> 14:34:08,639
do so we're going to say if a is greater
19330
14:34:06,239 --> 14:34:11,680
than b then a must be the maximum we're
19331
14:34:08,639 --> 14:34:14,000
going to send it that back to whoever
19332
14:34:11,680 --> 14:34:15,840
called this function or in other words
19333
14:34:15,839 --> 14:34:20,795
and if a is not greater than b then b
19334
14:34:18,879 --> 14:34:22,795
must be the maximum and we're going to
19335
14:34:20,796 --> 14:34:24,880
return it that's what we're saying here
19336
14:34:22,796 --> 14:34:27,680
here is another example of a function
19337
14:34:24,879 --> 14:34:30,319
that doesn't have any output and doesn't
19338
14:34:27,680 --> 14:34:33,360
take any input it doesn't return
19339
14:34:30,319 --> 14:34:35,680
anything because the return type is void
19340
14:34:33,360 --> 14:34:38,720
and it doesn't take any input because
19341
14:34:35,680 --> 14:34:40,639
the parameter list here is empty and the
19342
14:34:38,720 --> 14:34:43,360
body of the function we're just going to
19343
14:34:40,639 --> 14:34:44,955
greet somebody and tell them hello there
19344
14:34:43,360 --> 14:34:48,000
and we're going to return out of the
19345
14:34:44,955 --> 14:34:50,955
function notice that for avoid function
19346
14:34:48,000 --> 14:34:53,519
we can either omit the return statement
19347
14:34:50,955 --> 14:34:55,915
here or we can just put it in like this
19348
14:34:53,519 --> 14:34:58,079
say return and the semicolon and
19349
14:34:55,915 --> 14:35:01,040
whatever c plus plus compiler you are
19350
14:34:58,080 --> 14:35:02,480
using is going to accept this as valid c
19351
14:35:02,480 --> 14:35:07,756
here is another example of a function
19352
14:35:04,639 --> 14:35:10,000
that returns something but doesn't take
19353
14:35:07,756 --> 14:35:12,955
any input the return value is going to
19354
14:35:10,000 --> 14:35:14,879
be an integer but we don't need to pass
19355
14:35:12,955 --> 14:35:17,275
something to this function when we call
19356
14:35:14,879 --> 14:35:20,239
it it's just going to give us output we
19357
14:35:17,275 --> 14:35:22,879
can call it and get our lucky number and
19358
14:35:20,239 --> 14:35:25,436
use that however we want in our c plus
19359
14:35:22,879 --> 14:35:27,680
plus application i think we have seen a
19360
14:35:25,436 --> 14:35:30,319
lot of examples of how we can set up
19361
14:35:27,680 --> 14:35:32,796
functions now let's see how we can call
19362
14:35:30,319 --> 14:35:34,796
these functions here is a simple c plus
19363
14:35:32,796 --> 14:35:37,276
plus program in the main function we
19364
14:35:34,796 --> 14:35:40,400
just set up a few variables a value b
19365
14:35:37,275 --> 14:35:42,955
value a and b here and we use those
19366
14:35:40,400 --> 14:35:45,360
variables to call functions remember we
19367
14:35:42,955 --> 14:35:47,436
set up an inter bar function the
19368
14:35:45,360 --> 14:35:50,400
function looked like this and it was
19369
14:35:47,436 --> 14:35:52,796
testing to see if somebody's age was
19370
14:35:50,400 --> 14:35:55,756
greater than 18. if the age is greater
19371
14:35:52,796 --> 14:35:58,319
than 18 they are going to enter the bar
19372
14:35:55,756 --> 14:36:01,116
if the edge is not greater than 18 we
19373
14:35:58,319 --> 14:36:03,680
won't let them end the function takes
19374
14:36:01,116 --> 14:36:05,680
input but it doesn't return anything so
19375
14:36:03,680 --> 14:36:07,840
we can call this function like we do
19376
14:36:07,839 --> 14:36:11,519
and you notice that we're not catching
19377
14:36:09,756 --> 14:36:13,595
something out of this function we're
19378
14:36:11,519 --> 14:36:16,879
just going to call it and we're going to
19379
14:36:13,595 --> 14:36:18,639
give it input which is 22 here and the
19380
14:36:16,879 --> 14:36:21,915
function is going to do its thing so
19381
14:36:18,639 --> 14:36:24,879
it's going to let us in because our age
19382
14:36:21,915 --> 14:36:28,399
is greater than 18. down here you see we
19383
14:36:24,879 --> 14:36:31,680
are calling the max function here we are
19384
14:36:28,400 --> 14:36:34,000
giving it two inputs a value and b value
19385
14:36:31,680 --> 14:36:36,080
and it's going to return something and
19386
14:36:34,000 --> 14:36:38,720
the return value of this function is
19387
14:36:36,080 --> 14:36:41,680
going to be used to initialize this
19388
14:36:38,720 --> 14:36:44,239
maximum number variable here this is
19389
14:36:41,680 --> 14:36:46,160
what we are doing if we go down we see
19390
14:36:44,239 --> 14:36:49,436
that we can call the maximum function
19391
14:36:46,160 --> 14:36:52,160
directly and use its return value in an
19392
14:36:49,436 --> 14:36:54,480
sddc out statement here and this is
19393
14:36:52,160 --> 14:36:55,360
going to print out the maximum between a
19394
14:36:55,360 --> 14:36:59,275
and down here you see we have the
19395
14:36:57,040 --> 14:37:01,436
function say hello which is going to
19396
14:36:59,275 --> 14:37:03,839
just greet somebody and not return
19397
14:37:01,436 --> 14:37:05,596
anything here is another example of how
19398
14:37:03,839 --> 14:37:07,359
you can call the lucky number you say
19399
14:37:05,595 --> 14:37:08,479
lucky number you pass a pair of
19400
14:37:08,480 --> 14:37:13,840
and this is going to return the lucky
19401
14:37:10,160 --> 14:37:16,880
number and print it out in this htdc out
19402
14:37:13,839 --> 14:37:19,839
statement here down here we set up a few
19403
14:37:16,879 --> 14:37:22,319
variables a and b and we are going to
19404
14:37:19,839 --> 14:37:25,115
use them to call the maximum functions
19405
14:37:22,319 --> 14:37:28,559
you see we call max a b or we can even
19406
14:37:25,116 --> 14:37:30,639
pass in number literals like we are
19407
14:37:30,639 --> 14:37:34,479
one thing i want you to be careful about
19408
14:37:32,400 --> 14:37:36,080
is implicit conversions that might
19409
14:37:34,480 --> 14:37:37,276
happen when you are calling you
19410
14:37:37,275 --> 14:37:42,079
suppose we have a minimum function like
19411
14:37:39,756 --> 14:37:45,595
we see here which is going to be taking
19412
14:37:42,080 --> 14:37:48,319
in integer parameters but here we are
19413
14:37:45,595 --> 14:37:51,435
calling the function with f and g
19414
14:37:48,319 --> 14:37:54,080
which happen to be of double type like
19415
14:37:51,436 --> 14:37:55,840
we see on top here so what is going to
19416
14:37:54,080 --> 14:37:58,240
happen is the compiler is going to
19417
14:37:55,839 --> 14:38:00,639
notice that what you are passing in is
19418
14:37:58,239 --> 14:38:03,360
not really what the function takes but
19419
14:38:00,639 --> 14:38:06,879
the compiler knows that it can insert a
19420
14:38:03,360 --> 14:38:09,040
transformation from double to integer
19421
14:38:06,879 --> 14:38:11,755
and it is going to do that without your
19422
14:38:09,040 --> 14:38:14,239
involvement so be really careful about
19423
14:38:11,756 --> 14:38:16,955
implicit conversions and make sure they
19424
14:38:14,239 --> 14:38:18,639
are working to your advantage otherwise
19425
14:38:16,955 --> 14:38:21,199
you're going to have really hard to
19426
14:38:18,639 --> 14:38:22,559
debug problems in your c plus plus
19427
14:38:22,559 --> 14:38:26,639
one other thing i want you to be aware
19428
14:38:24,400 --> 14:38:29,360
of is that if we have a function set up
19429
14:38:26,639 --> 14:38:33,199
like this this function is going to be
19430
14:38:29,360 --> 14:38:35,756
taking parameters as copies so if you
19431
14:38:33,199 --> 14:38:37,275
have two variables for example c and d
19432
14:38:35,756 --> 14:38:39,436
and you call this function with those
19433
14:38:37,275 --> 14:38:41,680
two variables you're not going to be
19434
14:38:39,436 --> 14:38:44,160
manipulating those two variables what
19435
14:38:41,680 --> 14:38:46,955
you will be working with inside the body
19436
14:38:44,160 --> 14:38:48,720
of this function are going to be copies
19437
14:38:46,955 --> 14:38:51,040
of the parameters that you passed in
19438
14:38:48,720 --> 14:38:53,200
here so if for example you happen to
19439
14:38:51,040 --> 14:38:55,680
increment either of the parameters for
19440
14:38:53,199 --> 14:38:56,955
example here we increment a and we
19441
14:38:56,955 --> 14:39:01,116
the changes we make here inside the body
19442
14:38:59,199 --> 14:39:03,435
of the function are just going to be
19443
14:39:01,116 --> 14:39:05,756
affecting copies we have inside the
19444
14:39:03,436 --> 14:39:08,796
function here and these copies are going
19445
14:39:05,756 --> 14:39:10,400
to die the moment we hit the end of this
19446
14:39:08,796 --> 14:39:12,560
function here this is something i want
19447
14:39:10,400 --> 14:39:15,200
you to be aware of and we will play with
19448
14:39:12,559 --> 14:39:17,680
that in more detail when we hit visual
19449
14:39:15,199 --> 14:39:19,275
studio code in a minute here is a simple
19450
14:39:17,680 --> 14:39:22,639
example of how you can call that
19451
14:39:19,275 --> 14:39:25,519
function we have two variables h and i
19452
14:39:22,639 --> 14:39:27,199
and we are going to print them out after
19453
14:39:25,519 --> 14:39:30,399
that we're going to call the function
19454
14:39:27,199 --> 14:39:33,039
we're going to store the result back in
19455
14:39:30,400 --> 14:39:35,200
mult results but the important thing is
19456
14:39:33,040 --> 14:39:36,239
that we call the function here with h
19457
14:39:36,239 --> 14:39:41,680
remember in the body of the function we
19458
14:39:38,160 --> 14:39:44,720
are incrementing h and i as arguments
19459
14:39:41,680 --> 14:39:46,879
but the changes we do inside of the body
19460
14:39:44,720 --> 14:39:50,080
of the function are not going to be
19461
14:39:46,879 --> 14:39:52,399
visible when the function returns if we
19462
14:39:50,080 --> 14:39:55,276
print h and i here we're just going to
19463
14:39:52,400 --> 14:39:56,400
see the same thing we saw before we call
19464
14:39:56,400 --> 14:40:00,796
i realize this is a lot of information
19465
14:39:58,400 --> 14:40:03,040
to take in now we are going to head over
19466
14:40:00,796 --> 14:40:05,200
to visual studio code and actually play
19467
14:40:05,199 --> 14:40:10,479
okay here we are in our working
19468
14:40:07,839 --> 14:40:12,879
directory the chapter is on functions
19469
14:40:10,480 --> 14:40:15,360
the current lecture is first hand on
19470
14:40:12,879 --> 14:40:18,000
functions we are going to grab our
19471
14:40:15,360 --> 14:40:19,756
template files like we always do we're
19472
14:40:19,756 --> 14:40:25,520
and we are going to open this in visual
19473
14:40:21,680 --> 14:40:27,595
studio code let's open the folder
19474
14:40:25,519 --> 14:40:28,719
and we are going to go in the correct
19475
14:40:28,720 --> 14:40:33,756
and choose first hand on functions here
19476
14:40:31,275 --> 14:40:36,720
this is what we want to open and we are
19477
14:40:33,756 --> 14:40:39,200
going to open our main cpp file and
19478
14:40:39,199 --> 14:40:42,795
and the first thing we want to do is to
19479
14:40:41,040 --> 14:40:45,680
set up a function that takes a single
19480
14:40:42,796 --> 14:40:48,080
parameter and doesn't give back any
19481
14:40:45,680 --> 14:40:50,480
result so the function is going to be
19482
14:40:48,080 --> 14:40:52,480
interbore we have seen that the function
19483
14:40:50,480 --> 14:40:54,560
is not going to return anything so it's
19484
14:40:52,480 --> 14:40:56,319
going to be void its return type is
19485
14:40:54,559 --> 14:40:59,115
going to be void the name of the
19486
14:40:56,319 --> 14:41:00,796
function is going to be interbar and
19487
14:40:59,116 --> 14:41:02,796
what we want to pass in here is a
19488
14:41:00,796 --> 14:41:05,360
variable to represent the age of
19489
14:41:02,796 --> 14:41:08,240
somebody and we know that the age can
19490
14:41:05,360 --> 14:41:11,680
really not be negative so it is
19491
14:41:08,239 --> 14:41:13,595
advised to at least use an unsigned
19492
14:41:11,680 --> 14:41:16,319
integer type so we're going to use
19493
14:41:13,595 --> 14:41:18,319
unsigned end and the parameter name is
19494
14:41:18,319 --> 14:41:22,879
once we have our parameter list we're
19495
14:41:20,559 --> 14:41:24,720
going to put in the function body and
19496
14:41:22,879 --> 14:41:26,795
remember the function body is going to
19497
14:41:28,879 --> 14:41:33,115
now this is a valid c plus plus function
19498
14:41:31,116 --> 14:41:34,796
it's not going to return anything it's
19499
14:41:33,116 --> 14:41:37,680
going to take a single parameter whose
19500
14:41:34,796 --> 14:41:40,240
type is unsigned and its name is
19501
14:41:37,680 --> 14:41:42,160
interbar we can get inside the function
19502
14:41:40,239 --> 14:41:44,955
and actually do whatever it is we want
19503
14:41:42,160 --> 14:41:47,520
to do so once we go in we're going to
19504
14:41:44,955 --> 14:41:50,479
test and see if the age is greater than
19505
14:41:47,519 --> 14:41:52,000
18 do something if the age is not
19506
14:41:50,480 --> 14:41:53,520
greater than 18 we're going to do
19507
14:41:52,000 --> 14:41:54,720
something else let's do that we're going
19508
14:41:54,720 --> 14:41:59,840
age is greater than 18 we're going to
19509
14:41:57,680 --> 14:42:03,360
tell them the age and tell them that
19510
14:41:59,839 --> 14:42:05,595
they can actually go in this is logical
19511
14:42:03,360 --> 14:42:08,319
and we're going to say else and in the
19512
14:42:08,319 --> 14:42:12,400
we're going to say something else
19513
14:42:10,239 --> 14:42:14,319
we're going to tell them sorry you are
19514
14:42:12,400 --> 14:42:16,880
too young for this and we are going to
19515
14:42:14,319 --> 14:42:19,360
get out of this block here and this is
19516
14:42:16,879 --> 14:42:21,680
really our function again let's try to
19517
14:42:19,360 --> 14:42:24,720
analyze the syntax here we have the
19518
14:42:21,680 --> 14:42:26,639
return type this is required in c plus
19519
14:42:24,720 --> 14:42:29,200
plus if you don't put it in you're going
19520
14:42:26,639 --> 14:42:31,116
to get a compiler error because you
19521
14:42:29,199 --> 14:42:33,435
can't have a function without a return
19522
14:42:31,116 --> 14:42:35,276
type in c plus plus you notice that we
19523
14:42:33,436 --> 14:42:37,520
have our squiggly lines here visual
19524
14:42:35,275 --> 14:42:40,000
studio code is not happy so we're going
19525
14:42:37,519 --> 14:42:42,879
to tell it the return type we're going
19526
14:42:40,000 --> 14:42:44,559
to save the function name after that
19527
14:42:42,879 --> 14:42:47,360
and after the function name we're going
19528
14:42:44,559 --> 14:42:49,915
to pass the parameters we can have any
19529
14:42:47,360 --> 14:42:52,400
number of parameters or inputs to the
19530
14:42:49,915 --> 14:42:54,159
function but in this case we just have
19531
14:42:52,400 --> 14:42:56,796
one because it is enough for our
19532
14:42:54,160 --> 14:42:58,796
purposes after that we have the body and
19533
14:42:56,796 --> 14:43:01,360
inside the body we do whatever it is we
19534
14:42:58,796 --> 14:43:03,840
want to do in this function here because
19535
14:43:01,360 --> 14:43:06,559
this function returns void we don't
19536
14:43:03,839 --> 14:43:08,795
really need to explicitly return from
19537
14:43:06,559 --> 14:43:11,519
this function here but this is an
19538
14:43:08,796 --> 14:43:14,000
exception only for functions that return
19539
14:43:11,519 --> 14:43:16,639
void for other return types you will
19540
14:43:14,000 --> 14:43:18,720
have to put in the return statement but
19541
14:43:16,639 --> 14:43:20,879
even for void functions you can put the
19542
14:43:18,720 --> 14:43:24,080
return statement if you want and you can
19543
14:43:24,080 --> 14:43:28,080
and you're going to put a semicolon
19544
14:43:25,519 --> 14:43:30,955
after this this is also valid c plus
19545
14:43:28,080 --> 14:43:33,116
plus syntax okay now we have declared
19546
14:43:30,955 --> 14:43:35,275
the function it is a valid c plus plus
19547
14:43:33,116 --> 14:43:37,116
functions let's try and call it we're
19548
14:43:35,275 --> 14:43:38,559
going to go down in main because that's
19549
14:43:37,116 --> 14:43:41,680
where we want to be calling our
19550
14:43:38,559 --> 14:43:44,079
functions for now and we are going to
19551
14:43:41,680 --> 14:43:46,000
say interbar we're going to call the
19552
14:43:44,080 --> 14:43:48,319
function and you use the function name
19553
14:43:46,000 --> 14:43:51,595
to call it and you're going to put in a
19554
14:43:48,319 --> 14:43:54,000
pair of parentheses and pass an argument
19555
14:43:51,595 --> 14:43:55,435
to the function again what you pass to
19556
14:43:54,000 --> 14:43:57,595
the function when you call it it's
19557
14:43:55,436 --> 14:43:58,955
called an argument but what you pass
19558
14:43:57,595 --> 14:44:01,519
through the function when you are
19559
14:43:58,955 --> 14:44:02,639
defining it like we did here that's a
19560
14:44:02,639 --> 14:44:07,116
okay so function parameters when
19561
14:44:04,720 --> 14:44:09,116
declaring functions and when you are
19562
14:44:07,116 --> 14:44:10,480
calling the function what you pass are
19563
14:44:10,480 --> 14:44:15,596
arguments and now we need to pass in
19564
14:44:12,879 --> 14:44:18,159
some age to this function and let's say
19565
14:44:15,595 --> 14:44:21,519
22 and if we do that this is going to be
19566
14:44:21,519 --> 14:44:26,719
notice that we have this squiggly line
19567
14:44:23,436 --> 14:44:27,680
it is because we forgot a semicolon here
19568
14:44:27,680 --> 14:44:33,840
c plus plus requires to have a semicolon
19569
14:44:30,879 --> 14:44:37,115
after each statement and now we have a
19570
14:44:33,839 --> 14:44:39,435
valid c plus program that is declaring a
19571
14:44:37,116 --> 14:44:42,319
function and calling a function down
19572
14:44:39,436 --> 14:44:44,880
here in main we can try to build it
19573
14:44:42,319 --> 14:44:46,720
let's use gcc to do that the world is
19574
14:44:44,879 --> 14:44:49,115
going to be good you see world finished
19575
14:44:46,720 --> 14:44:51,116
successfully and we can bring up a
19576
14:44:49,116 --> 14:44:53,200
terminal and actually try to run this
19577
14:44:51,116 --> 14:44:55,360
function here let's clear and run
19578
14:44:53,199 --> 14:44:57,360
rooster because our program is going to
19579
14:44:55,360 --> 14:44:59,840
be called rooster like we have been
19580
14:44:57,360 --> 14:45:02,559
doing all along and at the output is
19581
14:45:02,559 --> 14:45:08,239
please proceed notice that we have this
19582
14:45:05,360 --> 14:45:10,319
function defined once but we can call it
19583
14:45:08,239 --> 14:45:12,559
multiple times so for example if you go
19584
14:45:15,436 --> 14:45:19,596
and we try and build again let's build
19585
14:45:19,595 --> 14:45:24,239
the builder is going to be good we can
19586
14:45:21,519 --> 14:45:27,199
clear and run rooster now it's going to
19587
14:45:24,239 --> 14:45:28,479
say you are 15 please proceed why is
19588
14:45:28,480 --> 14:45:32,880
what are we really doing here uh if age
19589
14:45:30,796 --> 14:45:36,080
is greater than 10 we say 10 here we
19590
14:45:32,879 --> 14:45:38,879
should say 18. sorry for this we're
19591
14:45:38,879 --> 14:45:43,915
and now it should behave accordingly so
19592
14:45:43,915 --> 14:45:49,115
you are 22 please proceed you are too
19593
14:45:46,796 --> 14:45:52,160
young for this no offense because the
19594
14:45:49,116 --> 14:45:53,916
age is 15 here you can keep calling this
19595
14:45:52,160 --> 14:45:55,680
function and you're going to see things
19596
14:45:53,915 --> 14:45:57,519
printing out you can even call this
19597
14:45:55,680 --> 14:45:59,595
function in the loop i can't really
19598
14:45:57,519 --> 14:46:03,039
resist so let's do that we're going to
19599
14:46:03,040 --> 14:46:07,680
i and say start from 0 for example or 1
19600
14:46:07,680 --> 14:46:11,199
and we are going to say while i is less
19601
14:46:12,839 --> 14:46:18,000
20. we're going to increment uh you
19602
14:46:15,595 --> 14:46:20,319
already know how to use loops so we're
19603
14:46:18,000 --> 14:46:21,680
going to be using this as an example
19604
14:46:21,680 --> 14:46:25,756
comment out all these guys in front
19605
14:46:23,915 --> 14:46:27,435
because we don't want them to print
19606
14:46:27,436 --> 14:46:31,916
and what we're going to do is call the
19607
14:46:29,519 --> 14:46:32,879
function with whatever iteration we are
19608
14:46:32,879 --> 14:46:37,839
notice that we have a size t here and
19609
14:46:35,360 --> 14:46:40,080
the function is going to be taken
19610
14:46:37,839 --> 14:46:43,839
an unsigned integer so we're going to
19611
14:46:40,080 --> 14:46:47,680
have implicit conversions from size t
19612
14:46:43,839 --> 14:46:50,719
to end or if we really want this to not
19613
14:46:47,680 --> 14:46:53,199
cause any problems we can change the
19614
14:46:50,720 --> 14:46:56,400
type of our parameter to be size t this
19615
14:46:53,199 --> 14:46:58,879
is also valid c plus plus code let's say
19616
14:47:06,639 --> 14:47:09,199
watch what is going to happen this is
19617
14:47:09,199 --> 14:47:14,319
from 1 all the way to 19 and it's going
19618
14:47:12,000 --> 14:47:16,879
to be calling this function with
19619
14:47:14,319 --> 14:47:19,275
whatever iteration we might be at so
19620
14:47:16,879 --> 14:47:21,680
it's going to look from 1 all the way to
19621
14:47:21,680 --> 14:47:26,000
tell us we are too young for this but
19622
14:47:23,915 --> 14:47:29,595
for 19 it's going to let us in because
19623
14:47:26,000 --> 14:47:31,275
we will be old enough to enter a bar
19624
14:47:29,595 --> 14:47:34,559
let's try this i think it's going to be
19625
14:47:31,275 --> 14:47:36,319
fun we're going to weld with gcc
19626
14:47:36,319 --> 14:47:40,720
and run rooster ah sorry you're too
19627
14:47:38,955 --> 14:47:42,879
young for this you too young with us and
19628
14:47:40,720 --> 14:47:45,116
that once we hit 19 it's going to tell
19629
14:47:42,879 --> 14:47:47,199
us we are young enough to enter a bar
19630
14:47:45,116 --> 14:47:50,080
and we're going to go and and have as
19631
14:47:47,199 --> 14:47:53,039
much fun as we want so this is really
19632
14:47:50,080 --> 14:47:56,000
how you can declare a function remember
19633
14:47:53,040 --> 14:47:58,639
a function is uniquely identified by its
19634
14:47:56,000 --> 14:48:00,720
signature and the signature is really
19635
14:47:58,639 --> 14:48:02,879
the name of the function and the
19636
14:48:00,720 --> 14:48:04,239
parameters that you have in here okay
19637
14:48:02,879 --> 14:48:05,595
once you have the function declared
19638
14:48:04,239 --> 14:48:07,839
you're going to do whatever you want in
19639
14:48:05,595 --> 14:48:10,159
the body you are going to optionally
19640
14:48:07,839 --> 14:48:13,359
return something from the function and
19641
14:48:10,160 --> 14:48:15,276
once the function is declared or set up
19642
14:48:13,360 --> 14:48:17,840
you can go in main and call it and do
19643
14:48:15,275 --> 14:48:20,400
whatever it is you want with it okay now
19644
14:48:17,839 --> 14:48:22,639
i think we are mature enough to try out
19645
14:48:20,400 --> 14:48:24,160
a few other functions let's go down and
19646
14:48:22,639 --> 14:48:26,400
put in another function which is going
19647
14:48:24,160 --> 14:48:28,000
to compute the maximum of two numbers
19648
14:48:26,400 --> 14:48:30,000
the signature of this function is going
19649
14:48:28,000 --> 14:48:32,559
to be its name here and the parameters
19650
14:48:30,000 --> 14:48:34,400
notice that we are taking two parameters
19651
14:48:32,559 --> 14:48:37,115
because we want to be computing the
19652
14:48:34,400 --> 14:48:38,880
maximum between two numbers and this
19653
14:48:37,116 --> 14:48:40,796
function is going to return something we
19654
14:48:38,879 --> 14:48:43,199
want to get the maximum out of the
19655
14:48:40,796 --> 14:48:44,560
function and use it to do something else
19656
14:48:44,559 --> 14:48:48,239
so this is the declaration of the
19657
14:48:46,319 --> 14:48:49,839
function once we hit the body of the
19658
14:48:48,239 --> 14:48:52,239
function we are going to compute the
19659
14:48:49,839 --> 14:48:54,559
maximum we're going to say if a is
19660
14:48:52,239 --> 14:48:56,955
greater than b then a must be our
19661
14:48:54,559 --> 14:48:59,839
maximum so we're going to return that
19662
14:48:56,955 --> 14:49:01,519
and if a is not greater than b then b
19663
14:48:59,839 --> 14:49:04,159
must be the maximum we're going to
19664
14:49:01,519 --> 14:49:06,239
return b as our maximum here this is
19665
14:49:04,160 --> 14:49:08,560
what the function is doing we can go in
19666
14:49:06,239 --> 14:49:10,559
main and call it let's go down and
19667
14:49:08,559 --> 14:49:13,360
comment this out because we don't want
19668
14:49:10,559 --> 14:49:15,756
noise output from these guys so calling
19669
14:49:13,360 --> 14:49:17,915
interbore that's what we were doing now
19670
14:49:15,756 --> 14:49:20,559
we are calling max so we're going to go
19671
14:49:17,915 --> 14:49:23,115
down and set up a variable call it
19672
14:49:20,559 --> 14:49:26,559
result why not and we're going to
19673
14:49:23,116 --> 14:49:28,955
compute the maximum between 10 and 20
19674
14:49:26,559 --> 14:49:30,479
why not okay so let's see what we get
19675
14:49:28,955 --> 14:49:32,559
and we're going to print the maximum
19676
14:49:32,559 --> 14:49:38,399
max as resort okay now if we build this
19677
14:49:36,480 --> 14:49:39,916
program and run it try to guess what
19678
14:49:38,400 --> 14:49:41,596
we're going to get we're going to call
19679
14:49:41,595 --> 14:49:47,360
and what we pass in here are arguments
19680
14:49:44,639 --> 14:49:50,400
again we are not passing parameters here
19681
14:49:47,360 --> 14:49:52,955
we are going to pass in 10 and 20 as our
19682
14:49:50,400 --> 14:49:55,040
arguments and when we call the function
19683
14:49:52,955 --> 14:49:56,795
control is going to jump to the body of
19684
14:49:55,040 --> 14:49:58,955
the function and we are going to fall
19685
14:49:56,796 --> 14:50:01,200
inside here the arguments we're going to
19686
14:49:58,955 --> 14:50:03,756
pass in are just going to be copied in
19687
14:50:01,199 --> 14:50:05,680
the function and we will have them
19688
14:50:03,756 --> 14:50:07,436
through these names a and b so we're
19689
14:50:05,680 --> 14:50:09,915
going to test and see if the first
19690
14:50:07,436 --> 14:50:11,916
parameter is greater than the second in
19691
14:50:09,915 --> 14:50:13,839
this case the first parameter is not
19692
14:50:11,915 --> 14:50:16,000
greater than the second because the
19693
14:50:13,839 --> 14:50:18,639
first one is 10 the second is a 20.
19694
14:50:16,000 --> 14:50:20,480
let's go down and see that and the test
19695
14:50:18,639 --> 14:50:23,595
here is going to fail and we're going to
19696
14:50:20,480 --> 14:50:25,840
run whatever is in the else block here
19697
14:50:23,595 --> 14:50:28,000
and we are going to return b as our
19698
14:50:28,000 --> 14:50:32,080
b is going to basically be the result of
19699
14:50:32,080 --> 14:50:36,000
and that result is going to be assigned
19700
14:50:34,239 --> 14:50:38,479
to our research variable and we're going
19701
14:50:36,000 --> 14:50:40,879
to print it out with this sddc out
19702
14:50:38,480 --> 14:50:43,436
statement here so let's try and build
19703
14:50:40,879 --> 14:50:45,115
this we're going to build with gcc again
19704
14:50:43,436 --> 14:50:47,520
the world is going to be good we're
19705
14:50:45,116 --> 14:50:50,240
going to clear and run rooster you see
19706
14:50:47,519 --> 14:50:51,839
that maximum is 20. if we try and change
19707
14:50:50,239 --> 14:50:55,680
this for example make the first
19708
14:50:55,680 --> 14:51:00,239
let's see what maximum we get
19709
14:50:58,319 --> 14:51:02,955
going to clear and run rooster we're
19710
14:51:00,239 --> 14:51:04,955
going to say that maximum is 100 and
19711
14:51:02,955 --> 14:51:07,199
again you can call this function however
19712
14:51:04,955 --> 14:51:10,319
many times you want for example we can
19713
14:51:07,199 --> 14:51:13,115
call it again and say result equals
19714
14:51:10,319 --> 14:51:15,040
max using two variables that we have
19715
14:51:15,040 --> 14:51:19,275
and go on top and declare these two
19716
14:51:17,116 --> 14:51:22,955
variables why not we're going to say and
19717
14:51:19,275 --> 14:51:26,079
x and we're going to put in it 22
19718
14:51:22,955 --> 14:51:27,915
and we're going to say end y and put in
19719
14:51:27,915 --> 14:51:32,559
and now if we print the result we're
19720
14:51:30,239 --> 14:51:35,839
going to get 44 because that's the
19721
14:51:32,559 --> 14:51:38,479
maximum that was assigned back to our
19722
14:51:35,839 --> 14:51:40,159
research variable here let's weld again
19723
14:51:38,480 --> 14:51:42,720
we're going to run the task to build
19724
14:51:42,720 --> 14:51:47,916
you can clear and run rooster you see
19725
14:51:45,116 --> 14:51:50,639
max is 44 and this is really how you can
19726
14:51:47,915 --> 14:51:51,435
declare and use a maximum function like
19727
14:51:51,436 --> 14:51:55,520
we're going to comment this out because
19728
14:51:52,955 --> 14:51:58,000
we have a few more functions we want to
19729
14:51:55,519 --> 14:52:00,319
try out let's go on top and put in
19730
14:51:58,000 --> 14:52:02,796
another function and again notice that
19731
14:52:02,796 --> 14:52:07,680
before the main function here this is a
19732
14:52:05,275 --> 14:52:10,720
requirement of a c plus plus compiler
19733
14:52:07,680 --> 14:52:13,360
because before you use the function the
19734
14:52:10,720 --> 14:52:16,080
function must be declared somewhere so
19735
14:52:13,360 --> 14:52:18,559
we need to go before the main function
19736
14:52:16,080 --> 14:52:20,319
and declare our functions here the
19737
14:52:18,559 --> 14:52:22,319
function we're going to do now is say
19738
14:52:20,319 --> 14:52:24,480
hello here it's not going to take any
19739
14:52:22,319 --> 14:52:27,040
input and it's not going to give us any
19740
14:52:24,480 --> 14:52:29,756
output it's just going to say hello and
19741
14:52:27,040 --> 14:52:32,160
die off we can go down and call it this
19742
14:52:29,756 --> 14:52:35,040
is going to be super easy calling hello
19743
14:52:32,160 --> 14:52:37,520
and we're going to call it say hello see
19744
14:52:35,040 --> 14:52:39,840
that even visual studio code knows about
19745
14:52:37,519 --> 14:52:41,595
this function we can call it like this
19746
14:52:39,839 --> 14:52:43,039
it's going to be activated so we're
19747
14:52:41,595 --> 14:52:45,115
going to hit the body of the function
19748
14:52:43,040 --> 14:52:47,680
we're going to say hello there and the
19749
14:52:45,116 --> 14:52:49,520
function is going to return or die off
19750
14:52:47,680 --> 14:52:51,680
please know that you could omit this
19751
14:52:49,519 --> 14:52:54,079
return statement for functions that
19752
14:52:51,680 --> 14:52:55,680
return void so if we comment this guy
19753
14:52:54,080 --> 14:52:57,840
out the function is going to work
19754
14:52:55,680 --> 14:53:00,160
equally well you can use this however
19755
14:52:57,839 --> 14:53:03,839
you want now we're just going to build
19756
14:53:00,160 --> 14:53:05,436
with gcc and see this function run
19757
14:53:03,839 --> 14:53:08,319
the build is good we're going to run
19758
14:53:05,436 --> 14:53:10,796
rooster and it is saying hello there
19759
14:53:08,319 --> 14:53:12,080
let's go down and look at another
19760
14:53:12,080 --> 14:53:17,116
the next function is going to be lucky
19761
14:53:14,639 --> 14:53:19,275
number it's not going to take any input
19762
14:53:17,116 --> 14:53:22,080
but it is going to give us an output in
19763
14:53:19,275 --> 14:53:24,400
the form of an integer so we can call it
19764
14:53:22,080 --> 14:53:27,116
let's go down and comment out saying
19765
14:53:24,400 --> 14:53:28,400
hello here and say that we want to call
19766
14:53:28,400 --> 14:53:32,400
and we can go down and set up a variable
19767
14:53:30,480 --> 14:53:33,680
let's do that we're going to say int
19768
14:53:34,879 --> 14:53:39,595
are going to brace initialize this guy
19769
14:53:37,275 --> 14:53:42,795
so it's going to be initialized to zero
19770
14:53:39,595 --> 14:53:45,360
and we're going to say result
19771
14:53:42,796 --> 14:53:48,160
equals lucky number and we're going to
19772
14:53:45,360 --> 14:53:50,879
take the result returned by our lucky
19773
14:53:48,160 --> 14:53:52,720
number function and assign that to the
19774
14:53:50,879 --> 14:53:56,000
result variable and we can print it out
19775
14:53:52,720 --> 14:53:59,116
if we want so we can say sddc out and
19776
14:53:59,116 --> 14:54:04,480
and we're going to put that out here say
19777
14:54:05,360 --> 14:54:10,319
and if we build and run this program
19778
14:54:08,000 --> 14:54:12,796
we're going to get this guy printed out
19779
14:54:10,319 --> 14:54:15,519
we should see a 99 because that's what
19780
14:54:12,796 --> 14:54:18,400
we are returning from our function here
19781
14:54:15,519 --> 14:54:20,719
and resort is 99 as you see in the
19782
14:54:18,400 --> 14:54:22,480
output here so this is really how you
19783
14:54:22,480 --> 14:54:26,796
your functions a function has a unique
19784
14:54:24,559 --> 14:54:28,955
signature so for example into bar here
19785
14:54:31,595 --> 14:54:37,595
if you go down mats has its own name and
19786
14:54:34,559 --> 14:54:40,079
the parameters that it takes in if you
19787
14:54:37,595 --> 14:54:42,795
go down say hello and lucky number are
19788
14:54:40,080 --> 14:54:44,955
different in their own ways if you try
19789
14:54:42,796 --> 14:54:48,160
and set up another function that has the
19790
14:54:44,955 --> 14:54:49,915
same signature as max here your compiler
19791
14:54:48,160 --> 14:54:51,116
is going to freak out let's try and do
19792
14:54:49,915 --> 14:54:52,795
that we're going to set up another
19793
14:54:51,116 --> 14:54:54,720
function it's going to have a void
19794
14:54:52,796 --> 14:54:56,639
return type we're going to call it max
19795
14:54:54,720 --> 14:54:57,520
because we want to match this signature
19796
14:54:57,519 --> 14:55:02,719
and we're going to give it two
19797
14:55:02,720 --> 14:55:06,080
and we can do whatever we want in this
19798
14:55:04,319 --> 14:55:09,360
function notice that we have a squiggly
19799
14:55:06,080 --> 14:55:11,276
line if we open our problems tab here
19800
14:55:09,360 --> 14:55:13,199
you're going to see that visual studio
19801
14:55:11,275 --> 14:55:16,319
code has a few problems with this
19802
14:55:13,199 --> 14:55:19,115
because we are setting up a function
19803
14:55:16,319 --> 14:55:21,199
with the same signature twice let's try
19804
14:55:19,116 --> 14:55:23,436
and different make this a net and see
19805
14:55:21,199 --> 14:55:25,680
what we get right now we don't seem to
19806
14:55:23,436 --> 14:55:28,720
have a problem but if we get to run this
19807
14:55:25,680 --> 14:55:30,879
program we're going to have problems
19808
14:55:28,720 --> 14:55:33,040
let's go down and actually activate the
19809
14:55:30,879 --> 14:55:34,399
code to call the max function to really
19810
14:55:34,400 --> 14:55:38,796
because you need to know so we're going
19811
14:55:36,480 --> 14:55:41,040
to comment out calling lucky number and
19812
14:55:38,796 --> 14:55:43,520
we want to call max we're going to
19813
14:55:43,519 --> 14:55:48,239
and we are going to build this with gcc
19814
14:55:46,639 --> 14:55:50,239
notice what we're going to see uh-huh we
19815
14:55:48,239 --> 14:55:53,436
have problems here we have a compiler
19816
14:55:50,239 --> 14:55:54,795
error saying re definition of int max
19817
14:55:55,680 --> 14:56:01,040
one might think what if i name my
19818
14:55:58,720 --> 14:56:02,796
parameters differently here for example
19819
14:56:07,756 --> 14:56:11,756
using different names like this is not
19820
14:56:09,839 --> 14:56:14,239
going to solve your troubles because if
19821
14:56:11,756 --> 14:56:16,639
we try and uh bold again we're going to
19822
14:56:14,239 --> 14:56:18,559
get the same compiler error this is not
19823
14:56:16,639 --> 14:56:20,879
going to change your thing we don't have
19824
14:56:18,559 --> 14:56:23,519
enough tools to really understand this
19825
14:56:20,879 --> 14:56:24,719
problem but know that you can't have two
19826
14:56:24,720 --> 14:56:29,436
with the exact same signature in a
19827
14:56:27,275 --> 14:56:31,680
single c plus plus program and we're
19828
14:56:29,436 --> 14:56:34,400
going to learn more about this later but
19829
14:56:31,680 --> 14:56:37,040
note that the signature of a function
19830
14:56:34,400 --> 14:56:40,160
must be unique to it throughout your
19831
14:56:37,040 --> 14:56:41,756
entire c-plus program if you remember
19832
14:56:40,160 --> 14:56:44,560
this simple rule you're not going to
19833
14:56:41,756 --> 14:56:46,796
have many problems so let's try and weld
19834
14:56:44,559 --> 14:56:48,479
again to make sure we have no more
19835
14:56:48,480 --> 14:56:53,276
the bolt is good and we can run the
19836
14:56:50,796 --> 14:56:56,639
program to see our maximum printed out
19837
14:56:56,839 --> 14:57:02,159
rooster and max is 44 it is exactly what
19838
14:57:02,160 --> 14:57:06,480
the last thing i want to do in this
19839
14:57:04,080 --> 14:57:09,360
lecture is make it super clear in your
19840
14:57:06,480 --> 14:57:11,680
mind that what we pass to functions we
19841
14:57:11,680 --> 14:57:17,840
are copies so let's go on top and set up
19842
14:57:15,595 --> 14:57:20,559
a simple function the function is going
19843
14:57:17,839 --> 14:57:22,955
to increment and multiply it returns a
19844
14:57:20,559 --> 14:57:25,199
double type the name of the function is
19845
14:57:22,955 --> 14:57:27,680
increment and multiply and it is going
19846
14:57:25,199 --> 14:57:29,039
to take two parameters and a double a
19847
14:57:29,040 --> 14:57:34,239
once we hit the body of the function
19848
14:57:30,955 --> 14:57:36,159
we're going to increment a and b
19849
14:57:34,239 --> 14:57:38,000
the arguments that were passed to the
19850
14:57:36,160 --> 14:57:39,756
function and we're going to multiply
19851
14:57:38,000 --> 14:57:42,720
them and we're going to store the result
19852
14:57:39,756 --> 14:57:44,239
of that in a reserved variable the
19853
14:57:42,720 --> 14:57:46,559
result variable is what we're going to
19854
14:57:44,239 --> 14:57:48,319
return to the function and whoever
19855
14:57:46,559 --> 14:57:50,879
called this function is going to use
19856
14:57:48,319 --> 14:57:53,275
that to do whatever they want what we
19857
14:57:50,879 --> 14:57:55,915
really want to see is that the changes
19858
14:57:53,275 --> 14:57:59,360
we do inside the function are not going
19859
14:57:55,915 --> 14:58:01,680
to be visible to the arguments that we
19860
14:57:59,360 --> 14:58:04,239
pass to this function here to really
19861
14:58:01,680 --> 14:58:06,160
make this super clear let's go down in
19862
14:58:04,239 --> 14:58:08,879
main and set up a few variables we're
19863
14:58:06,160 --> 14:58:11,116
going to have a double h and the double
19864
14:58:08,879 --> 14:58:13,435
i the values are going to be three and
19865
14:58:11,116 --> 14:58:15,276
four we're going to print them out and
19866
14:58:13,436 --> 14:58:17,840
we're going to call our increment
19867
14:58:15,275 --> 14:58:18,955
multiply function notice that we pass h
19868
14:58:18,955 --> 14:58:24,319
to the function and the result of the
19869
14:58:21,116 --> 14:58:27,200
function is going to be stored in uh the
19870
14:58:24,319 --> 14:58:29,116
anc mult resort variable here but the
19871
14:58:27,199 --> 14:58:30,719
return value is really not important
19872
14:58:30,720 --> 14:58:36,080
is if the changes we do to the arguments
19873
14:58:34,000 --> 14:58:38,879
are going to be visible on the outside
19874
14:58:36,080 --> 14:58:40,720
of the function here so remember we have
19875
14:58:38,879 --> 14:58:42,955
h and i here we pass them to the
19876
14:58:40,720 --> 14:58:44,160
function once we hit the inside of the
19877
14:58:44,160 --> 14:58:48,320
we're going to increment a and b
19878
14:58:46,796 --> 14:58:50,796
and we are going to return from the
19879
14:58:50,796 --> 14:58:57,840
if a which was a 3 and b which was a 4
19880
14:58:55,275 --> 14:58:59,756
have been incremented to 4 and 5. that's
19881
14:58:57,839 --> 14:59:02,795
what we want to see so we're going to
19882
14:58:59,756 --> 14:59:05,595
boil this and run this so let's use gcc
19883
14:59:02,796 --> 14:59:07,276
to do that the bulk is going to be good
19884
14:59:09,116 --> 14:59:14,160
and notice what we have here let's go
19885
14:59:11,199 --> 14:59:18,479
down and look at the variables again
19886
14:59:14,160 --> 14:59:20,000
we set up h to contain a 3 so before we
19887
14:59:22,319 --> 14:59:26,080
okay so that's what we're going to print
19888
14:59:23,915 --> 14:59:27,040
here once we hit the inside of the
19889
14:59:27,040 --> 14:59:31,200
we are going to say what we have inside
19890
14:59:29,199 --> 14:59:33,915
the function before we do the operation
19891
14:59:31,199 --> 14:59:36,639
before the increment again a and b are
19892
14:59:33,915 --> 14:59:37,915
four so these are copies we have inside
19893
14:59:37,915 --> 14:59:43,275
do the increment and after we have the
19894
14:59:40,160 --> 14:59:45,200
increment a and b are going to be four
19895
14:59:43,275 --> 14:59:47,040
but once we hit the outside of the
19896
14:59:48,559 --> 14:59:52,559
with this guy here we're going to see
19897
14:59:55,040 --> 15:00:01,116
we didn't really affect h and i when we
19898
14:59:58,080 --> 15:00:04,560
did this increment here what we affected
19899
15:00:01,116 --> 15:00:05,360
are copies that were passed to a and b
19900
15:00:05,360 --> 15:00:08,720
and this is something you need to know
19901
15:00:07,199 --> 15:00:10,559
because some people will think that
19902
15:00:10,559 --> 15:00:16,879
h and i in my argument list here i can
19903
15:00:14,796 --> 15:00:19,596
manipulate h and i what you are
19904
15:00:16,879 --> 15:00:22,639
manipulating are copies that were made
19905
15:00:19,595 --> 15:00:24,559
by the compiler to pass the arguments to
19906
15:00:22,639 --> 15:00:26,479
the function here this is something you
19907
15:00:24,559 --> 15:00:28,639
need to keep in mind and we will learn
19908
15:00:26,480 --> 15:00:31,200
more about this but i wanted you to
19909
15:00:28,639 --> 15:00:33,199
learn this firsthand and this is really
19910
15:00:31,199 --> 15:00:35,275
all we set out to do in this lecture i
19911
15:00:33,199 --> 15:00:37,435
hope you have a better understanding of
19912
15:00:35,275 --> 15:00:39,436
what a function is and what you can do
19913
15:00:37,436 --> 15:00:41,360
with it in c plus plus we are going to
19914
15:00:39,436 --> 15:00:43,040
stop here in this lecture in the next
19915
15:00:41,360 --> 15:00:45,915
one we're going to learn a little more
19916
15:00:43,040 --> 15:00:47,360
about function declarations and function
19917
15:00:47,360 --> 15:00:51,680
go ahead and finish up here and meet me
19918
15:00:49,680 --> 15:00:54,000
there in this lecture we're going to
19919
15:00:51,680 --> 15:00:57,040
learn about function declarations and
19920
15:00:54,000 --> 15:00:58,720
function definitions the motivation for
19921
15:00:57,040 --> 15:01:01,680
the topic we're going to be talking
19922
15:00:58,720 --> 15:01:05,116
about here is that sometimes you really
19923
15:01:01,680 --> 15:01:07,116
want to separate a function header from
19924
15:01:05,116 --> 15:01:10,080
its implementation because you don't
19925
15:01:07,116 --> 15:01:12,080
want to expose all the details about how
19926
15:01:10,080 --> 15:01:14,560
you do stuff let's look at the simple
19927
15:01:12,080 --> 15:01:16,480
example in the last lecture we declared
19928
15:01:14,559 --> 15:01:18,955
a max function which was computing the
19929
15:01:16,480 --> 15:01:20,560
maximum between two numbers the output
19930
15:01:18,955 --> 15:01:22,720
was an integer so that's what we
19931
15:01:20,559 --> 15:01:25,595
returned the name of the function was
19932
15:01:22,720 --> 15:01:27,756
max and we had two parameters into a and
19933
15:01:25,595 --> 15:01:31,040
and b but what we did in the last
19934
15:01:27,756 --> 15:01:32,080
lecture was crop the entire function
19935
15:01:32,080 --> 15:01:36,480
in front of main but sometimes people
19936
15:01:34,400 --> 15:01:39,200
don't want to really see the details of
19937
15:01:36,480 --> 15:01:41,276
how you do stuff they just want to know
19938
15:01:39,199 --> 15:01:43,199
a summary of what your function does
19939
15:01:41,275 --> 15:01:45,756
what we can get out of the function and
19940
15:01:43,199 --> 15:01:48,000
what we need to give to the function for
19941
15:01:45,756 --> 15:01:49,916
it to do its job and that's what we're
19942
15:01:48,000 --> 15:01:52,559
going to see in this lecture if you look
19943
15:01:49,915 --> 15:01:54,239
here we have the function header in
19944
15:01:52,559 --> 15:01:56,795
front of the main function and the
19945
15:01:54,239 --> 15:01:59,115
function header is made up of its return
19946
15:01:56,796 --> 15:02:01,520
type the name of the function and the
19947
15:01:59,116 --> 15:02:03,520
list of the parameters and after that
19948
15:02:01,519 --> 15:02:06,955
we're going to put a semicolon this is
19949
15:02:03,519 --> 15:02:09,115
called a function header or a prototype
19950
15:02:06,955 --> 15:02:10,879
and when we do that the compiler is
19951
15:02:09,116 --> 15:02:13,596
going to be happy and it's going to work
19952
15:02:10,879 --> 15:02:16,399
with us to compile our program but when
19953
15:02:13,595 --> 15:02:18,955
we get to link our program to really put
19954
15:02:16,400 --> 15:02:20,639
it together and make one binary the
19955
15:02:18,955 --> 15:02:23,116
definition of the function is going to
19956
15:02:20,639 --> 15:02:25,360
be needed and if you look after main
19957
15:02:23,116 --> 15:02:27,596
here what we have is a function
19958
15:02:25,360 --> 15:02:30,000
definition if you look closely you see
19959
15:02:27,595 --> 15:02:32,879
that it is exactly the same thing we had
19960
15:02:30,000 --> 15:02:34,879
in the last lecture we have our header
19961
15:02:32,879 --> 15:02:37,915
information we don't have a semicolon
19962
15:02:34,879 --> 15:02:41,360
after our parameter list but we have a
19963
15:02:37,915 --> 15:02:44,399
pair of curly braces and inside these
19964
15:02:41,360 --> 15:02:45,436
curly braces we have the body of our
19965
15:02:46,480 --> 15:02:50,480
it is really easy to look at this
19966
15:02:48,319 --> 15:02:52,559
program because we don't have to look at
19967
15:02:50,480 --> 15:02:54,956
all these details about how this
19968
15:02:54,955 --> 15:02:59,839
first-hand information on how we can use
19969
15:02:57,360 --> 15:03:01,680
this function and that is what most
19970
15:02:59,839 --> 15:03:03,679
people are going to be interested in
19971
15:03:01,680 --> 15:03:06,160
about your function they want to really
19972
15:03:03,680 --> 15:03:08,319
want to go in and see how you do stuff
19973
15:03:06,160 --> 15:03:10,320
they will want to use your function to
19974
15:03:08,319 --> 15:03:12,720
get the output and use it to do whatever
19975
15:03:10,319 --> 15:03:15,116
it is they want to do if you look here
19976
15:03:12,720 --> 15:03:17,275
in the body of the main function we have
19977
15:03:15,116 --> 15:03:19,436
two variables a and b and we use them to
19978
15:03:17,275 --> 15:03:21,915
call the maximum function we can also
19979
15:03:19,436 --> 15:03:24,560
set up a minimum function which works in
19980
15:03:21,915 --> 15:03:26,479
the similar way and we call another
19981
15:03:24,559 --> 15:03:28,795
function called increment which is going
19982
15:03:26,480 --> 15:03:31,040
to increment and multiply whatever
19983
15:03:28,796 --> 15:03:33,520
arguments we pass to this function so
19984
15:03:31,040 --> 15:03:36,400
the main idea here is that we can split
19985
15:03:33,519 --> 15:03:37,839
our function in two parts one is going
19986
15:03:36,400 --> 15:03:39,040
to be the function header which is
19987
15:03:37,839 --> 15:03:41,755
really going to be the function
19988
15:03:39,040 --> 15:03:44,400
declaration and the other is going to be
19989
15:03:41,756 --> 15:03:46,160
the function body with all the details
19990
15:03:44,400 --> 15:03:48,639
about how the function works and that's
19991
15:03:46,160 --> 15:03:50,560
going to be our function definition and
19992
15:03:48,639 --> 15:03:52,400
once we have these two things in place
19993
15:03:50,559 --> 15:03:54,319
we can call the function in our main
19994
15:03:52,400 --> 15:03:56,639
function and do whatever we want with
19995
15:03:54,319 --> 15:03:59,040
that okay now it should be super clear
19996
15:03:56,639 --> 15:04:01,680
that we can separate our function in two
19997
15:03:59,040 --> 15:04:03,756
parts declaration and definition and
19998
15:04:01,680 --> 15:04:05,915
sometimes the declaration part is also
19999
15:04:03,756 --> 15:04:08,160
called a prototype that's a prototype of
20000
15:04:05,915 --> 15:04:09,519
a function and it is made up of the
20001
15:04:09,519 --> 15:04:13,519
together with the function name together
20002
15:04:11,756 --> 15:04:15,595
with the parameters and after that
20003
15:04:13,519 --> 15:04:18,955
you're going to add a semicolon to make
20004
15:04:15,595 --> 15:04:21,199
it valid c plus syntax and another thing
20005
15:04:18,955 --> 15:04:24,000
you should know is that the prototype
20006
15:04:21,199 --> 15:04:25,755
needs to come before wherever it is
20007
15:04:24,000 --> 15:04:29,275
called if you're trying to call a
20008
15:04:25,756 --> 15:04:31,680
function before its prototype is seen in
20009
15:04:29,275 --> 15:04:33,756
your c plus plus program you're going to
20010
15:04:31,680 --> 15:04:37,275
get a compiler error and now you might
20011
15:04:33,756 --> 15:04:39,840
be asking but why did our programs in
20012
15:04:37,275 --> 15:04:42,400
the last lecture work we didn't split
20013
15:04:39,839 --> 15:04:43,275
things up and our program was working
20014
15:04:44,080 --> 15:04:49,116
if you put a function definition in
20015
15:04:46,639 --> 15:04:51,436
front of the main function that function
20016
15:04:49,116 --> 15:04:54,160
definition is also going to double as a
20017
15:04:51,436 --> 15:04:56,796
function declaration that's why the code
20018
15:04:54,160 --> 15:04:58,880
in the last lecture worked okay now that
20019
15:04:56,796 --> 15:05:01,040
you have an idea about what a function
20020
15:04:58,879 --> 15:05:03,519
declaration and the function definition
20021
15:05:01,040 --> 15:05:06,559
is let's head over to visual studio code
20022
15:05:03,519 --> 15:05:08,795
and play with us okay here we are in our
20023
15:05:06,559 --> 15:05:11,680
working folder the current project is
20024
15:05:08,796 --> 15:05:14,000
function declarations and definitions we
20025
15:05:11,680 --> 15:05:16,160
are going to grab our templates files
20026
15:05:16,160 --> 15:05:20,796
we're going to put them in place
20027
15:05:18,480 --> 15:05:24,000
and we are going to open this guy in
20028
15:05:20,796 --> 15:05:25,756
visual studio code let's do that
20029
15:05:25,756 --> 15:05:31,840
and we are going to open our main cpp
20030
15:05:28,559 --> 15:05:33,680
file clean it up a little bit and let's
20031
15:05:31,839 --> 15:05:35,359
close this pane so that we have some
20032
15:05:33,680 --> 15:05:37,595
breathing space the first thing we're
20033
15:05:35,360 --> 15:05:39,116
going to do is set up a maximum function
20034
15:05:37,595 --> 15:05:41,360
you already know how to do that we're
20035
15:05:39,116 --> 15:05:43,200
going to specify the return type
20036
15:05:41,360 --> 15:05:44,955
we are going to specify the function
20037
15:05:43,199 --> 15:05:47,755
name and the parameters we're going to
20038
15:05:44,955 --> 15:05:50,000
take in it a and into b and we're going
20039
15:05:47,756 --> 15:05:52,000
to go in and do whatever we need to
20040
15:05:50,000 --> 15:05:54,559
compute the maximum between these two
20041
15:05:52,000 --> 15:05:55,595
guys we're going to say if a is greater
20042
15:05:56,480 --> 15:06:00,480
a must be the maximum so we're going to
20043
15:06:04,796 --> 15:06:09,116
okay this is the function and it is
20044
15:06:06,720 --> 15:06:11,756
really simple we can go down in main and
20045
15:06:11,756 --> 15:06:16,480
x and i put in a five for example
20046
15:06:16,480 --> 15:06:21,680
y and put in a two or a three put in
20047
15:06:21,680 --> 15:06:25,840
and then we're going to set up the
20048
15:06:25,839 --> 15:06:29,755
which is going to catch the maximum i
20049
15:06:27,756 --> 15:06:32,080
think we can do that and what we're
20050
15:06:29,756 --> 15:06:34,400
going to assign to this is whatever is
20051
15:06:32,080 --> 15:06:36,480
returned from our function call so we're
20052
15:06:34,400 --> 15:06:37,840
going to call this function with x and y
20053
15:06:36,480 --> 15:06:39,360
so we're going to be computing the
20054
15:06:39,360 --> 15:06:44,319
5 and 2 here the maximum is going to be
20055
15:06:42,000 --> 15:06:45,915
stored in this result variable and we're
20056
15:06:44,319 --> 15:06:47,680
going to print it out so we're going to
20057
15:06:47,680 --> 15:06:54,720
see out and i'm going to say max
20058
15:06:50,879 --> 15:06:57,115
as result this is going to do
20059
15:06:54,720 --> 15:06:59,275
okay let's try and build this and make
20060
15:06:59,275 --> 15:07:03,595
this is nothing new so far it is
20061
15:07:01,519 --> 15:07:05,595
everything we have done in the last
20062
15:07:05,595 --> 15:07:09,680
now the world is good we can clear and
20063
15:07:08,000 --> 15:07:12,080
run rooster we're going to get the
20064
15:07:09,680 --> 15:07:15,116
maximum as a five here and if we try to
20065
15:07:12,080 --> 15:07:16,796
change this things for example make y 12
20066
15:07:19,275 --> 15:07:24,239
and we are going to clear these thanks
20067
15:07:21,519 --> 15:07:25,275
and run rooster we should get max equals
20068
15:07:25,275 --> 15:07:31,756
this is all fine and dandy but sometimes
20069
15:07:28,879 --> 15:07:35,115
we don't really want to have the details
20070
15:07:31,756 --> 15:07:37,595
about how our function works shown in
20071
15:07:35,116 --> 15:07:40,480
front of the main function here and we
20072
15:07:37,595 --> 15:07:43,040
can split our function in two parts a
20073
15:07:40,480 --> 15:07:44,720
declaration and a definition the
20074
15:07:43,040 --> 15:07:47,040
declaration is really going to be the
20075
15:07:44,720 --> 15:07:49,040
header part of the function and that's
20076
15:07:47,040 --> 15:07:51,680
going to be the return value the name of
20077
15:07:49,040 --> 15:07:54,239
the function and the parameter list but
20078
15:07:51,680 --> 15:07:56,955
to make it a valid declaration we have
20079
15:07:54,239 --> 15:07:58,319
to put a semicolon after this so this is
20080
15:07:59,756 --> 15:08:04,319
sometimes it is also called a prototype
20081
15:08:04,480 --> 15:08:09,040
and please make sure you understand the
20082
15:08:06,319 --> 15:08:11,275
difference between a prototype and a
20083
15:08:09,040 --> 15:08:14,319
signature in the last lecture we saw
20084
15:08:11,275 --> 15:08:16,400
that the signature was only made of the
20085
15:08:14,319 --> 15:08:20,000
name of the function and the parameter
20086
15:08:16,400 --> 15:08:21,916
list but the return value was not part
20087
15:08:20,000 --> 15:08:24,559
of the function signature but the
20088
15:08:21,915 --> 15:08:27,755
prototype includes all these guys so
20089
15:08:30,160 --> 15:08:36,880
okay so now that we have our function
20090
15:08:32,879 --> 15:08:38,955
declaration setup we need to put in
20091
15:08:36,879 --> 15:08:42,079
a function definition because if you try
20092
15:08:38,955 --> 15:08:44,479
to compile this program and link it
20093
15:08:42,080 --> 15:08:45,840
you are going to get problems let's try
20094
15:08:44,480 --> 15:08:47,040
and do that before we put in the
20095
15:08:47,040 --> 15:08:50,955
we can weld with gcc we are learning so
20096
15:08:50,955 --> 15:08:53,839
have to fear breaking things a little
20097
15:08:53,839 --> 15:09:00,639
let's clear and try to build with gcc
20098
15:08:58,400 --> 15:09:03,116
and you're going to see ah we have a
20099
15:09:00,639 --> 15:09:05,756
problem here and what kind of problem we
20100
15:09:03,116 --> 15:09:08,720
have the c plus plus compiler is going
20101
15:09:05,756 --> 15:09:10,319
to compile this program but when we hit
20102
15:09:10,319 --> 15:09:14,639
i realize i haven't really talked about
20103
15:09:12,239 --> 15:09:17,595
this in more detail but we will do in
20104
15:09:14,639 --> 15:09:20,000
this lecture but the main problem here
20105
15:09:17,595 --> 15:09:22,720
is that we don't have the definition of
20106
15:09:20,000 --> 15:09:24,480
this function in place and the compiler
20107
15:09:22,720 --> 15:09:26,720
is going to search for it and not find
20108
15:09:24,480 --> 15:09:29,276
it and you see that it is saying
20109
15:09:29,275 --> 15:09:33,115
okay so it has seen the declaration of
20110
15:09:33,116 --> 15:09:37,360
but it doesn't know how the function
20111
15:09:35,595 --> 15:09:39,915
does its job because we don't have a
20112
15:09:37,360 --> 15:09:42,796
function body in here so to really make
20113
15:09:39,915 --> 15:09:45,040
this code work exactly as we want we
20114
15:09:42,796 --> 15:09:47,276
need to put in a definition and the
20115
15:09:45,040 --> 15:09:49,436
definition can show up anywhere in your
20116
15:09:47,275 --> 15:09:50,795
c plus plus program in this case we're
20117
15:09:50,796 --> 15:09:55,040
after the main function and the
20118
15:09:55,040 --> 15:10:00,080
what we have been using so far as our
20119
15:09:57,756 --> 15:10:02,639
function definition in the last lecture
20120
15:10:00,080 --> 15:10:05,680
but notice that it has the body
20121
15:10:02,639 --> 15:10:08,400
information and now when the compiler
20122
15:10:05,680 --> 15:10:11,199
tries to compile this program it will
20123
15:10:08,400 --> 15:10:13,436
know how the maximum function is
20124
15:10:11,199 --> 15:10:15,435
computing its maximum because we have
20125
15:10:13,436 --> 15:10:17,680
all that information in here so let's
20126
15:10:15,436 --> 15:10:21,200
say that this is our function definition
20127
15:10:17,680 --> 15:10:23,915
and shows up after main in this case and
20128
15:10:21,199 --> 15:10:25,755
we can try and build this and see if the
20129
15:10:23,915 --> 15:10:26,559
work is good now you see the world is
20130
15:10:26,559 --> 15:10:32,159
and if we try to run it we're going to
20131
15:10:29,116 --> 15:10:33,360
get our maximum exactly like we did when
20132
15:10:33,360 --> 15:10:38,160
the declaration and the definition
20133
15:10:35,839 --> 15:10:39,915
cramped up before main here but
20134
15:10:38,160 --> 15:10:42,480
hopefully now you can see that our
20135
15:10:39,915 --> 15:10:44,639
program is much cleaner because when you
20136
15:10:42,480 --> 15:10:46,640
look at this you know that we have a
20137
15:10:44,639 --> 15:10:48,720
function called max it's going to take
20138
15:10:46,639 --> 15:10:51,199
two parameters it's going to return
20139
15:10:48,720 --> 15:10:53,200
something and it is called mats so it
20140
15:10:51,199 --> 15:10:56,239
must be computing the maximum of these
20141
15:10:53,199 --> 15:10:58,079
two guys but we don't really care how
20142
15:10:56,239 --> 15:11:00,239
this function does its job how it
20143
15:10:58,080 --> 15:11:02,720
computes the maximum here and this is
20144
15:11:00,239 --> 15:11:05,839
the main message here we can split a
20145
15:11:02,720 --> 15:11:08,400
function in two parts a declaration and
20146
15:11:05,839 --> 15:11:11,039
a definition okay just to play around we
20147
15:11:08,400 --> 15:11:13,360
can also set up a minimum function
20148
15:11:11,040 --> 15:11:15,680
before we do that let's set up its
20149
15:11:13,360 --> 15:11:18,319
definition down here we're just going to
20150
15:11:15,680 --> 15:11:20,639
copy the maximum and adapt it
20151
15:11:18,319 --> 15:11:23,915
we're going to put a copy of that guy
20152
15:11:20,639 --> 15:11:25,595
here we're going to call it men
20153
15:11:23,915 --> 15:11:27,915
it's going to take two parameters it's
20154
15:11:25,595 --> 15:11:31,275
going to return an end but what we test
20155
15:11:27,915 --> 15:11:33,755
for is if a is less than b if a is less
20156
15:11:33,756 --> 15:11:38,796
if a is not less than b then b must be
20157
15:11:36,796 --> 15:11:40,880
our minimum and we can put the
20158
15:11:38,796 --> 15:11:43,520
declaration of this function on top here
20159
15:11:40,879 --> 15:11:47,040
so let's go there and say men
20160
15:11:47,040 --> 15:11:50,879
and now we can change the call here to
20161
15:11:48,879 --> 15:11:53,275
say mean and it is going to compute the
20162
15:11:50,879 --> 15:11:55,199
minimum why not let's do that we're
20163
15:11:53,275 --> 15:11:57,595
going to say min here and we're going to
20164
15:11:55,199 --> 15:11:59,115
grab whatever is the minimum between x
20165
15:11:57,595 --> 15:12:01,839
and y here and that's what we're going
20166
15:11:59,116 --> 15:12:04,080
to have in this result variable here
20167
15:12:01,839 --> 15:12:05,595
let's do that we're going to try and use
20168
15:12:07,360 --> 15:12:11,756
so we're going to clear and run rooster
20169
15:12:09,519 --> 15:12:13,595
now the minimum is five we are calling
20170
15:12:13,595 --> 15:12:17,915
in the last lecture we also set up a
20171
15:12:15,680 --> 15:12:19,756
function to increment and multiply let's
20172
15:12:19,756 --> 15:12:24,319
but split that into a declaration and
20173
15:12:22,559 --> 15:12:26,955
the definition just to practice a little
20174
15:12:24,319 --> 15:12:30,400
more we're going to call this and
20175
15:12:26,955 --> 15:12:32,795
malt and it's going to take a and b in
20176
15:12:30,400 --> 15:12:34,796
and inside and we're not going to put
20177
15:12:32,796 --> 15:12:37,520
the body on top here we're going to put
20178
15:12:34,796 --> 15:12:39,436
the body down with the other definitions
20179
15:12:37,519 --> 15:12:42,079
that we have for all these other
20180
15:12:39,436 --> 15:12:43,596
functions for max and mean here so we're
20181
15:12:42,080 --> 15:12:45,680
going to put in our body it's really
20182
15:12:43,595 --> 15:12:48,079
simple so we're going to put a body
20183
15:12:53,839 --> 15:12:58,239
and we're going to multiply that with an
20184
15:12:58,239 --> 15:13:01,915
and we're going to return that i think
20185
15:13:00,000 --> 15:13:04,160
this is going to be valid c plus plus
20186
15:13:01,915 --> 15:13:06,559
syntax and if we try to call this
20187
15:13:04,160 --> 15:13:09,360
function in main let's do that say in
20188
15:13:06,559 --> 15:13:11,595
mult and we're going to pass an x and y
20189
15:13:09,360 --> 15:13:14,559
the program is going to just work fine
20190
15:13:11,595 --> 15:13:15,360
we're going to grab the result and store
20191
15:13:15,360 --> 15:13:21,040
in our variable let's do that
20192
15:13:21,040 --> 15:13:25,840
and we're going to say result here this
20193
15:13:25,839 --> 15:13:30,079
and if we build and run this program
20194
15:13:28,239 --> 15:13:33,199
we're going to see the output here let's
20195
15:13:33,199 --> 15:13:38,955
the results is going to be 78 because if
20196
15:13:36,080 --> 15:13:42,080
we increment a 5 it becomes a 6.
20197
15:13:38,955 --> 15:13:46,159
if we increment y we're going to get 13
20198
15:13:42,080 --> 15:13:48,720
13 times 6 should be 78 let's be sure
20199
15:13:46,160 --> 15:13:51,116
we're going to bring up the calculator
20200
15:13:48,720 --> 15:13:54,000
let's do that so that you know that i am
20201
15:13:51,116 --> 15:13:56,720
not making these things up 78. so our
20202
15:13:54,000 --> 15:13:58,639
program is really working like it should
20203
15:13:56,720 --> 15:14:00,796
and this is the main message here we can
20204
15:13:58,639 --> 15:14:02,319
really split up functions into a
20205
15:14:02,319 --> 15:14:07,116
and a definition and that's going to
20206
15:14:04,639 --> 15:14:08,796
make our programs much easier to work
20207
15:14:08,796 --> 15:14:13,276
one thing you should know is that the
20208
15:14:10,720 --> 15:14:15,756
names of the variables aren't really
20209
15:14:13,275 --> 15:14:16,559
important in function declarations like
20210
15:14:16,559 --> 15:14:19,915
so for example we can take out the a and
20211
15:14:19,915 --> 15:14:25,435
or we can take out all the variable
20212
15:14:22,239 --> 15:14:27,275
names in our function declarations let's
20213
15:14:27,275 --> 15:14:32,319
and you might think is this program
20214
15:14:29,360 --> 15:14:34,720
going to compile well i hate to break it
20215
15:14:32,319 --> 15:14:37,199
to you but it is going to compile so
20216
15:14:37,199 --> 15:14:41,915
you're going to see that the both is
20217
15:14:38,559 --> 15:14:44,559
good so the function header or
20218
15:14:41,915 --> 15:14:46,079
declaration doesn't really care about
20219
15:14:46,080 --> 15:14:50,240
in the definitions we care about these
20220
15:14:48,239 --> 15:14:52,879
variable names because we are going to
20221
15:14:50,239 --> 15:14:55,040
be using them in the bodies but if you
20222
15:14:52,879 --> 15:14:58,719
want you can leave them out in your
20223
15:14:55,040 --> 15:15:00,879
function declarations but i like to keep
20224
15:14:58,720 --> 15:15:03,360
them in place because i like my
20225
15:15:00,879 --> 15:15:05,360
functions to be self-documented if
20226
15:15:03,360 --> 15:15:07,756
somebody looks at this they will know
20227
15:15:05,360 --> 15:15:09,595
the variable name here but if you really
20228
15:15:07,756 --> 15:15:12,319
want you can leave the variable names
20229
15:15:09,595 --> 15:15:13,839
out and it is going to work pretty well
20230
15:15:12,319 --> 15:15:15,199
this is really always enough to do in
20231
15:15:13,839 --> 15:15:17,435
this lecture i hope you found it
20232
15:15:15,199 --> 15:15:19,275
interesting we are going to stop here in
20233
15:15:17,436 --> 15:15:20,955
this lecture in the next one we are
20234
15:15:19,275 --> 15:15:24,000
going to see how we can split our
20235
15:15:20,955 --> 15:15:26,159
programs in multiple files now that we
20236
15:15:24,000 --> 15:15:27,436
know how to split into declaration and
20237
15:15:27,436 --> 15:15:31,436
go ahead and finish up here and meet me
20238
15:15:31,436 --> 15:15:36,080
in this lecture we're going to revisit
20239
15:15:33,680 --> 15:15:38,720
our c plus plus program compilation
20240
15:15:36,080 --> 15:15:40,880
model along the way we are also going to
20241
15:15:38,720 --> 15:15:43,040
see how we can work with functions
20242
15:15:43,040 --> 15:15:47,520
if you remember our compilation model
20243
15:15:45,436 --> 15:15:50,796
looked something like this you have seen
20244
15:15:47,519 --> 15:15:53,039
this slide a lot of times by now what it
20245
15:15:50,796 --> 15:15:55,520
describes is what happens when we
20246
15:15:53,040 --> 15:15:58,400
compile our program the moment we run
20247
15:15:55,519 --> 15:16:01,039
the compilation command our c plus
20248
15:15:58,400 --> 15:16:03,360
program which lives in the main cpp file
20249
15:16:01,040 --> 15:16:05,275
by now is going to be passed through the
20250
15:16:03,360 --> 15:16:07,199
compiler the compiler is going to
20251
15:16:05,275 --> 15:16:10,000
process it and it is going to come up
20252
15:16:07,199 --> 15:16:12,319
with a binary executable that is mostly
20253
15:16:10,000 --> 15:16:15,275
called rooster in this course and when
20254
15:16:12,319 --> 15:16:17,519
we execute this rooster file or binary
20255
15:16:15,275 --> 15:16:20,079
file we're going to get the program to
20256
15:16:17,519 --> 15:16:22,239
run the program is going to be executed
20257
15:16:20,080 --> 15:16:24,955
instruction by instruction when it is
20258
15:16:22,239 --> 15:16:26,795
loaded by the operating system and we
20259
15:16:24,955 --> 15:16:29,040
are mostly going to see the output of
20260
15:16:26,796 --> 15:16:31,596
that program on the terminal in this
20261
15:16:29,040 --> 15:16:35,116
course this is the compilation model we
20262
15:16:31,595 --> 15:16:38,319
know but now what we want to do is zoom
20263
15:16:35,116 --> 15:16:40,955
in on this compilation part here and see
20264
15:16:38,319 --> 15:16:43,275
what really happens under the hood
20265
15:16:40,955 --> 15:16:46,239
we are going to suppose that we have a
20266
15:16:43,275 --> 15:16:48,559
program which is made of a lot of source
20267
15:16:46,239 --> 15:16:51,360
files as we have here on the left
20268
15:16:48,559 --> 15:16:54,159
suppose we have two three or five source
20269
15:16:51,360 --> 15:16:57,040
files unlike what we have so far which
20270
15:16:54,160 --> 15:16:58,796
is one file the main cpp file when you
20271
15:16:57,040 --> 15:17:00,840
compile such a program you're going to
20272
15:17:00,839 --> 15:17:04,159
pre-processing and what this is going to
20273
15:17:04,160 --> 15:17:08,160
it's going to look for your include
20274
15:17:08,160 --> 15:17:12,880
and it is going to take whatever file
20275
15:17:10,400 --> 15:17:15,436
you are including and it is going to
20276
15:17:12,879 --> 15:17:18,159
paste that in place so for example here
20277
15:17:15,436 --> 15:17:19,360
you see we have an include io stream
20278
15:17:19,360 --> 15:17:25,756
when the pre-processing stage is run
20279
15:17:23,436 --> 15:17:28,880
this includes statement is going to be
20280
15:17:25,756 --> 15:17:32,160
replaced with whatever we have in this
20281
15:17:28,879 --> 15:17:34,239
io stream file here so this is going to
20282
15:17:32,160 --> 15:17:38,240
be wiped out and we're going to put in
20283
15:17:34,239 --> 15:17:40,319
the content that we have in io stream in
20284
15:17:38,239 --> 15:17:42,955
this exact place where we have the
20285
15:17:40,319 --> 15:17:45,040
include statement i hope this is clear
20286
15:17:42,955 --> 15:17:46,795
so when we go through preprocessing
20287
15:17:46,796 --> 15:17:52,720
a version of our source files
20288
15:17:49,519 --> 15:17:54,639
with the included parts put in our
20289
15:17:52,720 --> 15:17:56,720
source files we're basically going to go
20290
15:17:54,639 --> 15:17:59,839
copy everything in that file that we
20291
15:17:56,720 --> 15:18:02,796
include and we're going to paste inside
20292
15:17:59,839 --> 15:18:05,915
our new files here that we're going to
20293
15:18:02,796 --> 15:18:08,560
be referring to as translation units by
20294
15:18:05,915 --> 15:18:11,275
now these are translation units in a c
20295
15:18:11,275 --> 15:18:14,955
once you have this translation unit then
20296
15:18:13,436 --> 15:18:16,880
you're going to compile them they are
20297
15:18:14,955 --> 15:18:19,116
going to go through the compiler the
20298
15:18:16,879 --> 15:18:22,639
compiler is going to generate what we
20299
15:18:19,116 --> 15:18:25,596
call an object file and this is a binary
20300
15:18:22,639 --> 15:18:28,080
representation of the content you have
20301
15:18:25,595 --> 15:18:30,399
in your translation unit so each
20302
15:18:28,080 --> 15:18:33,520
translation unit is going to generate
20303
15:18:30,400 --> 15:18:36,480
one object file and for example if you
20304
15:18:33,519 --> 15:18:39,039
had 20 translation units in your program
20305
15:18:36,480 --> 15:18:41,200
you're going to have 20 object files
20306
15:18:39,040 --> 15:18:43,200
once we have object files they are going
20307
15:18:41,199 --> 15:18:44,319
to be processed by what we call the
20308
15:18:44,319 --> 15:18:49,756
and the linker is going to stitch them
20309
15:18:46,319 --> 15:18:52,159
together and have one single binary file
20310
15:18:49,756 --> 15:18:53,916
out of all these object files so we're
20311
15:18:52,160 --> 15:18:56,320
going to have something like this and
20312
15:18:53,915 --> 15:18:59,360
this is basically going to be our binary
20313
15:18:56,319 --> 15:19:01,595
that we can run on our target operating
20314
15:18:59,360 --> 15:19:03,680
system so by now you see that our
20315
15:19:01,595 --> 15:19:05,756
compilation model has expanded to
20316
15:19:05,756 --> 15:19:11,360
pre-processing compilation and linking
20317
15:19:09,040 --> 15:19:14,080
now you might be asking why am i showing
20318
15:19:11,360 --> 15:19:15,436
you this now well it is going to matter
20319
15:19:14,080 --> 15:19:18,560
because we're going to split to a
20320
15:19:15,436 --> 15:19:20,720
program across multiple files some of
20321
15:19:18,559 --> 15:19:23,199
those files are going to matter on the
20322
15:19:20,720 --> 15:19:25,275
compilation phase and some of those
20323
15:19:23,199 --> 15:19:28,079
files are going to matter on the linking
20324
15:19:25,275 --> 15:19:30,159
stage so we really need to make a clear
20325
15:19:28,080 --> 15:19:32,639
distinction between the compilation and
20326
15:19:30,160 --> 15:19:35,916
linking here okay this should be a more
20327
15:19:32,639 --> 15:19:37,756
complete compilation model to go by for
20328
15:19:35,915 --> 15:19:40,000
now now that we know about this
20329
15:19:37,756 --> 15:19:42,239
compilation model we can look at how we
20330
15:19:40,000 --> 15:19:44,400
can split our program across multiple
20331
15:19:42,239 --> 15:19:46,400
files suppose we have three functions
20332
15:19:44,400 --> 15:19:49,436
one we can use to get the maximum of two
20333
15:19:46,400 --> 15:19:51,436
numbers called max a function called men
20334
15:19:49,436 --> 15:19:53,916
we can use to get the minimum between
20335
15:19:51,436 --> 15:19:56,480
two numbers and a function we can use to
20336
15:19:53,915 --> 15:19:57,915
increment and multiply like we have seen
20337
15:19:56,480 --> 15:19:59,680
in the last lecture now the two
20338
15:19:57,915 --> 15:20:02,639
functions maths and men are going to
20339
15:19:59,680 --> 15:20:04,480
live in their own file and that file is
20340
15:20:02,639 --> 15:20:06,955
going to be split in two files we're
20341
15:20:04,480 --> 15:20:08,880
going to have a header file and a cpp
20342
15:20:06,955 --> 15:20:10,955
file which is going to contain the
20343
15:20:08,879 --> 15:20:13,435
implementation in the header what we're
20344
15:20:10,955 --> 15:20:15,519
going to have is just a prototype and we
20345
15:20:13,436 --> 15:20:18,239
are going to set up our code in a way
20346
15:20:15,519 --> 15:20:20,639
that our anchor mult function here is
20347
15:20:18,239 --> 15:20:22,559
going to live in zone file we're going
20348
15:20:20,639 --> 15:20:24,159
to split that in two files so we're
20349
15:20:22,559 --> 15:20:25,680
going to have a header file called
20350
15:20:30,080 --> 15:20:33,436
which is going to contain the
20351
15:20:31,275 --> 15:20:35,519
implementation of this function here
20352
15:20:33,436 --> 15:20:37,275
when we hit the main file what we're
20353
15:20:35,519 --> 15:20:40,000
going to do is nothing special we're
20354
15:20:37,275 --> 15:20:42,000
just going to include the headers and we
20355
15:20:40,000 --> 15:20:44,239
are going to use these functions like we
20356
15:20:42,000 --> 15:20:45,756
have been using them all along if you
20357
15:20:44,239 --> 15:20:48,079
look on the first line here we are
20358
15:20:45,756 --> 15:20:50,796
calling max on the second line we are
20359
15:20:48,080 --> 15:20:53,840
calling men and on the third line here
20360
15:20:50,796 --> 15:20:56,400
we are calling incur mult to do whatever
20361
15:20:53,839 --> 15:20:58,399
it does okay when you start splitting
20362
15:20:56,400 --> 15:21:01,436
your functions between the definitions
20363
15:20:58,400 --> 15:21:04,239
and the declarations remember the one
20364
15:21:01,436 --> 15:21:07,200
definition rule and this says that you
20365
15:21:04,239 --> 15:21:10,000
can't have a function defined
20366
15:21:07,199 --> 15:21:12,079
multiple times in your entire c-plus
20367
15:21:10,000 --> 15:21:14,239
class application if you do that the
20368
15:21:12,080 --> 15:21:16,560
lincoln stage is going to find those two
20369
15:21:16,559 --> 15:21:20,879
not know which one you really want to
20370
15:21:18,796 --> 15:21:22,240
use and you're going to get a linker
20371
15:21:20,879 --> 15:21:24,559
error we're going to see that when we
20372
15:21:22,239 --> 15:21:26,479
hit visual studio code in a minute
20373
15:21:24,559 --> 15:21:29,040
another thing is that you know that your
20374
15:21:26,480 --> 15:21:30,160
definition can really leave anywhere in
20375
15:21:30,160 --> 15:21:35,200
the linker is smart enough to parse your
20376
15:21:35,199 --> 15:21:40,399
the definition for whatever function
20377
15:21:37,595 --> 15:21:42,720
it's found in your source code and it's
20378
15:21:40,400 --> 15:21:45,520
going to keep looking until it finishes
20379
15:21:42,720 --> 15:21:47,756
looking in all translation units and
20380
15:21:45,519 --> 15:21:49,839
when it doesn't find the definition it's
20381
15:21:47,756 --> 15:21:51,756
going to give you a link error which is
20382
15:21:49,839 --> 15:21:53,595
probably going to say undefined
20383
15:21:51,756 --> 15:21:55,840
reference to something and we're going
20384
15:21:53,595 --> 15:21:57,680
to see an example of this in a minute
20385
15:21:55,839 --> 15:21:59,915
okay now that you know about this
20386
15:21:57,680 --> 15:22:03,199
updated compilation model and you have
20387
15:21:59,915 --> 15:22:05,360
an idea that we can split our functions
20388
15:22:03,199 --> 15:22:07,199
across multiple files we're going to
20389
15:22:05,360 --> 15:22:08,160
head over to visual studio code and play
20390
15:22:08,160 --> 15:22:14,240
okay here we are in our working folder
20391
15:22:11,436 --> 15:22:16,400
the current project is multiple files
20392
15:22:14,239 --> 15:22:18,879
here we're going to grab our template
20393
15:22:18,879 --> 15:22:23,839
and put that in the project of interest
20394
15:22:22,239 --> 15:22:25,915
and we're going to open this in visual
20395
15:22:23,839 --> 15:22:28,159
studio code let's do that we're going to
20396
15:22:25,915 --> 15:22:30,000
open the folder i'm going to choose the
20397
15:22:30,000 --> 15:22:34,319
and we are going to open up the main cpp
20398
15:22:34,319 --> 15:22:39,116
and clean it up a little bit we are
20399
15:22:36,955 --> 15:22:41,275
going to set up a max function and
20400
15:22:39,116 --> 15:22:44,080
remember the function has to show up
20401
15:22:44,080 --> 15:22:49,680
and uh we are going to split this into a
20402
15:22:47,116 --> 15:22:51,916
definition and a declaration i think we
20403
15:22:49,680 --> 15:22:53,275
already know how to do that so let's do
20404
15:22:53,275 --> 15:22:58,239
put a definition down here and we're
20405
15:22:55,519 --> 15:23:01,275
going to change what we have on top here
20406
15:22:58,239 --> 15:23:03,839
into a declaration let's say that to be
20407
15:23:01,275 --> 15:23:05,915
super clear and what we have down here
20408
15:23:03,839 --> 15:23:07,519
is a definition and we can call this
20409
15:23:05,915 --> 15:23:09,915
function we're going to set up the
20410
15:23:07,519 --> 15:23:11,275
variable which is going to store our max
20411
15:23:11,275 --> 15:23:15,360
and we're going to assign whatever we
20412
15:23:15,360 --> 15:23:22,080
to max here so we want to find the
20413
15:23:17,680 --> 15:23:23,840
maximum between 34 and 56 for example
20414
15:23:22,080 --> 15:23:26,880
and we're going to print this out i'm
20415
15:23:23,839 --> 15:23:29,435
going to say max is the maximum
20416
15:23:26,879 --> 15:23:31,595
and if we boil and run this program
20417
15:23:29,436 --> 15:23:34,319
let's use gcc to do that we have a
20418
15:23:31,595 --> 15:23:36,559
compiler error here what is that we need
20419
15:23:34,319 --> 15:23:38,480
a semicolon not a column here
20420
15:23:36,559 --> 15:23:41,360
i think the squiggly line is now going
20421
15:23:38,480 --> 15:23:43,200
to go away and our things are named the
20422
15:23:41,360 --> 15:23:45,436
same way the compiler is not going to
20423
15:23:43,199 --> 15:23:48,479
like it let's bring up a terminal so
20424
15:23:45,436 --> 15:23:50,639
that we see our problems tab expression
20425
15:23:48,480 --> 15:23:51,680
preceding parentheses or parallel must
20426
15:23:51,680 --> 15:23:57,116
ah okay the problem here is that these
20427
15:23:54,239 --> 15:23:59,199
two guys max and max are called
20428
15:23:57,116 --> 15:24:01,276
the same and this is going to confuse
20429
15:23:59,199 --> 15:24:04,319
the compiler a little bit so what we're
20430
15:24:01,275 --> 15:24:06,479
going to do is call this maximum
20431
15:24:06,480 --> 15:24:11,916
and we're going to do maximum here
20432
15:24:09,436 --> 15:24:14,840
and the compiler is going to be happy
20433
15:24:11,915 --> 15:24:18,079
now we can compile and i've built this
20434
15:24:14,839 --> 15:24:21,435
program world is good and if we run it
20435
15:24:18,080 --> 15:24:24,639
we should get our maximum printed out
20436
15:24:21,436 --> 15:24:29,436
let's see that the maximum is 56
20437
15:24:24,639 --> 15:24:31,595
and if we change 34 here to be 134
20438
15:24:29,436 --> 15:24:34,160
and both again we should grab that as
20439
15:24:31,595 --> 15:24:35,115
the maximum let's see if that's the case
20440
15:24:35,116 --> 15:24:41,840
run the program the maximum is 134.
20441
15:24:38,796 --> 15:24:44,560
so this is working exactly as we want
20442
15:24:41,839 --> 15:24:47,039
the next thing we want to do is to split
20443
15:24:44,559 --> 15:24:48,559
this function across multiple files so
20444
15:24:47,040 --> 15:24:51,116
we're going to set up two different
20445
15:24:48,559 --> 15:24:53,435
files one is going to be a header file
20446
15:24:51,116 --> 15:24:55,680
the other is going to be a cpp file and
20447
15:24:53,436 --> 15:24:57,520
you have to follow this structure in c
20448
15:24:55,680 --> 15:25:00,239
plus so we're going to go on the left
20449
15:24:57,519 --> 15:25:02,719
here and add a new file in visual studio
20450
15:25:00,239 --> 15:25:05,519
code you can click on this little icon
20451
15:25:02,720 --> 15:25:06,720
that says new file to create a new file
20452
15:25:05,519 --> 15:25:08,795
once you do that you're going to be
20453
15:25:06,720 --> 15:25:10,955
given this little window in which we can
20454
15:25:08,796 --> 15:25:14,560
type the name of the file we're going to
20455
15:25:14,559 --> 15:25:19,040
dot h it's going to be our header file
20456
15:25:17,519 --> 15:25:22,399
and we're going to add another one which
20457
15:25:19,040 --> 15:25:24,480
is going to say compare that cpp okay
20458
15:25:22,400 --> 15:25:27,275
our two files are going to be compare
20459
15:25:27,275 --> 15:25:32,079
and they are going to contain
20460
15:25:29,595 --> 15:25:34,559
our functions to compare stuff so we're
20461
15:25:32,080 --> 15:25:37,040
going to have in a function called max
20462
15:25:34,559 --> 15:25:39,435
and another function called men for
20463
15:25:37,040 --> 15:25:41,595
computing the minimum let's go there and
20464
15:25:39,436 --> 15:25:44,796
actually do that we're going to move our
20465
15:25:41,595 --> 15:25:46,639
declaration in the header file
20466
15:25:44,796 --> 15:25:48,880
so your declarations are going to be
20467
15:25:46,639 --> 15:25:51,915
leaving in header files and we're going
20468
15:25:48,879 --> 15:25:54,360
to grab our definition and move that
20469
15:25:54,360 --> 15:26:01,360
compare.cpp so i'm just going to cut it
20470
15:25:57,275 --> 15:26:02,955
out and paste that and compare cpp here
20471
15:26:01,360 --> 15:26:04,000
once we do that we're going to go back
20472
15:26:04,000 --> 15:26:08,955
and see that we have a problem now
20473
15:26:06,480 --> 15:26:10,796
the main function doesn't know what this
20474
15:26:08,955 --> 15:26:12,879
max function is because it's not
20475
15:26:10,796 --> 15:26:14,480
declared anymore and if we're trying to
20476
15:26:12,879 --> 15:26:16,795
compile our program we're basically
20477
15:26:14,480 --> 15:26:19,596
going to get the same error we see here
20478
15:26:16,796 --> 15:26:22,000
and visual studio code identifier max is
20479
15:26:19,595 --> 15:26:24,479
undefined because it doesn't know what
20480
15:26:22,000 --> 15:26:26,559
this function is if we ignore this and
20481
15:26:24,480 --> 15:26:29,116
try to weld let's do that we are
20482
15:26:26,559 --> 15:26:30,955
learning so no big deal here we're going
20483
15:26:30,955 --> 15:26:36,319
much weirder error but the message is
20484
15:26:34,239 --> 15:26:39,115
going to be the same maths was not
20485
15:26:36,319 --> 15:26:41,116
declared in the scope so the compiler
20486
15:26:39,116 --> 15:26:43,680
doesn't know what to do with whatever we
20487
15:26:41,116 --> 15:26:45,756
typed here but there is a way in c plus
20488
15:26:43,680 --> 15:26:49,116
plus we can solve this problem by
20489
15:26:45,756 --> 15:26:51,520
including the header that contains our
20490
15:26:49,116 --> 15:26:53,756
declaration for the function that we are
20491
15:26:51,519 --> 15:26:55,915
using here we can go back in main and do
20492
15:26:53,756 --> 15:26:59,200
that and we're going to say include and
20493
15:27:00,720 --> 15:27:04,080
that's going to bring in our header and
20494
15:27:02,720 --> 15:27:05,680
if you wait a minute you're going to see
20495
15:27:04,080 --> 15:27:09,756
that the squiggly line is going to go
20496
15:27:05,680 --> 15:27:12,796
away so what happened the preprocessor
20497
15:27:09,756 --> 15:27:15,520
is going to come in and copy whatever we
20498
15:27:12,796 --> 15:27:18,319
have inside compare.h it's basically
20499
15:27:15,519 --> 15:27:21,199
going to go and compare that age copy
20500
15:27:18,319 --> 15:27:24,080
everything we have in here and come back
20501
15:27:21,199 --> 15:27:27,115
in main and paste all that in the place
20502
15:27:24,080 --> 15:27:30,240
where we have the include directive here
20503
15:27:27,116 --> 15:27:33,360
this is called an include directive or
20504
15:27:30,239 --> 15:27:35,436
an include preprocessor directive this
20505
15:27:33,360 --> 15:27:37,915
is what the preprocessor is going to do
20506
15:27:35,436 --> 15:27:40,000
here and now if we try to build this
20507
15:27:37,915 --> 15:27:43,275
program let's try to do that we should
20508
15:27:40,000 --> 15:27:45,595
be fine world finished successfully and
20509
15:27:43,275 --> 15:27:48,159
we can run our program to see the
20510
15:27:45,595 --> 15:27:51,519
maximum printed out let's run rooster
20511
15:27:48,160 --> 15:27:53,596
maximum is 134 now everything is working
20512
15:27:51,519 --> 15:27:55,359
let's add another function here because
20513
15:27:53,595 --> 15:27:57,275
just having one function is really
20514
15:27:55,360 --> 15:27:59,915
boring so we're going to put in a main
20515
15:27:57,275 --> 15:28:01,040
function it's going to type into a and
20516
15:28:01,040 --> 15:28:05,680
and we're going to go in the cpp file
20517
15:28:03,199 --> 15:28:07,519
and put in another definition for the
20518
15:28:05,680 --> 15:28:10,160
minimum function here we're going to
20519
15:28:13,519 --> 15:28:18,399
let's call this man and we're going to
20520
15:28:15,756 --> 15:28:21,275
test for a is less than b this is going
20521
15:28:18,400 --> 15:28:24,400
to give us a minimum and now if we go
20522
15:28:21,275 --> 15:28:26,400
back in main cpp we will be able to use
20523
15:28:24,400 --> 15:28:30,319
our minimum function because it is
20524
15:28:26,400 --> 15:28:33,200
protein also by this preprocessor
20525
15:28:30,319 --> 15:28:35,680
directive we have here so we can go down
20526
15:28:33,199 --> 15:28:36,795
and say end minimum and we're going to
20527
15:28:40,000 --> 15:28:44,879
and 23 why not and we're going to print
20528
15:28:42,955 --> 15:28:47,519
the minimum here and we're going to
20529
15:28:47,519 --> 15:28:52,159
the bullet is going to be good if we run
20530
15:28:49,680 --> 15:28:54,559
this we should see both the maximum and
20531
15:28:52,160 --> 15:28:55,840
the minimum from these calls we make
20532
15:28:55,839 --> 15:29:01,275
okay by now you should have an idea
20533
15:28:57,839 --> 15:29:03,839
about how to split your functions across
20534
15:29:01,275 --> 15:29:07,115
multiple files you should also know that
20535
15:29:03,839 --> 15:29:09,519
you will have to include whatever header
20536
15:29:07,116 --> 15:29:11,916
contains the declarations for the
20537
15:29:09,519 --> 15:29:14,399
functions that you want to use another
20538
15:29:11,915 --> 15:29:16,955
thing i want you to see is that the
20539
15:29:14,400 --> 15:29:20,639
definitions for your functions don't
20540
15:29:16,955 --> 15:29:23,595
have to live in a file that is named the
20541
15:29:20,639 --> 15:29:25,595
same as the header file for example here
20542
15:29:23,595 --> 15:29:27,115
our header file is called compare and
20543
15:29:25,595 --> 15:29:29,839
the comparison tpp contains our
20544
15:29:27,116 --> 15:29:32,400
definitions but the definitions don't
20545
15:29:29,839 --> 15:29:35,275
have to live here they can really live
20546
15:29:32,400 --> 15:29:37,596
in any translation unit that you have in
20547
15:29:37,595 --> 15:29:42,795
and our c plus plus programs the
20548
15:29:39,915 --> 15:29:45,839
translation unit is mostly equivalent to
20549
15:29:42,796 --> 15:29:47,436
a cpp file so let's set up another file
20550
15:29:45,839 --> 15:29:49,359
and show you that we can move this
20551
15:29:47,436 --> 15:29:51,200
definition there and the program is
20552
15:29:49,360 --> 15:29:53,915
going to keep working we're going to add
20553
15:29:51,199 --> 15:29:55,680
another cpp file and call it some
20554
15:29:55,680 --> 15:29:59,360
that cpp it has to be a cpp file because
20555
15:29:59,360 --> 15:30:03,840
implementations and let's take the
20556
15:30:02,000 --> 15:30:06,319
implementations for example let's take
20557
15:30:03,839 --> 15:30:07,199
them all put them in another file why
20558
15:30:07,199 --> 15:30:12,079
we're going to grab all these guys here
20559
15:30:09,595 --> 15:30:14,159
let's catch them out and put them in
20560
15:30:14,160 --> 15:30:18,640
and i'm going to build this and see that
20561
15:30:18,639 --> 15:30:23,275
because the linker is smart enough to go
20562
15:30:23,275 --> 15:30:28,955
and whatever translation units that we
20563
15:30:25,839 --> 15:30:31,435
have set up in our project here and you
20564
15:30:28,955 --> 15:30:33,199
see the world is good we can upload this
20565
15:30:31,436 --> 15:30:35,360
we can run this i should say and we're
20566
15:30:33,199 --> 15:30:38,719
going to have our output here we can
20567
15:30:35,360 --> 15:30:40,680
even take one of these guys let it leave
20568
15:30:40,680 --> 15:30:45,040
compare.cpp file for example let's take
20569
15:30:45,040 --> 15:30:49,915
and we're going to bring that
20570
15:30:46,839 --> 15:30:50,795
back and we're going to work notice that
20571
15:30:50,796 --> 15:30:56,720
our maximum function is living in some
20572
15:30:54,000 --> 15:30:59,199
other file and that the minimum function
20573
15:30:56,720 --> 15:31:02,080
definition is leaving and compare that
20574
15:30:59,199 --> 15:31:04,399
cpp but if we will this is going to work
20575
15:31:04,400 --> 15:31:08,796
going to parse all the translation units
20576
15:31:08,796 --> 15:31:14,000
definition it needs to find and in this
20577
15:31:11,680 --> 15:31:17,116
case it will be looking for the maximum
20578
15:31:14,000 --> 15:31:19,915
here and it's going to find that in some
20579
15:31:19,915 --> 15:31:24,000
minimum function here it's going to be
20580
15:31:21,756 --> 15:31:26,000
looking and compare and it is going to
20581
15:31:24,000 --> 15:31:28,480
find it and the world is going to be
20582
15:31:26,000 --> 15:31:31,519
good and we can run the program again
20583
15:31:31,519 --> 15:31:37,115
one thing i really need to point out is
20584
15:31:34,239 --> 15:31:39,595
that if the definition is not available
20585
15:31:37,116 --> 15:31:42,160
let's say the minimum function here is
20586
15:31:39,595 --> 15:31:44,559
not there we can comment it out to hide
20587
15:31:42,160 --> 15:31:45,916
it to the compiler or hide it from the
20588
15:31:48,160 --> 15:31:53,040
we will get a linker error let's try to
20589
15:31:53,040 --> 15:31:58,239
uh-huh world finished with errol's the
20590
15:31:55,915 --> 15:32:02,000
terminal process terminated with execute
20591
15:31:58,239 --> 15:32:05,040
code -1 but the main message here is
20592
15:32:02,000 --> 15:32:08,000
that we have an undefined reference to
20593
15:32:05,040 --> 15:32:10,319
min and and so when we compile the
20594
15:32:08,000 --> 15:32:13,796
compiler is going to be happy with the
20595
15:32:10,319 --> 15:32:16,639
declarations that it has found in our
20596
15:32:13,796 --> 15:32:19,520
compare.h file if we go there we see
20597
15:32:16,639 --> 15:32:21,839
that we have a declaration for max and
20598
15:32:19,519 --> 15:32:23,435
the declaration for man the compiler is
20599
15:32:21,839 --> 15:32:26,000
going to be happy it's going to compile
20600
15:32:23,436 --> 15:32:28,720
our code and when the compiler compiles
20601
15:32:26,000 --> 15:32:31,040
it's going to generate object files and
20602
15:32:28,720 --> 15:32:33,595
it will hand the job over to the linker
20603
15:32:31,040 --> 15:32:36,559
to stitch all those little object files
20604
15:32:33,595 --> 15:32:38,639
together to have one single binary file
20605
15:32:36,559 --> 15:32:40,559
once the linker tries to do that it's
20606
15:32:38,639 --> 15:32:42,796
going to look at main because that's
20607
15:32:40,559 --> 15:32:44,639
where it's mostly going to start from
20608
15:32:42,796 --> 15:32:47,116
and it's going to see uh-huh main is
20609
15:32:44,639 --> 15:32:49,199
calling minimum here where is the
20610
15:32:47,116 --> 15:32:51,276
definition for the minimum function it's
20611
15:32:49,199 --> 15:32:54,000
going to parse every single translation
20612
15:32:51,275 --> 15:32:55,839
unit in the project it's going to come
20613
15:32:54,000 --> 15:32:57,199
here and compare that cpp it's not going
20614
15:32:55,839 --> 15:32:59,519
to find it it's going to look in
20615
15:32:57,199 --> 15:33:01,199
main.cpp it's not going to find it it's
20616
15:32:59,519 --> 15:33:03,519
going to look in some other file it's
20617
15:33:01,199 --> 15:33:05,115
not going to find the definition and the
20618
15:33:05,116 --> 15:33:09,436
i didn't find my definition for the
20619
15:33:07,040 --> 15:33:11,915
minimum function so i'm going to throw a
20620
15:33:09,436 --> 15:33:14,560
linker error and you the developer
20621
15:33:11,915 --> 15:33:16,239
you're going to fix this problem and
20622
15:33:14,559 --> 15:33:20,000
you're going to see this error here and
20623
15:33:16,239 --> 15:33:21,040
again this is a linker error gcc doesn't
20624
15:33:21,040 --> 15:33:25,680
more visible stuff to show you that this
20625
15:33:23,595 --> 15:33:30,000
is a linker error but what you should
20626
15:33:25,680 --> 15:33:33,915
look for is ld returned 1 here because
20627
15:33:30,000 --> 15:33:35,360
ld is the linker that gcc uses so this
20628
15:33:35,360 --> 15:33:39,840
i think i should show you how a linker
20629
15:33:37,275 --> 15:33:42,400
error looks if you are using a microsoft
20630
15:33:39,839 --> 15:33:46,079
compiler so we're going to build again
20631
15:33:42,400 --> 15:33:47,840
but now we're going to build with msvc
20632
15:33:46,080 --> 15:33:50,560
if you don't have visual studio that's
20633
15:33:47,839 --> 15:33:52,955
not a problem you can keep using gcc but
20634
15:33:50,559 --> 15:33:56,239
i just want you to see how different
20635
15:33:52,955 --> 15:33:57,839
compilers handle these arrows i have the
20636
15:33:56,239 --> 15:33:59,519
luxury to do that because i am
20637
15:33:57,839 --> 15:34:02,559
developing this course on a windows
20638
15:33:59,519 --> 15:34:04,955
machine and i have a microsoft compiler
20639
15:34:02,559 --> 15:34:07,360
handy that we can use directly from
20640
15:34:04,955 --> 15:34:09,116
visual studio code here so i am going to
20641
15:34:09,116 --> 15:34:12,880
and you're going to see that it is going
20642
15:34:10,559 --> 15:34:15,680
to start welding it is building
20643
15:34:12,879 --> 15:34:18,879
and it is going to fail and throw a link
20644
15:34:15,680 --> 15:34:22,080
arrow also so you see here some other
20645
15:34:22,879 --> 15:34:27,755
this object file was being taken and
20646
15:34:25,360 --> 15:34:30,639
stitched together with other object
20647
15:34:27,756 --> 15:34:32,880
files to put together a binary it didn't
20648
15:34:30,639 --> 15:34:34,479
find the definition for the minimum
20649
15:34:32,879 --> 15:34:36,879
function and it is going to throw a
20650
15:34:34,480 --> 15:34:39,680
linker error and in visual studio you're
20651
15:34:36,879 --> 15:34:40,879
going to have a problem like this l and
20652
15:34:40,879 --> 15:34:44,879
and it's going to give whatever version
20653
15:34:42,720 --> 15:34:47,436
of the compiler you are using but down
20654
15:34:44,879 --> 15:34:51,115
here you see unresolved external symbol
20655
15:34:47,436 --> 15:34:53,040
this is how visual studio says it and
20656
15:34:53,040 --> 15:34:57,915
an undefined reference to something this
20657
15:34:55,360 --> 15:35:00,239
is just visual studio's compiler's way
20658
15:34:57,915 --> 15:35:02,159
to say this and again it's going to say
20659
15:35:02,160 --> 15:35:06,720
it is basically the same error we saw
20660
15:35:04,319 --> 15:35:09,040
when we were using gcc in a minute video
20661
15:35:06,720 --> 15:35:11,275
studio the compiler from microsoft is
20662
15:35:09,040 --> 15:35:13,200
also going to put a lot of junk in our
20663
15:35:11,275 --> 15:35:17,199
folder here so let's remove all these
20664
15:35:13,199 --> 15:35:20,159
things i'm going to select them all
20665
15:35:20,160 --> 15:35:24,720
and they are going to go to my recycle
20666
15:35:22,160 --> 15:35:28,080
bin and we have another one here we
20667
15:35:24,720 --> 15:35:30,595
should remove let's remove it
20668
15:35:28,080 --> 15:35:33,520
and now we should go back in some other
20669
15:35:30,595 --> 15:35:35,839
file.cpp or compare.cpp that's where we
20670
15:35:33,519 --> 15:35:38,399
have a minimum function we can activate
20671
15:35:35,839 --> 15:35:40,239
it and if we're both now the world
20672
15:35:38,400 --> 15:35:42,720
should be good because the linker is
20673
15:35:40,239 --> 15:35:45,519
going to find this definition here
20674
15:35:42,720 --> 15:35:47,840
okay let's build with gcc because that's
20675
15:35:47,839 --> 15:35:52,399
now you see that the world is good we
20676
15:35:49,915 --> 15:35:54,955
can clear and run rooster and our
20677
15:35:52,400 --> 15:35:57,520
program is going to work as it should
20678
15:35:54,955 --> 15:36:00,400
this is really how you can split your
20679
15:35:57,519 --> 15:36:01,915
functions across multiple files the
20680
15:36:00,400 --> 15:36:04,480
headers are going to contain the
20681
15:36:01,915 --> 15:36:07,040
declarations the cpp files are going to
20682
15:36:04,480 --> 15:36:08,796
contain the definitions your definitions
20683
15:36:07,040 --> 15:36:11,915
can really leave anywhere it's going to
20684
15:36:08,796 --> 15:36:14,720
be a matter of what works better for
20685
15:36:11,915 --> 15:36:17,360
your project but for organizational
20686
15:36:14,720 --> 15:36:18,955
purposes your cpp files are going to be
20687
15:36:17,360 --> 15:36:21,756
basically like this you're going to have
20688
15:36:18,955 --> 15:36:23,275
some declarations in the header like
20689
15:36:23,275 --> 15:36:28,639
and in a corresponding cpp file you're
20690
15:36:26,239 --> 15:36:30,479
going to have and the definitions for
20691
15:36:28,639 --> 15:36:32,720
whatever declarations you have in the
20692
15:36:30,480 --> 15:36:34,480
header but you don't have to do it this
20693
15:36:32,720 --> 15:36:36,639
way if it makes sense for your
20694
15:36:34,480 --> 15:36:38,640
definition to show up somewhere else
20695
15:36:36,639 --> 15:36:40,639
please go ahead and do that c plus plus
20696
15:36:38,639 --> 15:36:43,199
is going to accept that this is really
20697
15:36:40,639 --> 15:36:45,519
all we set out to do in this lecture but
20698
15:36:43,199 --> 15:36:47,755
before we go i'm going to give you a
20699
15:36:45,519 --> 15:36:51,199
chance to set up another function
20700
15:36:47,756 --> 15:36:54,400
suppose we have a function called
20701
15:36:51,199 --> 15:36:56,319
anchor malt and we're going to have the
20702
15:36:54,400 --> 15:36:58,000
function set up in here we're going to
20703
15:36:59,839 --> 15:37:03,275
we already know how to do these things
20704
15:37:01,519 --> 15:37:07,595
we've used this example a couple of
20705
15:37:07,595 --> 15:37:12,795
and that's what we're going to return
20706
15:37:09,756 --> 15:37:14,080
now your job is to split this function
20707
15:37:14,080 --> 15:37:19,040
a declaration and a definition and put
20708
15:37:16,796 --> 15:37:21,756
those in two separate files one is going
20709
15:37:19,040 --> 15:37:23,319
to be called operations.h and the other
20710
15:37:23,319 --> 15:37:28,559
operations.cpp pause the video go ahead
20711
15:37:26,720 --> 15:37:31,520
set up your project like that and call
20712
15:37:28,559 --> 15:37:33,839
that function in main cpp and see if you
20713
15:37:31,519 --> 15:37:35,915
can pull that together okay post the
20714
15:37:33,839 --> 15:37:37,915
video do that and once you are done come
20715
15:37:35,915 --> 15:37:39,915
back again and see how i do this so
20716
15:37:37,915 --> 15:37:42,719
we're going to set up a new file called
20717
15:37:42,720 --> 15:37:47,360
it's going to be a header file dot h and
20718
15:37:45,680 --> 15:37:50,319
we're going to add another file called
20719
15:37:50,319 --> 15:37:56,239
that's going to be our cpp file which is
20720
15:37:52,955 --> 15:37:58,479
going to contain our definitions we're
20721
15:37:56,239 --> 15:38:01,115
going to go back in main and grab the
20722
15:37:58,480 --> 15:38:03,756
entire function here we don't want it in
20723
15:38:05,915 --> 15:38:10,399
we should go in the operations header
20724
15:38:10,400 --> 15:38:13,756
and we're going to put in our definition
20725
15:38:12,720 --> 15:38:15,756
and we're going to put in our
20726
15:38:13,756 --> 15:38:17,680
declaration the declaration doesn't have
20727
15:38:15,756 --> 15:38:19,595
a body so we're just going to put a
20728
15:38:17,680 --> 15:38:21,915
semicolon at the end here you already
20729
15:38:19,595 --> 15:38:24,159
know this we're going to go in the cpp
20730
15:38:21,915 --> 15:38:26,559
file and put in our definition
20731
15:38:24,160 --> 15:38:28,160
this is going to work and to be able to
20732
15:38:30,639 --> 15:38:34,796
corresponding header here why is this
20733
15:38:37,199 --> 15:38:44,639
it's cpp we're going to rename it
20734
15:38:40,160 --> 15:38:47,200
and we're going to change this to cpp
20735
15:38:44,639 --> 15:38:48,639
now we should be fine we should have our
20736
15:38:48,639 --> 15:38:53,756
properly and uh to use this function we
20737
15:38:51,595 --> 15:38:56,319
will need to include the corresponding
20738
15:38:53,756 --> 15:38:58,480
header which is operations.h
20739
15:38:56,319 --> 15:39:02,000
let's do that we're going to go in main
20740
15:39:09,199 --> 15:39:14,399
and notice that the way we include our
20741
15:39:11,839 --> 15:39:15,435
own headers is different from the way we
20742
15:39:15,436 --> 15:39:20,955
the libraries or headers that come with
20743
15:39:18,480 --> 15:39:22,720
the c plus plus standard library this is
20744
15:39:20,955 --> 15:39:25,040
a conversion that is used by many
20745
15:39:22,720 --> 15:39:27,595
compilers this is how we will have to do
20746
15:39:25,040 --> 15:39:29,840
things please remember this if you are
20747
15:39:27,595 --> 15:39:30,720
including your own header please put
20748
15:39:30,720 --> 15:39:36,160
in the quotes like we do here if you are
20749
15:39:33,680 --> 15:39:38,955
including a standard library header
20750
15:39:36,160 --> 15:39:40,400
please use angle brackets like this now
20751
15:39:40,400 --> 15:39:43,756
included we can go down here and say
20752
15:39:43,756 --> 15:39:46,400
we're going to set up two variables x
20753
15:39:46,400 --> 15:39:53,040
why not we're going to have a 4 here
20754
15:39:49,915 --> 15:39:55,519
and we're going to have a y which is a
20755
15:39:53,040 --> 15:39:57,756
five let's do that and we're going to
20756
15:39:55,519 --> 15:40:00,639
have an integer to store our results
20757
15:39:57,756 --> 15:40:04,000
it's going to say anchor mount and it's
20758
15:40:00,639 --> 15:40:06,159
going to do the operations on x
20759
15:40:04,000 --> 15:40:08,879
and y let's do that and we're going to
20760
15:40:06,160 --> 15:40:11,756
print the results here so we're going to
20761
15:40:12,319 --> 15:40:17,756
and it's going to be whatever we have in
20762
15:40:18,080 --> 15:40:22,480
okay if we build this program it is
20763
15:40:19,915 --> 15:40:25,360
going to work we're going to use gcc to
20764
15:40:22,480 --> 15:40:27,200
world the world is good if we run it we
20765
15:40:27,199 --> 15:40:32,955
see our output here going to run rooster
20766
15:40:30,160 --> 15:40:34,956
and the result is 24 because
20767
15:40:32,955 --> 15:40:36,639
okay if we increment x we're going to
20768
15:40:36,639 --> 15:40:40,319
and if we increment a 5 we're going to
20769
15:40:40,319 --> 15:40:45,436
if we multiply these guys we should get
20770
15:40:42,559 --> 15:40:47,756
a 30 and that's not what we have here so
20771
15:40:45,436 --> 15:40:49,275
what is happening let's look at our
20772
15:40:54,319 --> 15:40:59,275
because we want to increment immediately
20773
15:41:02,559 --> 15:41:06,955
and we are going to clear and run
20774
15:41:04,319 --> 15:41:09,275
rooster now we have the result that we
20775
15:41:06,955 --> 15:41:11,360
expect let's go back in main and look at
20776
15:41:09,275 --> 15:41:14,479
our program this is what we are using
20777
15:41:11,360 --> 15:41:16,319
here and this is the output we expect
20778
15:41:14,480 --> 15:41:18,720
this is really all we set out to do in
20779
15:41:16,319 --> 15:41:21,360
this lecture showing you how you can
20780
15:41:21,360 --> 15:41:26,239
functions across multiple files this is
20781
15:41:24,160 --> 15:41:28,640
really good if you want to organize your
20782
15:41:26,239 --> 15:41:30,795
project for example somebody who comes
20783
15:41:28,639 --> 15:41:32,559
to the header here is not going to be
20784
15:41:30,796 --> 15:41:34,720
bothered by looking at all the
20785
15:41:32,559 --> 15:41:38,239
definitions and the details of how we
20786
15:41:34,720 --> 15:41:40,880
compute this maximum and minimum and we
20787
15:41:38,239 --> 15:41:43,436
have the flexibility now to move our
20788
15:41:40,879 --> 15:41:45,839
headers in some other file because we
20789
15:41:43,436 --> 15:41:48,796
really want to keep the main function or
20790
15:41:45,839 --> 15:41:50,955
the main file here really clean we don't
20791
15:41:48,796 --> 15:41:53,200
want all those definitions to show up
20792
15:41:50,955 --> 15:41:55,915
here because it is possible for your
20793
15:41:53,199 --> 15:41:58,159
project to contain hundreds or even
20794
15:41:55,915 --> 15:42:00,795
thousands of definitions if you make all
20795
15:41:58,160 --> 15:42:03,436
those declarations show up in the main
20796
15:42:00,796 --> 15:42:06,400
cpp file here that's going to be really
20797
15:42:03,436 --> 15:42:09,040
hard to follow and work with now we have
20798
15:42:06,400 --> 15:42:11,520
the flexibility to split those guys
20799
15:42:09,040 --> 15:42:14,319
across multiple files and we can even
20800
15:42:11,519 --> 15:42:16,559
use lots of headers if that is what is
20801
15:42:14,319 --> 15:42:18,000
going to work for our project this is
20802
15:42:16,559 --> 15:42:20,079
really all we set out to do in this
20803
15:42:18,000 --> 15:42:22,319
lecture i hope you found it interesting
20804
15:42:20,080 --> 15:42:23,840
we are going to stop here in this one in
20805
15:42:22,319 --> 15:42:26,839
the next one we're going to see how we
20806
15:42:23,839 --> 15:42:29,839
can pass parameters to functions by
20807
15:42:26,839 --> 15:42:31,115
value go ahead and finish up here and
20808
15:42:31,116 --> 15:42:35,436
in this lecture we're going to see what
20809
15:42:32,720 --> 15:42:37,916
is meant by passing parameters to a
20810
15:42:35,436 --> 15:42:40,080
function by value and we're going to
20811
15:42:37,915 --> 15:42:42,159
look at an example of that here we have
20812
15:42:40,080 --> 15:42:43,840
a simple function called say age it's
20813
15:42:42,160 --> 15:42:46,560
going to take one parameter which is an
20814
15:42:43,839 --> 15:42:49,679
integer called age and in the body of
20815
15:42:46,559 --> 15:42:52,079
the function we are printing out the age
20816
15:42:49,680 --> 15:42:53,519
after incrementing it suppose this is
20817
15:42:53,519 --> 15:42:58,559
for your program the function is split
20818
15:42:56,080 --> 15:43:01,756
into declaration and definition we have
20819
15:42:58,559 --> 15:43:04,879
a declaration on top here and we have
20820
15:43:01,756 --> 15:43:06,796
our definition below the main function
20821
15:43:04,879 --> 15:43:08,795
in the main function we will attempt to
20822
15:43:06,796 --> 15:43:11,360
use this function we're going to call it
20823
15:43:08,796 --> 15:43:14,080
down here and we're going to pass a
20824
15:43:11,360 --> 15:43:17,275
local variable which is called age as
20825
15:43:14,080 --> 15:43:19,916
our age when we do that we expect this
20826
15:43:17,275 --> 15:43:21,839
to print you are 24 years old because
20827
15:43:19,915 --> 15:43:23,755
we're going to increment the age and
20828
15:43:21,839 --> 15:43:25,679
we're going to say hello you are 24
20829
15:43:23,756 --> 15:43:28,880
years old this is what this program is
20830
15:43:25,680 --> 15:43:31,915
going to do but we want to keep track
20831
15:43:28,879 --> 15:43:34,559
of how the outside variable here is
20832
15:43:31,915 --> 15:43:37,199
going to change and the age we have
20833
15:43:34,559 --> 15:43:39,915
passed as a parameter here because this
20834
15:43:37,199 --> 15:43:42,795
edge we pass as a parameter is not going
20835
15:43:39,915 --> 15:43:45,115
to be the same as the age we have on top
20836
15:43:42,796 --> 15:43:47,680
here what we pass here as a parameter is
20837
15:43:45,116 --> 15:43:50,080
going to be a copy of the actual
20838
15:43:47,680 --> 15:43:52,639
variable that we passed here and this
20839
15:43:50,080 --> 15:43:55,116
mechanism is called passing a parameter
20840
15:43:52,639 --> 15:43:57,756
by value and what you really pass is
20841
15:43:55,116 --> 15:43:59,916
going to be copy and what you work on
20842
15:43:57,756 --> 15:44:02,000
inside the body of the function is not
20843
15:43:59,915 --> 15:44:04,559
going to be the original stuff you
20844
15:44:02,000 --> 15:44:06,559
passed as an argument to the function so
20845
15:44:04,559 --> 15:44:08,319
we're going to try and prove that here
20846
15:44:06,559 --> 15:44:10,159
we're going to print the age before we
20847
15:44:08,319 --> 15:44:12,639
call the function we're going to print
20848
15:44:10,160 --> 15:44:14,720
the age after we call the function and
20849
15:44:12,639 --> 15:44:17,436
what we print here is going to be the
20850
15:44:14,720 --> 15:44:18,559
outside variable because here we are in
20851
15:44:20,400 --> 15:44:26,239
inside the say edge function what we're
20852
15:44:23,199 --> 15:44:28,719
going to be modifying is a locker copy
20853
15:44:26,239 --> 15:44:32,000
so we expect the edge here to stay the
20854
15:44:28,720 --> 15:44:33,756
same before and after the function call
20855
15:44:32,000 --> 15:44:36,559
so the way this is going to work when
20856
15:44:33,756 --> 15:44:38,319
control has this function here it's like
20857
15:44:36,559 --> 15:44:40,955
we're going to have a situation like we
20858
15:44:38,319 --> 15:44:43,680
have here on the left we're going to set
20859
15:44:40,955 --> 15:44:46,559
up local copies in the function that are
20860
15:44:43,680 --> 15:44:49,275
going to contain whatever was passed as
20861
15:44:46,559 --> 15:44:51,680
an argument to this function and this
20862
15:44:49,275 --> 15:44:53,756
edge here was passed as an argument to a
20863
15:44:51,680 --> 15:44:56,080
function so we're going to have a local
20864
15:44:53,756 --> 15:44:57,756
copy of this h and we're going to store
20865
15:44:56,080 --> 15:45:00,639
it and it is what we're going to be
20866
15:44:57,756 --> 15:45:03,040
manipulating in our program when the
20867
15:45:00,639 --> 15:45:05,360
function goes out of scope the local
20868
15:45:03,040 --> 15:45:07,040
copy is going to die and the outside
20869
15:45:05,360 --> 15:45:09,595
variable we have here is basically going
20870
15:45:07,040 --> 15:45:11,915
to be unaffected let's head over to
20871
15:45:09,595 --> 15:45:13,115
visual studio code and show you this in
20872
15:45:13,116 --> 15:45:18,160
okay here we are in our working folder
20873
15:45:15,915 --> 15:45:20,639
the current project is passed by value
20874
15:45:18,160 --> 15:45:22,880
we're going to grab our template files
20875
15:45:20,639 --> 15:45:25,595
and we're going to put them in place in
20876
15:45:22,879 --> 15:45:28,079
the correct project and we're going to
20877
15:45:25,595 --> 15:45:30,000
open this up in visual studio code let's
20878
15:45:28,080 --> 15:45:33,040
do that we're going to open the folder
20879
15:45:30,000 --> 15:45:36,400
that contains the project pass by value
20880
15:45:33,040 --> 15:45:39,520
let's do that we are going to open it up
20881
15:45:36,400 --> 15:45:42,080
and i'm going to go in the file and
20882
15:45:39,519 --> 15:45:44,079
clean it up a little bit and we are
20883
15:45:42,080 --> 15:45:46,000
going to set up a function it's going to
20884
15:45:49,040 --> 15:45:52,879
and it's going to take an integer which
20885
15:45:52,879 --> 15:45:57,199
and inside we're going to increment our
20886
15:45:55,040 --> 15:45:59,595
h i think this is what we saw in the
20887
15:45:57,199 --> 15:46:01,595
slides and we're going to say however
20888
15:45:59,595 --> 15:46:02,879
many years you are old we're going to
20889
15:46:04,480 --> 15:46:09,360
age old and we can set up a variable and
20890
15:46:07,595 --> 15:46:10,559
the main function we're going to call it
20891
15:46:10,559 --> 15:46:15,915
and it is going to contain 23 as our age
20892
15:46:14,239 --> 15:46:19,040
we're going to say age and we're going
20893
15:46:15,915 --> 15:46:20,719
to pass in our age here we can do that
20894
15:46:19,040 --> 15:46:22,796
if we're trying to run this program
20895
15:46:20,720 --> 15:46:25,916
let's try to do that we're going to
20896
15:46:22,796 --> 15:46:28,080
build with gcc and we are going to bring
20897
15:46:25,915 --> 15:46:30,079
in a terminal we can use to run this
20898
15:46:30,080 --> 15:46:33,596
visual studio code here let's run
20899
15:46:32,000 --> 15:46:36,080
booster we're going to say hello you are
20900
15:46:33,595 --> 15:46:38,319
24 years old and this is what we expect
20901
15:46:36,080 --> 15:46:39,840
because when this function is called
20902
15:46:38,319 --> 15:46:42,480
we're going to increment the age then
20903
15:46:39,839 --> 15:46:43,519
we're going to say the age but we want
20904
15:46:43,519 --> 15:46:49,199
what happens to the outside edge ear
20905
15:46:46,796 --> 15:46:51,276
if we modify the inside edge that we
20906
15:46:49,199 --> 15:46:53,680
have on this function here that was
20907
15:46:51,275 --> 15:46:55,436
passed as an argument and again what you
20908
15:46:53,680 --> 15:46:57,595
pass when you are declaring your
20909
15:46:55,436 --> 15:46:59,520
function is the parameter and what you
20910
15:46:57,595 --> 15:47:01,915
pass when you are calling the function
20911
15:46:59,519 --> 15:47:04,000
is called an argument in c plus plus
20912
15:47:01,915 --> 15:47:06,479
please remember this okay what we pass
20913
15:47:04,000 --> 15:47:09,680
as an argument is our anti-age variable
20914
15:47:06,480 --> 15:47:11,200
which is local to the main function
20915
15:47:09,680 --> 15:47:14,319
and we're going to see what happens to
20916
15:47:17,360 --> 15:47:21,040
i think this is descriptive enough and
20917
15:47:19,275 --> 15:47:23,595
we're going to print that and we're
20918
15:47:21,040 --> 15:47:25,680
going to go after the function is called
20919
15:47:23,595 --> 15:47:28,000
we're going to say the same thing but
20920
15:47:25,680 --> 15:47:28,796
we're going to say after call
20921
15:47:28,796 --> 15:47:32,796
by after we mean after we call the
20922
15:47:30,796 --> 15:47:34,720
function say h here i think this is
20923
15:47:32,796 --> 15:47:37,520
descriptive enough and we're going to
20924
15:47:34,720 --> 15:47:40,080
see that if incrementing the local
20925
15:47:37,519 --> 15:47:42,159
variable to the function here affects
20926
15:47:40,080 --> 15:47:45,040
the variable that we have and the scope
20927
15:47:42,160 --> 15:47:47,756
of the main function okay so let's see
20928
15:47:45,040 --> 15:47:50,239
that we're going to build with gcc as
20929
15:47:50,239 --> 15:47:54,879
and the wealth is good so let's clear
20930
15:47:52,720 --> 15:47:57,840
and run rooster you're going to see that
20931
15:47:54,879 --> 15:48:00,559
before the call we have 23 and after the
20932
15:47:57,839 --> 15:48:02,000
call we have 23 we didn't change the
20933
15:48:02,000 --> 15:48:06,239
this is a classical copy paste error
20934
15:48:06,239 --> 15:48:10,079
for our program to really be descriptive
20935
15:48:10,080 --> 15:48:15,116
okay the world is good we can clear and
20936
15:48:12,319 --> 15:48:18,879
run rooster and now we have before call
20937
15:48:15,116 --> 15:48:22,000
23 after call age is 23 it wasn't
20938
15:48:18,879 --> 15:48:24,239
changed by what we have inside here and
20939
15:48:22,000 --> 15:48:26,559
we can even go further and look at the
20940
15:48:24,239 --> 15:48:29,595
memory addresses of these guys
20941
15:48:26,559 --> 15:48:31,915
here we can try and print the address of
20942
15:48:29,595 --> 15:48:34,159
the age variable let's let's do that
20943
15:48:36,400 --> 15:48:41,040
and put that out here we're going to say
20944
15:48:41,040 --> 15:48:46,480
no big deal here we can close the pane
20945
15:48:43,199 --> 15:48:48,795
on the left here because it is taking up
20946
15:48:46,480 --> 15:48:50,956
valuable space and we're going to go to
20947
15:48:48,796 --> 15:48:53,040
the second statement and put in the
20948
15:48:53,040 --> 15:48:56,480
and we're going to print that out we can
20949
15:49:00,796 --> 15:49:04,956
and when we hit the body of our function
20950
15:49:03,199 --> 15:49:06,079
here we can also print the address of
20951
15:49:09,756 --> 15:49:15,436
address of age let's do that here and
20952
15:49:12,639 --> 15:49:17,839
we're going to print the address of the
20953
15:49:15,436 --> 15:49:20,880
local edge variable here which was
20954
15:49:17,839 --> 15:49:23,519
passed as a parameter here okay now we
20955
15:49:20,879 --> 15:49:27,519
can build our program and watch those
20956
15:49:23,519 --> 15:49:29,680
addresses we're going to build with gcc
20957
15:49:27,519 --> 15:49:31,275
the world is good we can clear
20958
15:49:31,275 --> 15:49:36,479
now you see that the outside variable is
20959
15:49:33,839 --> 15:49:38,000
going to leave at an address that ends
20960
15:49:38,000 --> 15:49:43,275
and the local variable is going to leave
20961
15:49:39,839 --> 15:49:46,079
at an address that ends in dc0 so this
20962
15:49:43,275 --> 15:49:48,400
is a completely new memory location that
20963
15:49:46,080 --> 15:49:51,916
we are using and it is just going to
20964
15:49:48,400 --> 15:49:54,000
contain a copy of what we passed as a
20965
15:49:51,915 --> 15:49:56,239
parameter here and the compiler is going
20966
15:49:54,000 --> 15:49:58,955
to take care of setting up this copy
20967
15:49:56,239 --> 15:50:00,559
variable and have it available for use
20968
15:49:58,955 --> 15:50:02,795
in the local function here we don't have
20969
15:50:00,559 --> 15:50:06,079
to worry about that but we have to be
20970
15:50:02,796 --> 15:50:08,956
aware that what we are working on and
20971
15:50:06,080 --> 15:50:11,200
the same age function here is a copy
20972
15:50:08,955 --> 15:50:12,639
it's not the original value this is
20973
15:50:11,199 --> 15:50:15,519
really all we set out to do in this
20974
15:50:12,639 --> 15:50:18,559
lecture making you aware of the call by
20975
15:50:15,519 --> 15:50:21,199
value mechanism and the main message is
20976
15:50:18,559 --> 15:50:23,435
that what you are working on in the body
20977
15:50:21,199 --> 15:50:25,915
of your function when it is called is
20978
15:50:23,436 --> 15:50:29,116
going to be a copy of what you have
20979
15:50:25,915 --> 15:50:30,795
passed as an argument when your function
20980
15:50:30,796 --> 15:50:35,116
in this lecture we're going to see how
20981
15:50:32,319 --> 15:50:37,360
we can pass parameters to functions by
20982
15:50:35,116 --> 15:50:39,276
pointer this is going to allow us to
20983
15:50:37,360 --> 15:50:41,595
avoid the copies that we were
20984
15:50:39,275 --> 15:50:45,115
experiencing when we were passing
20985
15:50:41,595 --> 15:50:47,756
parameters by value like we have seen in
20986
15:50:45,116 --> 15:50:50,240
the last few lectures here is a simple
20987
15:50:47,756 --> 15:50:52,400
example showing the syntax we can use to
20988
15:50:52,400 --> 15:50:57,436
on top here we have our function
20989
15:50:54,720 --> 15:50:59,840
declaration and down here we have our
20990
15:50:57,436 --> 15:51:02,080
function definition and you see that the
20991
15:50:59,839 --> 15:51:04,639
syntax is the same we are passing by
20992
15:51:02,080 --> 15:51:07,200
pointer and by pointer and the
20993
15:51:04,639 --> 15:51:09,199
definition here and another thing you
20994
15:51:07,199 --> 15:51:12,000
should be careful about is that when you
20995
15:51:09,199 --> 15:51:14,639
call a function that passes by pointer
20996
15:51:12,000 --> 15:51:16,559
you have to give it an address and
20997
15:51:14,639 --> 15:51:20,159
that's what we are doing here so we are
20998
15:51:16,559 --> 15:51:22,399
passing the address of our age variable
20999
15:51:20,160 --> 15:51:24,720
which is going to be passed by pointer
21000
15:51:22,400 --> 15:51:28,639
when we pass by pointer we want to be
21001
15:51:24,720 --> 15:51:31,360
modifying a copy inside the body of our
21002
15:51:28,639 --> 15:51:34,319
function if you look here we are
21003
15:51:31,360 --> 15:51:36,955
incrementing the edge variable but we
21004
15:51:34,319 --> 15:51:39,040
are doing this through the referencing
21005
15:51:36,955 --> 15:51:41,275
so when we pass a pointer here the
21006
15:51:39,040 --> 15:51:42,879
pointer is going to contain the address
21007
15:51:42,879 --> 15:51:48,079
and in the body of the function the
21008
15:51:45,595 --> 15:51:51,435
pointer we will have this edge pointer
21009
15:51:48,080 --> 15:51:54,319
is going to be pointing to the original
21010
15:51:51,436 --> 15:51:56,319
variable here okay so this edge pointer
21011
15:51:54,319 --> 15:51:57,595
is going to be pointing to the original
21012
15:51:57,595 --> 15:52:02,159
when we dereference it and modify the
21013
15:52:00,160 --> 15:52:03,840
variable we're going to be affecting the
21014
15:52:02,160 --> 15:52:05,916
original variable i really hope this
21015
15:52:03,839 --> 15:52:08,399
makes sense and this is really what
21016
15:52:05,915 --> 15:52:10,239
passing by pointer is all about you
21017
15:52:08,400 --> 15:52:12,560
declare your functions by passing in
21018
15:52:10,239 --> 15:52:14,795
pointers like this and in the definition
21019
15:52:12,559 --> 15:52:17,435
you do the same and when you call the
21020
15:52:14,796 --> 15:52:19,756
function you need to pass in an address
21021
15:52:17,436 --> 15:52:21,840
of the variable because that's what we
21022
15:52:19,756 --> 15:52:23,916
store in a pointer here and this is
21023
15:52:21,839 --> 15:52:26,719
going to work if we try to run this
21024
15:52:23,915 --> 15:52:29,435
example here we're going to print 23
21025
15:52:26,720 --> 15:52:31,360
because that's the original value we are
21026
15:52:29,436 --> 15:52:33,436
going to call the say age we are going
21027
15:52:31,360 --> 15:52:35,520
to increment and this is going to change
21028
15:52:33,436 --> 15:52:38,955
the original value if we print here
21029
15:52:35,519 --> 15:52:41,275
we're going to get 24 and when this
21030
15:52:38,955 --> 15:52:43,040
function terminates we're going to hit
21031
15:52:41,275 --> 15:52:46,239
this statement here and we're going to
21032
15:52:43,040 --> 15:52:48,400
print 24 this is what we're going to see
21033
15:52:46,239 --> 15:52:50,000
when we get to run this program here and
21034
15:52:48,400 --> 15:52:52,560
this is really all there is about
21035
15:52:50,000 --> 15:52:54,955
passing by pointer we are going to head
21036
15:52:52,559 --> 15:52:58,479
over to visual studio code and play with
21037
15:52:54,955 --> 15:53:00,795
us a little more okay here we are in our
21038
15:52:58,480 --> 15:53:03,200
working folder the current project is
21039
15:53:00,796 --> 15:53:05,520
passed by pointer we are going to grab
21040
15:53:05,519 --> 15:53:11,115
and we're going to put them in the
21041
15:53:07,275 --> 15:53:12,879
current project which is pass by pointer
21042
15:53:11,116 --> 15:53:14,880
we are going to open this in visual
21043
15:53:12,879 --> 15:53:18,079
studio code pretty quick we're going to
21044
15:53:14,879 --> 15:53:20,795
choose that pass by pointer we open this
21045
15:53:18,080 --> 15:53:21,596
and our main cpp file should show up
21046
15:53:21,595 --> 15:53:27,519
we're going to clean it up a little bit
21047
15:53:25,275 --> 15:53:29,756
we are actually going to grab the code
21048
15:53:27,519 --> 15:53:32,479
from the last lecture and put that in
21049
15:53:29,756 --> 15:53:34,796
here and that's going to be our starting
21050
15:53:32,480 --> 15:53:37,116
point let's close the left pane here so
21051
15:53:34,796 --> 15:53:39,840
that we have some breathing space the
21052
15:53:37,116 --> 15:53:42,319
function here say h is going to pass by
21053
15:53:39,839 --> 15:53:43,435
pointer so we should take out this cost
21054
15:53:43,436 --> 15:53:48,796
and uh have a pointer here like we had
21055
15:53:46,080 --> 15:53:50,160
in the slides we're going to do the same
21056
15:53:50,160 --> 15:53:54,080
definition here if we go down we're
21057
15:53:52,400 --> 15:53:56,400
going to do that we're going to pass by
21058
15:53:54,080 --> 15:53:59,360
pointer and we are going to uncomment
21059
15:53:56,400 --> 15:54:01,200
the line that increments our age here
21060
15:53:59,360 --> 15:54:03,520
okay after we do that you see that we
21061
15:54:01,199 --> 15:54:06,879
have a squiggly line at this line that
21062
15:54:03,519 --> 15:54:09,755
calls the say age function what we need
21063
15:54:06,879 --> 15:54:12,319
to do is to pass it the address of the
21064
15:54:09,756 --> 15:54:14,480
edge variable here like we saw in the
21065
15:54:12,319 --> 15:54:15,519
slide so this is the syntax we have to
21066
15:54:15,519 --> 15:54:19,915
once we do this this program is going to
21067
15:54:17,519 --> 15:54:22,399
be valid and if we run it here we're
21068
15:54:19,915 --> 15:54:24,399
going to print 23 because that's the
21069
15:54:22,400 --> 15:54:26,720
value we have in here we're going to
21070
15:54:24,400 --> 15:54:29,596
call the say age function we are going
21071
15:54:26,720 --> 15:54:32,720
to increment age and here we forgot to
21072
15:54:29,595 --> 15:54:35,680
do our dereferencing so what we need to
21073
15:54:32,720 --> 15:54:38,160
do here is to dereference the age and
21074
15:54:35,680 --> 15:54:40,239
increment it this is going to increment
21075
15:54:38,160 --> 15:54:42,640
the original variable here and we're
21076
15:54:40,239 --> 15:54:45,519
going to be accessing this through the
21077
15:54:42,639 --> 15:54:48,000
the referencing operator of our pointer
21078
15:54:45,519 --> 15:54:50,639
here if we hit this line and the
21079
15:54:48,000 --> 15:54:52,796
function here we're going to print 24
21080
15:54:52,796 --> 15:54:58,400
incremented through this statement here
21081
15:54:56,400 --> 15:55:02,000
and after the function call we're going
21082
15:54:58,400 --> 15:55:04,319
to hit this statement here on line 10
21083
15:55:02,000 --> 15:55:05,680
and it is going to print 24. this is
21084
15:55:05,680 --> 15:55:09,360
take a moment to make sure you really
21085
15:55:07,360 --> 15:55:12,400
understand this the things you need to
21086
15:55:09,360 --> 15:55:15,199
be careful about is the syntax we use to
21087
15:55:12,400 --> 15:55:17,275
declare the function here we say that we
21088
15:55:15,199 --> 15:55:19,839
are passing by pointer because of this
21089
15:55:17,275 --> 15:55:21,915
little star here and we have the same
21090
15:55:19,839 --> 15:55:24,239
thing when we hit the definition of the
21091
15:55:21,915 --> 15:55:26,319
function we have this little star so we
21092
15:55:24,239 --> 15:55:28,795
are passing by pointer another thing you
21093
15:55:26,319 --> 15:55:31,275
should remember is to pass the address
21094
15:55:28,796 --> 15:55:33,916
of a variable when you call the function
21095
15:55:31,275 --> 15:55:36,720
like we do here and please remember to
21096
15:55:33,915 --> 15:55:39,839
use the the reference operator whenever
21097
15:55:36,720 --> 15:55:42,080
you want to modify whatever variable is
21098
15:55:39,839 --> 15:55:44,079
leaving at the address that you passed
21099
15:55:42,080 --> 15:55:46,480
in here so that's why we are the
21100
15:55:44,080 --> 15:55:48,955
reference in here through the star
21101
15:55:46,480 --> 15:55:51,116
operator like we are doing here this is
21102
15:55:48,955 --> 15:55:53,116
really all you need to be careful about
21103
15:55:51,116 --> 15:55:54,720
so we are going to try and run this
21104
15:55:53,116 --> 15:55:57,916
program let's do that we're going to
21105
15:55:58,239 --> 15:56:02,720
the boiler is going to go through we
21106
15:56:02,720 --> 15:56:09,916
so that we can run this program and
21107
15:56:05,199 --> 15:56:11,435
again we expect to see a 23 24 and 24
21108
15:56:13,519 --> 15:56:19,680
okay here is our output before we call
21109
15:56:17,040 --> 15:56:23,200
the say age function the age is 23 the
21110
15:56:19,680 --> 15:56:25,680
address is dec when we hit the function
21111
15:56:25,680 --> 15:56:32,080
uh years old so here we should have the
21112
15:56:29,116 --> 15:56:34,639
reference to access something inside the
21113
15:56:32,080 --> 15:56:37,276
variable here so we should say you are
21114
15:56:34,639 --> 15:56:39,199
age old we need to dereference this guy
21115
15:56:37,275 --> 15:56:41,839
because now it is a pointer i forgot
21116
15:56:39,199 --> 15:56:43,199
that i really am sorry but we are
21117
15:56:43,199 --> 15:56:47,275
this is a good learning chance for you
21118
15:56:45,199 --> 15:56:50,159
not to make the same mistake as i am
21119
15:56:47,275 --> 15:56:52,795
making here so let's try and build again
21120
15:56:50,160 --> 15:56:54,400
we should see the correct output we are
21121
15:56:54,400 --> 15:56:58,880
and run rooster now we see that before
21122
15:56:58,879 --> 15:57:04,795
ages 23 when we call the function h
21123
15:57:01,756 --> 15:57:07,595
becomes 24 because we just incremented
21124
15:57:04,796 --> 15:57:09,200
through our reference operator and after
21125
15:57:07,595 --> 15:57:10,479
the function call the edge is going to
21126
15:57:10,480 --> 15:57:15,276
because we have modified the original
21127
15:57:12,955 --> 15:57:18,000
variable here through our the
21128
15:57:15,275 --> 15:57:20,159
referencing of the pointer here this is
21129
15:57:18,000 --> 15:57:22,319
really all there is about passing by
21130
15:57:20,160 --> 15:57:24,480
pointer this is the syntax you have to
21131
15:57:22,319 --> 15:57:26,559
pass a pointer in the declaration you
21132
15:57:24,480 --> 15:57:28,400
have to pass a pointer in the function
21133
15:57:26,559 --> 15:57:31,435
definition and when you call the
21134
15:57:28,400 --> 15:57:33,360
function you have to use the address of
21135
15:57:31,436 --> 15:57:35,520
the variable and pass that as an
21136
15:57:33,360 --> 15:57:37,840
argument to the function and whenever
21137
15:57:35,519 --> 15:57:39,275
you need to use the past parameter
21138
15:57:37,839 --> 15:57:42,479
you're going to go through the the
21139
15:57:39,275 --> 15:57:45,756
reference operator like we did here
21140
15:57:42,480 --> 15:57:46,720
and here in the body of our function
21141
15:57:46,720 --> 15:57:51,436
in this lecture we're going to see how
21142
15:57:48,239 --> 15:57:52,559
we can pass parameters to a function by
21143
15:57:52,559 --> 15:57:57,275
and this is another technique we can use
21144
15:57:54,559 --> 15:57:59,680
to avoid passing by value which is going
21145
15:57:57,275 --> 15:58:01,915
to create a copy and the syntax is
21146
15:57:59,680 --> 15:58:03,915
really simple if you look at the
21147
15:58:01,915 --> 15:58:07,115
declaration here you're going to see
21148
15:58:03,915 --> 15:58:09,275
that we say and reference and again if
21149
15:58:07,116 --> 15:58:11,520
we hit the definition we're going to say
21150
15:58:09,275 --> 15:58:13,519
into reference as you see here
21151
15:58:11,519 --> 15:58:16,159
when we call the function we don't have
21152
15:58:13,519 --> 15:58:17,680
to pass the address of operator we just
21153
15:58:16,160 --> 15:58:20,160
passed the variable because this is
21154
15:58:17,680 --> 15:58:22,720
going to be treated as a reference by
21155
15:58:20,160 --> 15:58:25,040
the compiler and in the body of the
21156
15:58:22,720 --> 15:58:27,680
function we don't have to go through
21157
15:58:25,040 --> 15:58:30,080
ugly the referencing like we did with
21158
15:58:27,680 --> 15:58:33,116
pointers and hopefully you can see that
21159
15:58:30,080 --> 15:58:35,360
if you want to avoid copies passing by
21160
15:58:33,116 --> 15:58:37,840
references is much cleaner you don't
21161
15:58:35,360 --> 15:58:40,559
have to use the address of operator when
21162
15:58:37,839 --> 15:58:42,639
you call the function like we do here
21163
15:58:40,559 --> 15:58:45,435
and you don't have to go through the
21164
15:58:42,639 --> 15:58:48,159
reference and to access and modify your
21165
15:58:45,436 --> 15:58:51,040
variables and the modification we do
21166
15:58:48,160 --> 15:58:54,080
here by incrementing age is going to be
21167
15:58:51,040 --> 15:58:56,319
seen on the outside because we are going
21168
15:58:54,080 --> 15:58:59,276
through a reference and the reference is
21169
15:58:56,319 --> 15:59:01,519
a true alliance to the variable that the
21170
15:58:59,275 --> 15:59:03,680
reference is referencing so by
21171
15:59:01,519 --> 15:59:05,680
incrementing the edge here and the body
21172
15:59:03,680 --> 15:59:08,955
of the function the change is going to
21173
15:59:05,680 --> 15:59:11,519
be seen after the function call before
21174
15:59:08,955 --> 15:59:12,955
the function here we're going to get 23
21175
15:59:11,519 --> 15:59:15,359
in the body of the function we're going
21176
15:59:12,955 --> 15:59:17,915
to get 24 because we just incremented
21177
15:59:15,360 --> 15:59:20,720
the function and after the function call
21178
15:59:17,915 --> 15:59:23,595
we're going to get a 24 because the
21179
15:59:20,720 --> 15:59:26,239
change was propagated to the original
21180
15:59:23,595 --> 15:59:28,559
variable and the reason is because we
21181
15:59:26,239 --> 15:59:30,720
are going through a reference here
21182
15:59:28,559 --> 15:59:33,199
let's head to visual studio code and
21183
15:59:30,720 --> 15:59:35,275
actually play with us a little more okay
21184
15:59:33,199 --> 15:59:37,915
here we are in visual studio code the
21185
15:59:35,275 --> 15:59:41,199
current project is passed by reference
21186
15:59:37,915 --> 15:59:44,319
1710 here so we're going to grab our
21187
15:59:41,199 --> 15:59:45,839
template files and put them in place
21188
15:59:45,839 --> 15:59:50,399
let's do that and we are going to open
21189
15:59:48,239 --> 15:59:52,955
this in visual studio code pretty quick
21190
15:59:50,400 --> 15:59:55,520
let's do that the main cpp file is going
21191
15:59:52,955 --> 15:59:57,680
to show up here again we are going to
21192
15:59:55,519 --> 16:00:00,319
grab the code from the last lecture and
21193
15:59:57,680 --> 16:00:02,720
use that as a starting point and we're
21194
16:00:00,319 --> 16:00:05,040
going to be modifying the signature of
21195
16:00:02,720 --> 16:00:07,275
our function here so what we want to do
21196
16:00:05,040 --> 16:00:09,595
is to pass by reference we're going to
21197
16:00:07,275 --> 16:00:12,639
say enter reference here you already
21198
16:00:09,595 --> 16:00:14,795
know references from a previous chapter
21199
16:00:12,639 --> 16:00:17,680
and we are going to hit the definition
21200
16:00:14,796 --> 16:00:19,756
here and do the same thing so let's say
21201
16:00:21,116 --> 16:00:25,436
and when we call the function we don't
21202
16:00:23,040 --> 16:00:27,360
need to pass the address of operator
21203
16:00:25,436 --> 16:00:29,756
because this is a reference we can use
21204
16:00:27,360 --> 16:00:31,915
it right away the compiler is going to
21205
16:00:29,756 --> 16:00:33,916
know that this is going to be a
21206
16:00:31,915 --> 16:00:35,275
reference to the original variable that
21207
16:00:35,275 --> 16:00:39,519
and in the body of the function let's
21208
16:00:37,519 --> 16:00:42,399
take out this last line here we don't
21209
16:00:39,519 --> 16:00:43,595
need it and in the body when we want to
21210
16:00:43,595 --> 16:00:48,079
the reference we can do that right away
21211
16:00:46,000 --> 16:00:51,595
without the referencing so we can just
21212
16:00:48,080 --> 16:00:53,596
say plus plus h here and the changes are
21213
16:00:51,595 --> 16:00:56,079
going to be propagated to the original
21214
16:00:53,595 --> 16:00:58,399
variable here because we are going
21215
16:00:56,080 --> 16:01:00,400
through a reference let's go down and
21216
16:00:58,400 --> 16:01:02,480
modify this because this is a reference
21217
16:01:02,480 --> 16:01:08,956
and we can close this left pane here so
21218
16:01:05,839 --> 16:01:11,115
that we have some more breathing space
21219
16:01:08,955 --> 16:01:14,080
and you see that visual studio code is
21220
16:01:11,116 --> 16:01:17,200
no longer giving us any squiggly lines
21221
16:01:14,080 --> 16:01:19,840
so this must be valid c plus plus code
21222
16:01:17,199 --> 16:01:23,519
again notice the syntaxes we are using
21223
16:01:19,839 --> 16:01:26,319
here we are passing a reference in our
21224
16:01:23,519 --> 16:01:28,795
declaration we are passing a reference
21225
16:01:26,319 --> 16:01:30,720
in our function definition here when we
21226
16:01:28,796 --> 16:01:33,200
call the function we don't need to do
21227
16:01:30,720 --> 16:01:34,955
any address of operator we pass the
21228
16:01:34,955 --> 16:01:39,040
and in the body of the function we don't
21229
16:01:36,879 --> 16:01:40,719
have to do any dereferencing we can
21230
16:01:40,720 --> 16:01:45,360
or modify the variable however we want
21231
16:01:43,199 --> 16:01:47,915
the changes are going to be propagated
21232
16:01:45,360 --> 16:01:49,199
to the original variable because we are
21233
16:01:49,199 --> 16:01:54,159
incrementation here is also going to
21234
16:01:51,360 --> 16:01:56,480
affect the original variable that was
21235
16:01:54,160 --> 16:01:59,436
declared in the main function here let's
21236
16:01:56,480 --> 16:02:01,116
take this out and down here if we need
21237
16:01:59,436 --> 16:02:03,040
to use our variable we're going to just
21238
16:02:01,116 --> 16:02:06,000
use it right away we don't need any
21239
16:02:03,040 --> 16:02:08,400
referencing and if we print the address
21240
16:02:06,000 --> 16:02:10,400
of age here we're going to see the same
21241
16:02:08,400 --> 16:02:12,720
address we see on the outside because
21242
16:02:10,400 --> 16:02:15,040
this is a true alias it's going to be
21243
16:02:12,720 --> 16:02:17,520
referencing the same variable that we
21244
16:02:15,040 --> 16:02:19,915
have in main here okay now that you have
21245
16:02:17,519 --> 16:02:22,000
a better idea about this we are going to
21246
16:02:19,915 --> 16:02:24,879
try and build this we're going to use
21247
16:02:22,000 --> 16:02:25,915
gcc as always you can see that the build
21248
16:02:25,915 --> 16:02:30,719
if we bring up a terminal to try and run
21249
16:02:30,720 --> 16:02:35,275
we can clear and run rooster
21250
16:02:33,116 --> 16:02:38,319
we're going to see that before we call
21251
16:02:35,275 --> 16:02:40,239
the function the h is 23 but the address
21252
16:02:40,239 --> 16:02:46,159
when we hit the function the edge is 24
21253
16:02:42,955 --> 16:02:48,239
because we just incremented that here
21254
16:02:46,160 --> 16:02:51,116
but notice that the address of the
21255
16:02:48,239 --> 16:02:53,756
variable is the same as on the outside
21256
16:02:51,116 --> 16:02:56,639
so we are modifying the same variable
21257
16:02:53,756 --> 16:02:59,520
and when the function is done the edge
21258
16:02:56,639 --> 16:03:02,479
is still going to be 24 because we just
21259
16:02:59,519 --> 16:03:04,795
modified the original variable through a
21260
16:03:02,480 --> 16:03:07,360
reference here okay this is the effect
21261
16:03:04,796 --> 16:03:10,000
of passing by reference you can use a
21262
16:03:07,360 --> 16:03:12,879
claim syntax to modify the original
21263
16:03:10,000 --> 16:03:15,839
variable in your functions and this is
21264
16:03:12,879 --> 16:03:18,399
going to avoid copies like we have seen
21265
16:03:15,839 --> 16:03:21,199
when we were passing parameters by value
21266
16:03:18,400 --> 16:03:23,596
a few lectures back i would like to
21267
16:03:21,199 --> 16:03:26,795
welcome you in this new chapter where we
21268
16:03:23,595 --> 16:03:29,115
will be focusing on how to get data out
21269
16:03:26,796 --> 16:03:31,756
of functions again the model of the
21270
16:03:29,116 --> 16:03:34,400
function is really what you see here it
21271
16:03:31,756 --> 16:03:36,955
is like a machine and you can give input
21272
16:03:34,400 --> 16:03:39,275
to that machine and you expect to get
21273
16:03:36,955 --> 16:03:41,680
something out of that machine this
21274
16:03:39,275 --> 16:03:42,400
chapter is going to focus on this part
21275
16:03:42,400 --> 16:03:46,239
and we're going to see the different
21276
16:03:43,915 --> 16:03:49,115
facilities offered by the c plus plus
21277
16:03:46,239 --> 16:03:51,275
programming language to get output from
21278
16:03:49,116 --> 16:03:53,680
functions and we are going to start in
21279
16:03:51,275 --> 16:03:56,639
the next lecture and see how we can use
21280
16:03:53,680 --> 16:03:59,275
input and output parameters go ahead and
21281
16:03:56,639 --> 16:04:00,796
finish up here and meet me there in this
21282
16:03:59,275 --> 16:04:03,839
lecture we're going to see how we can
21283
16:04:00,796 --> 16:04:05,276
use function parameters to get data out
21284
16:04:05,275 --> 16:04:10,795
here is a simple example and we have
21285
16:04:07,360 --> 16:04:13,680
three functions here we have max str
21286
16:04:10,796 --> 16:04:16,000
max and and max double and you notice
21287
16:04:13,680 --> 16:04:17,840
that we have three parameters for each
21288
16:04:16,000 --> 16:04:19,915
of these functions the first two
21289
16:04:17,839 --> 16:04:22,559
parameters are going to be input they
21290
16:04:19,915 --> 16:04:24,879
are going to get data and the function
21291
16:04:22,559 --> 16:04:27,756
and the third one is going to be the
21292
16:04:24,879 --> 16:04:29,755
output parameter and it is going to get
21293
16:04:29,756 --> 16:04:35,756
let's focus on max hdr here and really
21294
16:04:33,040 --> 16:04:38,559
drive the point home the key idea here
21295
16:04:35,756 --> 16:04:42,080
is that for the third parameter
21296
16:04:38,559 --> 16:04:44,639
we are using a modifiable reference and
21297
16:04:42,080 --> 16:04:46,880
if we use a reference the changes we do
21298
16:04:44,639 --> 16:04:50,879
inside the function are also going to be
21299
16:04:46,879 --> 16:04:53,519
visible on the outside and we explicitly
21300
16:04:50,879 --> 16:04:55,595
left out the const that we have on the
21301
16:04:53,519 --> 16:04:57,359
other parameters because we want to be
21302
16:04:57,360 --> 16:05:02,480
the output variable here inside the
21303
16:05:00,400 --> 16:05:04,720
function if we marked the third
21304
16:05:02,480 --> 16:05:06,560
parameter as const we would get a
21305
16:05:04,720 --> 16:05:09,040
compiler error if we're trying to do
21306
16:05:06,559 --> 16:05:11,595
something like this and assign something
21307
16:05:09,040 --> 16:05:13,520
to the output parameter here so the main
21308
16:05:11,595 --> 16:05:16,000
purpose of this function is to compute
21309
16:05:13,519 --> 16:05:18,639
the maximum between these two strings we
21310
16:05:16,000 --> 16:05:20,480
are going to say if input 1 is greater
21311
16:05:20,480 --> 16:05:26,240
then input 1 is going to be our maximum
21312
16:05:23,519 --> 16:05:29,359
and we are going to store that in our
21313
16:05:26,239 --> 16:05:32,400
output parameter here if input 1 is not
21314
16:05:29,360 --> 16:05:34,796
greater than input 2 then input 2 is our
21315
16:05:32,400 --> 16:05:38,319
maximum we're going to store that in our
21316
16:05:34,796 --> 16:05:40,480
output and whoever has access to input 2
21317
16:05:38,319 --> 16:05:42,639
outside the function is going to see the
21318
16:05:40,480 --> 16:05:44,400
changes that we are making in the body
21319
16:05:42,639 --> 16:05:46,239
of the function this is really the
21320
16:05:46,955 --> 16:05:50,639
send output from the function and make
21321
16:05:50,639 --> 16:05:55,275
when the function has returned and again
21322
16:05:53,199 --> 16:05:57,915
the key idea is that we set up the
21323
16:05:55,275 --> 16:05:59,680
function in a way that the changes we do
21324
16:05:57,915 --> 16:06:02,000
inside the function are going to be
21325
16:05:59,680 --> 16:06:04,796
visible on the outside and we are able
21326
16:06:02,000 --> 16:06:07,275
to do that because output here is a
21327
16:06:04,796 --> 16:06:09,840
reference this is really key we have
21328
16:06:07,275 --> 16:06:12,239
used references here but we can set up
21329
16:06:09,839 --> 16:06:14,955
the same thing using pointers because we
21330
16:06:12,239 --> 16:06:17,436
have seen that with pointers we can also
21331
16:06:14,955 --> 16:06:19,915
make our changes inside the function
21332
16:06:17,436 --> 16:06:22,400
visible to the outside the two other
21333
16:06:19,915 --> 16:06:24,319
examples here are really extensions of
21334
16:06:22,400 --> 16:06:27,275
the same thing we have two input
21335
16:06:24,319 --> 16:06:28,400
variables input 1 and input 2
21336
16:06:28,400 --> 16:06:33,200
output is going to store the output from
21337
16:06:30,639 --> 16:06:35,360
the function you notice that output is a
21338
16:06:33,199 --> 16:06:37,519
reference and because of this the
21339
16:06:35,360 --> 16:06:40,639
changes we do in here are going to be
21340
16:06:37,519 --> 16:06:43,199
visible when this function has returned
21341
16:06:40,639 --> 16:06:44,400
and we do exactly the same thing on max
21342
16:06:44,400 --> 16:06:48,880
but you see that it is using a pointer
21343
16:06:46,559 --> 16:06:50,795
okay i really wanted you to see this so
21344
16:06:48,879 --> 16:06:54,079
inside we're going to try and figure out
21345
16:06:50,796 --> 16:06:56,560
who is the maximum and if input 1 is the
21346
16:06:54,080 --> 16:06:58,955
maximum we're going to write that in our
21347
16:06:56,559 --> 16:07:01,199
output variable here and you notice that
21348
16:06:58,955 --> 16:07:04,720
we are the referencing here because this
21349
16:07:01,199 --> 16:07:07,360
guy is a pointer and if input 2 is our
21350
16:07:04,720 --> 16:07:09,436
maximum we're going to write that in our
21351
16:07:07,360 --> 16:07:12,239
output variable here one thing i don't
21352
16:07:09,436 --> 16:07:15,680
think i explained here is that we have a
21353
16:07:12,239 --> 16:07:19,040
cost std string reference here for maxed
21354
16:07:15,680 --> 16:07:21,199
hdr and the reason is that the input
21355
16:07:19,040 --> 16:07:23,436
variables aren't really meant to be
21356
16:07:21,199 --> 16:07:26,079
changed that's why we market them as
21357
16:07:23,436 --> 16:07:28,400
cost and if you want to modify them in
21358
16:07:26,080 --> 16:07:30,240
some way you can take the const away and
21359
16:07:28,400 --> 16:07:32,639
it is going to work okay this is really
21360
16:07:30,239 --> 16:07:35,360
the big idea we are playing with in this
21361
16:07:32,639 --> 16:07:38,479
lecture using function parameters as a
21362
16:07:35,360 --> 16:07:40,720
way to output data from the function and
21363
16:07:38,480 --> 16:07:43,200
here are a few ideas you should keep in
21364
16:07:40,720 --> 16:07:45,360
mind output parameters should be passed
21365
16:07:43,199 --> 16:07:48,000
in such a way that you can modify the
21366
16:07:45,360 --> 16:07:50,000
arguments from the inside the functions
21367
16:07:48,000 --> 16:07:51,436
and we have seen that we have two ways
21368
16:07:50,000 --> 16:07:54,080
to do that we could either use
21369
16:07:51,436 --> 16:07:56,796
references or even use pointers but
21370
16:07:54,080 --> 16:07:59,360
references are what you should prefer in
21371
16:07:56,796 --> 16:08:01,840
modern c plus plus input parameters
21372
16:07:59,360 --> 16:08:04,559
shouldn't be modified they are meant to
21373
16:08:01,839 --> 16:08:06,479
just get data in the function and that's
21374
16:08:04,559 --> 16:08:08,955
why in most cases you're going to see
21375
16:08:06,480 --> 16:08:11,116
that they are marked const okay now that
21376
16:08:08,955 --> 16:08:13,116
we have seen all these ideas i think it
21377
16:08:11,116 --> 16:08:15,200
is time we headed over to visual studio
21378
16:08:13,116 --> 16:08:17,840
code and actually played with them okay
21379
16:08:15,199 --> 16:08:20,159
here we are in our working folder the
21380
16:08:17,839 --> 16:08:22,399
current project is input and output
21381
16:08:20,160 --> 16:08:24,880
parameters we are going to grab our
21382
16:08:22,400 --> 16:08:27,275
template files like we always do we're
21383
16:08:24,879 --> 16:08:29,275
going to put them in place and we are
21384
16:08:27,275 --> 16:08:31,199
going to open this guy in visual studio
21385
16:08:29,275 --> 16:08:33,839
code we're going to just drag it and
21386
16:08:31,199 --> 16:08:35,839
drop on top of visual studio code here
21387
16:08:33,839 --> 16:08:37,915
and it is going to open up we have our
21388
16:08:35,839 --> 16:08:40,879
main function here we can close the pane
21389
16:08:37,915 --> 16:08:42,559
here and clean the file up a little bit
21390
16:08:40,879 --> 16:08:45,595
we're going to remove what we don't need
21391
16:08:42,559 --> 16:08:47,519
here and we're going to have a bare main
21392
16:08:45,595 --> 16:08:49,839
function we can play with here the first
21393
16:08:47,519 --> 16:08:52,719
thing we're going to do is to put in our
21394
16:08:49,839 --> 16:08:55,755
max str function it is nothing special
21395
16:08:52,720 --> 16:08:58,480
we just have two input parameters and
21396
16:08:55,756 --> 16:09:00,480
one output parameter the output
21397
16:08:58,480 --> 16:09:03,116
parameter is going to be what we use to
21398
16:09:00,480 --> 16:09:04,796
get output outside the function and
21399
16:09:03,116 --> 16:09:07,200
inside we're just going to compute the
21400
16:09:04,796 --> 16:09:09,200
maximum if input 1 is the maximum we're
21401
16:09:07,199 --> 16:09:11,915
going to write that in our output
21402
16:09:09,199 --> 16:09:14,159
parameter if input 2 happens to be our
21403
16:09:11,915 --> 16:09:16,879
maximum we're going to write that in our
21404
16:09:14,160 --> 16:09:19,360
output parameter because our output
21405
16:09:16,879 --> 16:09:21,360
parameter is a reference the changes we
21406
16:09:19,360 --> 16:09:24,239
make inside the function are going to be
21407
16:09:21,360 --> 16:09:27,116
visible on the outside because we will
21408
16:09:24,239 --> 16:09:29,595
be working on the original variable
21409
16:09:27,116 --> 16:09:32,080
through the reference which is really a
21410
16:09:29,595 --> 16:09:33,756
true alias here okay now that we have
21411
16:09:32,080 --> 16:09:36,560
the function set up like this we can
21412
16:09:33,756 --> 16:09:38,639
head in the main function and try it out
21413
16:09:36,559 --> 16:09:40,639
we're going to set up three variables of
21414
16:09:38,639 --> 16:09:43,040
type std strand i think we should
21415
16:09:40,639 --> 16:09:45,275
include the string library here let's do
21416
16:09:43,040 --> 16:09:48,239
that and we're going to have an out
21417
16:09:45,275 --> 16:09:51,360
string which is going to be our output
21418
16:09:48,239 --> 16:09:53,915
variable and we have two input strings
21419
16:09:51,360 --> 16:09:56,796
one is initialized with alabama the
21420
16:09:53,915 --> 16:10:00,239
other is initialized with bell view and
21421
16:09:56,796 --> 16:10:02,080
we're going to call our max sdr function
21422
16:10:00,239 --> 16:10:04,559
here you notice that it's not going to
21423
16:10:02,080 --> 16:10:06,880
be using the return mechanism we're
21424
16:10:04,559 --> 16:10:10,000
going to be grabbing the output from
21425
16:10:06,879 --> 16:10:13,275
this function using an output parameter
21426
16:10:10,000 --> 16:10:15,275
which is going to be our out hdr
21427
16:10:13,275 --> 16:10:17,040
variable here okay once the function is
21428
16:10:15,275 --> 16:10:21,040
done we're going to have the maximum
21429
16:10:17,040 --> 16:10:22,879
stored in our out sdr variable here and
21430
16:10:21,040 --> 16:10:25,275
we can print it out now that we have
21431
16:10:22,879 --> 16:10:27,360
this setup we can actually try and build
21432
16:10:25,275 --> 16:10:29,680
this we're going to use gcc let's do
21433
16:10:27,360 --> 16:10:32,639
that the build is good we can bring up a
21434
16:10:29,680 --> 16:10:34,400
terminal and clear and run rooster now
21435
16:10:32,639 --> 16:10:38,000
you see that the maximum is going to be
21436
16:10:34,400 --> 16:10:39,840
bell view let's try and change this to
21437
16:10:38,000 --> 16:10:41,595
casablanca why not and we're going to
21438
16:10:39,839 --> 16:10:44,239
see that the maximum now is going to be
21439
16:10:41,595 --> 16:10:47,275
casablanca and our function is going to
21440
16:10:44,239 --> 16:10:50,079
be smart enough to store the maximum in
21441
16:10:47,275 --> 16:10:51,915
this output variable here let's build
21442
16:10:50,080 --> 16:10:54,160
again the world is going to be good
21443
16:10:51,915 --> 16:10:56,559
going to clear and run rooster now the
21444
16:10:54,160 --> 16:10:59,276
maximum is casablanca hopefully you
21445
16:10:56,559 --> 16:11:02,159
understand that we are able to make the
21446
16:10:59,275 --> 16:11:06,000
changes in the function processed
21447
16:11:02,160 --> 16:11:08,400
because our output parameter here is
21448
16:11:06,000 --> 16:11:10,720
passed by reference this is a true
21449
16:11:08,400 --> 16:11:13,200
reference and any change we do to the
21450
16:11:10,720 --> 16:11:16,160
output parameter here is going to be
21451
16:11:13,199 --> 16:11:19,199
visible in whatever variable you passed
21452
16:11:16,160 --> 16:11:21,436
as an argument for this third argument
21453
16:11:19,199 --> 16:11:23,039
here this is what is making this work
21454
16:11:21,436 --> 16:11:24,480
now that this is working we're going to
21455
16:11:25,360 --> 16:11:29,756
put in another example for you to play
21456
16:11:28,319 --> 16:11:32,159
with the next function we're going to
21457
16:11:29,756 --> 16:11:35,520
play with is going to be max and as you
21458
16:11:32,160 --> 16:11:39,116
see here and it is very similar to our
21459
16:11:35,519 --> 16:11:42,000
max hdr but you notice that our inputs
21460
16:11:39,116 --> 16:11:44,720
are no longer references because we
21461
16:11:42,000 --> 16:11:47,116
don't really mind copying fundamental
21462
16:11:44,720 --> 16:11:49,756
types in c plus plus they are small in
21463
16:11:47,116 --> 16:11:52,160
memory so copying them is really cheap
21464
16:11:49,756 --> 16:11:54,955
we can pass them by value and this is
21465
16:11:52,160 --> 16:11:57,360
not going to be so wasteful in our
21466
16:11:54,955 --> 16:11:59,839
program but the first parameter must be
21467
16:11:57,360 --> 16:12:02,796
passed by reference because we want to
21468
16:11:59,839 --> 16:12:04,955
use it as an output parameter and we're
21469
16:12:02,796 --> 16:12:06,796
going to use it to get output from the
21470
16:12:04,955 --> 16:12:08,400
function and the way we're going to do
21471
16:12:06,796 --> 16:12:11,040
that we're going to write whatever
21472
16:12:08,400 --> 16:12:13,275
variable is the maximum in our output
21473
16:12:11,040 --> 16:12:15,360
parameter and the changes are going to
21474
16:12:13,275 --> 16:12:17,756
be visible on the outside now we are
21475
16:12:15,360 --> 16:12:19,756
going to head over in our main function
21476
16:12:17,756 --> 16:12:22,400
set up a few variables and play with us
21477
16:12:19,756 --> 16:12:25,040
so we're going to say and out and this
21478
16:12:22,400 --> 16:12:27,680
is going to be our output variable and
21479
16:12:25,040 --> 16:12:29,436
we're going to say input one let's say
21480
16:12:27,680 --> 16:12:32,319
in one and we're going to initialize
21481
16:12:29,436 --> 16:12:34,480
this with a 45 why not and we're going
21482
16:12:32,319 --> 16:12:37,275
to say ent in two and we're going to
21483
16:12:34,480 --> 16:12:39,360
initialize this with 23 why not now that
21484
16:12:37,275 --> 16:12:41,115
we have this we're going to say max and
21485
16:12:39,360 --> 16:12:44,000
and we're going to put in our input
21486
16:12:41,116 --> 16:12:46,955
we're going to say n1 and n2 then we're
21487
16:12:44,000 --> 16:12:49,116
going to say out and as our output
21488
16:12:46,955 --> 16:12:51,199
variable now that we have this we can
21489
16:12:49,116 --> 16:12:53,596
actually print out whatever number is
21490
16:12:51,199 --> 16:12:55,360
the maximum through an output statement
21491
16:12:53,595 --> 16:12:58,000
like this really simple we're going to
21492
16:12:55,360 --> 16:13:00,239
say max and and we're going to say out
21493
16:12:58,000 --> 16:13:02,319
to end that's where it is going to be
21494
16:13:00,239 --> 16:13:05,115
stored and we are able to do this
21495
16:13:02,319 --> 16:13:08,159
because again the third parameter here
21496
16:13:05,116 --> 16:13:10,560
is passed by reference and any change we
21497
16:13:08,160 --> 16:13:13,756
do and the function here is going to
21498
16:13:10,559 --> 16:13:16,000
stack even when the function here has
21499
16:13:13,756 --> 16:13:18,720
returned and we're going to have that
21500
16:13:16,000 --> 16:13:20,480
stored in our third parameter here and
21501
16:13:18,720 --> 16:13:23,595
this is a really common technique
21502
16:13:20,480 --> 16:13:27,276
especially in code that has to interface
21503
16:13:23,595 --> 16:13:29,360
with c code out there from c plus plus
21504
16:13:27,275 --> 16:13:31,436
and you really need to be aware of this
21505
16:13:29,360 --> 16:13:33,915
now if we run this program we're going
21506
16:13:31,436 --> 16:13:36,480
to see our maximum printed out and it is
21507
16:13:33,915 --> 16:13:38,479
going to be stored in our out variable
21508
16:13:36,480 --> 16:13:40,796
here let's do that we're going to use
21509
16:13:38,480 --> 16:13:42,956
gcc to world the world is good you can
21510
16:13:40,796 --> 16:13:45,596
clear and run rooster and you're going
21511
16:13:42,955 --> 16:13:49,040
to see that the maximum is 45 if we
21512
16:13:45,595 --> 16:13:51,839
change and store our maximum in into
21513
16:13:49,040 --> 16:13:54,639
here and for example let's make this a
21514
16:13:54,639 --> 16:13:59,239
let's build it in to take the changes
21515
16:13:59,239 --> 16:14:03,680
rooster.xe binary we're going to clear
21516
16:14:01,839 --> 16:14:06,000
and run rooster and you're going to see
21517
16:14:03,680 --> 16:14:08,400
that that's the maximum here we are able
21518
16:14:06,000 --> 16:14:11,275
to grab whatever is the maximum from
21519
16:14:08,400 --> 16:14:13,916
these two input parameters and store
21520
16:14:11,275 --> 16:14:17,360
that in our output parameter here
21521
16:14:13,915 --> 16:14:19,915
because we are passing that third guy as
21522
16:14:17,360 --> 16:14:21,915
a reference this is really important we
21523
16:14:19,915 --> 16:14:24,955
have seen that we can use references to
21524
16:14:21,915 --> 16:14:28,239
make changes we do in the function stick
21525
16:14:24,955 --> 16:14:30,159
and be visible in outside variables but
21526
16:14:28,239 --> 16:14:32,239
we can also use pointers and i am going
21527
16:14:30,160 --> 16:14:33,840
to show you an example of how we can do
21528
16:14:32,239 --> 16:14:36,400
that first we're going to comment this
21529
16:14:33,839 --> 16:14:38,955
out because we don't want noise output
21530
16:14:36,400 --> 16:14:41,840
in our program and we are going to go on
21531
16:14:38,955 --> 16:14:45,680
top and set up a max double function
21532
16:14:41,839 --> 16:14:48,000
which is going to grab our output using
21533
16:14:45,680 --> 16:14:50,400
pointers the name of the function is max
21534
16:14:48,000 --> 16:14:52,400
double it's not going to return anything
21535
16:14:50,400 --> 16:14:55,916
and it is going to take two input
21536
16:14:52,400 --> 16:14:58,319
parameters input 1 and input 2 and it is
21537
16:14:55,915 --> 16:15:00,719
going to tell us whichever of these 2 is
21538
16:14:58,319 --> 16:15:03,595
the maximum the maximum is going to be
21539
16:15:00,720 --> 16:15:05,840
stored in our output parameter but we
21540
16:15:03,595 --> 16:15:08,399
are using pointers to make these changes
21541
16:15:05,839 --> 16:15:10,719
inside the body of the function stick
21542
16:15:08,400 --> 16:15:12,239
and be visible on the outside of the
21543
16:15:10,720 --> 16:15:14,080
function so we are going to the
21544
16:15:12,239 --> 16:15:15,915
reference here because the third guy
21545
16:15:14,080 --> 16:15:18,240
here is a pointer and we're going to
21546
16:15:15,915 --> 16:15:20,559
store in whichever is the maximum and
21547
16:15:18,239 --> 16:15:22,879
when the function returns the maximum is
21548
16:15:20,559 --> 16:15:24,879
going to be visible on the outside so
21549
16:15:22,879 --> 16:15:26,955
let's go down and try this out we're
21550
16:15:24,879 --> 16:15:28,079
going to say double out double and we're
21551
16:15:28,080 --> 16:15:32,400
set up our input here we're going to say
21552
16:15:30,400 --> 16:15:33,239
in double one and we're going to make
21553
16:15:33,239 --> 16:15:39,595
45.8 why not and we're going to do a
21554
16:15:36,239 --> 16:15:43,040
second input parameter and int we should
21555
16:15:39,595 --> 16:15:45,199
say n not end sorry for this in double
21556
16:15:43,040 --> 16:15:47,360
for input double so we're going to say
21557
16:15:45,199 --> 16:15:50,000
double 2 and we're going to initialize
21558
16:15:50,000 --> 16:15:54,000
for example we can really put in
21559
16:15:51,839 --> 16:15:56,319
anything now that we have this we can
21560
16:15:54,000 --> 16:15:58,080
call our max double function let's do
21561
16:15:56,319 --> 16:16:01,680
that going to say max double we're going
21562
16:15:58,080 --> 16:16:03,596
to say in double one and in double two
21563
16:16:01,680 --> 16:16:07,275
let's do that and we're going to have
21564
16:16:03,595 --> 16:16:09,040
out double as our output parameter and
21565
16:16:07,275 --> 16:16:12,000
uh because it's a pointer we need to
21566
16:16:09,040 --> 16:16:14,639
pass this guy as an address so we're
21567
16:16:12,000 --> 16:16:16,559
going to say address of how to double
21568
16:16:14,639 --> 16:16:19,040
here that's how we're going to be able
21569
16:16:16,559 --> 16:16:21,519
to manipulate that inside the function
21570
16:16:19,040 --> 16:16:24,879
here once we do this we are going to
21571
16:16:21,519 --> 16:16:26,719
have our maximum stored and out double
21572
16:16:24,879 --> 16:16:29,680
and we can print that out so we're going
21573
16:16:26,720 --> 16:16:32,000
to say stdcl max double and we're going
21574
16:16:29,680 --> 16:16:36,319
to say mac and we're going to say out to
21575
16:16:32,000 --> 16:16:38,239
double std e and el and if we weld why
21576
16:16:36,319 --> 16:16:40,955
do we have a squiggly line here we don't
21577
16:16:38,239 --> 16:16:42,559
have a semicolon at the end of our
21578
16:16:40,955 --> 16:16:45,275
function called here so we're going to
21579
16:16:42,559 --> 16:16:47,360
build with gcc as always you're going to
21580
16:16:45,275 --> 16:16:51,436
see that the world is good we can clear
21581
16:16:51,436 --> 16:16:57,116
if we change and store our maximum and
21582
16:16:54,319 --> 16:16:58,796
in double to here we can change this guy
21583
16:16:58,796 --> 16:17:04,080
we're going to build and see that we are
21584
16:17:01,116 --> 16:17:06,240
actually grabbing the maximum regardless
21585
16:17:04,080 --> 16:17:08,080
of the variable in which it is stored if
21586
16:17:06,239 --> 16:17:11,115
we run rooster we're going to have our
21587
16:17:08,080 --> 16:17:12,955
maximum and this is working exactly as
21588
16:17:11,116 --> 16:17:14,560
we want this is really all we set out to
21589
16:17:12,955 --> 16:17:18,239
do in this lecture showing you how you
21590
16:17:14,559 --> 16:17:21,519
can use references to use parameters as
21591
16:17:18,239 --> 16:17:24,879
output channels for data to get outside
21592
16:17:21,519 --> 16:17:27,435
of the function and be used in variables
21593
16:17:24,879 --> 16:17:29,435
that are outside the function here i
21594
16:17:27,436 --> 16:17:31,275
really hope this makes sense and this is
21595
16:17:29,436 --> 16:17:32,880
a technique you need to be aware of
21596
16:17:31,275 --> 16:17:35,680
we're going to see other techniques to
21597
16:17:32,879 --> 16:17:37,199
do the same thing and uh starting in the
21598
16:17:35,680 --> 16:17:39,840
next lecture we're going to see how we
21599
16:17:37,199 --> 16:17:42,319
can return from functions for now i hope
21600
16:17:39,839 --> 16:17:44,159
you found this lecture interesting we
21601
16:17:42,319 --> 16:17:45,436
are going to stop here in this one in
21602
16:17:44,160 --> 16:17:48,796
the next one we're going to see how we
21603
16:17:45,436 --> 16:17:51,680
can use the return mechanism to get data
21604
16:17:48,796 --> 16:17:54,240
outside our function go ahead and finish
21605
16:17:54,239 --> 16:17:58,559
in this lecture we're going to see how
21606
16:17:55,680 --> 16:18:01,756
we can get data outside of a function
21607
16:17:58,559 --> 16:18:04,399
through the return mechanism and this is
21608
16:18:01,756 --> 16:18:06,400
going to be an alternative to the way we
21609
16:18:04,400 --> 16:18:08,639
have been doing things in the last
21610
16:18:06,400 --> 16:18:12,080
lecture where we used function
21611
16:18:08,639 --> 16:18:14,000
parameters as channels to get data
21612
16:18:14,000 --> 16:18:17,756
let's look at the simple example of how
21613
16:18:16,239 --> 16:18:19,595
this is done here we have a simple
21614
16:18:17,756 --> 16:18:21,595
function called sum the function is
21615
16:18:21,595 --> 16:18:27,115
and it is going to sum up two parameters
21616
16:18:24,000 --> 16:18:28,720
that we pass to at nta and end b
21617
16:18:27,116 --> 16:18:30,240
if we get inside the function we're
21618
16:18:28,720 --> 16:18:31,680
going to do something really simple
21619
16:18:30,239 --> 16:18:33,360
we're going to set up a new variable
21620
16:18:31,680 --> 16:18:35,040
which is local to the function we're
21621
16:18:33,360 --> 16:18:37,040
going to call that reserved it's going
21622
16:18:35,040 --> 16:18:39,275
to be the same type as our input
21623
16:18:37,040 --> 16:18:41,756
parameters and we're going to add up a
21624
16:18:39,275 --> 16:18:43,680
and b and store the results back in our
21625
16:18:43,680 --> 16:18:49,436
once we have this we're going to return
21626
16:18:45,756 --> 16:18:52,080
this for this variable to be visible by
21627
16:18:49,436 --> 16:18:53,840
whoever called this function here one
21628
16:18:52,080 --> 16:18:57,596
thing you should know is that this
21629
16:18:53,839 --> 16:19:00,479
variable is local to this function here
21630
16:18:57,595 --> 16:19:02,879
and it will be destroyed the moment we
21631
16:19:00,480 --> 16:19:04,640
hit the end of the function here and the
21632
16:19:04,639 --> 16:19:08,559
so if we go in main here we're going to
21633
16:19:06,639 --> 16:19:11,116
try and see an example of how we can
21634
16:19:08,559 --> 16:19:14,399
call this function we have two variables
21635
16:19:11,116 --> 16:19:16,796
a and b and we have a new result
21636
16:19:14,400 --> 16:19:19,200
variable set up in the main function
21637
16:19:16,796 --> 16:19:21,436
please note that this variable is very
21638
16:19:19,199 --> 16:19:22,399
different from the variable we have and
21639
16:19:22,400 --> 16:19:27,360
sum function here because they live in
21640
16:19:24,879 --> 16:19:30,159
different scopes okay we are calling our
21641
16:19:27,360 --> 16:19:33,520
sum function here and we are passing it
21642
16:19:30,160 --> 16:19:35,596
two arguments in the form of a and b
21643
16:19:33,519 --> 16:19:37,915
here the function is going to compute
21644
16:19:35,595 --> 16:19:40,319
our sum and it's going to return it and
21645
16:19:37,915 --> 16:19:42,879
we're going to store that back in our
21646
16:19:40,319 --> 16:19:45,436
local variable to the main function here
21647
16:19:42,879 --> 16:19:47,755
the result variable here again is local
21648
16:19:45,436 --> 16:19:49,275
to this main function okay once we call
21649
16:19:47,756 --> 16:19:52,080
this function we're going to have our
21650
16:19:49,275 --> 16:19:53,756
results stored in here and if we print
21651
16:19:52,080 --> 16:19:55,916
like we do here we're going to see it
21652
16:19:53,756 --> 16:19:59,520
printed out on the console in this case
21653
16:19:55,915 --> 16:20:02,479
it's going to print 50 because 34 adding
21654
16:19:59,519 --> 16:20:04,479
16 that's going to be 50. but one thing
21655
16:20:02,480 --> 16:20:06,956
i want you to know is that this is going
21656
16:20:04,480 --> 16:20:08,956
to return by value and what we mean by
21657
16:20:06,955 --> 16:20:12,159
this is that we're going to copy
21658
16:20:08,955 --> 16:20:15,116
whatever we return here and store a copy
21659
16:20:12,160 --> 16:20:17,276
of that in this result variable that we
21660
16:20:15,116 --> 16:20:18,955
have in the main function and we're
21661
16:20:18,955 --> 16:20:25,519
notice the stdc out statement we have
21662
16:20:21,915 --> 16:20:27,519
here this is going to print the address
21663
16:20:25,519 --> 16:20:29,755
of this local variable and once the
21664
16:20:27,519 --> 16:20:32,079
function terminates we're going to try
21665
16:20:29,756 --> 16:20:34,639
and print the address of this resort
21666
16:20:32,080 --> 16:20:36,639
variable in the local scope of the main
21667
16:20:34,639 --> 16:20:38,879
function and we're going to see two
21668
16:20:36,639 --> 16:20:41,436
different addresses and hopefully this
21669
16:20:38,879 --> 16:20:43,755
is going to prove that we are returning
21670
16:20:41,436 --> 16:20:46,319
a copy it's not the original variable
21671
16:20:43,756 --> 16:20:48,559
that we have in the sum function here
21672
16:20:46,319 --> 16:20:50,639
that we are returning okay hopefully
21673
16:20:48,559 --> 16:20:53,275
this drives the point home that we can
21674
16:20:50,639 --> 16:20:55,199
use the return mechanism to get data
21675
16:20:53,275 --> 16:20:58,720
outside the function and we're going to
21676
16:20:55,199 --> 16:21:00,719
grab the result in our result variable
21677
16:20:58,720 --> 16:21:02,720
here and we're going to use it however
21678
16:21:02,720 --> 16:21:08,000
but things don't always work like this
21679
16:21:06,000 --> 16:21:10,080
sometimes the compiler is going to
21680
16:21:10,080 --> 16:21:15,520
and not really returned by value but
21681
16:21:12,559 --> 16:21:18,000
returning by value is the default but if
21682
16:21:15,519 --> 16:21:20,479
the compiler notices that it can do
21683
16:21:18,000 --> 16:21:23,360
things better it is going to optimize
21684
16:21:20,480 --> 16:21:25,520
your returns by value to return by
21685
16:21:23,360 --> 16:21:28,480
reference and you're not going to make a
21686
16:21:25,519 --> 16:21:30,795
copy but you're going to somehow reuse
21687
16:21:28,480 --> 16:21:33,040
the local variable in the main function
21688
16:21:30,796 --> 16:21:35,360
let's look at a simple example to really
21689
16:21:33,040 --> 16:21:37,436
drive this home we have a function here
21690
16:21:35,360 --> 16:21:39,436
which is going to add strength it is
21691
16:21:37,436 --> 16:21:41,756
going to basically concatenate them
21692
16:21:39,436 --> 16:21:43,596
using the plus operator here and you
21693
16:21:41,756 --> 16:21:45,040
notice that inside the function here
21694
16:21:43,595 --> 16:21:47,915
we're going to set up a local variable
21695
16:21:45,040 --> 16:21:49,360
which is going to store our concatenated
21696
16:21:49,360 --> 16:21:53,595
and we're going to print the address of
21697
16:21:51,680 --> 16:21:55,680
the local string after that we're going
21698
16:21:53,595 --> 16:21:58,639
to return the strength so that it is
21699
16:21:55,680 --> 16:22:00,720
usable by whoever calls this function
21700
16:21:58,639 --> 16:22:03,360
let's go in main and see how we can use
21701
16:22:00,720 --> 16:22:05,916
this function here we are setting up a
21702
16:22:03,360 --> 16:22:08,720
variable called sdr result which is
21703
16:22:05,915 --> 16:22:10,639
going to store our result strength we
21704
16:22:08,720 --> 16:22:13,040
are saying add strings here we are
21705
16:22:10,639 --> 16:22:16,080
calling our function and we are passing
21706
16:22:13,040 --> 16:22:18,400
in two strings hello and world and we
21707
16:22:16,080 --> 16:22:20,480
want to concatenate these guys this is
21708
16:22:18,400 --> 16:22:21,916
going to give us our result and if we
21709
16:22:20,480 --> 16:22:24,480
print it out we're going to get hello
21710
16:22:21,915 --> 16:22:28,000
world printed out but the main message
21711
16:22:24,480 --> 16:22:30,720
here is that the address of the outside
21712
16:22:28,000 --> 16:22:33,680
string here is going to be the same as
21713
16:22:30,720 --> 16:22:35,360
the address we have on the inside here
21714
16:22:33,680 --> 16:22:37,436
and this is going to mean that the
21715
16:22:39,116 --> 16:22:44,880
to return the local variable because it
21716
16:22:42,400 --> 16:22:47,436
has seen that we could really be wasting
21717
16:22:44,879 --> 16:22:49,755
this guy here inside the function when
21718
16:22:47,436 --> 16:22:52,319
the function returns this string result
21719
16:22:49,756 --> 16:22:54,880
here is going to die off but the
21720
16:22:52,319 --> 16:22:57,436
compiler knows that we can reuse that
21721
16:22:54,879 --> 16:23:00,159
and avoid the work of copying this
21722
16:22:57,436 --> 16:23:02,160
string which might be really large
21723
16:23:00,160 --> 16:23:04,640
suppose this string has a thousand
21724
16:23:02,160 --> 16:23:07,276
characters inside and copying it would
21725
16:23:04,639 --> 16:23:10,000
be a waste so the compiler is not going
21726
16:23:07,275 --> 16:23:12,400
to return by value which is the default
21727
16:23:10,000 --> 16:23:14,955
it is going to do some kind of return by
21728
16:23:12,400 --> 16:23:16,796
reference but it's really not a return
21729
16:23:14,955 --> 16:23:18,639
by reference because this is a local
21730
16:23:16,796 --> 16:23:20,319
variable we can't really have a
21731
16:23:18,639 --> 16:23:22,239
reference to a local variable to a
21732
16:23:20,319 --> 16:23:24,559
function that would be really bad
21733
16:23:22,239 --> 16:23:27,040
because we might be able to modify it
21734
16:23:24,559 --> 16:23:29,360
when the variable is actually dead after
21735
16:23:27,040 --> 16:23:31,756
the function has returned so it is a
21736
16:23:29,360 --> 16:23:34,319
magic that the compiler is doing to save
21737
16:23:31,756 --> 16:23:36,400
you from unnecessary copies but you
21738
16:23:34,319 --> 16:23:39,519
should be aware of this and not make
21739
16:23:36,400 --> 16:23:41,360
your code rely on returning by value
21740
16:23:39,519 --> 16:23:43,275
okay now that we know this we're going
21741
16:23:41,360 --> 16:23:46,559
to head over to visual studio code and
21742
16:23:43,275 --> 16:23:48,795
actually play with us here we are in our
21743
16:23:46,559 --> 16:23:51,595
working folder the current project is
21744
16:23:48,796 --> 16:23:54,000
returning from functions by value we're
21745
16:23:51,595 --> 16:23:56,159
going to grab our template files pretty
21746
16:23:54,000 --> 16:23:58,400
quick we're going to copy them let's do
21747
16:23:56,160 --> 16:24:00,956
that and we're going to put them in the
21748
16:24:00,955 --> 16:24:05,595
and we're going to open this guy up in
21749
16:24:03,360 --> 16:24:06,559
visual studio code pretty quick let's do
21750
16:24:06,559 --> 16:24:11,915
now we have our main cpp file here we
21751
16:24:09,436 --> 16:24:14,000
can clean it up a little bit
21752
16:24:11,915 --> 16:24:15,519
and close the left pane here because we
21753
16:24:14,000 --> 16:24:17,436
don't need it the first thing we're
21754
16:24:15,519 --> 16:24:19,519
going to do is to put in our function
21755
16:24:17,436 --> 16:24:22,796
which is going to compute the sum of two
21756
16:24:19,519 --> 16:24:24,955
integers and return as the sum of these
21757
16:24:22,796 --> 16:24:27,200
two guys inside the function we're going
21758
16:24:24,955 --> 16:24:29,116
to set up a result variable which is
21759
16:24:27,199 --> 16:24:31,039
going to store the sum and we're going
21760
16:24:29,116 --> 16:24:33,276
to return it and it is going to be
21761
16:24:31,040 --> 16:24:35,275
visible to whoever has called this
21762
16:24:33,275 --> 16:24:37,436
function here again i am going to
21763
16:24:35,275 --> 16:24:40,319
emphasize that this is going to return
21764
16:24:37,436 --> 16:24:43,596
by value so what we return is really
21765
16:24:40,319 --> 16:24:45,275
going to be a copy of this variable here
21766
16:24:43,595 --> 16:24:47,756
and we're going to prove that by
21767
16:24:45,275 --> 16:24:50,639
printing the address of this variable
21768
16:24:47,756 --> 16:24:52,319
inside and outside the function here so
21769
16:24:50,639 --> 16:24:54,559
we're going to set up two variables in
21770
16:24:52,319 --> 16:24:57,519
main we're going to say and x let's call
21771
16:24:54,559 --> 16:25:00,239
our input parameters x and y we're going
21772
16:24:57,519 --> 16:25:02,559
to put in a five and the second guy is
21773
16:25:00,239 --> 16:25:05,115
going to be a y and it's going to store
21774
16:25:02,559 --> 16:25:07,040
an n9 why not after that we're going to
21775
16:25:05,116 --> 16:25:09,916
set up a variable which is going to
21776
16:25:07,040 --> 16:25:12,400
store the results let's call this result
21777
16:25:09,915 --> 16:25:14,795
why not and we're going to say some x
21778
16:25:12,400 --> 16:25:17,275
and y okay we are passing these guys by
21779
16:25:14,796 --> 16:25:20,160
value because we don't really care about
21780
16:25:17,275 --> 16:25:22,879
copying and and it is a fundamental type
21781
16:25:20,160 --> 16:25:25,520
it is really small in memory so it's
21782
16:25:22,879 --> 16:25:28,079
going to be very cheap to copy it's not
21783
16:25:25,519 --> 16:25:31,435
going to hurt the performance of our
21784
16:25:28,080 --> 16:25:33,276
application but what we want to do now
21785
16:25:33,275 --> 16:25:39,519
the address of the reserved variable in
21786
16:25:37,040 --> 16:25:41,756
the main function here and see that it
21787
16:25:41,756 --> 16:25:46,000
address of the variable we have inside
21788
16:25:44,319 --> 16:25:48,400
here another thing you should watch out
21789
16:25:46,000 --> 16:25:50,879
for is that we are able to get data
21790
16:25:48,400 --> 16:25:53,840
outside the function here the sum was a
21791
16:25:50,879 --> 16:25:56,559
local variable but we are able to get it
21792
16:25:53,839 --> 16:25:59,199
out of the function through the return
21793
16:25:56,559 --> 16:26:01,680
mechanism here okay before we go ahead
21794
16:25:59,199 --> 16:26:04,239
and run this program we're going to fix
21795
16:26:01,680 --> 16:26:07,116
the statement here we forgot to change
21796
16:26:04,239 --> 16:26:09,275
this to say out to mean that it is
21797
16:26:07,116 --> 16:26:12,319
outside the function here that's the
21798
16:26:09,275 --> 16:26:14,639
meaning we're going to build with gcc
21799
16:26:12,319 --> 16:26:16,559
the world is good we can clear and run
21800
16:26:14,639 --> 16:26:19,839
rooster now we're going to see that
21801
16:26:16,559 --> 16:26:22,000
inside the function the address of the
21802
16:26:24,239 --> 16:26:29,040
and outside the function when we hit
21803
16:26:27,116 --> 16:26:32,400
the end of the function here we're going
21804
16:26:29,040 --> 16:26:35,520
to see that the address ends in de4 so
21805
16:26:32,400 --> 16:26:38,000
this proves that the local variable
21806
16:26:35,519 --> 16:26:40,639
inside the function and the outside
21807
16:26:38,000 --> 16:26:42,879
variable here in the main function
21808
16:26:40,639 --> 16:26:44,955
leaving two different memory addresses
21809
16:26:42,879 --> 16:26:47,595
there are two different variables and
21810
16:26:44,955 --> 16:26:50,319
the return mechanism here is just going
21811
16:26:47,595 --> 16:26:52,639
to copy whatever we have in the local
21812
16:26:50,319 --> 16:26:56,000
variable and make it available on the
21813
16:26:52,639 --> 16:26:58,080
outside here so that we can assign it to
21814
16:26:56,000 --> 16:27:00,239
the reserved variable in our main
21815
16:26:58,080 --> 16:27:02,796
function here this is how the return
21816
16:27:00,239 --> 16:27:05,519
mechanism is working and it is going to
21817
16:27:02,796 --> 16:27:07,360
be returning by value by default it is
21818
16:27:05,519 --> 16:27:09,839
going to be making copies this is the
21819
16:27:07,360 --> 16:27:11,360
message here now that we know this i
21820
16:27:09,839 --> 16:27:13,755
want to show you that there are
21821
16:27:13,756 --> 16:27:18,559
if you return by value like this you
21822
16:27:15,756 --> 16:27:21,436
won't be really always using separate
21823
16:27:18,559 --> 16:27:23,199
memory addresses for the inside and the
21824
16:27:21,436 --> 16:27:25,200
outside here and we're going to prove
21825
16:27:23,199 --> 16:27:26,955
that with a function that is going to
21826
16:27:26,955 --> 16:27:31,680
let's comment what we have out because
21827
16:27:29,275 --> 16:27:34,000
we don't want this to confuse us so
21828
16:27:31,680 --> 16:27:36,239
we're going to bring this inside our
21829
16:27:34,000 --> 16:27:38,879
block comment here and we are going to
21830
16:27:36,239 --> 16:27:40,879
go below our sum function here and set
21831
16:27:38,879 --> 16:27:43,839
up a new function which is going to be
21832
16:27:40,879 --> 16:27:46,719
called add strands it is going to return
21833
16:27:43,839 --> 16:27:49,039
a string by value okay it is by value
21834
16:27:46,720 --> 16:27:51,200
because this return type here is not
21835
16:27:49,040 --> 16:27:53,360
qualified with anything like a pointer
21836
16:27:51,199 --> 16:27:56,159
or a reference so by default it is going
21837
16:27:53,360 --> 16:27:58,400
to be by value and inside you see we are
21838
16:27:56,160 --> 16:28:01,040
doing the exact same thing we did in the
21839
16:27:58,400 --> 16:28:03,360
sum function here we are adding up two
21840
16:28:01,040 --> 16:28:06,239
strands we are storing the results in a
21841
16:28:03,360 --> 16:28:08,239
local variable and we are returning that
21842
16:28:06,239 --> 16:28:11,680
but if we run this program you're going
21843
16:28:08,239 --> 16:28:14,079
to see that the address on the inside is
21844
16:28:11,680 --> 16:28:16,879
going to be the same as the address on
21845
16:28:14,080 --> 16:28:18,560
the outside so let's set up something
21846
16:28:16,879 --> 16:28:20,479
that we can play with here we're going
21847
16:28:18,559 --> 16:28:22,319
to go down in the main function and set
21848
16:28:20,480 --> 16:28:24,840
up a few variables we're going to say
21849
16:28:22,319 --> 16:28:28,080
hdd strand we're going to say
21850
16:28:24,839 --> 16:28:30,719
nstr1 and we're going to store in hello
21851
16:28:28,080 --> 16:28:31,756
let's do that and we're going to say std
21852
16:28:33,756 --> 16:28:38,480
and we're going to store and world by
21853
16:28:36,319 --> 16:28:40,796
now you know what i am trying to do here
21854
16:28:38,480 --> 16:28:42,796
i am trying to say hello world okay once
21855
16:28:40,796 --> 16:28:45,756
we have this we're going to set up a
21856
16:28:42,796 --> 16:28:48,956
resort strike so we're going to say std
21857
16:28:45,756 --> 16:28:51,436
strength and i say result str and we're
21858
16:28:48,955 --> 16:28:52,839
going to say add sdr and we're going to
21859
16:28:52,839 --> 16:28:59,199
nstr1 and in str2 this is how we do this
21860
16:28:57,519 --> 16:29:02,079
and after we do this we're going to
21861
16:28:59,199 --> 16:29:04,399
print out the address of the variable
21862
16:29:02,080 --> 16:29:08,880
here so let's do that and it is going to
21863
16:29:04,400 --> 16:29:11,840
be the address of result hdr let's say
21864
16:29:08,879 --> 16:29:14,719
that here and we also need to print the
21865
16:29:11,839 --> 16:29:17,519
actual result of this operation here so
21866
16:29:14,720 --> 16:29:20,639
let's do that we're going to say sddc
21867
16:29:17,519 --> 16:29:21,595
out result sdr we're going to print the
21868
16:29:21,595 --> 16:29:25,199
strength i don't think we did that on
21869
16:29:25,199 --> 16:29:30,719
sum function here but we can quickly go
21870
16:29:28,239 --> 16:29:33,115
there and prove that to you so let's
21871
16:29:30,720 --> 16:29:35,200
comment this out sorry for this this is
21872
16:29:33,116 --> 16:29:36,880
going to be confusing but i don't want
21873
16:29:38,720 --> 16:29:42,319
so we're going to see that if we print
21874
16:29:40,796 --> 16:29:45,520
this out we're going to get the sum
21875
16:29:42,319 --> 16:29:47,040
which is 14 printed out let's do that
21876
16:29:45,519 --> 16:29:50,479
pretty quick we're going to go down and
21877
16:29:47,040 --> 16:29:52,720
say sddcl and say result and we're going
21878
16:29:50,480 --> 16:29:55,840
to say result and we're going to build
21879
16:29:52,720 --> 16:29:58,000
it pretty quick with the gcc and if we
21880
16:29:55,839 --> 16:30:00,479
clear and run the rooster we're going to
21881
16:29:58,000 --> 16:30:02,239
see the result which is 14 here and you
21882
16:30:00,480 --> 16:30:04,796
can change these guys up to really play
21883
16:30:02,239 --> 16:30:07,436
with us for example if we make this 15
21884
16:30:04,796 --> 16:30:09,520
and put in a 9 we're going to get a 24
21885
16:30:07,436 --> 16:30:11,360
printed out let's build again
21886
16:30:09,519 --> 16:30:13,595
just to have fun with this and we're
21887
16:30:11,360 --> 16:30:15,840
going to clear and run rooster we're
21888
16:30:13,595 --> 16:30:18,319
going to get a 24 here now we can
21889
16:30:15,839 --> 16:30:20,955
comment this back i am happy i have
21890
16:30:18,319 --> 16:30:24,480
showed you this and we can uncomment our
21891
16:30:20,955 --> 16:30:27,116
string code here and uh build and run it
21892
16:30:24,480 --> 16:30:29,436
so we're going to build with gcc the
21893
16:30:27,116 --> 16:30:32,560
build is good we can clear and run
21894
16:30:29,436 --> 16:30:34,480
rooster and again what we want to see
21895
16:30:32,559 --> 16:30:36,720
is that the compiler is going to
21896
16:30:34,480 --> 16:30:39,916
optimize this out it is not going to
21897
16:30:36,720 --> 16:30:42,480
return by value like we had was the sum
21898
16:30:39,915 --> 16:30:44,879
function where we had the address on the
21899
16:30:42,480 --> 16:30:48,240
inside different from the address on the
21900
16:30:44,879 --> 16:30:50,559
outside you see here that inside ah we
21901
16:30:48,239 --> 16:30:52,879
forgot again to change this guy to out
21902
16:30:50,559 --> 16:30:54,879
uh sorry for this so we're going to make
21903
16:30:52,879 --> 16:30:56,955
this guy out and we're going to build
21904
16:30:54,879 --> 16:30:59,680
again and we're going to clear
21905
16:30:56,955 --> 16:31:03,839
clear and run rooster now we're going to
21906
16:30:59,680 --> 16:31:07,915
see that inside the address ends in d30
21907
16:31:03,839 --> 16:31:10,159
and outside the address ends in d30 this
21908
16:31:07,915 --> 16:31:12,635
can be really confusing because we said
21909
16:31:10,160 --> 16:31:15,200
we want to return by value by not
21910
16:31:12,635 --> 16:31:17,519
decorating our return type with a
21911
16:31:15,199 --> 16:31:19,435
pointer or a reference or something like
21912
16:31:17,519 --> 16:31:21,839
that it is going to be returning by
21913
16:31:19,436 --> 16:31:23,916
value and if you return by value you're
21914
16:31:21,839 --> 16:31:27,039
going to make copies and if we made the
21915
16:31:23,915 --> 16:31:29,040
copies the address on the inside and the
21916
16:31:27,040 --> 16:31:31,200
address on the outside should be
21917
16:31:29,040 --> 16:31:32,955
different but they are the same the
21918
16:31:31,199 --> 16:31:35,199
reason is the compiler is going to
21919
16:31:32,955 --> 16:31:36,400
notice that you are trying to copy
21920
16:31:36,400 --> 16:31:40,400
and it is going to see that the variable
21921
16:31:38,559 --> 16:31:42,720
here which is inside the function is
21922
16:31:40,400 --> 16:31:43,756
going to be wasted when the function
21923
16:31:43,756 --> 16:31:48,796
by default this should be really
21924
16:31:45,680 --> 16:31:50,720
destroyed and you should copy
21925
16:31:48,796 --> 16:31:52,480
because you are returning by value but
21926
16:31:50,720 --> 16:31:55,360
the compiler is going to insert an
21927
16:31:52,480 --> 16:31:57,360
optimization to do some magic and make
21928
16:31:55,360 --> 16:31:59,520
it look like you are returning by
21929
16:31:57,360 --> 16:32:01,915
reference and it is really not going to
21930
16:31:59,519 --> 16:32:04,479
make a copy so it is going to reuse the
21931
16:32:01,915 --> 16:32:06,159
address on the inside and hopefully this
21932
16:32:04,480 --> 16:32:08,636
is going to prove this to you the
21933
16:32:06,160 --> 16:32:10,480
message here is that you shouldn't rely
21934
16:32:10,480 --> 16:32:15,040
returning by value because if the
21935
16:32:12,720 --> 16:32:17,756
compiler sees that it can do a better
21936
16:32:15,040 --> 16:32:20,000
job than you it is going to optimize
21937
16:32:17,756 --> 16:32:22,720
your return by value to return by
21938
16:32:20,000 --> 16:32:25,275
reference and you're going to not be
21939
16:32:22,720 --> 16:32:28,635
making copies so don't make your code
21940
16:32:25,275 --> 16:32:31,239
rely on returning by value and making
21941
16:32:28,635 --> 16:32:34,319
copies and you should be aware of these
21942
16:32:31,239 --> 16:32:37,275
optimizations that the compiler can do
21943
16:32:34,319 --> 16:32:39,915
behind your back i would like to welcome
21944
16:32:37,275 --> 16:32:42,319
you in this new chapter where we will be
21945
16:32:39,915 --> 16:32:44,635
learning about function overloading
21946
16:32:42,319 --> 16:32:46,635
function overloading is a mechanism we
21947
16:32:46,635 --> 16:32:52,635
to have multiple copies of the same
21948
16:32:49,199 --> 16:32:54,159
function but taking different parameters
21949
16:32:52,635 --> 16:32:56,000
for example here you see that we have
21950
16:32:54,160 --> 16:32:58,720
different functions but all these
21951
16:32:56,000 --> 16:33:01,595
functions have the same function name
21952
16:32:58,720 --> 16:33:04,400
and these are said to be different
21953
16:33:01,595 --> 16:33:06,559
overloads of the same function there are
21954
16:33:04,400 --> 16:33:08,635
a couple of rules you need to be aware
21955
16:33:06,559 --> 16:33:10,479
of to be able to set up your overalls
21956
16:33:08,635 --> 16:33:11,839
correctly and get them to work and
21957
16:33:10,480 --> 16:33:14,720
that's what we're going to be learning
21958
16:33:11,839 --> 16:33:16,955
about in detail in this chapter but now
21959
16:33:14,720 --> 16:33:19,275
i just want you to see the flexibility
21960
16:33:16,955 --> 16:33:21,199
you can get with function overloading
21961
16:33:19,275 --> 16:33:24,400
for example here if we have a few
21962
16:33:21,199 --> 16:33:27,039
variables in our program we can call the
21963
16:33:24,400 --> 16:33:29,680
max function and the compiler is going
21964
16:33:27,040 --> 16:33:32,080
to select the most fitting overloading
21965
16:33:29,680 --> 16:33:35,040
here so for example if we call our
21966
16:33:32,080 --> 16:33:37,040
function with integer arguments the
21967
16:33:35,040 --> 16:33:39,840
compiler is going to choose this
21968
16:33:37,040 --> 16:33:42,559
overload here if we call a function with
21969
16:33:39,839 --> 16:33:45,519
std string arguments the compiler is
21970
16:33:42,559 --> 16:33:47,275
going to choose this overload here and
21971
16:33:45,519 --> 16:33:48,795
we don't really need to concern
21972
16:33:48,796 --> 16:33:52,480
with making sure we have the correct
21973
16:33:50,720 --> 16:33:54,635
arguments the compiler is going to
21974
16:33:52,480 --> 16:33:56,796
choose the correct function overload for
21975
16:33:54,635 --> 16:33:58,796
us and it is going to call it and it's
21976
16:33:56,796 --> 16:34:01,436
going to be very flexible to call these
21977
16:33:58,796 --> 16:34:04,160
functions from our c plus plus code this
21978
16:34:01,436 --> 16:34:06,635
is how function overload can be really
21979
16:34:04,160 --> 16:34:08,320
useful we are going to stop here in this
21980
16:34:06,635 --> 16:34:10,559
lecture in the next one we're going to
21981
16:34:08,319 --> 16:34:13,519
learn about how you can set up function
21982
16:34:10,559 --> 16:34:14,795
overloads based on different function
21983
16:34:14,796 --> 16:34:19,360
go ahead and finish up here and meet me
21984
16:34:17,199 --> 16:34:22,479
there in this lecture we're going to see
21985
16:34:19,360 --> 16:34:24,955
how we can overload functions based on
21986
16:34:22,480 --> 16:34:27,436
the parameters that we pass to the
21987
16:34:24,955 --> 16:34:29,839
function when we are declaring it or
21988
16:34:27,436 --> 16:34:32,080
defining it and here is a simple example
21989
16:34:29,839 --> 16:34:34,319
to drive the point home here we have a
21990
16:34:36,319 --> 16:34:40,635
it is taking two parameters which are of
21991
16:34:40,635 --> 16:34:46,319
and by overloading this function we will
21992
16:34:43,756 --> 16:34:48,955
have to use the same name as this
21993
16:34:46,319 --> 16:34:51,360
function here so the differences really
21994
16:34:48,955 --> 16:34:54,319
will be in the parameters that we pass
21995
16:34:51,360 --> 16:34:55,275
to the function because the return type
21996
16:34:55,275 --> 16:35:00,479
involved in defining the signature of
21997
16:34:58,480 --> 16:35:02,720
the function so if we try to set up
21998
16:35:00,480 --> 16:35:04,560
another function called max here which
21999
16:35:04,559 --> 16:35:09,519
same parameters as our max on top here
22000
16:35:07,839 --> 16:35:11,679
the difference is only going to be in
22001
16:35:09,519 --> 16:35:13,595
the return type the compiler is not
22002
16:35:11,680 --> 16:35:17,116
going to allow us to do this because the
22003
16:35:13,595 --> 16:35:19,756
return type isn't really significant
22004
16:35:17,116 --> 16:35:21,360
in making two functions different okay
22005
16:35:19,756 --> 16:35:24,400
the only way we have to set up a
22006
16:35:21,360 --> 16:35:27,275
function which is legal in c plus plus
22007
16:35:24,400 --> 16:35:29,680
is to change something about the
22008
16:35:27,275 --> 16:35:31,436
parameters that we have here we can
22009
16:35:29,680 --> 16:35:33,915
change the types like you see here for
22010
16:35:31,436 --> 16:35:36,000
example we change the types to b double
22011
16:35:33,915 --> 16:35:38,159
if the types are different we might even
22012
16:35:36,000 --> 16:35:40,080
change the order of the parameters you
22013
16:35:38,160 --> 16:35:43,520
just have to make sure the parameter
22014
16:35:40,080 --> 16:35:45,040
list is different in one way or another
22015
16:35:43,519 --> 16:35:48,079
that's how you're going to get this
22016
16:35:45,040 --> 16:35:49,915
function to run with the same names here
22017
16:35:48,080 --> 16:35:52,319
and if we manage to set up multiple
22018
16:35:49,915 --> 16:35:54,559
functions with the same name in c plus
22019
16:35:52,319 --> 16:35:56,955
plus these functions are going to be
22020
16:35:54,559 --> 16:35:59,040
called overloads of each other okay if
22021
16:35:56,955 --> 16:36:01,680
we go down here we have another overload
22022
16:35:59,040 --> 16:36:03,756
for the max function this overload is
22023
16:36:01,680 --> 16:36:05,680
going to take two parameters and the
22024
16:36:03,756 --> 16:36:08,239
parameters are going to be of type
22025
16:36:05,680 --> 16:36:10,635
string view they are different from what
22026
16:36:08,239 --> 16:36:13,915
we have on top here which is ant so this
22027
16:36:10,635 --> 16:36:16,319
is a legal overload for this max
22028
16:36:13,915 --> 16:36:18,479
function here and we can use it okay we
22029
16:36:16,319 --> 16:36:21,275
really have a few ways we can make our
22030
16:36:18,480 --> 16:36:23,916
function overloads by now we can change
22031
16:36:21,275 --> 16:36:26,079
the order of the parameter we can change
22032
16:36:23,915 --> 16:36:28,559
the number of the parameters or even we
22033
16:36:26,080 --> 16:36:31,680
can change the types of the parameters
22034
16:36:28,559 --> 16:36:34,159
again function overloads are a mechanism
22035
16:36:31,680 --> 16:36:36,879
we have in c plus plus to set up
22036
16:36:34,160 --> 16:36:39,520
multiple functions with the same name to
22037
16:36:36,879 --> 16:36:41,199
make our code easier to work with okay
22038
16:36:39,519 --> 16:36:43,755
now that you know that let's look at a
22039
16:36:41,199 --> 16:36:45,839
simple example of how we can call our
22040
16:36:43,756 --> 16:36:48,080
overloads we have a few variables
22041
16:36:45,839 --> 16:36:50,635
declared here we have ant variables we
22042
16:36:48,080 --> 16:36:52,560
have double variables and we have std
22043
16:36:52,559 --> 16:36:57,756
and if you go down here we are calling
22044
16:36:54,796 --> 16:37:00,080
our max function passing in integers so
22045
16:36:57,756 --> 16:37:02,000
the overload that takes integers for
22046
16:37:00,080 --> 16:37:05,116
this max function is going to be called
22047
16:37:02,000 --> 16:37:07,116
here down here we are passing in integer
22048
16:37:05,116 --> 16:37:10,000
literals so this is going to call the
22049
16:37:07,116 --> 16:37:12,480
int overload down here we are calling
22050
16:37:10,000 --> 16:37:15,040
the function with double parameters or
22051
16:37:12,480 --> 16:37:17,276
arguments so this is going to call our
22052
16:37:15,040 --> 16:37:20,319
double overload for the match function
22053
16:37:17,275 --> 16:37:22,879
here and down here we are passing in our
22054
16:37:20,319 --> 16:37:25,839
string view parameters and this is going
22055
16:37:22,879 --> 16:37:28,479
to call the overload that takes string
22056
16:37:25,839 --> 16:37:29,915
view parameters and the last guy here is
22057
16:37:29,915 --> 16:37:37,199
two string literals string literals can
22058
16:37:33,040 --> 16:37:40,796
implicitly convert to std string view so
22059
16:37:37,199 --> 16:37:43,360
our std string view overload for the max
22060
16:37:40,796 --> 16:37:44,635
function here is going to be called
22061
16:37:43,360 --> 16:37:46,879
now that we know this we're going to
22062
16:37:44,635 --> 16:37:49,116
head over to visual studio code and play
22063
16:37:46,879 --> 16:37:51,680
with this a little more okay here we are
22064
16:37:49,116 --> 16:37:54,720
in our working folder the current
22065
16:37:51,680 --> 16:37:57,756
project is overloading with different
22066
16:37:54,720 --> 16:38:00,239
parameters here we're going to grab our
22067
16:37:57,756 --> 16:38:02,239
template files like we always do we're
22068
16:38:02,239 --> 16:38:06,319
and we are going to open this guy in
22069
16:38:04,160 --> 16:38:08,720
visual studio code by dragging and
22070
16:38:06,319 --> 16:38:10,879
dropping on top of visual studio code
22071
16:38:08,720 --> 16:38:12,720
here this is going to open our project
22072
16:38:10,879 --> 16:38:15,680
here we're going to click on our main
22073
16:38:12,720 --> 16:38:18,000
cpp file and open it we're going to
22074
16:38:15,680 --> 16:38:20,635
clean it up a little bit and close the
22075
16:38:18,000 --> 16:38:23,519
left pane here we are going to go on top
22076
16:38:20,635 --> 16:38:26,239
here and put in our first max function
22077
16:38:23,519 --> 16:38:28,635
here the return type is and in this case
22078
16:38:26,239 --> 16:38:30,795
it is going to take two parameters and
22079
16:38:28,635 --> 16:38:33,199
it is going to return whichever number
22080
16:38:30,796 --> 16:38:35,756
is the maximum and we are taking
22081
16:38:33,199 --> 16:38:38,159
parameters in by value and returning by
22082
16:38:35,756 --> 16:38:39,840
value here nothing special we can go in
22083
16:38:38,160 --> 16:38:41,360
main and call this function and you
22084
16:38:39,839 --> 16:38:43,275
already know how to do that i don't
22085
16:38:41,360 --> 16:38:46,239
think i really need to do that
22086
16:38:43,275 --> 16:38:49,040
but now what we really are interested in
22087
16:38:46,239 --> 16:38:51,680
is being able to set up different
22088
16:38:49,040 --> 16:38:54,239
functions with the same function name
22089
16:38:51,680 --> 16:38:56,720
like we have here because if for example
22090
16:38:54,239 --> 16:38:58,795
you take this function and put that down
22091
16:38:56,720 --> 16:39:01,520
below we're going to make a copy of it
22092
16:38:58,796 --> 16:39:03,596
and only change the return type if we
22093
16:39:01,519 --> 16:39:06,559
try to compile this program you see that
22094
16:39:03,595 --> 16:39:08,879
even visual studio code is unhappy now
22095
16:39:06,559 --> 16:39:11,595
if we bring up a terminal it is going to
22096
16:39:08,879 --> 16:39:14,955
tell us cannot overload function
22097
16:39:11,595 --> 16:39:17,519
distinguished by the return type alone
22098
16:39:14,955 --> 16:39:20,319
so again the message is super clear here
22099
16:39:17,519 --> 16:39:22,559
the return type is not enough to make
22100
16:39:20,319 --> 16:39:26,559
two functions different because the
22101
16:39:22,559 --> 16:39:28,879
return type isn't involved in making the
22102
16:39:26,559 --> 16:39:30,879
signature unique what makes the
22103
16:39:28,879 --> 16:39:33,755
signature unique is either the function
22104
16:39:30,879 --> 16:39:36,079
name or the parameters that you pass to
22105
16:39:33,756 --> 16:39:38,480
the function here so we're going to make
22106
16:39:36,080 --> 16:39:40,160
this return type back a double and we're
22107
16:39:38,480 --> 16:39:42,720
going to figure out a way to make these
22108
16:39:40,160 --> 16:39:44,400
two functions different but have the
22109
16:39:42,720 --> 16:39:45,680
same name here because sometimes you
22110
16:39:45,680 --> 16:39:49,756
one way we have to do this is to change
22111
16:39:47,680 --> 16:39:51,519
the types of the parameters that we pass
22112
16:39:49,756 --> 16:39:53,040
in here so we're going to make them
22113
16:39:51,519 --> 16:39:55,115
double and we're going to make them
22114
16:39:53,040 --> 16:39:58,000
double here and this is going to be
22115
16:39:55,116 --> 16:40:00,400
valid c plus plus could these two
22116
16:39:58,000 --> 16:40:02,635
functions are different even if they
22117
16:40:00,400 --> 16:40:04,560
have the same name here they are two
22118
16:40:02,635 --> 16:40:06,879
different functions because they take
22119
16:40:04,559 --> 16:40:08,955
different parameters so if you try to
22120
16:40:08,955 --> 16:40:14,080
integers this one is going to be called
22121
16:40:11,595 --> 16:40:16,239
which takes integers n if you call it
22122
16:40:14,080 --> 16:40:17,916
with double arguments this guy here is
22123
16:40:16,239 --> 16:40:20,400
going to be called let's try and prove
22124
16:40:17,915 --> 16:40:24,079
this so we're going to go inside and say
22125
16:40:20,400 --> 16:40:26,000
stdc out and overload called i think
22126
16:40:24,080 --> 16:40:28,635
this is enough and we're going to go in
22127
16:40:26,000 --> 16:40:31,116
the double function here and say sddc
22128
16:40:31,116 --> 16:40:35,840
okay once we have this we also have to
22129
16:40:33,199 --> 16:40:37,275
change the return type here to double
22130
16:40:35,839 --> 16:40:39,839
because it's going to make things a
22131
16:40:37,275 --> 16:40:43,040
little bit consistent here but now we
22132
16:40:39,839 --> 16:40:44,879
want to go in our main function here
22133
16:40:43,040 --> 16:40:46,796
and set up a few variables we're going
22134
16:40:44,879 --> 16:40:48,879
to say and x and we're going to make
22135
16:40:46,796 --> 16:40:51,200
this a four and we're going to say into
22136
16:40:48,879 --> 16:40:52,319
y and we're going to make this a nine
22137
16:40:52,319 --> 16:40:57,519
we're going to set up also double
22138
16:40:59,436 --> 16:41:04,635
point four to make it a double variable
22139
16:41:02,559 --> 16:41:08,479
and we're going to say double
22140
16:41:09,680 --> 16:41:15,199
now we are going to call max we're going
22141
16:41:11,595 --> 16:41:17,680
to say auto result and say max and
22142
16:41:17,680 --> 16:41:22,319
what do you think we're going to return
22143
16:41:19,436 --> 16:41:24,635
here so what we really are interested in
22144
16:41:22,319 --> 16:41:26,796
is the return type of the result
22145
16:41:24,635 --> 16:41:29,360
variable here and the compiler is going
22146
16:41:26,796 --> 16:41:31,916
to deduce whatever is returned by this
22147
16:41:29,360 --> 16:41:34,480
function if we call the function with x
22148
16:41:31,915 --> 16:41:36,079
and y x and y are integers so the
22149
16:41:34,480 --> 16:41:38,240
compiler is going to search for a
22150
16:41:36,080 --> 16:41:39,840
function that takes integers and it's
22151
16:41:38,239 --> 16:41:41,756
going to find this guy here and that's
22152
16:41:41,756 --> 16:41:46,635
let's weld and run this program we are
22153
16:41:44,400 --> 16:41:49,916
not interested in looking at the output
22154
16:41:46,635 --> 16:41:52,479
here we're just going to see this std
22155
16:41:49,915 --> 16:41:55,040
out statement here print whatever
22156
16:41:52,480 --> 16:41:56,636
function was called okay we expect the
22157
16:41:55,040 --> 16:41:59,360
end one to be called so we're going to
22158
16:41:56,635 --> 16:42:02,400
see ant overload called on the terminal
22159
16:41:59,360 --> 16:42:04,400
here when we run this program so let's
22160
16:42:02,400 --> 16:42:07,275
do that we're going to build with gcc
22161
16:42:04,400 --> 16:42:09,840
like we always do the world is good so
22162
16:42:07,275 --> 16:42:12,319
we can clear and run rooster
22163
16:42:09,839 --> 16:42:14,795
we're going to see int overload called
22164
16:42:14,796 --> 16:42:19,200
we can set up two functions with the
22165
16:42:16,720 --> 16:42:22,319
same name and make them different only
22166
16:42:19,199 --> 16:42:24,795
in the parameters that they take and the
22167
16:42:22,319 --> 16:42:27,199
differences may be either in the types
22168
16:42:24,796 --> 16:42:29,680
of the parameter like we are doing here
22169
16:42:27,199 --> 16:42:31,915
they may also be in the order of the
22170
16:42:29,680 --> 16:42:34,160
parameters and we're going to see an
22171
16:42:31,915 --> 16:42:36,559
example of that in a minute but before
22172
16:42:34,160 --> 16:42:38,880
we do that we also need to try this with
22173
16:42:36,559 --> 16:42:41,115
a and b and show you that the double one
22174
16:42:38,879 --> 16:42:43,755
is going to be called because we are
22175
16:42:41,116 --> 16:42:45,756
passing in double arguments here so
22176
16:42:43,756 --> 16:42:48,796
let's build again the bullet is good we
22177
16:42:45,756 --> 16:42:51,916
can clear and run rooster this is going
22178
16:42:48,796 --> 16:42:54,400
to call our double overload hopefully
22179
16:42:51,915 --> 16:42:56,719
this really drives the point home
22180
16:42:54,400 --> 16:42:59,275
that we can set up multiple overloads
22181
16:42:56,720 --> 16:43:00,720
for the same function name and again the
22182
16:42:59,275 --> 16:43:03,040
differences are going to be in the
22183
16:43:00,720 --> 16:43:06,000
parameters that we pass here we have
22184
16:43:03,040 --> 16:43:08,480
been able to pass different types for
22185
16:43:06,000 --> 16:43:10,955
the parameters and this was a vehicle c
22186
16:43:08,480 --> 16:43:14,000
plus plus code but we can also set up
22187
16:43:10,955 --> 16:43:17,040
another overload just by changing the
22188
16:43:14,000 --> 16:43:18,635
types and the order of the parameters
22189
16:43:17,040 --> 16:43:21,360
let's do that we're going to make the
22190
16:43:18,635 --> 16:43:23,595
first parameter here and and once we do
22191
16:43:21,360 --> 16:43:26,480
that this is different from any of the
22192
16:43:23,595 --> 16:43:29,199
overloads we've had so this is a valid
22193
16:43:26,480 --> 16:43:31,436
overload for this max function here this
22194
16:43:29,199 --> 16:43:33,680
is going to work we can even change the
22195
16:43:31,436 --> 16:43:34,880
order of these two guys and it is also
22196
16:43:34,879 --> 16:43:39,199
a valid overload let's put in another
22197
16:43:39,199 --> 16:43:43,039
and we're going to change the first
22198
16:43:40,955 --> 16:43:46,239
parameter to double and the second one
22199
16:43:43,040 --> 16:43:48,635
to end and now we have four overloads
22200
16:43:46,239 --> 16:43:51,115
for the max function and again the
22201
16:43:48,635 --> 16:43:54,080
message here is that you just have to
22202
16:43:51,116 --> 16:43:56,635
make sure the parameters are different
22203
16:43:54,080 --> 16:43:59,040
in some way and your overload is going
22204
16:43:56,635 --> 16:44:00,720
to be valid and again i'm not telling
22205
16:43:59,040 --> 16:44:02,400
you to set up functions like this
22206
16:44:00,720 --> 16:44:05,116
because in this case this is really
22207
16:44:02,400 --> 16:44:07,520
useless but i am trying to expose this
22208
16:44:05,116 --> 16:44:10,560
facility to you so that you can use it
22209
16:44:07,519 --> 16:44:12,479
to your advantage if it makes sense for
22210
16:44:10,559 --> 16:44:15,360
whatever application you are designing
22211
16:44:12,480 --> 16:44:18,319
here so let's go down and put in
22212
16:44:15,360 --> 16:44:20,080
meaningful output i think we can come in
22213
16:44:18,319 --> 16:44:22,955
here and say the parameters that we are
22214
16:44:20,080 --> 16:44:25,200
passing in here so we can say and double
22215
16:44:22,955 --> 16:44:28,000
overload called and if we go down here
22216
16:44:25,199 --> 16:44:30,635
you can take this out and say double and
22217
16:44:28,000 --> 16:44:32,720
overload called and to get any of these
22218
16:44:30,635 --> 16:44:35,199
guys to be called we have to pass the
22219
16:44:32,720 --> 16:44:36,160
parameters or of the arguments in this
22220
16:44:36,160 --> 16:44:42,480
so if we pass in an end which is x x is
22221
16:44:39,839 --> 16:44:44,719
in it and we pass in a double which is a
22222
16:44:42,480 --> 16:44:47,520
b here this is going to call our
22223
16:44:44,720 --> 16:44:50,000
overload which takes the first argument
22224
16:44:47,519 --> 16:44:51,275
to be an integer and the second argument
22225
16:44:51,275 --> 16:44:55,756
let's prove that we're going to
22226
16:44:53,275 --> 16:44:57,839
build with the gcc the bolt is good so
22227
16:44:55,756 --> 16:45:00,720
we can clear and we can run rooster and
22228
16:44:57,839 --> 16:45:01,519
we see ant double called because x is an
22229
16:45:01,519 --> 16:45:07,595
and b is a double if we flip these guys
22230
16:45:04,720 --> 16:45:09,916
let's say b and x then we're going to
22231
16:45:07,595 --> 16:45:12,795
have the overload that takes the first
22232
16:45:09,915 --> 16:45:15,115
argument of double type and the second
22233
16:45:12,796 --> 16:45:17,116
argument of into type to be called and
22234
16:45:15,116 --> 16:45:19,840
that's this guy here and we're going to
22235
16:45:17,116 --> 16:45:22,480
see this message printed out on the
22236
16:45:19,839 --> 16:45:24,239
terminal here let's build with gcc to
22237
16:45:22,480 --> 16:45:25,040
really prove this so we're going to do
22238
16:45:25,040 --> 16:45:28,400
the bullet is good we can clear and run
22239
16:45:28,400 --> 16:45:32,480
and the double end overload called
22240
16:45:30,720 --> 16:45:35,595
hopefully you can really see that you
22241
16:45:32,480 --> 16:45:38,000
can set up all kinds of crazy overloads
22242
16:45:35,595 --> 16:45:39,680
for your functions the next thing i want
22243
16:45:38,000 --> 16:45:42,239
you to see is that we can even change
22244
16:45:39,680 --> 16:45:44,635
the number of the parameters for example
22245
16:45:42,239 --> 16:45:47,275
here we can set up another guy here and
22246
16:45:44,635 --> 16:45:49,839
i call it max it is going to be exactly
22247
16:45:47,275 --> 16:45:52,795
like the one on top here for the first
22248
16:45:49,839 --> 16:45:56,239
two parameters but let's add a third
22249
16:45:52,796 --> 16:45:57,840
parameter maybe make it an end and say c
22250
16:45:57,839 --> 16:46:02,559
a valid overload for the max function
22251
16:46:00,400 --> 16:46:04,000
here so we're going to say double and
22252
16:46:04,000 --> 16:46:08,796
three parameters i won't go into the
22253
16:46:06,720 --> 16:46:11,360
details of how we can compute the
22254
16:46:08,796 --> 16:46:13,436
maximum between these three guys what i
22255
16:46:11,360 --> 16:46:15,756
really am interested in is showing you
22256
16:46:13,436 --> 16:46:17,436
that you can set up overloads here so
22257
16:46:15,756 --> 16:46:20,480
for this case we are just going to
22258
16:46:17,436 --> 16:46:23,596
return let's just say a this is going to
22259
16:46:20,480 --> 16:46:25,200
work but this is a valid overload for
22260
16:46:23,595 --> 16:46:27,839
the match function and it is going to
22261
16:46:25,199 --> 16:46:30,159
compile so let's draw and do that we're
22262
16:46:27,839 --> 16:46:32,635
going to pass and a double a net and the
22263
16:46:30,160 --> 16:46:34,880
net so we're going to pass in b which is
22264
16:46:34,879 --> 16:46:39,360
let's see what is called here we can
22265
16:46:36,400 --> 16:46:41,520
compile with gcc the border is good we
22266
16:46:41,519 --> 16:46:44,879
try to come up with what is going to be
22267
16:46:43,275 --> 16:46:47,115
printed out here what is going to be
22268
16:46:44,879 --> 16:46:48,635
printed okay now that you have guessed
22269
16:46:47,116 --> 16:46:50,880
we're going to run and we're going to
22270
16:46:48,635 --> 16:46:53,595
see double and ant because this is going
22271
16:46:50,879 --> 16:46:56,319
to call this overload again you can
22272
16:46:53,595 --> 16:46:58,795
overload based on the differences in the
22273
16:46:56,319 --> 16:47:00,480
types of the parameters that you pass
22274
16:46:58,796 --> 16:47:03,276
you can change the order of the
22275
16:47:00,480 --> 16:47:06,480
parameters like we are doing here double
22276
16:47:03,275 --> 16:47:08,635
end and end double or you can even
22277
16:47:06,480 --> 16:47:11,276
change the number of the parameters
22278
16:47:08,635 --> 16:47:13,756
using these techniques you can make sure
22279
16:47:11,275 --> 16:47:14,879
that your overloads are different in
22280
16:47:14,879 --> 16:47:18,719
before i close this lecture i'm going to
22281
16:47:16,955 --> 16:47:20,400
show you that you can also use another
22282
16:47:20,400 --> 16:47:24,955
string view parameters let's go down
22283
16:47:24,955 --> 16:47:29,275
again the name of the function is max
22284
16:47:26,879 --> 16:47:31,040
the return type isn't really meaningful
22285
16:47:29,275 --> 16:47:33,275
in making sure two functions are
22286
16:47:31,040 --> 16:47:36,239
different but watch the parameters we
22287
16:47:33,275 --> 16:47:38,559
pass here the types are string view
22288
16:47:36,239 --> 16:47:40,879
and we have a and b here and we are
22289
16:47:38,559 --> 16:47:44,635
going to compute the maximum so if we go
22290
16:47:40,879 --> 16:47:46,879
down here and say max and pass n hello
22291
16:47:44,635 --> 16:47:49,756
and world the compiler is going to try
22292
16:47:46,879 --> 16:47:51,680
and look for a function that takes two
22293
16:47:49,756 --> 16:47:53,360
character array parameters it's not
22294
16:47:51,680 --> 16:47:55,840
going to find it because we don't have
22295
16:47:53,360 --> 16:47:57,840
that guy in here but it's going to see
22296
16:47:57,839 --> 16:48:03,115
take something i can come up with
22297
16:48:01,040 --> 16:48:04,720
through implicit conversions and the
22298
16:48:03,116 --> 16:48:06,480
compiler is going to see that it can
22299
16:48:06,480 --> 16:48:12,160
a string literal to a string view type
22300
16:48:09,915 --> 16:48:13,839
and it is going to insert an implicit
22301
16:48:13,839 --> 16:48:18,879
string literal to string view and this
22302
16:48:16,635 --> 16:48:21,199
function here is going to be called so
22303
16:48:18,879 --> 16:48:23,435
we're going to put in a an output
22304
16:48:21,199 --> 16:48:27,839
statement here we're going to say
22305
16:48:23,436 --> 16:48:30,480
string view string view overload called
22306
16:48:27,839 --> 16:48:32,879
and if we try and run this program let's
22307
16:48:30,480 --> 16:48:33,916
build with gcc make sure that the build
22308
16:48:33,915 --> 16:48:38,955
the world is good so we can clear and
22309
16:48:36,480 --> 16:48:41,680
run rooster this is going to show string
22310
16:48:38,955 --> 16:48:44,159
view string view overload called we are
22311
16:48:41,680 --> 16:48:46,480
able to call this guy here and again the
22312
16:48:44,160 --> 16:48:49,040
message is that we really have a lot of
22313
16:48:46,480 --> 16:48:52,400
flexibility in how we can set up
22314
16:48:49,040 --> 16:48:55,436
overloads for a function in c plus plus
22315
16:48:52,400 --> 16:48:57,916
and please use this facility at your
22316
16:48:55,436 --> 16:48:59,596
advantage if this makes things better
22317
16:48:57,915 --> 16:49:02,239
for whatever application you are
22318
16:48:59,595 --> 16:49:04,159
designing i would like to welcome you in
22319
16:49:02,239 --> 16:49:06,795
this new chapter where we're going to be
22320
16:49:04,160 --> 16:49:09,596
learning about lambda functions lambda
22321
16:49:06,796 --> 16:49:12,796
functions are a mechanism we have in c
22322
16:49:09,595 --> 16:49:15,040
plus plus to set up anonymous functions
22323
16:49:12,796 --> 16:49:17,116
once we have anonymous function set up
22324
16:49:15,040 --> 16:49:19,915
we can do all kinds of crazy things with
22325
16:49:17,116 --> 16:49:22,635
them for example we can give them names
22326
16:49:19,915 --> 16:49:25,040
and code them multiple times or we can
22327
16:49:22,635 --> 16:49:27,360
even call them directly without even
22328
16:49:25,040 --> 16:49:29,520
giving them a name i realize this can be
22329
16:49:27,360 --> 16:49:31,840
really cryptic so we're going to head
22330
16:49:29,519 --> 16:49:35,595
over to the next lecture and see how we
22331
16:49:31,839 --> 16:49:37,519
can declare and use our lambda functions
22332
16:49:35,595 --> 16:49:39,519
go ahead and finish up here
22333
16:49:37,519 --> 16:49:42,000
and meet me there in this lecture we're
22334
16:49:39,519 --> 16:49:44,879
going to see how we can declare and use
22335
16:49:42,000 --> 16:49:47,680
our lambda functions and again lambda
22336
16:49:44,879 --> 16:49:51,040
functions are a mechanism we have in c
22337
16:49:47,680 --> 16:49:53,360
plus plus to set up anonymous functions
22338
16:49:51,040 --> 16:49:55,520
and an anonymous function is a function
22339
16:49:53,360 --> 16:49:57,680
without a name we're going to see how we
22340
16:49:55,519 --> 16:49:59,915
can set up an anonymous function
22341
16:49:57,680 --> 16:50:02,000
optionally give it a name and call it or
22342
16:49:59,915 --> 16:50:04,319
we can even call it directly without
22343
16:50:02,000 --> 16:50:06,635
giving that a name let's see how we can
22344
16:50:04,319 --> 16:50:08,400
do that before we talk about anything
22345
16:50:06,635 --> 16:50:09,839
about lambda functions we're going to
22346
16:50:09,839 --> 16:50:15,115
the lambda function signature and there
22347
16:50:12,879 --> 16:50:16,879
is a special syntax you have to follow
22348
16:50:15,116 --> 16:50:18,796
if you want to set up a lambda function
22349
16:50:16,879 --> 16:50:21,199
in c plus plus the first thing you have
22350
16:50:18,796 --> 16:50:24,160
to put in place is angle brackets like
22351
16:50:21,199 --> 16:50:26,479
this and that's going to be your capture
22352
16:50:24,160 --> 16:50:27,916
list we are not going to talk anymore
22353
16:50:26,480 --> 16:50:30,560
about this we're going to have a chance
22354
16:50:27,915 --> 16:50:32,479
to talk about this in detail after your
22355
16:50:30,559 --> 16:50:35,040
capture list which is going to leave in
22356
16:50:32,480 --> 16:50:37,596
this pair of angle brackets you're going
22357
16:50:35,040 --> 16:50:39,915
to have the parameters to your lambda
22358
16:50:37,595 --> 16:50:41,839
functions and this is where you can pass
22359
16:50:39,915 --> 16:50:43,915
arguments if you want to call your
22360
16:50:41,839 --> 16:50:46,955
lambda function after that you're going
22361
16:50:43,915 --> 16:50:49,435
to have a return type for your lambda
22362
16:50:46,955 --> 16:50:52,239
function but you don't have to put this
22363
16:50:49,436 --> 16:50:53,916
in explicitly you can live this out and
22364
16:50:52,239 --> 16:50:56,400
the compiler is going to deduce your
22365
16:50:56,400 --> 16:51:01,916
after all these things you have to put
22366
16:50:58,480 --> 16:51:03,916
in a pair of curly braces and inside
22367
16:51:01,915 --> 16:51:06,399
these curly braces we're going to have
22368
16:51:03,915 --> 16:51:09,040
our function body and we can do whatever
22369
16:51:06,400 --> 16:51:11,116
we want our lambda function to do in
22370
16:51:09,040 --> 16:51:12,879
this function body here after this you
22371
16:51:11,116 --> 16:51:15,680
will have to remember to put your
22372
16:51:12,879 --> 16:51:17,040
semicolon to make whatever statements
22373
16:51:17,040 --> 16:51:21,360
this along the function to be valid and
22374
16:51:19,275 --> 16:51:23,839
this is the syntax you have to follow
22375
16:51:21,360 --> 16:51:26,319
here we have a simple example so we have
22376
16:51:23,839 --> 16:51:28,795
our lambda function we want to say hello
22377
16:51:26,319 --> 16:51:30,796
to the console this is what we have in
22378
16:51:28,796 --> 16:51:32,956
the body of the lambda function but
22379
16:51:30,796 --> 16:51:34,880
notice that we have our capture list
22380
16:51:34,879 --> 16:51:40,000
delimited by these angle brackets we
22381
16:51:37,756 --> 16:51:42,080
have our parameter list which is going
22382
16:51:40,000 --> 16:51:43,756
to be empty in this moment because this
22383
16:51:42,080 --> 16:51:46,560
lambda function doesn't take any
22384
16:51:43,756 --> 16:51:48,400
parameter and we have our body which is
22385
16:51:48,400 --> 16:51:54,635
these two curly braces and after that we
22386
16:51:51,519 --> 16:51:57,519
have our semicolon to make this a valid
22387
16:51:54,635 --> 16:51:59,680
c plus plus statement if we try and put
22388
16:51:57,519 --> 16:52:00,399
this thing in our c plus plus source
22389
16:52:00,400 --> 16:52:04,880
this is going to be a valid lambda
22390
16:52:02,400 --> 16:52:07,436
function but it isn't really useful by
22391
16:52:04,879 --> 16:52:09,595
now because we can't call it one way we
22392
16:52:07,436 --> 16:52:12,400
have to call it is to give it a name and
22393
16:52:09,595 --> 16:52:15,275
we can give it a name by assigning our
22394
16:52:12,400 --> 16:52:17,520
lambda function to a variable like we
22395
16:52:15,275 --> 16:52:20,319
see here once we have our lambda
22396
16:52:17,519 --> 16:52:22,719
function declared like this this entire
22397
16:52:20,319 --> 16:52:25,519
thing is going to be our lambda function
22398
16:52:22,720 --> 16:52:28,000
type we can take this and assign that to
22399
16:52:25,519 --> 16:52:28,879
a variable which is going to deduce the
22400
16:52:28,879 --> 16:52:32,719
using auto type deduction here this is
22401
16:52:32,720 --> 16:52:38,559
once this thing has a name then we can
22402
16:52:35,275 --> 16:52:40,720
call it with the syntax we have here and
22403
16:52:38,559 --> 16:52:43,275
if we run this code now it is going to
22404
16:52:40,720 --> 16:52:45,360
print hello world to the console i
22405
16:52:43,275 --> 16:52:48,879
realize this syntax can be really
22406
16:52:45,360 --> 16:52:50,480
cryptic but if you try to remember this
22407
16:52:48,879 --> 16:52:53,040
you're going to find that lambda
22408
16:52:50,480 --> 16:52:54,796
functions are really cool and later in
22409
16:52:53,040 --> 16:52:57,520
the course we will see that they really
22410
16:52:54,796 --> 16:53:00,160
make a lot of things easier in c plus
22411
16:52:57,519 --> 16:53:02,159
plus so try to remember the syntax here
22412
16:53:00,160 --> 16:53:04,796
and everything is going to flow from
22413
16:53:02,160 --> 16:53:06,796
here again the syntax is to have the
22414
16:53:04,796 --> 16:53:08,880
capture list which is going to be the
22415
16:53:06,796 --> 16:53:11,200
first thing the second thing is going to
22416
16:53:08,879 --> 16:53:13,040
be the parameters the third thing is
22417
16:53:11,199 --> 16:53:14,719
going to be the return type which is
22418
16:53:13,040 --> 16:53:16,879
optional you can leave this out and the
22419
16:53:14,720 --> 16:53:18,239
compiler is going to deduce this and
22420
16:53:16,879 --> 16:53:21,755
after this you're going to have your
22421
16:53:18,239 --> 16:53:24,239
pair of curly braces and the body of our
22422
16:53:21,756 --> 16:53:26,720
lambda function is going to leave within
22423
16:53:24,239 --> 16:53:28,559
these curly braces this is the syntax
22424
16:53:26,720 --> 16:53:30,955
you need to remember okay we have seen
22425
16:53:28,559 --> 16:53:33,435
that we can give a name to our lambda
22426
16:53:30,955 --> 16:53:36,000
function and call it but it is also
22427
16:53:33,436 --> 16:53:39,200
possible to call our lambda function
22428
16:53:36,000 --> 16:53:42,239
directly without giving it a name and we
22429
16:53:39,199 --> 16:53:45,275
do that by appending a pair of curly
22430
16:53:42,239 --> 16:53:47,199
braces to the lambda function definition
22431
16:53:45,275 --> 16:53:49,199
here so we have a lambda function we
22432
16:53:47,199 --> 16:53:52,319
have our curly braces and we have our
22433
16:53:49,199 --> 16:53:55,519
parameter list we have our body here and
22434
16:53:52,319 --> 16:53:57,756
after the closing curly brace we're
22435
16:53:55,519 --> 16:54:00,079
going to add a pair of parentheses to
22436
16:53:57,756 --> 16:54:02,480
call this lambda function and because
22437
16:54:00,080 --> 16:54:04,480
this lambda function takes no parameter
22438
16:54:02,480 --> 16:54:06,796
we're not going to put any argument
22439
16:54:04,480 --> 16:54:09,276
within our parenthesis here and this is
22440
16:54:06,796 --> 16:54:11,116
going to call our lambda function don't
22441
16:54:09,275 --> 16:54:12,879
worry if you find this confusing we're
22442
16:54:11,116 --> 16:54:14,720
going to head over to visual studio code
22443
16:54:12,879 --> 16:54:17,199
in a minute and all of this is going to
22444
16:54:14,720 --> 16:54:19,916
make sense okay so far we haven't really
22445
16:54:17,199 --> 16:54:22,319
seen that we can pass parameters to our
22446
16:54:19,915 --> 16:54:24,879
lambda function here is a simple example
22447
16:54:22,319 --> 16:54:27,116
that takes parameters this is a lambda
22448
16:54:24,879 --> 16:54:29,275
function because it follows the syntax
22449
16:54:27,116 --> 16:54:31,756
for lambda functions we have
22450
16:54:29,275 --> 16:54:34,559
our capture list we have our parameter
22451
16:54:31,756 --> 16:54:36,720
list we have our curly braces and the
22452
16:54:34,559 --> 16:54:38,955
body is going to live inside these guys
22453
16:54:36,720 --> 16:54:41,756
and we are calling this lambda function
22454
16:54:38,955 --> 16:54:43,199
directly with this parameter list the
22455
16:54:41,756 --> 16:54:45,756
lambda function is going to take two
22456
16:54:43,199 --> 16:54:48,399
parameters of double type we're going to
22457
16:54:45,756 --> 16:54:50,080
print out the sum of these two numbers
22458
16:54:48,400 --> 16:54:52,080
and that we are going to call this
22459
16:54:50,080 --> 16:54:55,040
lambda function directly notice that we
22460
16:54:57,595 --> 16:55:02,795
literals okay this is how you can set up
22461
16:55:00,160 --> 16:55:04,796
a lambda function that takes parameters
22462
16:55:02,796 --> 16:55:07,436
and call it directly another thing we
22463
16:55:04,796 --> 16:55:09,436
can do is make our lambda function
22464
16:55:07,436 --> 16:55:11,116
return something and that's really
22465
16:55:09,436 --> 16:55:12,880
simple we're going to set up the lambda
22466
16:55:11,116 --> 16:55:15,200
function like this so it's going to take
22467
16:55:15,199 --> 16:55:20,000
and here you see that we are returning a
22468
16:55:17,595 --> 16:55:21,839
plus b and we can do that the lambda
22469
16:55:20,000 --> 16:55:24,635
function is now going to return
22470
16:55:21,839 --> 16:55:28,079
something and this entire thing we have
22471
16:55:24,635 --> 16:55:29,595
here is going to be a lambda expression
22472
16:55:28,080 --> 16:55:31,916
the lambda function is going to be
22473
16:55:29,595 --> 16:55:34,239
called it is going to return something
22474
16:55:31,915 --> 16:55:36,479
and what the lambda function returns is
22475
16:55:34,239 --> 16:55:38,635
going to be assigned to this result
22476
16:55:36,480 --> 16:55:40,796
variable here and if we print it we're
22477
16:55:38,635 --> 16:55:42,955
going to get the sum of whatever pass in
22478
16:55:40,796 --> 16:55:45,116
here printed out on the console and
22479
16:55:42,955 --> 16:55:47,680
you're going to see it printed out on
22480
16:55:45,116 --> 16:55:50,240
the terminal it is also possible to put
22481
16:55:47,680 --> 16:55:52,879
your lambda function directly in an
22482
16:55:50,239 --> 16:55:56,000
output statement i realize this can be
22483
16:55:52,879 --> 16:55:59,199
really confusing but please look at this
22484
16:55:56,000 --> 16:56:02,160
entire lambda function is same here
22485
16:55:59,199 --> 16:56:04,239
as a single value because this is a
22486
16:56:02,160 --> 16:56:06,720
lambda function that is going to return
22487
16:56:04,239 --> 16:56:09,040
something and what is returned by this
22488
16:56:06,720 --> 16:56:11,436
lambda function is going to be printed
22489
16:56:11,436 --> 16:56:16,400
again i realize this may be confusing to
22490
16:56:14,160 --> 16:56:18,240
many of you guys we are going to head
22491
16:56:16,400 --> 16:56:19,840
over to visual studio code in a minute
22492
16:56:18,239 --> 16:56:21,680
and we're going to see this and you're
22493
16:56:19,839 --> 16:56:23,275
going to really understand okay the last
22494
16:56:21,680 --> 16:56:26,635
thing we're going to look at is that we
22495
16:56:23,275 --> 16:56:29,436
can specify a return type to our lambda
22496
16:56:26,635 --> 16:56:30,955
function and the syntax to do this is to
22497
16:56:30,955 --> 16:56:36,955
a greater than symbol and put your type
22498
16:56:34,160 --> 16:56:39,200
after that and when you do that now this
22499
16:56:36,955 --> 16:56:42,795
lambda function is going to be forced to
22500
16:56:39,199 --> 16:56:45,360
return double type even if you pass it
22501
16:56:42,796 --> 16:56:47,436
to parameters that are not of double
22502
16:56:45,360 --> 16:56:49,680
type we are going to add them up and the
22503
16:56:47,436 --> 16:56:51,680
return type is going to be implicitly
22504
16:56:49,680 --> 16:56:53,360
converted to double and that's what
22505
16:56:51,680 --> 16:56:55,595
we're going to return and we can print
22506
16:56:53,360 --> 16:56:57,840
it out on the console and we're going to
22507
16:56:55,595 --> 16:57:00,559
see an example of this in a minute when
22508
16:56:57,839 --> 16:57:02,559
we hit visual studio code in fact this
22509
16:57:00,559 --> 16:57:04,955
is really all i had to share with you in
22510
16:57:02,559 --> 16:57:07,519
the slides i realized many of these
22511
16:57:04,955 --> 16:57:09,839
things may be confusing we are going to
22512
16:57:07,519 --> 16:57:12,159
head over to visual studio code and play
22513
16:57:09,839 --> 16:57:14,000
with these things step by step and i am
22514
16:57:12,160 --> 16:57:17,116
sure you're going to understand here we
22515
16:57:14,000 --> 16:57:19,680
are in our working directory the current
22516
16:57:17,116 --> 16:57:21,680
project is declaring and using lambda
22517
16:57:19,680 --> 16:57:24,160
functions we're going to grab our
22518
16:57:21,680 --> 16:57:26,239
template files and put them in place
22519
16:57:24,160 --> 16:57:29,116
let's do that and we're going to grab
22520
16:57:26,239 --> 16:57:30,879
our folder here and drag and drop it in
22521
16:57:29,116 --> 16:57:33,040
visual studio code and this is going to
22522
16:57:30,879 --> 16:57:36,000
open it it is opened here we have our
22523
16:57:33,040 --> 16:57:38,319
main cpp file opened we can close the
22524
16:57:36,000 --> 16:57:40,480
left pane here because we don't want it
22525
16:57:38,319 --> 16:57:42,319
anymore and we can clean up our function
22526
16:57:40,480 --> 16:57:45,276
here and the first thing we're going to
22527
16:57:42,319 --> 16:57:48,239
do is to put in the syntax for a lambda
22528
16:57:45,275 --> 16:57:50,159
function here and use it as a reference
22529
16:57:48,239 --> 16:57:52,319
as we learn about this i think this is
22530
16:57:50,160 --> 16:57:54,080
going to make things a little easier so
22531
16:57:52,319 --> 16:57:56,559
the first thing we want to do is to
22532
16:57:54,080 --> 16:57:58,400
declare a lambda function and the first
22533
16:57:56,559 --> 16:58:00,795
thing we need to put in is a capture
22534
16:57:58,400 --> 16:58:03,200
list a capture list is going to be in
22535
16:58:00,796 --> 16:58:05,680
globe in this angle bracket so this is
22536
16:58:03,199 --> 16:58:07,755
our empty capture list and after this
22537
16:58:05,680 --> 16:58:10,000
we're going to put in a parameter list
22538
16:58:07,756 --> 16:58:12,239
which is going to leave inside this
22539
16:58:10,000 --> 16:58:13,519
parenthesis here after that we're going
22540
16:58:13,519 --> 16:58:17,519
an optional return type for now we're
22541
16:58:15,756 --> 16:58:20,000
going to ignore this and after that
22542
16:58:17,519 --> 16:58:22,955
we're going to put in our pair of curly
22543
16:58:20,000 --> 16:58:26,319
braces and inside this pair of curly
22544
16:58:22,955 --> 16:58:28,479
braces is where the body of our lambda
22545
16:58:26,319 --> 16:58:30,239
function is going to leave so inside
22546
16:58:28,480 --> 16:58:32,240
here we can do whatever we want in the
22547
16:58:30,239 --> 16:58:35,040
body of this lambda function for example
22548
16:58:32,239 --> 16:58:37,275
we can say hello world which is
22549
16:58:35,040 --> 16:58:39,436
the logical thing to do at this point so
22550
16:58:37,275 --> 16:58:41,275
we're going to say hello world here and
22551
16:58:39,436 --> 16:58:44,319
we're going to put in our new line
22552
16:58:41,275 --> 16:58:47,115
character with endl okay now we have a
22553
16:58:44,319 --> 16:58:50,159
lambda function declared but we have to
22554
16:58:47,116 --> 16:58:52,796
put in a closing semicolon because this
22555
16:58:50,160 --> 16:58:55,436
is a c plus plus statement okay now we
22556
16:58:52,796 --> 16:58:58,000
have our lambda function declared and
22557
16:58:55,436 --> 16:58:59,596
this is valid c plus plus code if we're
22558
16:58:58,000 --> 16:59:01,519
trying to compile this program you're
22559
16:58:59,595 --> 16:59:04,239
going to see that it is going to compile
22560
16:59:01,519 --> 16:59:06,399
fine cape world finished successfully
22561
16:59:04,239 --> 16:59:09,595
and if we try to run it it is not going
22562
16:59:06,400 --> 16:59:11,840
to do a thing because we are declaring
22563
16:59:09,595 --> 16:59:14,399
the lambda function here but we're not
22564
16:59:11,839 --> 16:59:16,399
calling it to get it to do things
22565
16:59:14,400 --> 16:59:18,720
so let's bring up a terminal and show
22566
16:59:16,400 --> 16:59:21,200
you that if we run this program it is
22567
16:59:18,720 --> 16:59:23,275
not going to do anything so let's do
22568
16:59:21,199 --> 16:59:24,635
clear and run rooster you're going to
22569
16:59:23,275 --> 16:59:27,115
see that it's not going to print
22570
16:59:24,635 --> 16:59:30,879
anything and we can even go down here
22571
16:59:27,116 --> 16:59:33,116
and put in a closing stdc out statement
22572
16:59:30,879 --> 16:59:35,115
saying it done to me that we are hitting
22573
16:59:33,116 --> 16:59:38,000
the end of the function here without
22574
16:59:35,116 --> 16:59:40,240
doing anything so if we vote again the
22575
16:59:38,000 --> 16:59:42,480
vote is going to be good we can clear
22576
16:59:40,239 --> 16:59:44,559
and we're going to run rooster you see
22577
16:59:42,480 --> 16:59:46,880
we are printing done we are hitting the
22578
16:59:44,559 --> 16:59:49,915
end of the function here and are we not
22579
16:59:46,879 --> 16:59:52,879
seeing hello world so this function here
22580
16:59:49,915 --> 16:59:55,360
or this lambda function here to be exact
22581
16:59:52,879 --> 16:59:57,435
is not being called one way we have to
22582
16:59:55,360 --> 16:59:59,436
call it is to give it a name
22583
16:59:57,436 --> 17:00:02,480
and we have seen that to give it a name
22584
16:59:59,436 --> 17:00:04,635
we have to assign the entire lambda
22585
17:00:02,480 --> 17:00:06,480
function thing we have here to a
22586
17:00:04,635 --> 17:00:08,239
variable and we're going to use auto
22587
17:00:06,480 --> 17:00:10,956
type deduction here so we're going to
22588
17:00:08,239 --> 17:00:14,319
say auto func and we're going to assign
22589
17:00:10,955 --> 17:00:16,080
our lambda function here to this
22590
17:00:14,319 --> 17:00:18,879
variable and this is going to be
22591
17:00:16,080 --> 17:00:21,520
basically a handle we have in our
22592
17:00:18,879 --> 17:00:24,000
program here to the lambda function and
22593
17:00:21,519 --> 17:00:26,319
we can use this handle to do things with
22594
17:00:24,000 --> 17:00:28,160
the lambda function but by now i want
22595
17:00:26,319 --> 17:00:31,040
you to see that even if we run the
22596
17:00:28,160 --> 17:00:33,276
program now it is not going to do
22597
17:00:31,040 --> 17:00:35,595
anything because we're still not calling
22598
17:00:33,275 --> 17:00:37,519
the lambda function here let's show you
22599
17:00:35,595 --> 17:00:39,360
that we're going to world again and the
22600
17:00:37,519 --> 17:00:42,239
world is going to be good no problem we
22601
17:00:39,360 --> 17:00:44,000
can clear and run rooster still not
22602
17:00:42,239 --> 17:00:46,635
hello world because we're not calling
22603
17:00:44,000 --> 17:00:49,436
our lambda function to call our lambda
22604
17:00:46,635 --> 17:00:53,199
function we have to use our handle here
22605
17:00:49,436 --> 17:00:55,916
which is this variable and use regular
22606
17:00:53,199 --> 17:00:58,559
function called syntax so we can go down
22607
17:00:55,915 --> 17:01:00,955
here and say func and we can put in our
22608
17:00:58,559 --> 17:01:02,955
parenthesis we're not putting in any
22609
17:01:00,955 --> 17:01:06,159
parameter because this lambda here
22610
17:01:02,955 --> 17:01:08,239
doesn't take any parameters and now if
22611
17:01:06,160 --> 17:01:10,480
we run this program it is going to say
22612
17:01:08,239 --> 17:01:13,519
hello world because this line here is
22613
17:01:10,480 --> 17:01:15,436
going to call this lambda function let's
22614
17:01:15,436 --> 17:01:21,275
we're going to use gcc to build
22615
17:01:17,839 --> 17:01:23,275
so now if we clear and run rooster we're
22616
17:01:21,275 --> 17:01:25,275
going to see hello world we can call
22617
17:01:23,275 --> 17:01:27,436
this function multiple times because we
22618
17:01:25,275 --> 17:01:29,199
have a handle to it the handle is going
22619
17:01:29,199 --> 17:01:32,955
throughout the scope of the main
22620
17:01:30,879 --> 17:01:35,519
function here so we're going to go down
22621
17:01:32,955 --> 17:01:38,000
and call it again and if we build we're
22622
17:01:35,519 --> 17:01:40,955
going to build with gcc the world is
22623
17:01:38,000 --> 17:01:43,360
good we can clear and run rooster we're
22624
17:01:40,955 --> 17:01:46,635
going to say hello world twice because
22625
17:01:43,360 --> 17:01:48,635
we are calling our lambda function twice
22626
17:01:46,635 --> 17:01:50,319
this is one way we have to call our
22627
17:01:50,319 --> 17:01:54,080
so we're going to comment this out
22628
17:01:52,400 --> 17:01:56,560
because we're going to see a few other
22629
17:01:54,080 --> 17:01:58,955
things and on top here what we were
22630
17:01:56,559 --> 17:02:01,199
doing is declaring around the function
22631
17:01:58,955 --> 17:02:03,839
and call it through an a now we're going
22632
17:02:01,199 --> 17:02:06,079
to go down set up a lambda function and
22633
17:02:03,839 --> 17:02:08,399
call it directly without giving it a
22634
17:02:06,080 --> 17:02:10,560
name because that's also a possibility
22635
17:02:08,400 --> 17:02:12,560
in c plus plus for that we're going to
22636
17:02:10,559 --> 17:02:14,559
grab our lambda function here and we're
22637
17:02:12,559 --> 17:02:16,879
going to copy it and we're going to say
22638
17:02:14,559 --> 17:02:18,879
declare a lambda function and call it
22639
17:02:16,879 --> 17:02:20,239
direct and the syntax to do that is
22640
17:02:20,239 --> 17:02:24,400
you set up your lambda function like we
22641
17:02:22,239 --> 17:02:26,720
have seen before you see this is our
22642
17:02:24,400 --> 17:02:28,635
lambda function statement here but
22643
17:02:26,720 --> 17:02:31,040
you're going to go to the closing curly
22644
17:02:31,040 --> 17:02:36,879
of parentheses this is going to declare
22645
17:02:33,839 --> 17:02:39,115
the lambda function and call it directly
22646
17:02:36,879 --> 17:02:41,595
notice that we don't have a handle to
22647
17:02:39,116 --> 17:02:44,160
this lambda function so if you do things
22648
17:02:41,595 --> 17:02:46,000
like this you will have only one chance
22649
17:02:44,160 --> 17:02:48,400
to call the lambda function so we're
22650
17:02:46,000 --> 17:02:50,796
going to say hello world once because we
22651
17:02:48,400 --> 17:02:53,596
are declaring the lambda function and
22652
17:02:50,796 --> 17:02:55,276
calling it directly here and after that
22653
17:02:53,595 --> 17:02:57,680
we're going to say done because we're
22654
17:02:55,275 --> 17:02:59,040
going to be hitting the end of the main
22655
17:02:59,040 --> 17:03:03,040
let's build the program and show you
22656
17:03:00,796 --> 17:03:05,596
that we're going to build with gcc like
22657
17:03:03,040 --> 17:03:07,595
we always do we're going to clear
22658
17:03:05,595 --> 17:03:09,756
and run rooster this is going to say
22659
17:03:07,595 --> 17:03:12,079
hello world and we're going to be done
22660
17:03:09,756 --> 17:03:15,520
here because we are calling this lambda
22661
17:03:12,080 --> 17:03:17,276
function once again notice that now we
22662
17:03:15,519 --> 17:03:19,915
don't have a handle to this lambda
22663
17:03:17,275 --> 17:03:22,479
function so we really have one chance to
22664
17:03:19,915 --> 17:03:25,040
call this and you will do this if you
22665
17:03:22,480 --> 17:03:27,436
just want to set up some function that
22666
17:03:25,040 --> 17:03:29,840
you want to call directly and you don't
22667
17:03:27,436 --> 17:03:32,080
care about calling it ever again in your
22668
17:03:29,839 --> 17:03:34,719
c plus plus application and we're going
22669
17:03:32,080 --> 17:03:37,200
to see that we have many kinds of
22670
17:03:34,720 --> 17:03:38,239
problems where we want to do these kinds
22671
17:03:38,239 --> 17:03:42,079
okay now that you have seen this the
22672
17:03:39,839 --> 17:03:44,159
next thing i want to show you is how to
22673
17:03:42,080 --> 17:03:46,560
set up a lambda function that takes
22674
17:03:44,160 --> 17:03:48,636
parameters and we're going to comment
22675
17:03:46,559 --> 17:03:51,915
out what we have on top here because we
22676
17:03:48,635 --> 17:03:53,595
don't want noise output on our terminal
22677
17:03:51,915 --> 17:03:56,159
and we're going to grab this lambda
22678
17:03:56,160 --> 17:04:00,720
so let's copy it we're going to go down
22679
17:03:58,160 --> 17:04:02,796
here and put it in and we want to pass
22680
17:04:00,720 --> 17:04:04,480
two parameters now let's pass in double
22681
17:04:02,796 --> 17:04:07,360
parameters we're going to pass in double
22682
17:04:04,480 --> 17:04:10,560
a and double d you can do that
22683
17:04:07,360 --> 17:04:13,595
and inside the lambda function we can
22684
17:04:10,559 --> 17:04:16,239
print the sum of these two variables so
22685
17:04:13,595 --> 17:04:18,239
we're going to say a plus b for example
22686
17:04:16,239 --> 17:04:21,519
and we're going to print out whatever is
22687
17:04:18,239 --> 17:04:22,879
the result of a plus b let's do that and
22688
17:04:21,519 --> 17:04:26,000
after we do that you're going to see
22689
17:04:22,879 --> 17:04:29,595
that we get a compiler error because now
22690
17:04:26,000 --> 17:04:32,239
our lambda function is taking parameters
22691
17:04:29,595 --> 17:04:34,079
but we are calling that with an empty
22692
17:04:34,080 --> 17:04:40,720
so we need to give it something to sum
22693
17:04:36,559 --> 17:04:43,360
up let's give it 10.0 for example and a
22694
17:04:40,720 --> 17:04:45,595
5.0 and see what we get and after this
22695
17:04:43,360 --> 17:04:48,635
we need to put in our semicolon because
22696
17:04:45,595 --> 17:04:51,435
this is a z plus plus statement and any
22697
17:04:48,635 --> 17:04:54,159
c plus plus statement needs to end with
22698
17:04:51,436 --> 17:04:56,796
a semicolon now try to think about what
22699
17:04:54,160 --> 17:04:59,040
we are doing here we are setting up a
22700
17:04:56,796 --> 17:05:00,720
lambda function okay it's going to end
22701
17:05:00,720 --> 17:05:05,436
curly brace and this lambda function is
22702
17:05:03,275 --> 17:05:06,319
going to take two parameters of double
22703
17:05:06,319 --> 17:05:10,319
and inside the lambda function we are
22704
17:05:08,319 --> 17:05:12,879
going to print out whatever is the sum
22705
17:05:10,319 --> 17:05:14,319
of these two parameters that we are
22706
17:05:14,319 --> 17:05:20,720
after that we are calling our lambda
22707
17:05:16,080 --> 17:05:24,000
function with two variables 10.0 and 5.0
22708
17:05:20,720 --> 17:05:25,680
or i should say two double literals
22709
17:05:24,000 --> 17:05:28,559
that's what we are calling our lambda
22710
17:05:25,680 --> 17:05:30,796
function with and now if the program
22711
17:05:28,559 --> 17:05:32,635
runs the lambda function is going to be
22712
17:05:30,796 --> 17:05:35,276
called once and we're going to print out
22713
17:05:32,635 --> 17:05:37,915
whatever is the sum of these two numbers
22714
17:05:35,275 --> 17:05:40,479
and that's going to be 15. let's build
22715
17:05:37,915 --> 17:05:42,795
so we're going to build with gcc
22716
17:05:40,480 --> 17:05:45,360
the world is good we can clear and run
22717
17:05:42,796 --> 17:05:47,520
rooster we're going to see a plus b is
22718
17:05:45,360 --> 17:05:50,080
15. we are calling a lambda function
22719
17:05:47,519 --> 17:05:52,079
here if we put in a 50 here for example
22720
17:05:50,080 --> 17:05:54,319
we're going to get 60 printed out
22721
17:05:52,080 --> 17:05:56,480
because that's going to be our sum okay
22722
17:05:54,319 --> 17:05:58,559
let's boil it again and see that print
22723
17:05:56,480 --> 17:06:01,680
it down if we run rooster we're going to
22724
17:05:58,559 --> 17:06:02,879
see 60 because that's the sum of 10 and
22725
17:06:02,879 --> 17:06:07,360
another thing we can do is actually
22726
17:06:05,360 --> 17:06:09,360
not call the lambda function directly
22727
17:06:07,360 --> 17:06:11,116
here we can actually comment this out i
22728
17:06:09,360 --> 17:06:13,756
don't want to take this out because you
22729
17:06:11,116 --> 17:06:15,756
might want to use this as a reference so
22730
17:06:13,756 --> 17:06:17,275
we're going to comment this out and set
22731
17:06:17,275 --> 17:06:21,915
that is going to name our lambda
22732
17:06:19,275 --> 17:06:23,680
function and then we will have a handle
22733
17:06:21,915 --> 17:06:25,360
to the lambda function and we can call
22734
17:06:25,360 --> 17:06:30,000
so let's take out the call we are doing
22735
17:06:28,239 --> 17:06:32,559
here and we're going to assign our
22736
17:06:30,000 --> 17:06:34,955
lambda function to a variable we're
22737
17:06:32,559 --> 17:06:38,079
going to say auto func one we can call
22738
17:06:34,955 --> 17:06:39,756
this func one no problem and now
22739
17:06:38,080 --> 17:06:42,480
we can call this lambda function
22740
17:06:39,756 --> 17:06:46,319
multiple times for example we can say
22741
17:06:42,480 --> 17:06:50,080
funk one and pass in 10 and 20 okay and
22742
17:06:46,319 --> 17:06:52,480
we can say funk one and pass in five
22743
17:06:52,480 --> 17:06:56,796
if we run this program it is going to
22744
17:06:54,400 --> 17:06:59,360
print the sum of 10 and 20 and it is
22745
17:06:56,796 --> 17:07:01,116
going to print the sum of five and seven
22746
17:06:59,360 --> 17:07:03,680
and it is going to be calling this
22747
17:07:01,116 --> 17:07:05,840
lambda function multiple times hopefully
22748
17:07:03,680 --> 17:07:08,559
you can see that if you want a chance to
22749
17:07:05,839 --> 17:07:10,795
call your lambda function multiple times
22750
17:07:08,559 --> 17:07:12,879
you will need to give it a handle like
22751
17:07:10,796 --> 17:07:14,160
we are doing here and then you can use
22752
17:07:14,160 --> 17:07:18,880
multiple times and call your lambda
22753
17:07:16,400 --> 17:07:21,360
function however many times you want so
22754
17:07:18,879 --> 17:07:23,595
let's build this program and see what we
22755
17:07:23,595 --> 17:07:28,955
i'm going to clear and run rooster
22756
17:07:26,319 --> 17:07:31,519
now we're going to see a plus b it's 30
22757
17:07:28,955 --> 17:07:34,159
as a result of this call here and we're
22758
17:07:34,160 --> 17:07:40,400
as a result of this call here notice
22759
17:07:36,955 --> 17:07:42,479
that we are passing an integer literals
22760
17:07:40,400 --> 17:07:45,520
so the compiler is going to insert an
22761
17:07:42,480 --> 17:07:47,520
implicit conversion from and to double
22762
17:07:45,519 --> 17:07:49,755
because our lambda function here is
22763
17:07:47,519 --> 17:07:52,719
taking double type you really need to be
22764
17:07:49,756 --> 17:07:54,559
aware of these implicit conversions and
22765
17:07:52,720 --> 17:07:56,796
make sure they are working to your
22766
17:07:54,559 --> 17:07:58,479
advantage if they are working against
22767
17:07:56,796 --> 17:08:01,840
you trying to find a way to make your
22768
17:07:58,480 --> 17:08:03,680
code work exactly like you want because
22769
17:08:01,839 --> 17:08:06,079
we are learning about all these cool
22770
17:08:03,680 --> 17:08:08,239
tricks in c plus plus you're going to be
22771
17:08:06,080 --> 17:08:10,080
using them at your advantage okay
22772
17:08:08,239 --> 17:08:11,915
hopefully now you know how you can set
22773
17:08:10,080 --> 17:08:14,080
up a lambda function that takes
22774
17:08:11,915 --> 17:08:16,635
parameters we're going to go down and
22775
17:08:14,080 --> 17:08:19,116
comment this out because now we want to
22776
17:08:16,635 --> 17:08:20,879
see how we can return something from a
22777
17:08:19,116 --> 17:08:22,796
lambda function and we're going to be
22778
17:08:20,879 --> 17:08:24,399
using the same lambda function here so
22779
17:08:22,796 --> 17:08:26,635
let's grab it and we're going to say
22780
17:08:24,400 --> 17:08:28,955
lambda function that returns something
22781
17:08:26,635 --> 17:08:31,360
and we're going to set up our lambda
22782
17:08:28,955 --> 17:08:32,559
function here let's put that in place
22783
17:08:32,559 --> 17:08:36,720
and instead of printing out the sum of a
22784
17:08:36,720 --> 17:08:41,680
we can return that we can go in our
22785
17:08:39,116 --> 17:08:44,560
lambda function and say return
22786
17:08:41,680 --> 17:08:47,116
a plus b okay now that we have this we
22787
17:08:44,559 --> 17:08:51,275
can either call it directly by saying
22788
17:08:47,116 --> 17:08:54,160
for example 10 and 20 but now if we try
22789
17:08:51,275 --> 17:08:56,795
and run this code it is not going to do
22790
17:08:56,796 --> 17:09:01,276
this lambda function is not printing to
22791
17:08:59,199 --> 17:09:04,000
the concept directly it is just
22792
17:09:01,275 --> 17:09:04,955
returning whatever is the sum of 10 and
22793
17:09:04,955 --> 17:09:09,275
and if we return it we're not doing
22794
17:09:07,199 --> 17:09:11,275
anything with whatever is returned from
22795
17:09:09,275 --> 17:09:12,879
this lambda function so we're not going
22796
17:09:11,275 --> 17:09:14,479
to print anything and we're just going
22797
17:09:14,480 --> 17:09:18,480
let's boil and make you see this because
22798
17:09:16,879 --> 17:09:19,680
you really need to be aware of these
22799
17:09:19,680 --> 17:09:24,160
so the build is good we can clear and
22800
17:09:21,839 --> 17:09:26,719
run rooster we're going to see down our
22801
17:09:24,160 --> 17:09:28,956
lambda function is returning something
22802
17:09:26,720 --> 17:09:30,400
but we're not doing anything with the
22803
17:09:30,400 --> 17:09:35,040
if we want to print the return value we
22804
17:09:32,635 --> 17:09:36,879
need to catch it somehow and we can put
22805
17:09:35,040 --> 17:09:39,840
that in a variable for example we can
22806
17:09:36,879 --> 17:09:42,635
say auto result and assign the return
22807
17:09:39,839 --> 17:09:44,955
value of our lambda function to this
22808
17:09:42,635 --> 17:09:47,839
variable now we have a chance to print
22809
17:09:44,955 --> 17:09:49,915
this for example by doing sddc out
22810
17:09:49,915 --> 17:09:54,879
print that out and save result now if we
22811
17:09:53,040 --> 17:09:57,360
build this program it is going to print
22812
17:09:54,879 --> 17:09:58,955
whatever is the sum of 10 and 20. let's
22813
17:09:57,360 --> 17:10:00,796
do that and show you that this is
22814
17:10:00,796 --> 17:10:08,720
so world is good so we can clear and run
22815
17:10:04,635 --> 17:10:11,519
rooster result is 30. if we pass in 10
22816
17:10:08,720 --> 17:10:14,239
and 50 for example we're going to get
22817
17:10:11,519 --> 17:10:16,399
the same thing let's pass in 60 here
22818
17:10:14,239 --> 17:10:18,635
so we're going to build with gcc the
22819
17:10:16,400 --> 17:10:21,596
build is good we can clear pretty quick
22820
17:10:18,635 --> 17:10:23,839
and run rooster now the sum is 70 and
22821
17:10:21,595 --> 17:10:26,319
this is how you can return stuff from
22822
17:10:23,839 --> 17:10:28,955
your lambda function and once you return
22823
17:10:26,319 --> 17:10:31,519
stuff you have to be sure you cut your
22824
17:10:28,955 --> 17:10:33,756
results and print them out another thing
22825
17:10:31,519 --> 17:10:36,000
you can do is print out the result
22826
17:10:33,756 --> 17:10:38,635
directly after you call your lambda
22827
17:10:36,000 --> 17:10:41,275
function so for example we can grab this
22828
17:10:38,635 --> 17:10:44,080
entire lambda function thing here and
22829
17:10:41,275 --> 17:10:46,319
put that in an sddc out statement so
22830
17:10:44,080 --> 17:10:48,880
we're going to put in a second one here
22831
17:10:46,319 --> 17:10:51,519
and say result or we can even comment
22832
17:10:48,879 --> 17:10:53,360
this out we don't want to be confused
22833
17:10:51,519 --> 17:10:56,239
when we look at the terminology we're
22834
17:10:53,360 --> 17:10:59,319
going to comment out the first sddc out
22835
17:10:56,239 --> 17:11:02,795
statement here and we're going to say
22836
17:10:59,319 --> 17:11:05,116
stdendl here and put in a placeholder
22837
17:11:02,796 --> 17:11:06,560
for our lambda function and we're going
22838
17:11:06,559 --> 17:11:11,040
if we do something like this again this
22839
17:11:08,635 --> 17:11:13,116
entire lambda function thing is going to
22840
17:11:11,040 --> 17:11:15,840
return the sum and that's what we're
22841
17:11:13,116 --> 17:11:18,560
going to print i realize this syntax is
22842
17:11:15,839 --> 17:11:21,275
really cryptic but it is going to work
22843
17:11:18,559 --> 17:11:23,680
let's try and build our program here the
22844
17:11:21,275 --> 17:11:25,680
world is good so we can clear and run
22845
17:11:23,680 --> 17:11:29,040
rooster we're going to see that result
22846
17:11:25,680 --> 17:11:32,955
is 70 and this is coming from our call
22847
17:11:29,040 --> 17:11:35,520
here which is nested inside our htdc out
22848
17:11:32,955 --> 17:11:37,519
statement you can do this if you want
22849
17:11:35,519 --> 17:11:40,159
another thing you can do as we have seen
22850
17:11:37,519 --> 17:11:42,795
before is give your lambda function a
22851
17:11:40,160 --> 17:11:44,796
name and call it repeatedly so for
22852
17:11:42,796 --> 17:11:47,040
example we can try and comment out what
22853
17:11:44,796 --> 17:11:48,796
we have here and set up another lambda
22854
17:11:48,796 --> 17:11:53,756
don't want to confuse you again so we're
22855
17:11:50,879 --> 17:11:55,360
going to grab our lambda function here
22856
17:11:53,756 --> 17:11:57,840
we're going to copy it because we don't
22857
17:11:55,360 --> 17:11:59,840
want to type this a thousand times
22858
17:11:57,839 --> 17:12:01,915
and we don't want to call this lambda
22859
17:11:59,839 --> 17:12:03,595
function directly instead we want to
22860
17:12:01,915 --> 17:12:07,199
give it a name and we're going to say
22861
17:12:03,595 --> 17:12:10,399
aro funk 2 and we're going to assign our
22862
17:12:07,199 --> 17:12:12,879
lambda function type to func one
22863
17:12:10,400 --> 17:12:14,955
now that we have this we can say auto
22864
17:12:14,955 --> 17:12:19,756
and we can say func and we can pass in
22865
17:12:17,275 --> 17:12:20,720
whatever we want let's put in 23 and a
22866
17:12:20,720 --> 17:12:25,275
and this is going to add up 23 and seven
22867
17:12:23,680 --> 17:12:27,756
we're going to grab the result and we're
22868
17:12:25,275 --> 17:12:29,915
going to assign that to result one
22869
17:12:27,756 --> 17:12:33,275
if we go down and say auto for example
22870
17:12:29,915 --> 17:12:34,635
result two and say for example funk one
22871
17:12:37,595 --> 17:12:41,915
why not and go down and print out these
22872
17:12:40,080 --> 17:12:44,319
result variables we're going to see the
22873
17:12:41,915 --> 17:12:47,115
sums printed out and again the message
22874
17:12:44,319 --> 17:12:49,199
is that we can use this handle to call
22875
17:12:47,116 --> 17:12:51,040
our lambda function multiple times so
22876
17:12:49,199 --> 17:12:52,239
let's go down and print this out we're
22877
17:12:52,239 --> 17:12:56,635
result one and we're going to say result
22878
17:12:54,635 --> 17:12:58,955
one here we're going to go down and say
22879
17:12:56,635 --> 17:13:00,796
result two and we're going to print that
22880
17:12:58,955 --> 17:13:03,680
out and we can even call this lambda
22881
17:13:00,796 --> 17:13:05,840
function directly and put that in sddc
22882
17:13:03,680 --> 17:13:08,635
out here so let's say that we're going
22883
17:13:05,839 --> 17:13:11,199
to say result to 3 for example or direct
22884
17:13:08,635 --> 17:13:13,360
call i think this is descriptive enough
22885
17:13:13,360 --> 17:13:18,080
one the name of our lambda function or
22886
17:13:15,680 --> 17:13:20,955
the handle to the lambda function and we
22887
17:13:18,080 --> 17:13:22,560
can put in a five and a two for example
22888
17:13:20,955 --> 17:13:25,519
and we're going to see this print out
22889
17:13:22,559 --> 17:13:29,040
the result if we build our program let's
22890
17:13:25,519 --> 17:13:32,000
do that with gcc the bolt is going to be
22891
17:13:29,040 --> 17:13:35,436
good we can clear and run rooster we're
22892
17:13:32,000 --> 17:13:38,559
going to have result 1 is 30 which is 23
22893
17:13:35,436 --> 17:13:42,080
and 7 so the sum is 30. the second one
22894
17:13:38,559 --> 17:13:44,239
should say 54 because that's the sum and
22895
17:13:42,080 --> 17:13:47,436
the third one should say 7 because
22896
17:13:44,239 --> 17:13:49,275
that's the sum of 5 and 2 and it is what
22897
17:13:47,436 --> 17:13:51,680
we have here and after that we're going
22898
17:13:49,275 --> 17:13:54,159
to see that our program is done this is
22899
17:13:51,680 --> 17:13:56,635
how you can set up a lambda function
22900
17:13:54,160 --> 17:13:58,796
that returns something and we have seen
22901
17:13:56,635 --> 17:14:01,040
many ways we can work with us let's
22902
17:13:58,796 --> 17:14:03,596
comment this out because there is one
22903
17:14:01,040 --> 17:14:06,239
more thing i want you to see and that's
22904
17:14:03,595 --> 17:14:08,955
along the function whose return type is
22905
17:14:06,239 --> 17:14:11,040
specified explicitly okay we are going
22906
17:14:08,955 --> 17:14:12,795
to reuse the same lambda function we
22907
17:14:11,040 --> 17:14:14,319
have been using all along and we're
22908
17:14:14,319 --> 17:14:19,839
and we're going to go down and put it
22909
17:14:16,796 --> 17:14:22,319
down here and now we want to specify the
22910
17:14:19,839 --> 17:14:25,039
return type as a double the way we do
22911
17:14:22,319 --> 17:14:27,680
that we go after our parameter list and
22912
17:14:25,040 --> 17:14:29,595
we put in a dash symbol and we put in a
22913
17:14:27,680 --> 17:14:32,319
greater than symbol and then we're going
22914
17:14:29,595 --> 17:14:34,879
to specify the return type of our lambda
22915
17:14:32,319 --> 17:14:37,595
function let's say that we want our
22916
17:14:34,879 --> 17:14:39,915
return type to be ant this is how we say
22917
17:14:37,595 --> 17:14:42,955
it now our function here is going to
22918
17:14:39,915 --> 17:14:45,435
return end regardless of the types that
22919
17:14:42,955 --> 17:14:47,199
we put in so what the compiler is going
22920
17:14:45,436 --> 17:14:48,955
to do when we call this lambda function
22921
17:14:47,199 --> 17:14:50,479
it is going to take the parameters it is
22922
17:14:48,955 --> 17:14:52,879
going to add them up for example now
22923
17:14:50,480 --> 17:14:54,956
they are double so it's going to add a
22924
17:14:52,879 --> 17:14:57,040
and b as double it's going to produce a
22925
17:14:54,955 --> 17:15:00,319
double variable then it is going to
22926
17:14:57,040 --> 17:15:03,275
convert that to end and return it you
22927
17:15:00,319 --> 17:15:06,319
notice that now we have forced our
22928
17:15:03,275 --> 17:15:07,519
lambda function to really return a
22929
17:15:08,720 --> 17:15:14,160
before the return type was deduced from
22930
17:15:11,519 --> 17:15:16,719
the operation that we did here and
22931
17:15:14,160 --> 17:15:18,796
before we were returning double because
22932
17:15:16,720 --> 17:15:21,116
that's what the compiler was deducing
22933
17:15:18,796 --> 17:15:24,000
for a and b here to really drive the
22934
17:15:21,116 --> 17:15:27,756
point home let's assign this lambda
22935
17:15:24,000 --> 17:15:30,239
function to func one or func three let's
22936
17:15:27,756 --> 17:15:32,000
do that we're going to say func three
22937
17:15:30,239 --> 17:15:35,519
and this is a lambda function that is
22938
17:15:32,000 --> 17:15:36,955
going to explicitly return and and we're
22939
17:15:35,519 --> 17:15:38,955
going to set up another one which is
22940
17:15:36,955 --> 17:15:40,720
going to deduce the return type we're
22941
17:15:40,720 --> 17:15:45,595
the return type explicitly so we're
22942
17:15:42,955 --> 17:15:46,879
going to take out our return type here
22943
17:15:46,879 --> 17:15:53,115
and we're going to go down and say auto
22944
17:15:49,199 --> 17:15:56,239
result 3 and we're going to say funk 3
22945
17:15:53,116 --> 17:15:58,480
and add up two double variables let's
22946
17:15:56,239 --> 17:16:00,479
set up these variables explicitly so
22947
17:15:58,480 --> 17:16:03,116
that you really see what is happening so
22948
17:16:00,480 --> 17:16:05,276
we're going to say it a and put in
22949
17:16:05,275 --> 17:16:10,159
why not and let's make this guy a double
22950
17:16:08,080 --> 17:16:12,240
because that's what our function here
22951
17:16:10,160 --> 17:16:14,956
expects and we're going to do another
22952
17:16:12,239 --> 17:16:17,839
one do double b and we're going to put
22953
17:16:17,839 --> 17:16:22,479
for example and we are going to use this
22954
17:16:20,559 --> 17:16:24,559
variables as arguments here we're going
22955
17:16:22,480 --> 17:16:26,480
to say a and b and we're going to say
22956
17:16:27,275 --> 17:16:32,879
this should be funk 4 sorry for this
22957
17:16:30,635 --> 17:16:36,080
and i'm going to say result 4 and this
22958
17:16:32,879 --> 17:16:38,239
should say result i am making many typos
22959
17:16:36,080 --> 17:16:41,040
so we're going to assign our lambda
22960
17:16:38,239 --> 17:16:44,479
function the result of our lambda
22961
17:16:41,040 --> 17:16:46,160
function i should say to result for here
22962
17:16:47,595 --> 17:16:53,839
now we want to see the types of result 3
22963
17:16:50,955 --> 17:16:55,519
and result 4 here we're going to go down
22964
17:16:53,839 --> 17:16:59,199
and print them out we're going to say
22965
17:16:55,519 --> 17:17:00,399
sddc out size of this is one way we have
22966
17:17:03,040 --> 17:17:07,595
we're going to pass in result three
22967
17:17:05,040 --> 17:17:09,915
we're going to say size of result three
22968
17:17:07,595 --> 17:17:13,199
and we're going to go down and say size
22969
17:17:09,915 --> 17:17:15,435
of result for okay we have our code in
22970
17:17:13,199 --> 17:17:18,795
place and what we want to see
22971
17:17:15,436 --> 17:17:22,720
is the type that is deduced by the func
22972
17:17:18,796 --> 17:17:25,040
3 lambda function here we are explicitly
22973
17:17:22,720 --> 17:17:26,955
turning the return type into end the
22974
17:17:25,040 --> 17:17:29,116
parameters we pass in are going to be
22975
17:17:26,955 --> 17:17:31,436
double that's what we have here we are
22976
17:17:29,116 --> 17:17:33,596
going to add up a and b and the result
22977
17:17:31,436 --> 17:17:35,596
of this is also going to be double but
22978
17:17:33,595 --> 17:17:39,115
the compiler is going to notice that we
22979
17:17:35,595 --> 17:17:41,756
are returning and explicitly here and it
22980
17:17:39,116 --> 17:17:44,635
is going to take this double result and
22981
17:17:41,756 --> 17:17:45,436
transform that to end and we're going to
22982
17:17:45,436 --> 17:17:49,756
and we're going to get the result of
22983
17:17:47,040 --> 17:17:52,160
that assigned to func 3 here for the
22984
17:17:49,756 --> 17:17:54,635
second lambda function here we are going
22985
17:17:52,160 --> 17:17:57,276
to automatically deduce the return type
22986
17:17:54,635 --> 17:17:59,680
so what we return here is going to be
22987
17:17:57,275 --> 17:18:02,479
a double type and we should see a size
22988
17:17:59,680 --> 17:18:06,000
of it for research 3 here printed out so
22989
17:18:02,480 --> 17:18:08,400
we should see a 4 on my system and for
22990
17:18:06,000 --> 17:18:10,796
the second statement here we should see
22991
17:18:08,400 --> 17:18:13,436
a size of double printed out this is one
22992
17:18:10,796 --> 17:18:15,520
way we have to try and prove this so
22993
17:18:13,436 --> 17:18:17,756
let's build this program and see what we
22994
17:18:15,519 --> 17:18:20,079
get okay the world is good we can clear
22995
17:18:17,756 --> 17:18:23,200
and run rooster and we're going to see
22996
17:18:20,080 --> 17:18:25,840
that this is exactly what we expect here
22997
17:18:23,199 --> 17:18:28,479
if we want we can even print result 3
22998
17:18:25,839 --> 17:18:31,359
and result 4 and see what we get so
22999
17:18:28,480 --> 17:18:32,956
let's do that we are learning so let's
23000
17:18:31,360 --> 17:18:36,000
experiment with this a little bit we're
23001
17:18:32,955 --> 17:18:39,519
going to say result 3 and we should go
23002
17:18:36,000 --> 17:18:42,000
back and say result three if i can type
23003
17:18:39,519 --> 17:18:45,680
e and dl here and we're going to go down
23004
17:18:42,000 --> 17:18:47,199
and say sddc out result for okay if we
23005
17:18:47,199 --> 17:18:52,079
we're going to see the results printed
23006
17:18:49,519 --> 17:18:53,519
down the both is good we can clear and
23007
17:18:53,519 --> 17:18:59,595
now we have result is 10 for the
23008
17:18:59,595 --> 17:19:05,915
first lambda function and for the second
23009
17:19:02,239 --> 17:19:08,955
one result is 10.4 you can see that for
23010
17:19:05,915 --> 17:19:11,275
the first one the result was transformed
23011
17:19:08,955 --> 17:19:13,436
from double to and and for the second
23012
17:19:11,275 --> 17:19:16,159
one we deduced double so we still have
23013
17:19:13,436 --> 17:19:18,160
our decimal point here hopefully this
23014
17:19:16,160 --> 17:19:20,880
makes sense and this is really all we
23015
17:19:18,160 --> 17:19:22,720
set out to do in this lecture showing
23016
17:19:20,879 --> 17:19:25,040
you different ways you can set up your
23017
17:19:22,720 --> 17:19:27,275
lambda functions we saw the syntax of
23018
17:19:25,040 --> 17:19:29,275
setting up a lambda function we saw that
23019
17:19:27,275 --> 17:19:32,000
you can declare a lambda function and
23020
17:19:29,275 --> 17:19:34,159
call it through a name like func here we
23021
17:19:32,000 --> 17:19:36,160
went down and so that you can declare a
23022
17:19:34,160 --> 17:19:38,160
lambda function and call it directly
23023
17:19:36,160 --> 17:19:40,480
through the syntax you see here we saw
23024
17:19:38,160 --> 17:19:42,956
that how we could specify parameters to
23025
17:19:40,480 --> 17:19:44,400
our lambda function this is the syntax
23026
17:19:42,955 --> 17:19:46,239
and once you do this you have to
23027
17:19:44,400 --> 17:19:48,955
remember to call your lambda functions
23028
17:19:46,239 --> 17:19:52,159
with parameters like we see here we can
23029
17:19:48,955 --> 17:19:54,720
even use a handle given to our lambda
23030
17:19:52,160 --> 17:19:57,200
function and call our lambda function
23031
17:19:54,720 --> 17:19:59,040
multiple times after that we saw that we
23032
17:19:57,199 --> 17:20:01,275
could return something from a lambda
23033
17:19:59,040 --> 17:20:02,239
function and we had many chances to play
23034
17:20:03,436 --> 17:20:09,116
finished by looking how we could specify
23035
17:20:06,080 --> 17:20:12,160
the return type explicitly and the
23036
17:20:09,116 --> 17:20:13,756
syntax to do that is what you see here
23037
17:20:12,160 --> 17:20:15,596
we are going to stop here in this
23038
17:20:13,756 --> 17:20:18,720
lecture the next one we're going to see
23039
17:20:15,595 --> 17:20:21,756
how we can use our capture lists here
23040
17:20:18,720 --> 17:20:23,595
and make them do useful things
23041
17:20:25,436 --> 17:20:30,080
in this lecture we're going to see how
23042
17:20:26,955 --> 17:20:32,879
we can use capture lists in our lambda
23043
17:20:30,080 --> 17:20:35,680
functions and do some useful things we
23044
17:20:32,879 --> 17:20:38,239
have seen that the syntax of our lambda
23045
17:20:35,680 --> 17:20:40,720
functions includes these angle brackets
23046
17:20:38,239 --> 17:20:43,275
here but we haven't really used them to
23047
17:20:40,720 --> 17:20:45,840
do anything for what we have done in the
23048
17:20:43,275 --> 17:20:48,159
last lecture they were empty all the
23049
17:20:45,839 --> 17:20:50,399
time in this lecture we're going to use
23050
17:20:48,160 --> 17:20:52,636
them here is a simple example of how we
23051
17:20:52,635 --> 17:20:57,116
we have two variables a and b they are
23052
17:20:55,116 --> 17:21:00,240
of double type and they contain these
23053
17:20:57,116 --> 17:21:02,796
values 10 and 20. but sometimes we want
23054
17:21:00,239 --> 17:21:04,319
to use thanks outside the scope of the
23055
17:21:04,319 --> 17:21:08,635
inside the lambda function here and if
23056
17:21:06,635 --> 17:21:10,635
you set up your lambda function with an
23057
17:21:08,635 --> 17:21:12,635
empty capture list suppose you don't
23058
17:21:12,635 --> 17:21:16,635
and you try to use a and b like this
23059
17:21:14,796 --> 17:21:17,840
you're going to get a compiler error
23060
17:21:17,839 --> 17:21:24,795
the body of the lambda function doesn't
23061
17:21:20,955 --> 17:21:27,275
have access to the outer context here it
23062
17:21:24,796 --> 17:21:29,840
can only use things inside the lambda
23063
17:21:27,275 --> 17:21:32,159
functions or events that you pass to the
23064
17:21:29,839 --> 17:21:34,955
lambda function here but it can't
23065
17:21:32,160 --> 17:21:37,596
directly access things outside the
23066
17:21:34,955 --> 17:21:40,159
lambda functions and we can have access
23067
17:21:37,595 --> 17:21:42,635
to thanks that are declared and defined
23068
17:21:40,160 --> 17:21:44,880
outside the lambda function through our
23069
17:21:42,635 --> 17:21:47,756
capture list if you look here we are
23070
17:21:44,879 --> 17:21:49,519
saying a and b and this is the syntax we
23071
17:21:49,519 --> 17:21:55,435
these two variables a and b and have
23072
17:21:52,796 --> 17:21:57,596
access to them inside our lambda
23073
17:21:55,436 --> 17:22:00,160
function here and this is what capture
23074
17:21:57,595 --> 17:22:03,435
lists are really for giving you access
23075
17:22:00,160 --> 17:22:05,436
to things that are declared outside the
23076
17:22:03,436 --> 17:22:08,000
scope of the lambda function because if
23077
17:22:05,436 --> 17:22:11,040
you really think about it this lambda
23078
17:22:08,000 --> 17:22:12,239
function thing we have here is really a
23079
17:22:14,400 --> 17:22:19,360
that has these behaviors well then so
23080
17:22:16,955 --> 17:22:21,839
that we can call it and do things but it
23081
17:22:19,360 --> 17:22:23,116
doesn't really have direct access to the
23082
17:22:23,116 --> 17:22:27,436
where it was declared and you have to
23083
17:22:25,275 --> 17:22:29,519
give it access through the capture
23084
17:22:27,436 --> 17:22:31,116
mechanism here okay now that you know
23085
17:22:29,519 --> 17:22:33,595
this we're going to see different ways
23086
17:22:31,116 --> 17:22:36,160
we can use the capture mechanism one
23087
17:22:33,595 --> 17:22:38,079
thing we can do is capture by value and
23088
17:22:36,160 --> 17:22:40,720
if we capture by value what we're going
23089
17:22:38,080 --> 17:22:42,635
to have inside the lambda function is
23090
17:22:40,720 --> 17:22:44,955
going to be a copy suppose we have a
23091
17:22:42,635 --> 17:22:47,519
variable here which is c the value is
23092
17:22:44,955 --> 17:22:49,275
going to be 42 as you see here we're
23093
17:22:47,519 --> 17:22:51,755
going to set up a lambda function and
23094
17:22:51,756 --> 17:22:56,480
by value in this lambda function here
23095
17:22:54,480 --> 17:22:58,160
and what we're going to do outside the
23096
17:22:56,480 --> 17:23:00,400
lambda function notice the lambda
23097
17:22:58,160 --> 17:23:02,400
function has a handle so we can call it
23098
17:23:00,400 --> 17:23:04,480
we're going to loop five times
23099
17:23:02,400 --> 17:23:07,116
and at each iteration we're going to
23100
17:23:04,480 --> 17:23:08,480
call our lambda function and print the
23101
17:23:08,480 --> 17:23:12,636
but after that we're going to increment
23102
17:23:10,400 --> 17:23:14,239
our c variable and this is going to
23103
17:23:14,239 --> 17:23:19,040
outer variable here and what we want to
23104
17:23:16,796 --> 17:23:21,756
see is that the changes we are doing on
23105
17:23:19,040 --> 17:23:23,840
the outside here are picked up by the
23106
17:23:21,756 --> 17:23:26,400
inner value that we have in our lambda
23107
17:23:23,839 --> 17:23:28,635
function here and ahead to break it to
23108
17:23:26,400 --> 17:23:30,720
you this is going to not be the case
23109
17:23:28,635 --> 17:23:33,436
because what we have inside the lambda
23110
17:23:30,720 --> 17:23:35,200
function is a copy of the outside
23111
17:23:33,436 --> 17:23:38,000
variable here so what we're going to
23112
17:23:35,199 --> 17:23:40,399
have is for the outer value to go from
23113
17:23:38,000 --> 17:23:42,955
42 all the way to 47 we're going to go
23114
17:23:40,400 --> 17:23:45,360
five times incrementing this little guy
23115
17:23:42,955 --> 17:23:47,595
but the thing on the inside is not going
23116
17:23:45,360 --> 17:23:50,160
to change because it is a copy the
23117
17:23:47,595 --> 17:23:52,795
incrementation here is affecting the
23118
17:23:50,160 --> 17:23:55,116
outside variable here but it is not
23119
17:23:52,796 --> 17:23:57,680
affecting the copy we have inside our
23120
17:23:55,116 --> 17:24:00,240
lambda function so for all these loops
23121
17:23:57,680 --> 17:24:02,000
here we're going to see 42 print it down
23122
17:24:00,239 --> 17:24:04,159
and we're going to see this in a minute
23123
17:24:02,000 --> 17:24:06,080
when we hit visual studio code let's say
23124
17:24:06,080 --> 17:24:10,635
excuse my typing here okay so now you
23125
17:24:08,480 --> 17:24:12,796
know that we can capture by a value and
23126
17:24:10,635 --> 17:24:15,595
you know what this really means another
23127
17:24:12,796 --> 17:24:18,160
thing we can do is capture by reference
23128
17:24:15,595 --> 17:24:20,955
and the syntax to do that is to add an
23129
17:24:18,160 --> 17:24:22,956
ampersand symbol in front of the
23130
17:24:20,955 --> 17:24:25,519
variable that we capture here and if we
23131
17:24:22,955 --> 17:24:27,915
do this and run the semicolon we run in
23132
17:24:25,519 --> 17:24:30,635
the last lecture we're going to see now
23133
17:24:27,915 --> 17:24:32,719
that the changes we do on the outside
23134
17:24:30,635 --> 17:24:35,595
are going to be picked up by the inner
23135
17:24:32,720 --> 17:24:38,319
side of our lambda function because we
23136
17:24:35,595 --> 17:24:41,115
are capturing by reference what we have
23137
17:24:38,319 --> 17:24:43,756
inside our lambda function here is a
23138
17:24:41,116 --> 17:24:45,360
true reference to the outside the
23139
17:24:43,756 --> 17:24:48,319
variable here and we're going to see
23140
17:24:45,360 --> 17:24:50,400
that now the outside and the inside are
23141
17:24:48,319 --> 17:24:53,519
going to be incrementing together and
23142
17:24:50,400 --> 17:24:55,840
we're going to have 43 42 44 and things
23143
17:24:53,519 --> 17:24:57,755
like that printed out on the console
23144
17:24:55,839 --> 17:24:59,915
okay this is really all i have to share
23145
17:24:57,756 --> 17:25:02,480
with you in this lecture showing you how
23146
17:24:59,915 --> 17:25:04,795
you can use your capture lists and that
23147
17:25:02,480 --> 17:25:06,880
you can capture either by value or by
23148
17:25:04,796 --> 17:25:08,635
reference we're going to head over to
23149
17:25:06,879 --> 17:25:11,199
visual studio code and play with this a
23150
17:25:08,635 --> 17:25:13,436
little more okay here we are in our
23151
17:25:11,199 --> 17:25:16,159
working folder the current project is
23152
17:25:13,436 --> 17:25:18,080
capture lists we're going to grab our
23153
17:25:16,160 --> 17:25:19,756
template files pretty quick and we're
23154
17:25:18,080 --> 17:25:20,635
going to put them in place we're going
23155
17:25:20,635 --> 17:25:25,199
put them in the current project and
23156
17:25:23,116 --> 17:25:27,596
we're going to open this guy in visual
23157
17:25:25,199 --> 17:25:29,839
studio code by dragging and dropping in
23158
17:25:27,595 --> 17:25:33,360
place here and we're going to open our
23159
17:25:29,839 --> 17:25:35,519
main cpp file clean it up a little bit
23160
17:25:33,360 --> 17:25:38,160
and close the left pane here what we
23161
17:25:35,519 --> 17:25:40,239
want to do in here is uh learn a little
23162
17:25:38,160 --> 17:25:42,880
more about capture lists and we're going
23163
17:25:40,239 --> 17:25:46,400
to put in a piece of code to play with
23164
17:25:42,879 --> 17:25:49,435
just that we have two variables a and 10
23165
17:25:46,400 --> 17:25:51,436
here and we have our lambda function
23166
17:25:49,436 --> 17:25:53,436
setup and let's take out our capture
23167
17:25:51,436 --> 17:25:54,720
list so that you can see the compiler
23168
17:25:54,720 --> 17:25:59,595
if we try to use them as is here so we
23169
17:25:57,680 --> 17:26:02,635
have our two variables and we have a
23170
17:25:59,595 --> 17:26:05,199
lambda function set up here and inside
23171
17:26:02,635 --> 17:26:08,080
the lambda function notice that we are
23172
17:26:05,199 --> 17:26:10,239
trying to access the variables that have
23173
17:26:08,080 --> 17:26:12,635
been declared on the outside of the
23174
17:26:10,239 --> 17:26:14,239
lambda function here and by default if
23175
17:26:12,635 --> 17:26:16,239
we try to do this we're going to get a
23176
17:26:14,239 --> 17:26:19,199
compiler error because these two
23177
17:26:16,239 --> 17:26:21,199
variables don't exist in the scope of
23178
17:26:19,199 --> 17:26:23,839
the lambda function here let's bring up
23179
17:26:21,199 --> 17:26:25,755
a terminal and see what visual studio
23180
17:26:25,756 --> 17:26:30,160
and it is going to say an enclosing
23181
17:26:27,680 --> 17:26:31,915
function local variable cannot be
23182
17:26:31,915 --> 17:26:36,795
lambda body unless it is in the capture
23183
17:26:35,040 --> 17:26:39,360
list and you see that this is really
23184
17:26:36,796 --> 17:26:41,200
descriptive okay we have sent this error
23185
17:26:39,360 --> 17:26:43,520
but we want to see what the compiler
23186
17:26:41,199 --> 17:26:46,719
says about this we're going to pass this
23187
17:26:43,519 --> 17:26:49,359
through gcc and we should get a similar
23188
17:26:46,720 --> 17:26:52,000
error it is going to say a is not
23189
17:26:49,360 --> 17:26:55,116
captured and it is going to go down here
23190
17:26:52,000 --> 17:26:57,360
and say b is not captured here and this
23191
17:26:55,116 --> 17:27:00,560
is the error we are trying to use
23192
17:26:57,360 --> 17:27:02,720
outside variables in our lambda function
23193
17:27:00,559 --> 17:27:03,839
but to really do that we need to capture
23194
17:27:03,839 --> 17:27:09,359
and the syntax to capture our variables
23195
17:27:06,160 --> 17:27:12,480
is to put them inside our angle brackets
23196
17:27:09,360 --> 17:27:14,635
here with a comma separate to the list
23197
17:27:12,480 --> 17:27:16,956
of the variables that we want to capture
23198
17:27:14,635 --> 17:27:19,199
so we're going to say a comma b because
23199
17:27:16,955 --> 17:27:20,955
that's what we want to capture here and
23200
17:27:20,955 --> 17:27:24,720
visual studio code should be happy it is
23201
17:27:22,879 --> 17:27:27,915
not happy i think we need to compile
23202
17:27:24,720 --> 17:27:29,275
this for it to be happy so let's do that
23203
17:27:29,275 --> 17:27:35,115
our variables are being captured and we
23204
17:27:32,239 --> 17:27:38,400
are summing them up and we are printing
23205
17:27:35,116 --> 17:27:41,200
the result of adding them up here by
23206
17:27:38,400 --> 17:27:43,200
calling the function through a handle we
23207
17:27:41,199 --> 17:27:45,435
have set up here hopefully this is
23208
17:27:43,199 --> 17:27:46,879
really making sense let's build the
23209
17:27:49,275 --> 17:27:53,519
you're going to see that the world is
23210
17:27:50,720 --> 17:27:57,916
good we can clear and run rooster we
23211
17:27:53,519 --> 17:28:01,039
should see a plus b is 30 but the values
23212
17:27:57,915 --> 17:28:03,199
are getting inside the lambda function
23213
17:28:01,040 --> 17:28:06,080
through our capture list they are not
23214
17:28:03,199 --> 17:28:08,079
going through the parameter list here
23215
17:28:06,080 --> 17:28:09,276
this is really something you need to be
23216
17:28:09,275 --> 17:28:15,199
now that you know how capture lists work
23217
17:28:12,635 --> 17:28:17,436
let's see that you can capture either by
23218
17:28:15,199 --> 17:28:20,000
value or by reference and we're going to
23219
17:28:17,436 --> 17:28:22,160
see what that means exactly i am going
23220
17:28:20,000 --> 17:28:24,879
to go down here and put in a piece of
23221
17:28:22,160 --> 17:28:27,276
code to play with capturing by value
23222
17:28:24,879 --> 17:28:30,079
okay let's do that we have a variable
23223
17:28:30,080 --> 17:28:34,080
and we set up a lambda function which is
23224
17:28:34,080 --> 17:28:38,480
with this syntax here and this is the
23225
17:28:38,480 --> 17:28:43,200
like we did on top here so we are going
23226
17:28:40,879 --> 17:28:44,719
to be capturing like this and if we do
23227
17:28:43,199 --> 17:28:46,719
this we're going to be capturing by
23228
17:28:44,720 --> 17:28:49,275
value the meaning of that is that what
23229
17:28:46,720 --> 17:28:51,595
we have inside our lambda function is
23230
17:28:49,275 --> 17:28:54,079
not going to be the original value here
23231
17:28:51,595 --> 17:28:55,115
it is going to be a copy of what we have
23232
17:28:55,116 --> 17:29:00,319
what we can do here is use this thing in
23233
17:28:57,839 --> 17:29:02,795
a loop and really prove this
23234
17:29:00,319 --> 17:29:05,199
so we're going to loop five times from
23235
17:29:02,796 --> 17:29:08,000
zero all the way to four because this is
23236
17:29:05,199 --> 17:29:09,275
going to go until i is no longer less
23237
17:29:09,275 --> 17:29:13,115
and inside we're going to print the
23238
17:29:11,040 --> 17:29:15,040
outer value which is going to be
23239
17:29:13,116 --> 17:29:17,116
the c here after that we're going to
23240
17:29:15,040 --> 17:29:18,955
call our lambda function which is going
23241
17:29:17,116 --> 17:29:21,200
to predict the inner value in the lambda
23242
17:29:18,955 --> 17:29:23,915
function and we're going to see that the
23243
17:29:21,199 --> 17:29:26,000
incrementation we do on the outside
23244
17:29:23,915 --> 17:29:28,479
which is going to affect the outer value
23245
17:29:26,000 --> 17:29:30,720
here is going to be visible inside the
23246
17:29:28,480 --> 17:29:32,480
lambda function here and that's not
23247
17:29:30,720 --> 17:29:34,955
going to be the case the change we do
23248
17:29:32,480 --> 17:29:36,956
here is not going to be picked up by the
23249
17:29:34,955 --> 17:29:39,275
lambda function here because what we
23250
17:29:36,955 --> 17:29:41,595
have inside is a copy so what we're
23251
17:29:39,275 --> 17:29:46,000
going to see is for the outer value to
23252
17:29:41,595 --> 17:29:48,319
go from 42 43 43 45 and it is going to
23253
17:29:46,000 --> 17:29:51,116
go until we hit the end of this loop
23254
17:29:48,319 --> 17:29:53,519
here but the inside value is not going
23255
17:29:51,116 --> 17:29:56,400
to change because the change we do in
23256
17:29:53,519 --> 17:29:59,275
here is not going to affect the copy
23257
17:29:56,400 --> 17:30:01,436
that we have in our lambda function here
23258
17:29:59,275 --> 17:30:03,519
hopefully this makes sense and again if
23259
17:30:01,436 --> 17:30:04,400
you have a problem please make sure you
23260
17:30:05,756 --> 17:30:10,080
course platform and i will do the best i
23261
17:30:07,915 --> 17:30:12,399
can to help you out for now we're going
23262
17:30:10,080 --> 17:30:15,520
to build and run this program you see
23263
17:30:12,400 --> 17:30:17,756
the world is good so let's clear and run
23264
17:30:15,519 --> 17:30:21,595
rooster you're going to see outer value
23265
17:30:17,756 --> 17:30:25,520
is 43 outer value is 43 outer value is
23266
17:30:21,595 --> 17:30:28,879
44 outer value is 45 the outer value is
23267
17:30:25,519 --> 17:30:30,559
changing but the inner value is staying
23268
17:30:32,000 --> 17:30:36,879
hopefully this proves that the outer
23269
17:30:34,239 --> 17:30:39,199
value and the inner value are two
23270
17:30:36,879 --> 17:30:41,680
different things but we can even go
23271
17:30:39,199 --> 17:30:43,680
further and print the addresses of the
23272
17:30:41,680 --> 17:30:44,400
outer value and the inner value let's do
23273
17:30:44,400 --> 17:30:50,635
we're going to add that to our statement
23274
17:30:47,040 --> 17:30:53,040
here and say the address of this guy
23275
17:30:50,635 --> 17:30:55,915
so we're going to say address of outer
23276
17:30:53,040 --> 17:30:57,680
value or say address of inner value we
23277
17:30:57,680 --> 17:31:02,480
to really be descriptive in our terminal
23278
17:31:00,559 --> 17:31:03,519
here so we're going to say the address
23279
17:31:03,519 --> 17:31:08,159
and on the outer value we're going to
23280
17:31:05,595 --> 17:31:10,955
add another piece of information and say
23281
17:31:08,160 --> 17:31:13,360
address of outer value and we're going
23282
17:31:13,360 --> 17:31:17,680
and this is going to pick up the outer
23283
17:31:15,275 --> 17:31:20,635
value that we have here and this is
23284
17:31:17,680 --> 17:31:22,720
going to use the inner value we have in
23285
17:31:22,720 --> 17:31:27,520
let's try and work and hopefully these
23286
17:31:24,955 --> 17:31:29,756
two addresses the inner and outer
23287
17:31:27,519 --> 17:31:31,755
addresses are going to be different
23288
17:31:29,756 --> 17:31:34,720
that's what we want to see here and
23289
17:31:31,756 --> 17:31:37,200
really proving that what we have inside
23290
17:31:34,720 --> 17:31:40,080
the lambda function is a copy through
23291
17:31:37,199 --> 17:31:42,559
the capture mechanism so let's run the
23292
17:31:40,080 --> 17:31:45,360
program the world was good so the outer
23293
17:31:42,559 --> 17:31:48,635
value the address is the e4 the inner
23294
17:31:45,360 --> 17:31:50,720
value the address is de0 we are proving
23295
17:31:48,635 --> 17:31:54,000
that what we have inside our lambda
23296
17:31:50,720 --> 17:31:56,796
function is really a copy so this is how
23297
17:31:54,000 --> 17:31:58,955
you can capture by value and that's
23298
17:31:56,796 --> 17:32:00,956
going to make a copy but sometimes you
23299
17:31:58,955 --> 17:32:02,720
really want to capture by reference and
23300
17:32:00,955 --> 17:32:05,116
we're going to see how you can do that
23301
17:32:02,720 --> 17:32:07,040
so we're going to comment out the code
23302
17:32:05,116 --> 17:32:09,756
to capture by value here we're going to
23303
17:32:07,040 --> 17:32:11,915
grab the code and reuse it because
23304
17:32:09,756 --> 17:32:14,080
that's going to be very similar to what
23305
17:32:11,915 --> 17:32:16,319
we had before we're going to say capture
23306
17:32:14,080 --> 17:32:18,635
by reference we're going to put in our
23307
17:32:16,319 --> 17:32:21,199
code and we're going to change it a tiny
23308
17:32:18,635 --> 17:32:22,955
bit what we're going to do is add an
23309
17:32:22,955 --> 17:32:27,915
in front of our variable here that we
23310
17:32:25,756 --> 17:32:29,116
are capturing and we're going to say
23311
17:32:29,116 --> 17:32:34,240
the moment we do this what we have
23312
17:32:31,595 --> 17:32:37,040
inside the lambda function is no longer
23313
17:32:34,239 --> 17:32:40,239
a copy it's going to be a true reference
23314
17:32:37,040 --> 17:32:43,360
to the outer value here and now the
23315
17:32:40,239 --> 17:32:45,360
changes we do to our outer value are
23316
17:32:43,360 --> 17:32:47,116
going to be visible inside the lambda
23317
17:32:45,360 --> 17:32:49,595
function here and you're going to see
23318
17:32:47,116 --> 17:32:51,840
the addresses to be the same
23319
17:32:49,595 --> 17:32:54,720
let's build and really see this we're
23320
17:32:51,839 --> 17:32:57,199
going to use gcc to build our program
23321
17:32:54,720 --> 17:32:59,595
the world is good we can clear now and
23322
17:32:57,199 --> 17:33:02,719
run rooster and we're going to see that
23323
17:32:59,595 --> 17:33:05,435
the outer value let's make sure we have
23324
17:33:02,720 --> 17:33:08,080
some spaces after these guys and let's
23325
17:33:05,436 --> 17:33:10,080
go up and do that and both again because
23326
17:33:08,080 --> 17:33:11,436
things are really cramped together and i
23327
17:33:11,436 --> 17:33:14,880
so the boost is good we can clear and
23328
17:33:14,879 --> 17:33:18,559
so we're going to see the outer value
23329
17:33:16,720 --> 17:33:21,436
and the inner value are changing
23330
17:33:18,559 --> 17:33:22,399
together and the addresses are now the
23331
17:33:22,400 --> 17:33:27,840
because we have captured by reference
23332
17:33:25,275 --> 17:33:30,319
the inner value and the outer value are
23333
17:33:27,839 --> 17:33:32,795
referencing the same variable we have
23334
17:33:30,319 --> 17:33:34,559
outside here this is really all we set
23335
17:33:32,796 --> 17:33:37,116
out to do in this lecture i hope you
23336
17:33:34,559 --> 17:33:39,595
found it interesting the main idea was
23337
17:33:37,116 --> 17:33:42,080
the capture mechanism we have with our
23338
17:33:39,595 --> 17:33:45,199
lambda functions to capture thanks
23339
17:33:42,080 --> 17:33:47,756
outside the context of lambda functions
23340
17:33:45,199 --> 17:33:50,000
we can capture by specifying a comma
23341
17:33:47,756 --> 17:33:52,239
separate to the list of the variables
23342
17:33:50,000 --> 17:33:54,879
that we want to capture and we have the
23343
17:33:52,239 --> 17:33:55,915
option to either capture by value by
23344
17:33:55,915 --> 17:34:01,199
the variable directly in the capture
23345
17:33:57,915 --> 17:34:03,755
list like we do here or by prepending an
23346
17:34:01,199 --> 17:34:05,915
ampersand symbol here and capture by
23347
17:34:03,756 --> 17:34:07,916
reference and you are going to have to
23348
17:34:05,915 --> 17:34:10,479
choose whichever way you want to capture
23349
17:34:07,915 --> 17:34:12,319
your variables now that you know about
23350
17:34:12,319 --> 17:34:15,680
we are going to stop here in this
23351
17:34:13,915 --> 17:34:18,319
lecture in the next one we're going to
23352
17:34:15,680 --> 17:34:20,480
see how we can capture everything from
23353
17:34:18,319 --> 17:34:21,595
the outside context to the lambda
23354
17:34:23,519 --> 17:34:28,319
and meet me there in the last lecture we
23355
17:34:25,756 --> 17:34:31,040
saw that we could capture things outside
23356
17:34:28,319 --> 17:34:32,720
the context of the lambda function now
23357
17:34:31,040 --> 17:34:36,319
we want to see that we can capture
23358
17:34:32,720 --> 17:34:38,480
everything living outside the context of
23359
17:34:36,319 --> 17:34:41,275
the lambda function the syntax to do
23360
17:34:38,480 --> 17:34:44,560
that is ridiculously simple if you want
23361
17:34:41,275 --> 17:34:46,720
to capture everything by value you just
23362
17:34:44,559 --> 17:34:48,879
put an equal sign in your lambda
23363
17:34:46,720 --> 17:34:50,880
function capture list and if you do
23364
17:34:48,879 --> 17:34:53,360
something like this now you're going to
23365
17:34:50,879 --> 17:34:55,435
have access to everything outside the
23366
17:34:53,360 --> 17:34:57,680
scope of the lambda function for example
23367
17:34:55,436 --> 17:35:00,400
we can access the c variable here from
23368
17:34:57,680 --> 17:35:02,955
the lambda function but if we have any
23369
17:35:00,400 --> 17:35:05,040
more variables declared outside the
23370
17:35:02,955 --> 17:35:08,319
scope of the lambda function we will
23371
17:35:05,040 --> 17:35:11,595
have access to them inside our lambda
23372
17:35:08,319 --> 17:35:14,319
function here again this is enabled by
23373
17:35:11,595 --> 17:35:17,040
the syntax that we use here by putting
23374
17:35:14,319 --> 17:35:19,360
an equal sign inside a lambda function
23375
17:35:17,040 --> 17:35:21,275
notice that if you use the equal sign
23376
17:35:19,360 --> 17:35:23,915
like we do here we're going to be
23377
17:35:21,275 --> 17:35:25,595
capturing by value what we have inside
23378
17:35:23,915 --> 17:35:28,399
the lambda function is going to be a
23379
17:35:25,595 --> 17:35:31,839
copy if you don't want to capture all by
23380
17:35:28,400 --> 17:35:34,400
value you can capture all by reference
23381
17:35:31,839 --> 17:35:37,039
and again the syntax is really simple
23382
17:35:34,400 --> 17:35:39,840
all you have to do is put an ampersand
23383
17:35:37,040 --> 17:35:41,436
symbol inside your capture list the
23384
17:35:39,839 --> 17:35:44,635
moment you do this you're going to have
23385
17:35:41,436 --> 17:35:47,040
access to everything outside the context
23386
17:35:44,635 --> 17:35:49,680
of your lambda function but that's going
23387
17:35:47,040 --> 17:35:51,756
to be by reference what you have inside
23388
17:35:49,680 --> 17:35:55,275
the lambda function are going to be true
23389
17:35:51,756 --> 17:35:58,796
references to the outside variables and
23390
17:35:55,275 --> 17:36:00,635
you can do pretty nasty things with them
23391
17:35:58,796 --> 17:36:02,720
because the changes you do inside the
23392
17:36:00,635 --> 17:36:05,519
lambda function are going to be visible
23393
17:36:02,720 --> 17:36:07,436
outside the lambda function and any
23394
17:36:05,519 --> 17:36:09,839
change you do from the outside is also
23395
17:36:07,436 --> 17:36:12,080
going to be visible inside the lambda
23396
17:36:09,839 --> 17:36:14,239
function so if you do this make sure
23397
17:36:12,080 --> 17:36:16,720
this is what you want and you can use
23398
17:36:14,239 --> 17:36:18,319
this to your advantage okay now that you
23399
17:36:16,720 --> 17:36:20,080
know this we're going to head over to
23400
17:36:18,319 --> 17:36:22,796
visual studio code and play with us a
23401
17:36:20,080 --> 17:36:25,040
little more okay here we are in our
23402
17:36:22,796 --> 17:36:28,080
working folder the current project is
23403
17:36:25,040 --> 17:36:31,360
capture all lists we're going to
23404
17:36:28,080 --> 17:36:33,436
grab our template files pretty quick and
23405
17:36:31,360 --> 17:36:35,436
we're going to put them in place and
23406
17:36:33,436 --> 17:36:37,840
we're going to open this little guy in
23407
17:36:35,436 --> 17:36:40,160
visual studio code let's do that we are
23408
17:36:37,839 --> 17:36:43,839
going to have our folder open we can
23409
17:36:40,160 --> 17:36:46,160
open our main cpp file clean it up like
23410
17:36:43,839 --> 17:36:48,000
we always do and we're going to close
23411
17:36:46,160 --> 17:36:50,320
the left pane here the first thing we
23412
17:36:48,000 --> 17:36:51,915
want to do is to capture everything by
23413
17:36:50,319 --> 17:36:54,400
value and we're going to put in the code
23414
17:36:51,915 --> 17:36:56,955
to do that which should be very easy to
23415
17:36:54,400 --> 17:36:59,840
understand by now and again the syntax
23416
17:36:56,955 --> 17:37:02,720
to capture everything by value is by
23417
17:36:59,839 --> 17:37:05,039
putting an equal sign within your
23418
17:37:02,720 --> 17:37:07,116
capture list you have to put that within
23419
17:37:05,040 --> 17:37:09,436
these angle brackets and that's going to
23420
17:37:07,116 --> 17:37:11,200
capture everything by value now now if
23421
17:37:09,436 --> 17:37:14,319
we run the program we're going to see
23422
17:37:11,199 --> 17:37:15,915
that c has been captured by value if we
23423
17:37:14,319 --> 17:37:17,839
look around we're going to see that the
23424
17:37:17,839 --> 17:37:22,879
change but the inner value is going to
23425
17:37:20,400 --> 17:37:24,796
stay the same this is the same behavior
23426
17:37:22,879 --> 17:37:26,795
we have seen before by capturing by
23427
17:37:24,796 --> 17:37:29,436
value so let's build again we're going
23428
17:37:26,796 --> 17:37:31,916
to build with gcc the world is good we
23429
17:37:29,436 --> 17:37:34,160
can clear and uh bring up a terminal so
23430
17:37:31,915 --> 17:37:37,115
that we can clear properly so let's do
23431
17:37:34,160 --> 17:37:39,436
clear and run rooster now we see that
23432
17:37:37,116 --> 17:37:42,796
the outer value is changing but the
23433
17:37:39,436 --> 17:37:46,160
inner value is not changing and again
23434
17:37:42,796 --> 17:37:48,796
this is classic capturing by value if
23435
17:37:46,160 --> 17:37:50,796
you want to capture all by reference
23436
17:37:48,796 --> 17:37:52,160
you're going to use the ampersand symbol
23437
17:37:50,796 --> 17:37:55,040
here and let's do that we're going to
23438
17:37:52,160 --> 17:37:57,360
comment this out and we're going to take
23439
17:37:57,360 --> 17:38:02,559
use the code here we can do that we're
23440
17:38:00,000 --> 17:38:05,360
going to go down and put in a code and
23441
17:38:02,559 --> 17:38:08,479
say that we are capturing by reference
23442
17:38:05,360 --> 17:38:11,199
we should say capturing all by reference
23443
17:38:08,480 --> 17:38:14,000
and all we have to do to make that work
23444
17:38:11,199 --> 17:38:17,519
by reference is to put our ampersand
23445
17:38:14,000 --> 17:38:19,199
symbol within this angle brackets here
23446
17:38:17,519 --> 17:38:21,359
and this is going to capture everything
23447
17:38:19,199 --> 17:38:23,039
by reference if we run now we're going
23448
17:38:21,360 --> 17:38:25,595
to see that the changes we do from the
23449
17:38:23,040 --> 17:38:26,955
outside are going to be visible from the
23450
17:38:26,955 --> 17:38:32,400
let's weld with gcc and see that this is
23451
17:38:29,756 --> 17:38:35,116
actually the case the bolt is good as
23452
17:38:32,400 --> 17:38:36,796
you see here we can clear and run the
23453
17:38:35,116 --> 17:38:40,400
rooster we're going to see that the
23454
17:38:36,796 --> 17:38:42,880
outer value is 42 the outer value is
23455
17:38:40,400 --> 17:38:46,480
changing and the inner value is changing
23456
17:38:42,879 --> 17:38:48,479
as you see in our output here and this
23457
17:38:46,480 --> 17:38:51,116
is really how you can capture
23458
17:38:48,480 --> 17:38:52,560
by reference just to play with this
23459
17:38:51,116 --> 17:38:55,756
we're going to set up another variable
23460
17:38:52,559 --> 17:38:58,239
call it d and we're going to say it
23461
17:38:55,756 --> 17:39:00,480
contains a 5 and we can try to print
23462
17:38:58,239 --> 17:39:02,000
that inside our inner value here and it
23463
17:39:00,480 --> 17:39:04,000
is going to work you're going to see
23464
17:39:02,000 --> 17:39:07,040
that it has been captured we can say
23465
17:39:04,000 --> 17:39:09,360
sddc out inner value let's say that it
23466
17:39:07,040 --> 17:39:12,080
is the d variable we are trying to
23467
17:39:09,360 --> 17:39:14,480
access here and we're going to say d and
23468
17:39:12,080 --> 17:39:16,635
it is going to be visible inside our
23469
17:39:14,480 --> 17:39:19,520
lambda function here because it was
23470
17:39:16,635 --> 17:39:22,479
captured by reference here let's build
23471
17:39:19,519 --> 17:39:24,955
again we're going to use gcc to do that
23472
17:39:22,480 --> 17:39:27,840
the bolt is good we can clear and if we
23473
17:39:24,955 --> 17:39:29,519
run booster we should see d printed out
23474
17:39:30,879 --> 17:39:36,399
d and we are able to access it through
23475
17:39:34,160 --> 17:39:39,200
the capture mechanism and we are
23476
17:39:36,400 --> 17:39:41,520
capturing everything in the context by
23477
17:39:39,199 --> 17:39:43,275
reference here this is really all we set
23478
17:39:41,519 --> 17:39:45,755
out to do in this lecture i hope you
23479
17:39:43,275 --> 17:39:48,559
found it interesting i hate to say it
23480
17:39:45,756 --> 17:39:50,955
but this happens to be the last lecture
23481
17:39:48,559 --> 17:39:53,199
in this chapter on lambda functions we
23482
17:39:50,955 --> 17:39:55,680
still have a lot to learn about lambda
23483
17:39:53,199 --> 17:39:57,755
functions but unfortunately we don't
23484
17:39:55,680 --> 17:39:59,840
really have enough tools to understand
23485
17:39:57,756 --> 17:40:01,436
that now but for now we're going to stop
23486
17:39:59,839 --> 17:40:03,435
here and learn a little more things
23487
17:40:01,436 --> 17:40:05,916
about c plus plus then we're going to
23488
17:40:03,436 --> 17:40:08,880
come back and see some crazy things you
23489
17:40:05,915 --> 17:40:10,719
can really do with lambda functions i
23490
17:40:08,879 --> 17:40:12,559
would like to welcome you in this new
23491
17:40:10,720 --> 17:40:14,955
chapter where we're going to be learning
23492
17:40:12,559 --> 17:40:18,000
about function templates function
23493
17:40:14,955 --> 17:40:21,595
templates are a mechanism we have in c
23494
17:40:18,000 --> 17:40:24,720
plus to set up blueprint for functions
23495
17:40:21,595 --> 17:40:26,559
and have one point of control to set up
23496
17:40:24,720 --> 17:40:28,720
the function but the compiler is going
23497
17:40:26,559 --> 17:40:31,275
to generate the actual function that
23498
17:40:28,720 --> 17:40:33,116
gets called when it sees the function
23499
17:40:31,275 --> 17:40:35,275
call so this is going to solve the
23500
17:40:33,116 --> 17:40:37,276
problem we had before with function
23501
17:40:35,275 --> 17:40:39,595
overloads if you look at the code here
23502
17:40:37,275 --> 17:40:42,400
we have multiple overloads for the
23503
17:40:39,595 --> 17:40:45,435
maximum function but what we really are
23504
17:40:42,400 --> 17:40:48,635
doing in the body of these functions
23505
17:40:45,436 --> 17:40:51,840
is the same and suppose you have
23506
17:40:48,635 --> 17:40:53,839
12 or 13 or 20 overloads of the same
23507
17:40:51,839 --> 17:40:56,319
function you're going to be basically
23508
17:40:53,839 --> 17:40:58,079
repeating the same logic in the bodies
23509
17:40:56,319 --> 17:41:00,955
of this function and this code
23510
17:40:58,080 --> 17:41:02,720
repetition is bad function templates are
23511
17:41:02,720 --> 17:41:06,955
solve problems like this the way they
23512
17:41:05,040 --> 17:41:09,520
work you set up a blueprint for your
23513
17:41:06,955 --> 17:41:12,080
function and this is the syntax to do
23514
17:41:09,519 --> 17:41:14,479
something like that you say template
23515
17:41:12,080 --> 17:41:16,000
type name t here don't worry about this
23516
17:41:14,480 --> 17:41:19,200
syntax we're going to have a chance to
23517
17:41:16,000 --> 17:41:21,436
go through it in detail but if you do
23518
17:41:19,199 --> 17:41:24,399
things like this this is going to be a
23519
17:41:21,436 --> 17:41:26,319
blueprint for your maximum function and
23520
17:41:24,400 --> 17:41:30,000
the compiler is going to use this
23521
17:41:26,319 --> 17:41:31,756
blueprint to generate an actual function
23522
17:41:30,000 --> 17:41:34,000
when you call this function and this is
23523
17:41:31,756 --> 17:41:36,160
going to make things super easy i
23524
17:41:34,000 --> 17:41:39,116
realized some of this is really cryptic
23525
17:41:36,160 --> 17:41:41,596
so let's head over to the next lecture
23526
17:41:39,116 --> 17:41:44,080
and let you set up your very first
23527
17:41:41,595 --> 17:41:46,635
function template go ahead and finish up
23528
17:41:44,080 --> 17:41:49,040
here and meet me there in this lecture
23529
17:41:46,635 --> 17:41:51,436
we're going to set up our very first
23530
17:41:49,040 --> 17:41:54,239
function template and again function
23531
17:41:51,436 --> 17:41:57,200
templates are a mechanism we have in c
23532
17:41:54,239 --> 17:42:00,000
plus plus to avoid code repetition for
23533
17:41:57,199 --> 17:42:02,879
example if you are setting up function
23534
17:42:00,000 --> 17:42:05,519
overloads if you look here we have our
23535
17:42:02,879 --> 17:42:07,680
max function and we have multiple
23536
17:42:05,519 --> 17:42:10,879
overloads for this function we can call
23537
17:42:07,680 --> 17:42:12,955
it with and double and string view here
23538
17:42:10,879 --> 17:42:15,680
but if you look inside you see that we
23539
17:42:12,955 --> 17:42:18,239
really are repeating the same logic
23540
17:42:15,680 --> 17:42:21,595
and it is even possible to have dozens
23541
17:42:18,239 --> 17:42:23,680
of overloads if you want to support tons
23542
17:42:23,680 --> 17:42:29,275
and this code repetition is really bad
23543
17:42:27,040 --> 17:42:32,000
function templates are a mechanism we
23544
17:42:29,275 --> 17:42:33,519
have in place to avoid things like this
23545
17:42:33,519 --> 17:42:38,559
you set up a function blueprint using
23546
17:42:36,160 --> 17:42:40,160
the syntax you see here and your
23547
17:42:38,559 --> 17:42:41,595
function template is going to be
23548
17:42:41,595 --> 17:42:46,795
with this template type name teeth and
23549
17:42:44,239 --> 17:42:48,559
here type name t is going to be in this
23550
17:42:48,559 --> 17:42:53,040
and then you're going to put the
23551
17:42:50,000 --> 17:42:55,436
blueprint for your function t is a
23552
17:42:53,040 --> 17:42:58,559
placeholder for the types that you use
23553
17:42:55,436 --> 17:43:01,436
in your function you see that t is in
23554
17:42:58,559 --> 17:43:03,756
the return type here it's in the
23555
17:43:01,436 --> 17:43:05,360
parameters that we pass to the function
23556
17:43:03,756 --> 17:43:07,436
and because it is the same character
23557
17:43:05,360 --> 17:43:09,275
here all these things have to be of the
23558
17:43:07,436 --> 17:43:11,680
same type the return type the first
23559
17:43:09,275 --> 17:43:14,400
parameter the second parameter they have
23560
17:43:11,680 --> 17:43:16,319
to be of the same type okay so once you
23561
17:43:14,400 --> 17:43:17,916
have your function template set up like
23562
17:43:16,319 --> 17:43:20,480
this you're going to implement it like
23563
17:43:17,915 --> 17:43:23,199
we see down below here it is nothing
23564
17:43:20,480 --> 17:43:25,116
complicated we just set up the prototype
23565
17:43:25,116 --> 17:43:30,240
and inside we put our implementation you
23566
17:43:27,680 --> 17:43:32,319
see here we have separated this into
23567
17:43:30,239 --> 17:43:34,795
function declaration and function
23568
17:43:32,319 --> 17:43:37,519
definition but inside you see that it is
23569
17:43:34,796 --> 17:43:39,916
the same logic we had to compute our
23570
17:43:37,519 --> 17:43:42,719
maximum between these two parameters
23571
17:43:39,915 --> 17:43:45,595
that we pass to this function
23572
17:43:42,720 --> 17:43:48,955
so how does this work when the compiler
23573
17:43:45,595 --> 17:43:51,915
sees you call this max function for
23574
17:43:48,955 --> 17:43:54,239
example as we are doing here it's going
23575
17:43:51,915 --> 17:43:56,795
to look at the types that you pass in
23576
17:43:56,796 --> 17:44:03,520
are of ant type so it is going to
23577
17:43:59,436 --> 17:44:05,840
replace the t in here for and and it is
23578
17:44:03,519 --> 17:44:06,879
going to generate a function initial
23579
17:44:06,879 --> 17:44:10,719
and this really brings up a big point
23580
17:44:08,879 --> 17:44:13,519
about function templates many people
23581
17:44:10,720 --> 17:44:16,160
think that function templates are actual
23582
17:44:13,519 --> 17:44:18,795
c plus plus code they're not they're
23583
17:44:16,160 --> 17:44:21,840
just a blueprint from which the compiler
23584
17:44:18,796 --> 17:44:23,596
is going to generate the actual function
23585
17:44:21,839 --> 17:44:26,559
that is called by the compiler for
23586
17:44:23,595 --> 17:44:27,435
example when you issue a call like this
23587
17:44:27,436 --> 17:44:32,720
function templates are not real c plus
23588
17:44:29,519 --> 17:44:35,039
plus code they are just a blueprint that
23589
17:44:32,720 --> 17:44:36,080
the compiler uses to generate your
23590
17:44:36,080 --> 17:44:40,720
based on the arguments you pass to the
23591
17:44:38,400 --> 17:44:43,275
function when you call it so when we
23592
17:44:40,720 --> 17:44:45,595
issue the call like we do here an int
23593
17:44:43,275 --> 17:44:47,680
version of our maximum function is going
23594
17:44:45,595 --> 17:44:50,559
to be created so the compiler is
23595
17:44:47,680 --> 17:44:52,796
basically going to go in and replace n
23596
17:44:50,559 --> 17:44:54,635
and for t here the return type is going
23597
17:44:52,796 --> 17:44:56,400
to be nt the first parameter is going to
23598
17:44:54,635 --> 17:44:57,680
be end the second parameter is going to
23599
17:44:56,400 --> 17:44:59,436
be empty it's going to go in the
23600
17:44:57,680 --> 17:45:01,436
definition it's going to do that and
23601
17:44:59,436 --> 17:45:04,239
we're going to have an it function
23602
17:45:01,436 --> 17:45:06,635
if we issue a call with c and d like we
23603
17:45:04,239 --> 17:45:09,199
do here in the second line here then the
23604
17:45:06,635 --> 17:45:11,436
compiler is going to see that c and d
23605
17:45:09,199 --> 17:45:13,360
are of double type so it is going to
23606
17:45:11,436 --> 17:45:14,955
generate another function from this
23607
17:45:13,360 --> 17:45:17,275
blueprint here and it is going to
23608
17:45:14,955 --> 17:45:19,595
replace in double then we're going to
23609
17:45:17,275 --> 17:45:21,040
have another double function if we go to
23610
17:45:19,595 --> 17:45:22,635
the third line here we're going to do
23611
17:45:21,040 --> 17:45:24,955
the same we're going to call it with
23612
17:45:22,635 --> 17:45:27,680
strengths and it is going to generate a
23613
17:45:24,955 --> 17:45:30,559
stringed version of the maximum function
23614
17:45:27,680 --> 17:45:33,040
here so what we achieve with function
23615
17:45:33,040 --> 17:45:37,520
several overloads for the same function
23616
17:45:35,360 --> 17:45:40,559
and we have one point of control in our
23617
17:45:37,519 --> 17:45:43,275
code but the compiler is still going to
23618
17:45:40,559 --> 17:45:45,275
generate this function overloads but one
23619
17:45:43,275 --> 17:45:47,436
thing about this is that if a function
23620
17:45:45,275 --> 17:45:50,479
is not used for example if you never
23621
17:45:47,436 --> 17:45:52,239
call a maximum function with string
23622
17:45:50,480 --> 17:45:54,636
then the string version is never going
23623
17:45:52,239 --> 17:45:57,275
to be created the compiler is going to
23624
17:45:54,635 --> 17:45:59,436
generate the overloads that you only
23625
17:45:57,275 --> 17:46:01,595
call in your c plus plus program and
23626
17:45:59,436 --> 17:46:04,160
this is really all function templates
23627
17:46:01,595 --> 17:46:06,319
are all about they give you a mechanism
23628
17:46:04,160 --> 17:46:07,840
to set up a blueprint for your function
23629
17:46:06,319 --> 17:46:11,116
and then the compiler is going to
23630
17:46:07,839 --> 17:46:13,359
generate actual functions based on what
23631
17:46:11,116 --> 17:46:14,796
you call in your c plus plus code okay
23632
17:46:13,360 --> 17:46:16,796
we have saved this but i want to
23633
17:46:16,796 --> 17:46:22,796
function templates are just blueprints
23634
17:46:19,595 --> 17:46:24,479
they're not real c plus plus could and
23635
17:46:22,796 --> 17:46:26,400
when we hit visual studio code in a
23636
17:46:24,480 --> 17:46:29,520
minute we're going to see a tool
23637
17:46:26,400 --> 17:46:32,480
that allows us to see how the compiler
23638
17:46:29,519 --> 17:46:35,115
instantiates your function templates
23639
17:46:32,480 --> 17:46:37,916
based on the arguments you call your
23640
17:46:35,116 --> 17:46:40,160
function with but keep this in mind
23641
17:46:37,915 --> 17:46:43,275
function templates are not real c plus
23642
17:46:40,160 --> 17:46:45,520
plus code the rio c plus plus functions
23643
17:46:43,275 --> 17:46:47,915
get generated by the compiler
23644
17:46:45,519 --> 17:46:50,635
when you call your function and another
23645
17:46:47,915 --> 17:46:53,680
thing i wanted to point out is that
23646
17:46:50,635 --> 17:46:55,680
once a function template instance is
23647
17:46:53,680 --> 17:46:59,275
generated for example the interversion
23648
17:46:55,680 --> 17:47:01,199
of our maximum function template then if
23649
17:46:59,275 --> 17:47:03,275
it is needed again the compiler is not
23650
17:47:01,199 --> 17:47:05,680
going to generate that again it's going
23651
17:47:03,275 --> 17:47:07,756
to see if there is one generator already
23652
17:47:05,680 --> 17:47:09,436
and it is going to reuse that okay this
23653
17:47:07,756 --> 17:47:11,916
is really all i have to share about
23654
17:47:09,436 --> 17:47:14,000
function templates at this point in this
23655
17:47:11,915 --> 17:47:15,915
chapter for now we're going to head over
23656
17:47:14,000 --> 17:47:18,796
to visual studio code and play with this
23657
17:47:15,915 --> 17:47:21,360
a little more okay here we are in our
23658
17:47:18,796 --> 17:47:23,116
working directory the current project is
23659
17:47:21,360 --> 17:47:25,915
trying out function templates we're
23660
17:47:23,116 --> 17:47:27,756
going to grab our template project and
23661
17:47:25,915 --> 17:47:30,319
one thing i should point out here is
23662
17:47:27,756 --> 17:47:34,080
that our template project has been now
23663
17:47:30,319 --> 17:47:36,000
updated to have the launch.json file
23664
17:47:34,080 --> 17:47:38,635
which is going to allow us to debug our
23665
17:47:36,000 --> 17:47:41,519
programs so you should use a template
23666
17:47:38,635 --> 17:47:43,275
that includes the launch.json file here
23667
17:47:41,519 --> 17:47:45,275
that's going to allow us to debug your
23668
17:47:43,275 --> 17:47:47,360
programs and we're going to do that in a
23669
17:47:45,275 --> 17:47:49,839
minute when we have set up the example
23670
17:47:47,360 --> 17:47:52,879
here so we're going to grab our template
23671
17:47:49,839 --> 17:47:54,955
files and put them in place and we're
23672
17:47:52,879 --> 17:47:57,519
going to open this little guy in visual
23673
17:47:54,955 --> 17:48:00,319
studio code by dragging and dropping on
23674
17:47:57,519 --> 17:48:02,319
top here this is going to do our job
23675
17:48:00,319 --> 17:48:04,400
then we're going to open up the main cpp
23676
17:48:02,319 --> 17:48:06,559
file and i think we should close the
23677
17:48:04,400 --> 17:48:07,916
left pane here we don't need it anymore
23678
17:48:06,559 --> 17:48:10,239
and we're going to clean this up a
23679
17:48:07,915 --> 17:48:12,399
little bit so one thing i want to do is
23680
17:48:10,239 --> 17:48:14,400
to first do things the bad way so we're
23681
17:48:12,400 --> 17:48:16,560
going to set up a max function
23682
17:48:16,559 --> 17:48:21,595
and it's going to take end parameters
23683
17:48:18,955 --> 17:48:23,436
and we're going to return the maximum
23684
17:48:21,595 --> 17:48:26,319
between a and b and the way we do that
23685
17:48:23,436 --> 17:48:28,160
we say a greater than b we are going to
23686
17:48:26,319 --> 17:48:29,680
use our ternary operator here we're
23687
17:48:28,160 --> 17:48:32,480
going to put a question mark we're going
23688
17:48:29,680 --> 17:48:34,796
to return a or b and this is going to be
23689
17:48:32,480 --> 17:48:38,000
our function but suppose we need another
23690
17:48:34,796 --> 17:48:40,240
function that works on doubles if we put
23691
17:48:38,000 --> 17:48:42,635
double arguments in here the compiler is
23692
17:48:40,239 --> 17:48:45,436
going to insert implicit conversions
23693
17:48:42,635 --> 17:48:48,879
from double to end this may seem to work
23694
17:48:45,436 --> 17:48:50,720
but suppose you use a parameter type
23695
17:48:48,879 --> 17:48:52,795
that is not convertible to end for
23696
17:48:50,720 --> 17:48:54,840
example you use a string or something
23697
17:48:54,839 --> 17:49:01,199
here just for an example so we're going
23698
17:49:04,400 --> 17:49:08,560
and we should make these const
23699
17:49:06,080 --> 17:49:11,360
references because we're not interested
23700
17:49:08,559 --> 17:49:13,435
in modifying these strings here
23701
17:49:13,436 --> 17:49:18,319
and we're going to say const std string
23702
17:49:16,160 --> 17:49:20,560
reference a this is much better it's
23703
17:49:18,319 --> 17:49:23,436
going to avoid unnecessary copies of
23704
17:49:20,559 --> 17:49:25,115
strings and we're going to say const htd
23705
17:49:25,116 --> 17:49:29,680
be here then inside we're not going to
23706
17:49:27,839 --> 17:49:32,399
do anything different we're just going
23707
17:49:29,680 --> 17:49:35,199
to use the same logic okay let's do that
23708
17:49:32,400 --> 17:49:38,560
suppose you have another function
23709
17:49:35,199 --> 17:49:41,435
which takes what should i say long long
23710
17:49:38,559 --> 17:49:44,795
end if we need that we need to copy this
23711
17:49:41,436 --> 17:49:46,480
function and put that in okay we need to
23712
17:49:44,796 --> 17:49:48,796
do that and we're going to change this
23713
17:49:46,480 --> 17:49:50,240
to long long end and we're going to do
23714
17:49:50,239 --> 17:49:55,915
long long and our parameter and we're
23715
17:49:53,360 --> 17:49:58,160
going to say the same here and you see
23716
17:49:55,915 --> 17:50:00,719
we are setting up a lot of functions
23717
17:49:58,160 --> 17:50:03,840
with basically the same thing inside and
23718
17:50:00,720 --> 17:50:06,635
that this is a lot of code copies
23719
17:50:03,839 --> 17:50:09,915
suppose we have this function maybe 20
23720
17:50:06,635 --> 17:50:12,319
times it is possible or even worse the
23721
17:50:09,915 --> 17:50:15,115
logic in this function is really long
23722
17:50:12,319 --> 17:50:17,680
maybe 20 or 30 lines and we will have to
23723
17:50:15,116 --> 17:50:19,596
repeat this thing in aku so the
23724
17:50:17,680 --> 17:50:22,319
designers of the c plus plus language
23725
17:50:19,595 --> 17:50:25,360
saw this problem and they said why don't
23726
17:50:22,319 --> 17:50:27,756
we set up a one point of control
23727
17:50:25,360 --> 17:50:31,360
where we can set up our logic to do the
23728
17:50:27,756 --> 17:50:32,720
maximum and we let the compiler generate
23729
17:50:32,720 --> 17:50:39,436
functions based on the arguments we call
23730
17:50:35,915 --> 17:50:41,040
our functions with and they came up with
23731
17:50:39,436 --> 17:50:42,400
function templates and that's what we're
23732
17:50:41,040 --> 17:50:44,160
going to see so we're going to take out
23733
17:50:42,400 --> 17:50:47,680
all the other functions and we're going
23734
17:50:44,160 --> 17:50:50,160
to turn this maximum and function into a
23735
17:50:47,680 --> 17:50:52,160
function template the syntax to do that
23736
17:50:52,160 --> 17:50:56,000
so we're going to say template this is
23737
17:50:54,000 --> 17:50:58,720
what you say you put an angle bracket
23738
17:50:56,000 --> 17:51:01,436
and you say type name and you specify
23739
17:50:58,720 --> 17:51:03,360
the placeholder for the type in this
23740
17:51:01,436 --> 17:51:04,720
angle brackets here this is the syntax
23741
17:51:04,720 --> 17:51:10,400
then you have to specify your function
23742
17:51:07,199 --> 17:51:12,879
in terms of this placeholder t it is
23743
17:51:10,400 --> 17:51:15,116
going to take the place of the type so
23744
17:51:12,879 --> 17:51:17,115
for example here we want to return and
23745
17:51:15,116 --> 17:51:19,436
we're going to change this to t and the
23746
17:51:17,116 --> 17:51:21,916
parameters are going to be taken by
23747
17:51:23,436 --> 17:51:28,560
and now we have a legal c plus plus
23748
17:51:26,319 --> 17:51:30,720
function template it is going to take
23749
17:51:28,559 --> 17:51:34,239
this template here and use it to
23750
17:51:30,720 --> 17:51:36,160
generate actual c plus plus functions so
23751
17:51:34,239 --> 17:51:39,595
for example if we go in the main
23752
17:51:36,160 --> 17:51:42,956
function here and say ent result
23753
17:51:39,595 --> 17:51:45,199
equals max maximum we should say and say
23754
17:51:42,955 --> 17:51:47,680
x and y for example let's create these
23755
17:51:45,199 --> 17:51:49,915
variables on top here so we're going to
23756
17:51:47,680 --> 17:51:52,319
say ent x and we're going to put in a
23757
17:51:49,915 --> 17:51:55,435
five and we're going to create a y and
23758
17:51:52,319 --> 17:51:57,360
put in a seven why not now this function
23759
17:51:55,436 --> 17:51:58,635
is going to store the result and print
23760
17:51:58,635 --> 17:52:02,479
let's do that so that we can see that
23761
17:52:00,796 --> 17:52:05,596
this actually works so we're going to
23762
17:52:02,480 --> 17:52:08,240
say result and say results this is going
23763
17:52:05,595 --> 17:52:10,399
to do and if we build and run this
23764
17:52:08,239 --> 17:52:11,915
program we're going to use gcc you're
23765
17:52:10,400 --> 17:52:13,040
going to see that the world is going to
23766
17:52:13,040 --> 17:52:18,796
and uh world finished successfully we
23767
17:52:15,519 --> 17:52:20,955
can run this program like we always do
23768
17:52:18,796 --> 17:52:23,276
let's bring up a terminal and clear a
23769
17:52:20,955 --> 17:52:24,635
little bit and run rooster you're going
23770
17:52:23,275 --> 17:52:27,199
to see that we're going to see that
23771
17:52:24,635 --> 17:52:29,839
result now is 7 because that's the
23772
17:52:27,199 --> 17:52:33,115
maximum you see it is working here so
23773
17:52:29,839 --> 17:52:34,879
how is this mechanism working here the
23774
17:52:33,116 --> 17:52:37,360
compiler is basically looking in the
23775
17:52:34,879 --> 17:52:39,755
main function here and it is noticing
23776
17:52:37,360 --> 17:52:43,040
the call and it is going to look around
23777
17:52:39,756 --> 17:52:44,796
and see if it can find a declaration for
23778
17:52:43,040 --> 17:52:47,360
the maximum function here it's not going
23779
17:52:44,796 --> 17:52:49,116
to find it because there is none then
23780
17:52:47,360 --> 17:52:51,275
it's going to look at the function
23781
17:52:49,116 --> 17:52:54,080
templates it has in here and it's going
23782
17:52:51,275 --> 17:52:56,400
to see that it can do a replacement and
23783
17:52:54,080 --> 17:52:58,560
replacing the types that we are passing
23784
17:52:56,400 --> 17:53:00,635
in here so it is going to do that it is
23785
17:52:58,559 --> 17:53:02,319
going to take this template and it is
23786
17:53:02,319 --> 17:53:08,239
t by end and then it is going to
23787
17:53:05,275 --> 17:53:10,319
generate a function that basically looks
23788
17:53:08,239 --> 17:53:13,115
like what we have here we're going to
23789
17:53:10,319 --> 17:53:14,720
copy this and we're going to put this in
23790
17:53:13,116 --> 17:53:16,400
the compiler is going to take the first
23791
17:53:14,720 --> 17:53:18,319
t here it's going to turn that into a
23792
17:53:16,400 --> 17:53:20,239
net it's going to take the second one
23793
17:53:18,319 --> 17:53:23,040
here it's going to turn that into an end
23794
17:53:20,239 --> 17:53:25,595
it's going to take the third one here
23795
17:53:23,040 --> 17:53:28,080
and turn that into an it and we're going
23796
17:53:25,595 --> 17:53:30,159
to have a function definition for the
23797
17:53:28,080 --> 17:53:31,360
call here this is what the compiler is
23798
17:53:31,360 --> 17:53:36,720
one thing some of you might be thinking
23799
17:53:33,915 --> 17:53:38,955
is there a way to really prove this and
23800
17:53:36,720 --> 17:53:39,916
somebody was nice enough to design a
23801
17:53:41,436 --> 17:53:46,720
this function or template instances
23802
17:53:44,319 --> 17:53:49,199
generated by the compiler and i happen
23803
17:53:46,720 --> 17:53:51,595
to have that opened it is a web-based
23804
17:53:49,199 --> 17:53:53,719
tool so you can use this in your browser
23805
17:53:55,275 --> 17:54:01,199
and then we're going to grab the code we
23806
17:53:57,360 --> 17:54:04,160
had in our main cpp file we're going to
23807
17:54:01,199 --> 17:54:07,360
copy it all and we're going to go back
23808
17:54:04,160 --> 17:54:09,040
to our browser and remove whatever i had
23809
17:54:07,360 --> 17:54:11,040
in here because i don't want this
23810
17:54:09,040 --> 17:54:13,200
anymore and i'm going to put in my
23811
17:54:11,040 --> 17:54:16,319
function template if we want we can even
23812
17:54:13,199 --> 17:54:18,319
take this sddc out statement because we
23813
17:54:16,319 --> 17:54:21,756
don't want all the junk that comes with
23814
17:54:18,319 --> 17:54:24,239
that we are just interested in looking
23815
17:54:24,239 --> 17:54:29,199
generated by the compiler now that we
23816
17:54:26,559 --> 17:54:31,435
have the code in here we're going to see
23817
17:54:29,199 --> 17:54:33,595
what the compiler generates because of
23818
17:54:31,436 --> 17:54:35,436
the call we have here i think i could
23819
17:54:33,595 --> 17:54:36,720
increase the size of the font here so
23820
17:54:36,720 --> 17:54:39,680
can see this i think this is a little
23821
17:54:39,680 --> 17:54:44,840
then if you hit this play button here
23822
17:54:42,319 --> 17:54:47,360
let's click on it it's going to do its
23823
17:54:44,839 --> 17:54:48,955
processing and then the code generated
23824
17:54:47,360 --> 17:54:51,360
by the compiler is going to show up to
23825
17:54:48,955 --> 17:54:52,635
the right here you see it has detected
23826
17:54:52,635 --> 17:54:58,239
called the function template on line 13
23827
17:54:55,199 --> 17:54:59,680
here you see this line is highlighted
23828
17:54:58,239 --> 17:55:02,319
and then if you go to the right we're
23829
17:54:59,680 --> 17:55:04,559
going to see the functions generated by
23830
17:55:02,319 --> 17:55:06,635
the compiler so if you go here you see
23831
17:55:06,635 --> 17:55:12,239
of our function template and another
23832
17:55:09,519 --> 17:55:14,719
thing i should prove here is that
23833
17:55:12,239 --> 17:55:16,400
template instances that are not needed
23834
17:55:14,720 --> 17:55:18,319
are not going to be generated by the
23835
17:55:16,400 --> 17:55:21,436
compiler another way to say this the
23836
17:55:18,319 --> 17:55:24,480
compiler is only going to generate the
23837
17:55:21,436 --> 17:55:27,200
template instances it needs and again a
23838
17:55:24,480 --> 17:55:29,840
template instance is what you have here
23839
17:55:27,199 --> 17:55:32,559
the function the actual function that is
23840
17:55:29,839 --> 17:55:34,879
callable by the compiler generated from
23841
17:55:32,559 --> 17:55:37,519
your blueprint so if for example we
23842
17:55:37,519 --> 17:55:42,635
parameters to double let's do that okay
23843
17:55:39,915 --> 17:55:44,879
so we changed our types to double we're
23844
17:55:42,635 --> 17:55:46,635
going to hit the play button again
23845
17:55:44,879 --> 17:55:48,879
you're going to see that now it is going
23846
17:55:46,635 --> 17:55:51,275
to generate a double function here you
23847
17:55:48,879 --> 17:55:52,955
see that here if we change this for
23848
17:55:52,955 --> 17:55:58,559
what can we use let's use long long end
23849
17:55:55,839 --> 17:56:02,319
like we did in our lecture we can do
23850
17:55:58,559 --> 17:56:04,559
that we can say long long and and if we
23851
17:56:02,319 --> 17:56:07,436
hit the play button that's what is going
23852
17:56:04,559 --> 17:56:10,159
to be generated by the compiler so
23853
17:56:07,436 --> 17:56:13,596
hopefully this proves that the compiler
23854
17:56:10,160 --> 17:56:16,400
is only going to generate the instances
23855
17:56:13,595 --> 17:56:18,879
that are needed for the calls you do in
23856
17:56:16,400 --> 17:56:21,116
your c plus plus program and this is
23857
17:56:18,879 --> 17:56:22,955
really function templates are all about
23858
17:56:21,116 --> 17:56:25,040
okay now that you know this let's set up
23859
17:56:22,955 --> 17:56:26,479
a few more examples to see that this
23860
17:56:26,480 --> 17:56:29,680
so let's change the types of these guys
23861
17:56:29,680 --> 17:56:33,915
double let's do that and we're going to
23862
17:56:32,160 --> 17:56:37,200
play with this a little more in visual
23863
17:56:33,915 --> 17:56:41,955
studio code and let's use double
23864
17:56:41,955 --> 17:56:48,720
78.7 here let's do that 78.7 and we're
23865
17:56:46,319 --> 17:56:50,635
going to build this and one thing i
23866
17:56:48,720 --> 17:56:52,880
should point out is that template
23867
17:56:50,635 --> 17:56:55,199
instances are generated when the
23868
17:56:52,879 --> 17:56:56,879
compiler is doing its job and then they
23869
17:56:56,879 --> 17:57:02,239
in the binary representation of your
23870
17:56:59,519 --> 17:57:05,115
source code so the world is good as you
23871
17:57:02,239 --> 17:57:08,319
see here we can clear and run a rooster
23872
17:57:05,116 --> 17:57:11,200
we're going to see that the result is 78
23873
17:57:08,319 --> 17:57:13,595
and it is transformed to end because we
23874
17:57:11,199 --> 17:57:15,435
are assigning to end here to really get
23875
17:57:13,595 --> 17:57:18,079
to the correct results here we should
23876
17:57:15,436 --> 17:57:20,000
use auto type deduction if we do that
23877
17:57:18,080 --> 17:57:22,480
the compiler is going to deduce the type
23878
17:57:20,000 --> 17:57:24,955
of result here based on the return type
23879
17:57:22,480 --> 17:57:27,360
of this function or the function
23880
17:57:24,955 --> 17:57:29,116
template instance i should say
23881
17:57:27,360 --> 17:57:31,360
now we're going to change this to auto
23882
17:57:31,360 --> 17:57:36,319
and if we both again we should see a
23883
17:57:33,199 --> 17:57:38,719
double printed out correctly the both is
23884
17:57:36,319 --> 17:57:41,275
good we can clear and run the rooster
23885
17:57:38,720 --> 17:57:44,796
now we have the correct value printed
23886
17:57:41,275 --> 17:57:47,115
out from our function template here
23887
17:57:44,796 --> 17:57:49,436
let's change this to std string we can
23888
17:57:52,080 --> 17:57:57,436
and we're going to change these two guys
23889
17:57:53,839 --> 17:58:01,435
to std string why not std string x is
23890
17:57:57,436 --> 17:58:04,720
going to be a string electro let's use
23891
17:58:01,436 --> 17:58:07,520
hello for example and uh for
23892
17:58:04,720 --> 17:58:10,080
y we're going to say std strength and
23893
17:58:07,519 --> 17:58:12,079
we're going to put in a world here okay
23894
17:58:10,080 --> 17:58:14,400
this is going to do and you notice that
23895
17:58:12,080 --> 17:58:16,560
we don't even have a compiler error
23896
17:58:14,400 --> 17:58:18,400
visual studio code is not complaining
23897
17:58:16,559 --> 17:58:21,115
the compiler is going to look at the
23898
17:58:18,400 --> 17:58:23,596
types we call our function with then it
23899
17:58:21,116 --> 17:58:26,000
is going to generate is an sdd string
23900
17:58:23,595 --> 17:58:28,879
version of this function and what it is
23901
17:58:26,000 --> 17:58:31,915
going to do it's going to replace in t
23902
17:58:28,879 --> 17:58:35,595
and replace that for std strand we can
23903
17:58:31,915 --> 17:58:37,595
actually put this thing entirely in
23904
17:58:35,595 --> 17:58:39,519
cpp inside so let's copy this code
23905
17:58:37,595 --> 17:58:41,435
before we run it so that you can really
23906
17:58:39,519 --> 17:58:43,115
see what is happening here we're going
23907
17:58:41,436 --> 17:58:45,200
to take out whatever we had before we're
23908
17:58:43,116 --> 17:58:46,880
going to put in our code and then we're
23909
17:58:45,199 --> 17:58:48,879
going to hit the play button here it's
23910
17:58:46,879 --> 17:58:51,199
going to generate our thumb we wait for
23911
17:58:48,879 --> 17:58:54,079
it to do its thing and if you look here
23912
17:58:54,080 --> 17:59:00,000
std strength this is really a compiler
23913
17:58:56,519 --> 17:59:02,079
representation of std string we don't
23914
17:59:00,000 --> 17:59:04,879
have enough tools to really understand
23915
17:59:02,080 --> 17:59:06,955
this but hopefully you can see that it
23916
17:59:06,955 --> 17:59:12,559
with some other type we don't know yet
23917
17:59:09,436 --> 17:59:14,955
std basic string car it has a few things
23918
17:59:12,559 --> 17:59:17,360
inside that we don't really know yet we
23919
17:59:14,955 --> 17:59:19,839
will have to learn a few more things
23920
17:59:17,360 --> 17:59:21,199
about this as we progress in the course
23921
17:59:21,199 --> 17:59:25,839
i want to prove to you that the compiler
23922
17:59:23,275 --> 17:59:28,720
is doing the replacement you see t was
23923
17:59:25,839 --> 17:59:30,879
replaced by this thing here std basic
23924
17:59:28,720 --> 17:59:34,080
strength and we have angle brackets and
23925
17:59:30,879 --> 17:59:36,239
this entire thing is really hdd strength
23926
17:59:34,080 --> 17:59:37,916
in the eyes of the compiler okay now
23927
17:59:36,239 --> 17:59:40,400
that we know this let's go back to
23928
17:59:37,915 --> 17:59:43,595
visual studio code and run this we're
23929
17:59:40,400 --> 17:59:45,756
going to build with gcc as we always do
23930
17:59:43,595 --> 17:59:46,879
the world is good we can clear and run
23931
17:59:46,879 --> 17:59:51,115
going to see that the maximum is world
23932
17:59:49,040 --> 17:59:53,040
and this is going to be using the
23933
17:59:53,040 --> 17:59:57,275
and this is going to compare two
23934
17:59:55,116 --> 18:00:00,160
strengths based on this and we know that
23935
18:00:00,160 --> 18:00:04,880
in lexicographical order so the
23936
18:00:03,116 --> 18:00:06,400
comparison that is done here is
23937
18:00:06,400 --> 18:00:11,275
for this strength here or i should say
23938
18:00:08,879 --> 18:00:14,479
it is comparing things in alphabetical
23939
18:00:11,275 --> 18:00:17,115
order in abcde and things like that okay
23940
18:00:14,480 --> 18:00:18,636
now hopefully you have a big idea about
23941
18:00:17,116 --> 18:00:20,955
function templates they are just
23942
18:00:20,955 --> 18:00:26,000
to generate actual functions and this is
23943
18:00:23,915 --> 18:00:28,000
going to allow you to avoid multiple
23944
18:00:26,000 --> 18:00:28,955
function overloads as we have seen
23945
18:00:28,955 --> 18:00:33,199
one thing i want you to see
23946
18:00:30,955 --> 18:00:36,159
is that you have to be sure that the
23947
18:00:33,199 --> 18:00:38,635
logic you do inside your function is
23948
18:00:36,160 --> 18:00:40,636
supported by the types that you pass to
23949
18:00:38,635 --> 18:00:42,080
the function and i'm going to show you
23950
18:00:40,635 --> 18:00:43,756
what i mean here we're going to set up
23951
18:00:42,080 --> 18:00:46,000
another function template we're going to
23952
18:00:43,756 --> 18:00:48,239
say template type named we're going to
23953
18:00:46,000 --> 18:00:50,559
set up another one pedem and we're going
23954
18:00:50,559 --> 18:00:54,159
this however many times you want and
23955
18:00:52,720 --> 18:00:57,680
then we're going to set up the function
23956
18:00:54,160 --> 18:00:59,360
which is going to do a multiplication so
23957
18:00:57,680 --> 18:01:01,116
we're going to say t that's going to be
23958
18:00:59,360 --> 18:01:03,116
the return value and we're going to say
23959
18:01:01,116 --> 18:01:05,680
multiply and we're going to multiply two
23960
18:01:03,116 --> 18:01:08,080
parameters we're going to say t a and t
23961
18:01:05,680 --> 18:01:11,040
b okay and we're going to put in the
23962
18:01:08,080 --> 18:01:12,880
logic and we're going to just return a
23963
18:01:12,879 --> 18:01:18,479
multiplication operator in c plus plus
23964
18:01:16,160 --> 18:01:21,116
and we can use this function so for
23965
18:01:18,480 --> 18:01:23,116
example we can say we can comment this
23966
18:01:21,116 --> 18:01:25,680
out and we can set up two variables
23967
18:01:23,116 --> 18:01:27,436
we're going to say and x and we're going
23968
18:01:25,680 --> 18:01:28,796
to put in whatever we had before let's
23969
18:01:28,796 --> 18:01:33,360
and end to y we're going to say 7 i
23970
18:01:31,680 --> 18:01:35,360
think this is what we used before you
23971
18:01:33,360 --> 18:01:37,199
can really put in whatever you want and
23972
18:01:35,360 --> 18:01:39,199
now we're going to call the multiply
23973
18:01:37,199 --> 18:01:41,755
function template so what this is going
23974
18:01:39,199 --> 18:01:44,159
to do is to generate a function template
23975
18:01:41,756 --> 18:01:46,796
instance which is going to be of type
23976
18:01:44,160 --> 18:01:49,116
and it's going to do a replacement in
23977
18:01:46,796 --> 18:01:51,040
here and replace t with ant and then
23978
18:01:49,116 --> 18:01:52,560
we're going to multiply two end
23979
18:01:51,040 --> 18:01:55,116
parameters that are passed to this
23980
18:01:52,559 --> 18:01:57,360
function and we're going to return end
23981
18:01:55,116 --> 18:01:59,276
and if we do that we're going to get 35
23982
18:01:57,360 --> 18:02:02,080
printed out let's prove this we're going
23983
18:01:59,275 --> 18:02:05,756
to use gcc to bolt the bolt is good we
23984
18:02:02,080 --> 18:02:07,680
can clear and run rooster we get a 35 if
23985
18:02:05,756 --> 18:02:10,319
we change this to double it is going to
23986
18:02:07,680 --> 18:02:13,879
work so let's change this to double and
23987
18:02:10,319 --> 18:02:16,796
maybe put in five point one and
23988
18:02:13,879 --> 18:02:18,795
7.0 why not and then we're going to see
23989
18:02:16,796 --> 18:02:21,680
what we get we're going to build with
23990
18:02:18,796 --> 18:02:23,000
gcc the build is good we can clear run
23991
18:02:26,000 --> 18:02:33,436
but watch what happens if we try
23992
18:02:29,275 --> 18:02:35,839
to use the std string types okay i want
23993
18:02:33,436 --> 18:02:38,955
you to see that so we're going to enable
23994
18:02:35,839 --> 18:02:41,199
our std strength variables here
23995
18:02:38,955 --> 18:02:43,519
and if we try to bolt we're going to get
23996
18:02:41,199 --> 18:02:45,519
a compiler error but i want you to try
23997
18:02:43,519 --> 18:02:48,399
and guess why why do we have this
23998
18:02:45,519 --> 18:02:49,680
compiler if we look at what gcc is
23999
18:02:49,680 --> 18:02:56,160
it is saying an instantiation of our
24000
18:02:52,955 --> 18:02:58,559
function template required from here and
24001
18:02:58,559 --> 18:03:02,239
multiplication here and this is the
24002
18:03:02,239 --> 18:03:06,479
the compiler is going to do what it
24003
18:03:04,400 --> 18:03:09,360
knows to do it is going to do a
24004
18:03:06,480 --> 18:03:11,436
replacement in our function template and
24005
18:03:11,436 --> 18:03:16,400
by std strength because that's the type
24006
18:03:13,839 --> 18:03:19,359
we are using as an argument here the
24007
18:03:16,400 --> 18:03:21,596
problem is we can't really multiply two
24008
18:03:19,360 --> 18:03:23,756
strands if you try to multiply two
24009
18:03:21,595 --> 18:03:26,479
strands like we do here it's not going
24010
18:03:23,756 --> 18:03:28,635
to make sense what do you expect to get
24011
18:03:26,480 --> 18:03:30,400
if you multiply two strings it doesn't
24012
18:03:28,635 --> 18:03:32,319
make sense the compiler doesn't know
24013
18:03:30,400 --> 18:03:34,319
what to do with this operation it's
24014
18:03:32,319 --> 18:03:36,879
going to give you a compiler error okay
24015
18:03:34,319 --> 18:03:39,275
to really drive this home let's go back
24016
18:03:39,275 --> 18:03:43,839
and put in the code here and see what is
24017
18:03:43,839 --> 18:03:48,000
you should use these tools to your
24018
18:03:45,756 --> 18:03:50,480
advantage because they really help in
24019
18:03:48,000 --> 18:03:52,400
understanding what is going on so let's
24020
18:03:50,480 --> 18:03:54,240
hit the play button here i just put in
24021
18:03:52,400 --> 18:03:57,040
my code and it is going to say
24022
18:03:54,239 --> 18:04:00,239
compilation failed because we have the
24023
18:03:57,040 --> 18:04:01,915
same error cpp insights needs to compile
24024
18:04:01,915 --> 18:04:07,435
to give you the template instantiations
24025
18:04:05,116 --> 18:04:10,240
but here you see that it is basically
24026
18:04:07,436 --> 18:04:12,955
giving us the same error let's try and
24027
18:04:10,239 --> 18:04:15,680
see the entire thing here and see if we
24028
18:04:12,955 --> 18:04:17,519
see the real error and we can't really
24029
18:04:15,680 --> 18:04:20,000
scroll around with this i'm having
24030
18:04:17,519 --> 18:04:22,955
trouble scrolling around here i can use
24031
18:04:20,000 --> 18:04:25,595
these buttons i guess okay so let's see
24032
18:04:22,955 --> 18:04:28,080
if we see the actual error and we're not
24033
18:04:25,595 --> 18:04:30,159
seeing it here auto result multiply
24034
18:04:28,080 --> 18:04:32,319
error generated so we're going to get an
24035
18:04:30,160 --> 18:04:34,880
error if we try to instantiate our
24036
18:04:32,319 --> 18:04:37,436
template with the types that we are
24037
18:04:34,879 --> 18:04:40,479
passing in here which are hdd strength
24038
18:04:37,436 --> 18:04:42,635
cpp insights isn't really helpful here
24039
18:04:40,480 --> 18:04:45,116
but hopefully you understand the problem
24040
18:04:42,635 --> 18:04:49,040
the problem is if the compiler tries to
24041
18:04:45,116 --> 18:04:51,756
generate a template instance using std
24042
18:04:49,040 --> 18:04:53,520
strand multiplying two strands isn't
24043
18:04:51,756 --> 18:04:55,595
going to make sense so the compiler is
24044
18:04:53,519 --> 18:04:57,915
going to give you a compiler error
24045
18:04:55,595 --> 18:05:00,159
because this is not supported so the
24046
18:04:57,915 --> 18:05:02,319
message here is that you should make
24047
18:05:00,160 --> 18:05:04,796
sure that the template instances
24048
18:05:02,319 --> 18:05:08,000
generated by the compilers support
24049
18:05:04,796 --> 18:05:10,160
whatever operations you are doing in the
24050
18:05:08,000 --> 18:05:11,839
body of your function template this is
24051
18:05:11,839 --> 18:05:15,595
another thing i want you to see before
24052
18:05:13,360 --> 18:05:16,400
we close this off i'm going to take out
24053
18:05:16,400 --> 18:05:21,200
problematic line here and we're going to
24054
18:05:18,400 --> 18:05:23,275
go back to our maximum function what i
24055
18:05:21,199 --> 18:05:25,360
want you to see is that if you pass
24056
18:05:23,275 --> 18:05:27,680
different types for this function
24057
18:05:25,360 --> 18:05:30,000
template you're going to get a compiler
24058
18:05:27,680 --> 18:05:32,559
error and what do i mean by that let's
24059
18:05:30,000 --> 18:05:35,680
take out our std strength because it's
24060
18:05:32,559 --> 18:05:38,795
no longer useful for our purposes here
24061
18:05:35,680 --> 18:05:42,239
and we're going to just use double and 8
24062
18:05:38,796 --> 18:05:43,520
parameters let's use ant here
24063
18:05:46,080 --> 18:05:50,319
and then we call our maximum function
24064
18:05:48,480 --> 18:05:52,796
you see that we have a squiggly line
24065
18:05:50,319 --> 18:05:56,000
because the function template is forced
24066
18:05:52,796 --> 18:05:57,596
to use the same type for the return type
24067
18:05:56,000 --> 18:06:00,160
the first parameter and the second
24068
18:05:57,595 --> 18:06:02,795
parameter here because the placeholder
24069
18:06:00,160 --> 18:06:04,956
is the same so the compiler is supposed
24070
18:06:02,796 --> 18:06:07,520
to use the same thing for the first
24071
18:06:04,955 --> 18:06:09,519
argument here the second argument and
24072
18:06:07,519 --> 18:06:11,680
the return type that we get from this
24073
18:06:09,519 --> 18:06:13,519
maximum function here but the problem is
24074
18:06:11,680 --> 18:06:15,595
we are passing in parameters of
24075
18:06:13,519 --> 18:06:17,359
different types and this is going to
24076
18:06:15,595 --> 18:06:20,399
give us a compiler error because the
24077
18:06:17,360 --> 18:06:23,520
compiler want to know what to do with
24078
18:06:20,400 --> 18:06:26,635
the types that you pass in as arguments
24079
18:06:23,519 --> 18:06:29,115
and if we look at our problems tab here
24080
18:06:26,635 --> 18:06:31,839
visual studio code should give us an
24081
18:06:29,116 --> 18:06:33,840
error no match for operator uh this is
24082
18:06:31,839 --> 18:06:35,275
the error we had before we can try and
24083
18:06:33,839 --> 18:06:38,319
build again we're going to get a
24084
18:06:35,275 --> 18:06:39,756
compiler error again but this time it's
24085
18:06:38,319 --> 18:06:43,275
going to be different it's going to say
24086
18:06:39,756 --> 18:06:45,595
no instance of function template maximum
24087
18:06:43,275 --> 18:06:48,079
matches the argument list that we are
24088
18:06:45,595 --> 18:06:48,955
using here which is double and end
24089
18:06:48,955 --> 18:06:52,955
this is a problem but we will see ways
24090
18:06:51,360 --> 18:06:55,595
around this as we progress in the
24091
18:06:52,955 --> 18:06:57,839
chapter but what you should know
24092
18:06:55,595 --> 18:07:00,319
is that if we set up a function template
24093
18:06:57,839 --> 18:07:03,039
like this this is going to enforce for
24094
18:07:00,319 --> 18:07:05,595
all the types where we will place in t
24095
18:07:03,040 --> 18:07:07,595
to be the same if they're not the same
24096
18:07:05,595 --> 18:07:09,519
the compiler won't know how to do its
24097
18:07:07,595 --> 18:07:11,595
replacement and it is going to give you
24098
18:07:09,519 --> 18:07:14,159
a compiler error okay the last thing i
24099
18:07:11,595 --> 18:07:17,435
want you to see is that we can use the
24100
18:07:14,160 --> 18:07:19,596
debugger to debug function templates so
24101
18:07:17,436 --> 18:07:21,436
let's turn this back to end because we
24102
18:07:21,436 --> 18:07:27,596
so let's take out the decimal point here
24103
18:07:24,559 --> 18:07:30,079
so that we have proper intellectuals and
24104
18:07:27,595 --> 18:07:32,635
if we compile again this should compile
24105
18:07:30,080 --> 18:07:36,160
okay the world is good now what really
24106
18:07:32,635 --> 18:07:36,955
happens if you try to debug a program
24107
18:07:38,480 --> 18:07:43,360
are you going to be working on the
24108
18:07:40,720 --> 18:07:46,160
template instances because remember the
24109
18:07:43,360 --> 18:07:48,480
function templates are going to generate
24110
18:07:46,160 --> 18:07:50,880
function template instances with actual
24111
18:07:48,480 --> 18:07:53,116
types for example our template instance
24112
18:07:50,879 --> 18:07:56,955
here is going to have ants because we
24113
18:07:53,116 --> 18:07:59,116
are passing ant as argument here so how
24114
18:07:56,955 --> 18:08:02,080
are we exactly going to debug this let's
24115
18:07:59,116 --> 18:08:03,360
try this we're going to set up a break
24116
18:08:03,360 --> 18:08:08,080
on the call to our maximum function
24117
18:08:06,239 --> 18:08:10,000
and we're going to start debugging we're
24118
18:08:11,839 --> 18:08:16,239
and we're going to use the debugging
24119
18:08:13,519 --> 18:08:18,795
tools that come with gcc we have seen
24120
18:08:16,239 --> 18:08:20,559
how to do that in the last chapter and
24121
18:08:18,796 --> 18:08:23,596
we're going to start debugging let's
24122
18:08:20,559 --> 18:08:25,275
minimize this guy here so that we have
24123
18:08:25,275 --> 18:08:30,879
and we're going to run our debugger
24124
18:08:28,160 --> 18:08:33,520
let's maximize this a little bit
24125
18:08:30,879 --> 18:08:35,199
and push this a little to the left
24126
18:08:33,519 --> 18:08:37,519
and we're going to start debugging and
24127
18:08:35,199 --> 18:08:39,275
see what really happens here so we hit
24128
18:08:37,519 --> 18:08:41,839
the green button here we're going to
24129
18:08:39,275 --> 18:08:43,275
start debugging our code is building now
24130
18:08:43,275 --> 18:08:48,239
the binary has been passed to the
24131
18:08:45,680 --> 18:08:50,796
debugger and now we have hit our break
24132
18:08:48,239 --> 18:08:53,115
point here so let's minimize this a
24133
18:08:50,796 --> 18:08:55,680
little bit so that we have an easier way
24134
18:08:53,116 --> 18:08:57,360
to see this we have hit or break point
24135
18:08:55,680 --> 18:08:59,595
you see the locals are what we have in
24136
18:08:57,360 --> 18:09:01,915
the main function which happens to be to
24137
18:08:59,595 --> 18:09:03,595
the top of the call stack here
24138
18:09:01,915 --> 18:09:05,680
okay now we want to jump into the
24139
18:09:03,595 --> 18:09:07,275
maximum function and see the types that
24140
18:09:07,275 --> 18:09:12,635
so what we want to do here is head the
24141
18:09:09,595 --> 18:09:14,795
step into function and you notice it is
24142
18:09:12,635 --> 18:09:17,756
going to jump into our function template
24143
18:09:14,796 --> 18:09:20,160
here but the locals here are not giving
24144
18:09:17,756 --> 18:09:22,239
us the types and this is because this is
24145
18:09:20,160 --> 18:09:24,320
a function template it's not going to
24146
18:09:24,319 --> 18:09:30,159
because it's not easy to get those here
24147
18:09:27,199 --> 18:09:32,399
but if we look at the call stack you see
24148
18:09:30,160 --> 18:09:34,160
that we have information about the types
24149
18:09:32,400 --> 18:09:36,560
of the function that is being called we
24150
18:09:36,559 --> 18:09:40,635
and it is going to return and you see
24151
18:09:38,480 --> 18:09:42,480
that in the angle brackets here and
24152
18:09:40,635 --> 18:09:45,436
again this is possibly another way to
24153
18:09:42,480 --> 18:09:47,596
look at what template instances were
24154
18:09:45,436 --> 18:09:49,520
generated by the compiler because we see
24155
18:09:47,595 --> 18:09:52,319
the function called here is taken into
24156
18:09:49,519 --> 18:09:54,879
parameters and it is going to return end
24157
18:09:52,319 --> 18:09:57,116
let's kill our debugger because this is
24158
18:09:54,879 --> 18:09:59,199
really all we want to see and change the
24159
18:09:57,116 --> 18:10:01,596
types to double here and we're going to
24160
18:09:59,199 --> 18:10:03,519
see that the function to the top of the
24161
18:10:03,519 --> 18:10:09,435
taking double parameters so let's change
24162
18:10:06,239 --> 18:10:13,360
this back to five point something 5.5
24163
18:10:09,436 --> 18:10:15,275
maybe 7 and 0.9 why not and we're going
24164
18:10:15,275 --> 18:10:21,436
but uh what we really are interested in
24165
18:10:17,756 --> 18:10:23,360
is seeing the function template instance
24166
18:10:21,436 --> 18:10:25,200
generated by the compiler because of
24167
18:10:23,360 --> 18:10:27,116
this call here and we can do this
24168
18:10:25,199 --> 18:10:29,039
through the debugger this is a little
24169
18:10:27,116 --> 18:10:31,276
bit convoluted because you have to set
24170
18:10:29,040 --> 18:10:33,275
up breakpoints and whatever but it is
24171
18:10:31,275 --> 18:10:36,319
helpful if you don't want to use things
24172
18:10:33,275 --> 18:10:38,319
like cpp insights as we have seen before
24173
18:10:36,319 --> 18:10:40,400
and again this is also useful because
24174
18:10:38,319 --> 18:10:42,480
you will need to debug your code if it
24175
18:10:40,400 --> 18:10:45,275
is using function templates let's run
24176
18:10:42,480 --> 18:10:47,276
this to really prove our point here
24177
18:10:45,275 --> 18:10:49,360
the world is going to go through the
24178
18:10:47,275 --> 18:10:50,239
binary executable is going to be passed
24179
18:10:50,239 --> 18:10:55,040
the debugger and we're going to hit our
24180
18:10:52,080 --> 18:10:57,680
breakpoint here again you see our locals
24181
18:10:55,040 --> 18:10:59,200
are not giving us the types here but we
24182
18:10:59,199 --> 18:11:03,435
the function call stack to really see
24183
18:11:01,116 --> 18:11:06,400
this we have hit the breakpoint here at
24184
18:11:03,436 --> 18:11:09,360
line 15 so we can step into the call
24185
18:11:06,400 --> 18:11:12,880
and if we hit the body of the maximum
24186
18:11:09,360 --> 18:11:15,520
function here and look at the call stack
24187
18:11:12,879 --> 18:11:18,879
we're going to see that the parameters
24188
18:11:15,519 --> 18:11:21,115
we have in our function call are of
24189
18:11:18,879 --> 18:11:22,719
double type and again this hopefully
24190
18:11:22,720 --> 18:11:26,955
that the compiler has actually generated
24191
18:11:26,955 --> 18:11:31,680
function template instance okay since we
24192
18:11:29,756 --> 18:11:35,116
are debugging we can actually try and
24193
18:11:31,680 --> 18:11:37,199
follow this program let's hit next so
24194
18:11:35,116 --> 18:11:38,400
that we can hit the end of this function
24195
18:11:38,400 --> 18:11:43,200
finish it and hit the main function by
24196
18:11:40,955 --> 18:11:46,000
the moment we hit the main function
24197
18:11:43,199 --> 18:11:47,519
results is going to be 7.9 which is what
24198
18:11:46,000 --> 18:11:49,756
we have here and it is what we're going
24199
18:11:47,519 --> 18:11:51,519
to print we can just step over this
24200
18:11:49,756 --> 18:11:54,400
because we don't want to step into the
24201
18:11:51,519 --> 18:11:56,239
logics of sddc out so step over we're
24202
18:11:54,400 --> 18:11:58,400
going to print our result and our
24203
18:11:56,239 --> 18:12:01,040
debugging session is going to basically
24204
18:11:58,400 --> 18:12:03,520
end because we have hit the end of the
24205
18:12:01,040 --> 18:12:06,160
main function let's try and use the
24206
18:12:03,519 --> 18:12:08,479
compiler from microsoft to see the
24207
18:12:06,160 --> 18:12:10,480
information it gives us because these
24208
18:12:08,480 --> 18:12:12,796
things can be different depending on the
24209
18:12:10,480 --> 18:12:15,040
compiler and the debugging tools that
24210
18:12:12,796 --> 18:12:17,835
you are using we have the luxury to have
24211
18:12:15,040 --> 18:12:19,755
these two set up here so all we have to
24212
18:12:17,835 --> 18:12:22,243
do is switch the tool we want to use
24213
18:12:19,755 --> 18:12:24,720
here and this is going to be using the
24214
18:12:22,244 --> 18:12:27,436
one from microsoft if you are not on
24215
18:12:24,720 --> 18:12:30,244
windows or you don't want to use the
24216
18:12:27,436 --> 18:12:33,115
compiler from microsoft and its
24217
18:12:30,244 --> 18:12:35,360
debugging tools you can just use gcc and
24218
18:12:33,115 --> 18:12:37,115
its debugging tools here i just want you
24219
18:12:35,360 --> 18:12:39,436
to see different ways to do the same
24220
18:12:37,115 --> 18:12:42,080
things and that compilers and debuggers
24221
18:12:39,436 --> 18:12:44,000
can give us different information we're
24222
18:12:42,080 --> 18:12:46,000
going to try and debug with this so
24223
18:12:44,000 --> 18:12:47,600
we're going to hit the green button here
24224
18:12:46,000 --> 18:12:50,639
notice that this is going to be using
24225
18:12:47,600 --> 18:12:53,116
the compiler from microsoft if we look
24226
18:12:50,639 --> 18:12:55,600
at the world output here you see that we
24227
18:12:55,600 --> 18:13:00,080
it is what we are using to build our
24228
18:12:57,755 --> 18:13:02,155
binary the binary is going to be passed
24229
18:13:00,080 --> 18:13:05,516
to the debugger and then we're going to
24230
18:13:02,156 --> 18:13:07,600
hit the breakpoint here as we know
24231
18:13:05,516 --> 18:13:10,000
and then we're going to have our output
24232
18:13:10,000 --> 18:13:15,279
you see in the main function we don't
24233
18:13:12,475 --> 18:13:17,599
see the types of our locals why is that
24234
18:13:15,279 --> 18:13:19,919
i don't know why but we see the values
24235
18:13:19,919 --> 18:13:25,755
and if we hit the step into button to
24236
18:13:23,039 --> 18:13:27,515
jump into our maximum function a is
24237
18:13:25,755 --> 18:13:30,475
going to have this value b is going to
24238
18:13:27,516 --> 18:13:32,244
have this value and we look at the
24239
18:13:30,475 --> 18:13:34,796
template instance we can see the same
24240
18:13:32,244 --> 18:13:37,196
information but we are using a different
24241
18:13:34,796 --> 18:13:40,080
compiler this is really how you can
24242
18:13:37,195 --> 18:13:42,555
debug your code that uses function
24243
18:13:40,080 --> 18:13:46,000
templates and this is going to give us a
24244
18:13:42,555 --> 18:13:49,195
peek into the actual template instance
24245
18:13:46,000 --> 18:13:51,360
that was generated by our compiler this
24246
18:13:49,195 --> 18:13:53,436
is really all i had to share in this
24247
18:13:51,360 --> 18:13:55,516
lecture and before i let you go let's
24248
18:13:53,436 --> 18:13:57,360
summarize a little bit function
24249
18:13:55,516 --> 18:13:59,279
templates are blueprints we have seen
24250
18:13:57,360 --> 18:14:01,600
that the compiler is going to use those
24251
18:13:59,279 --> 18:14:04,399
to generate actual function template
24252
18:14:01,600 --> 18:14:05,116
instances real function definitions and
24253
18:14:05,115 --> 18:14:08,875
declarations are going to be created
24254
18:14:07,195 --> 18:14:11,516
when you call the function with
24255
18:14:08,876 --> 18:14:14,555
arguments if the template parameters are
24256
18:14:11,516 --> 18:14:16,476
of the same type maybe t and t then the
24257
18:14:14,555 --> 18:14:18,399
arguments you call the function with
24258
18:14:16,475 --> 18:14:20,555
must also match otherwise you'll get a
24259
18:14:18,399 --> 18:14:22,875
compiler error we have seen this okay
24260
18:14:20,555 --> 18:14:25,115
here we have a point we haven't already
24261
18:14:22,876 --> 18:14:27,360
covered template instances won't always
24262
18:14:25,115 --> 18:14:29,195
do what you want a good example is when
24263
18:14:27,360 --> 18:14:31,436
you call our maximum function with
24264
18:14:29,195 --> 18:14:32,243
pointers so let's go back and really say
24265
18:14:32,244 --> 18:14:37,360
because i want this to cover as much as
24266
18:14:34,796 --> 18:14:39,600
possible about function templates
24267
18:14:37,360 --> 18:14:41,436
so let's go back to our code and we're
24268
18:14:39,600 --> 18:14:42,960
going to modify things a little bit okay
24269
18:14:41,436 --> 18:14:44,400
so what we're going to do here is take
24270
18:14:42,960 --> 18:14:47,280
out whatever we have here we're going to
24271
18:14:47,279 --> 18:14:51,279
x is going to be 5 as we have seen
24272
18:14:51,279 --> 18:14:55,516
y is going to be seven let's use this
24273
18:14:54,320 --> 18:14:57,116
and then we're going to set up two
24274
18:14:55,516 --> 18:14:58,400
pointer variables we're going to say
24275
18:14:58,399 --> 18:15:02,639
px and we're going to initialize this
24276
18:15:00,555 --> 18:15:04,639
with the address of x nothing
24277
18:15:02,639 --> 18:15:06,796
sophisticated so far and we're going to
24278
18:15:04,639 --> 18:15:09,516
say end p y and we're going to
24279
18:15:06,796 --> 18:15:11,756
initialize this with the address of y we
24280
18:15:09,516 --> 18:15:14,156
can do this the problem is going to come
24281
18:15:11,755 --> 18:15:15,435
when we try to call our function here
24282
18:15:15,436 --> 18:15:21,279
pointers let's use px and py to call
24283
18:15:18,475 --> 18:15:24,243
this function and py and what this is
24284
18:15:21,279 --> 18:15:26,475
going to do is to generate a template
24285
18:15:24,244 --> 18:15:28,080
instance that takes end pointer this is
24286
18:15:26,475 --> 18:15:30,000
what the compiler knows to do we're
24287
18:15:28,080 --> 18:15:32,796
going to take the types that we pass in
24288
18:15:30,000 --> 18:15:34,720
here which happen to be end pointer and
24289
18:15:32,796 --> 18:15:36,080
we're going to change the return type to
24290
18:15:34,720 --> 18:15:37,919
end pointer we're going to change the
24291
18:15:36,080 --> 18:15:39,835
first parameter to end pointer the
24292
18:15:37,919 --> 18:15:41,919
second parameter to end pointer and
24293
18:15:39,835 --> 18:15:43,679
we're going to compute the maximum
24294
18:15:41,919 --> 18:15:46,156
if we compute the maximum here we're
24295
18:15:43,679 --> 18:15:48,875
going to be comparing pointers okay
24296
18:15:46,156 --> 18:15:51,756
notice this and if we try to do that we
24297
18:15:48,876 --> 18:15:55,279
might not get what we want because what
24298
18:15:51,755 --> 18:15:57,360
we get now depends on the address used
24299
18:15:55,279 --> 18:16:00,156
to store these guys in memory hopefully
24300
18:15:57,360 --> 18:16:02,475
you can see that and let's try and debug
24301
18:16:00,156 --> 18:16:06,876
this program so that you can really see
24302
18:16:02,475 --> 18:16:09,039
this we're going to use the tools from g
24303
18:16:09,039 --> 18:16:13,279
and we're going to try and debug it
24304
18:16:10,475 --> 18:16:15,115
let's do that it is going to run through
24305
18:16:13,279 --> 18:16:18,000
the debugger and what we're going to
24306
18:16:15,115 --> 18:16:20,555
have is our terminal here i think this
24307
18:16:18,000 --> 18:16:23,195
is not needed anymore so let's put this
24308
18:16:20,555 --> 18:16:27,195
to the right here and minimize a little
24309
18:16:23,195 --> 18:16:30,243
bit and now you notice that px contains
24310
18:16:27,195 --> 18:16:32,243
an address and py contains an address
24311
18:16:30,244 --> 18:16:34,000
hopefully you can see that in the body
24312
18:16:32,244 --> 18:16:36,720
of our template instance we're going to
24313
18:16:34,000 --> 18:16:38,796
be comparing these addresses because
24314
18:16:36,720 --> 18:16:40,796
we're comparing what we pass by value
24315
18:16:38,796 --> 18:16:43,919
here and what we pass are these two
24316
18:16:40,796 --> 18:16:46,080
addresses so whichever is the maximum in
24317
18:16:43,919 --> 18:16:49,599
these guys and i think that's going to
24318
18:16:46,080 --> 18:16:52,244
be dd4 here it is the maximum so
24319
18:16:49,600 --> 18:16:55,279
whatever is contained in px is going to
24320
18:16:52,244 --> 18:16:56,639
be considered the maximum let's kill
24321
18:16:55,279 --> 18:16:59,436
this because we have seen this
24322
18:16:56,639 --> 18:17:01,755
information so if we have a value in px
24323
18:16:59,436 --> 18:17:03,600
and that happens to be at a bigger
24324
18:17:01,755 --> 18:17:05,679
address it's going to be considered the
24325
18:17:03,600 --> 18:17:07,360
maximum let's see what we print if we
24326
18:17:05,679 --> 18:17:10,875
run this program we're going to build
24327
18:17:07,360 --> 18:17:12,475
with gcc let's do that the world is good
24328
18:17:12,475 --> 18:17:17,919
and run rooster now you see result is
24329
18:17:15,516 --> 18:17:20,000
some address because we are returning a
24330
18:17:17,919 --> 18:17:22,399
pointer and printing that out but we can
24331
18:17:20,000 --> 18:17:25,279
easily dereference this and get to the
24332
18:17:22,399 --> 18:17:28,243
value inside this pointer let's build
24333
18:17:25,279 --> 18:17:30,796
again we can clear and run rooster this
24334
18:17:28,244 --> 18:17:32,244
is going to give us result is 5 and
24335
18:17:30,796 --> 18:17:35,600
hopefully you can see that this is
24336
18:17:32,244 --> 18:17:38,400
really bad and not correct we are trying
24337
18:17:35,600 --> 18:17:41,600
to compute the maximum between x and y
24338
18:17:38,399 --> 18:17:44,555
and we are seeing that the maximum is
24339
18:17:41,600 --> 18:17:46,960
five so how can five beat the maximum
24340
18:17:44,555 --> 18:17:49,360
between five and seven the problem is
24341
18:17:46,960 --> 18:17:52,556
we're not comparing the values here we
24342
18:17:49,360 --> 18:17:54,244
are comparing the addresses stored in
24343
18:17:52,555 --> 18:17:55,679
these pointers because that's what we
24344
18:17:54,244 --> 18:17:57,836
are passing here hopefully you can
24345
18:17:55,679 --> 18:18:00,795
really see this and we can prove this
24346
18:17:57,835 --> 18:18:03,279
again through our debugger we can run
24347
18:18:00,796 --> 18:18:05,600
this through the debugger we're going to
24348
18:18:03,279 --> 18:18:07,679
hit the breakpoint let's minimize this
24349
18:18:05,600 --> 18:18:09,680
so that we can see our terminal window
24350
18:18:07,679 --> 18:18:11,835
here and we're going to move this around
24351
18:18:09,679 --> 18:18:14,719
a little bit and now we have hit our
24352
18:18:11,835 --> 18:18:16,796
break point if we hit next to jump into
24353
18:18:14,720 --> 18:18:20,000
the function you see that what we are
24354
18:18:16,796 --> 18:18:22,720
really comparing are a and b here and a
24355
18:18:20,000 --> 18:18:25,115
contains a much larger address so it is
24356
18:18:22,720 --> 18:18:27,516
the pointer that is going to be returned
24357
18:18:25,115 --> 18:18:29,679
and if we dereference that we're going
24358
18:18:27,516 --> 18:18:32,639
to be dereferencing the pointer that
24359
18:18:29,679 --> 18:18:35,435
contains this x value and the message
24360
18:18:32,639 --> 18:18:37,195
here is that you should be careful
24361
18:18:35,436 --> 18:18:39,279
that your function templates are really
24362
18:18:37,195 --> 18:18:41,599
what doing what you want somebody might
24363
18:18:39,279 --> 18:18:43,679
do this if they are not careful just
24364
18:18:41,600 --> 18:18:46,156
pass in pointer and expect to get the
24365
18:18:43,679 --> 18:18:49,039
maximum but the compiler is just going
24366
18:18:46,156 --> 18:18:50,960
to compare pointer addresses and you're
24367
18:18:49,039 --> 18:18:53,360
going to get something you probably
24368
18:18:50,960 --> 18:18:55,756
don't expect okay this is what is meant
24369
18:18:53,360 --> 18:18:57,600
by template instances won't always do
24370
18:18:55,755 --> 18:18:59,835
what you want a good example is when you
24371
18:18:57,600 --> 18:19:01,756
call a maximum function with pointers
24372
18:18:59,835 --> 18:19:04,000
you're going to get a wrong value
24373
18:19:01,755 --> 18:19:05,919
possibly there are tools like cpp
24374
18:19:04,000 --> 18:19:07,755
insights which can show the template in
24375
18:19:05,919 --> 18:19:10,319
spatial instruments we have seen that
24376
18:19:07,755 --> 18:19:12,155
and again the arguments passed to a
24377
18:19:10,320 --> 18:19:14,796
function template must support the
24378
18:19:12,156 --> 18:19:16,555
operations that you are doing in your
24379
18:19:14,796 --> 18:19:18,244
function template we have seen an
24380
18:19:16,555 --> 18:19:20,399
example of this by setting up a
24381
18:19:18,244 --> 18:19:22,720
multiplication function template and we
24382
18:19:20,399 --> 18:19:25,435
saw that we had a compiler error if we
24383
18:19:22,720 --> 18:19:27,755
try to pass std strength arguments
24384
18:19:25,436 --> 18:19:30,000
because we can't multiply two strings
24385
18:19:27,755 --> 18:19:32,399
this is really all i had to share in
24386
18:19:30,000 --> 18:19:35,039
this lecture i apologize it turned out
24387
18:19:32,399 --> 18:19:37,360
to be lengthy but i really had to put
24388
18:19:35,039 --> 18:19:39,679
this in one lecture so that i can really
24389
18:19:37,360 --> 18:19:42,080
show you different sides of the same
24390
18:19:39,679 --> 18:19:43,755
things we are going to stop here in this
24391
18:19:42,080 --> 18:19:46,960
lecture and the next one we're going to
24392
18:19:43,755 --> 18:19:49,115
learn about template type deduction and
24393
18:19:49,115 --> 18:19:52,639
go ahead and finish up here
24394
18:19:52,639 --> 18:19:56,639
in this lecture we're going to learn
24395
18:19:53,919 --> 18:19:59,679
about template type deduction and
24396
18:19:56,639 --> 18:20:02,960
explicit arguments what we mean by
24397
18:19:59,679 --> 18:20:04,959
template type deduction is the mechanism
24398
18:20:04,960 --> 18:20:10,476
to deduce the type it would use to
24399
18:20:08,080 --> 18:20:12,796
set up our template instance from the
24400
18:20:10,475 --> 18:20:14,243
arguments that we passed to our function
24401
18:20:14,244 --> 18:20:18,080
for example the compiler is going to
24402
18:20:15,755 --> 18:20:20,243
look at a and b here in a call to the
24403
18:20:18,080 --> 18:20:22,400
maximum function and it is going to
24404
18:20:20,244 --> 18:20:24,720
notice that they are of into type and
24405
18:20:22,399 --> 18:20:27,279
then it is going to say okay you are
24406
18:20:24,720 --> 18:20:30,156
calling your function with it types and
24407
18:20:27,279 --> 18:20:33,436
i see that your function templates takes
24408
18:20:30,156 --> 18:20:36,080
three replacers in here so i am going to
24409
18:20:33,436 --> 18:20:38,080
replace these guys with and and it is
24410
18:20:36,080 --> 18:20:40,639
going to guess that from the call that
24411
18:20:38,080 --> 18:20:42,796
you make here there's no other mechanism
24412
18:20:40,639 --> 18:20:45,516
to help the compiler out this is really
24413
18:20:42,796 --> 18:20:47,360
what template type deduction is about
24414
18:20:45,516 --> 18:20:50,000
and for the first example here we are
24415
18:20:50,000 --> 18:20:55,195
nt is going to be deduced for the second
24416
18:20:52,080 --> 18:20:57,436
function call we are passing in double
24417
18:20:55,195 --> 18:20:59,679
parameter so a double function template
24418
18:20:57,436 --> 18:21:02,400
instance is going to be generated for
24419
18:20:59,679 --> 18:21:04,155
the third call here we are using std
24420
18:21:04,156 --> 18:21:10,080
so we are going to deduce a template
24421
18:21:07,279 --> 18:21:12,475
instance that uses hdd string here this
24422
18:21:10,080 --> 18:21:14,555
is what we mean by template type
24423
18:21:12,475 --> 18:21:17,279
deduction but we have seen that
24424
18:21:14,555 --> 18:21:19,755
automatic template type deduction can
24425
18:21:17,279 --> 18:21:22,555
really have problems especially if you
24426
18:21:19,755 --> 18:21:24,720
pass parameters of different types for
24427
18:21:22,555 --> 18:21:26,319
example if we call a maximum function
24428
18:21:26,320 --> 18:21:31,040
a and c which happen to be end and
24429
18:21:29,195 --> 18:21:33,436
double type then we're going to have a
24430
18:21:31,039 --> 18:21:34,795
problem because this function template
24431
18:21:34,796 --> 18:21:40,080
parameters with different types because
24432
18:21:37,516 --> 18:21:42,876
the replacer is the same the compiler is
24433
18:21:40,080 --> 18:21:45,360
going to enforce that all the template
24434
18:21:42,876 --> 18:21:47,116
arguments are of the same type and the
24435
18:21:45,360 --> 18:21:49,516
template arguments are going to be what
24436
18:21:47,115 --> 18:21:51,835
you pass in here so a and b must be the
24437
18:21:49,516 --> 18:21:53,836
same if they happen to be not the same
24438
18:21:51,835 --> 18:21:55,515
for example ant and double you're going
24439
18:21:55,516 --> 18:22:00,720
now we're going to see that we can use
24440
18:21:57,436 --> 18:22:02,555
explicit template arguments and again i
24441
18:22:00,720 --> 18:22:05,360
want to make it very clear the
24442
18:22:02,555 --> 18:22:07,755
difference between a template parameter
24443
18:22:05,360 --> 18:22:09,755
and the template argument a template
24444
18:22:07,755 --> 18:22:12,155
parameter is what you have in your
24445
18:22:09,755 --> 18:22:15,039
function declaration or a definition so
24446
18:22:12,156 --> 18:22:16,476
what we have in our function setup here
24447
18:22:16,475 --> 18:22:22,796
parameters ta here and tb are template
24448
18:22:20,000 --> 18:22:25,360
parameters but what we have when we call
24449
18:22:22,796 --> 18:22:28,475
a function template is going to be
24450
18:22:25,360 --> 18:22:29,360
template arguments for example c and d
24451
18:22:29,360 --> 18:22:34,080
are template arguments and we're going
24452
18:22:31,600 --> 18:22:36,720
to be using this terminology in this
24453
18:22:34,080 --> 18:22:38,555
chapter and many more chapters to come
24454
18:22:36,720 --> 18:22:40,720
in this course make sure this is super
24455
18:22:38,555 --> 18:22:44,796
clear so what we're going to look at is
24456
18:22:40,720 --> 18:22:46,399
using explicit template arguments and
24457
18:22:46,399 --> 18:22:51,755
is a mechanism through which you can
24458
18:22:48,639 --> 18:22:53,919
force the compiler to use some type to
24459
18:22:51,755 --> 18:22:56,000
generate your template instance and the
24460
18:22:53,919 --> 18:22:58,639
syntax to do this is really simple it is
24461
18:22:56,000 --> 18:23:00,399
what we have here we say maximum and we
24462
18:23:00,399 --> 18:23:05,039
to use to generate our template instance
24463
18:23:03,115 --> 18:23:07,115
in angle brackets like we see here so
24464
18:23:05,039 --> 18:23:10,000
this is going to use double so this is
24465
18:23:07,115 --> 18:23:12,399
going to explicitly tell the compiler we
24466
18:23:10,000 --> 18:23:14,399
want the double version called and it's
24467
18:23:12,399 --> 18:23:16,555
going to generate that and that's what
24468
18:23:14,399 --> 18:23:18,959
is going to be called by this call we
24469
18:23:16,555 --> 18:23:21,436
have here a good benefit with this is
24470
18:23:18,960 --> 18:23:24,080
that now this is going to support
24471
18:23:21,436 --> 18:23:25,756
template arguments of different types so
24472
18:23:24,080 --> 18:23:27,756
if we make the call like this the
24473
18:23:25,755 --> 18:23:30,155
compiler is going to see that uh-huh we
24474
18:23:27,755 --> 18:23:33,679
are calling with intent double types
24475
18:23:30,156 --> 18:23:36,156
because a is ant and c is double
24476
18:23:33,679 --> 18:23:36,875
but it's going to see that you want
24477
18:23:36,876 --> 18:23:42,400
double template instance generated now
24478
18:23:39,919 --> 18:23:45,039
the compiler will have the possibility
24479
18:23:42,399 --> 18:23:47,755
to do implicit conversions from other
24480
18:23:45,039 --> 18:23:50,000
types to double and if this implicit
24481
18:23:47,755 --> 18:23:52,155
conversion fails then we're going to get
24482
18:23:50,000 --> 18:23:53,115
a compiler error so if you look here for
24483
18:23:53,115 --> 18:23:59,360
this is the example for that we are
24484
18:23:54,876 --> 18:24:02,000
passing in a and e and a is ant and e is
24485
18:23:59,360 --> 18:24:03,600
an std strength we cannot do an implicit
24486
18:24:03,600 --> 18:24:08,156
std strength to double so this is going
24487
18:24:06,156 --> 18:24:11,516
to give us a compiler error and this is
24488
18:24:08,156 --> 18:24:14,080
really all template type deduction and
24489
18:24:11,516 --> 18:24:15,836
explicit arguments are about we can use
24490
18:24:14,080 --> 18:24:18,639
these things to really make our code
24491
18:24:15,835 --> 18:24:20,156
easier now that you have this understood
24492
18:24:18,639 --> 18:24:21,679
we're going to head over to visual
24493
18:24:20,156 --> 18:24:24,156
studio code and play with this a little
24494
18:24:21,679 --> 18:24:26,243
more here we are in our working
24495
18:24:24,156 --> 18:24:29,116
directory the current project is
24496
18:24:26,244 --> 18:24:31,360
template type deductions and explicit
24497
18:24:29,115 --> 18:24:33,835
arguments we're going to grab our
24498
18:24:31,360 --> 18:24:36,080
template files pretty quick and put them
24499
18:24:33,835 --> 18:24:38,156
in place and after that we're going to
24500
18:24:36,080 --> 18:24:40,555
open this in visual studio code let's
24501
18:24:38,156 --> 18:24:42,720
drag and drop on top of visual studio
24502
18:24:40,555 --> 18:24:46,399
code here this is going to open our
24503
18:24:42,720 --> 18:24:47,436
folder and we can open our main cpp file
24504
18:24:47,436 --> 18:24:51,680
set up our function template let's clean
24505
18:24:49,835 --> 18:24:54,475
this up a little bit and we're going to
24506
18:24:51,679 --> 18:24:56,399
set up our function template let's type
24507
18:24:54,475 --> 18:24:58,639
this out to just to practice so we're
24508
18:24:56,399 --> 18:25:01,195
going to say template and we're going to
24509
18:24:58,639 --> 18:25:02,960
say type name and we're going to say t
24510
18:25:01,195 --> 18:25:05,755
and if you want you can put this on a
24511
18:25:02,960 --> 18:25:08,320
single line but i prefer to put this on
24512
18:25:05,755 --> 18:25:10,475
separate lines but let's show you that
24513
18:25:08,320 --> 18:25:12,320
so we're going to say t here and we're
24514
18:25:10,475 --> 18:25:14,399
going to say maximum and we're going to
24515
18:25:12,320 --> 18:25:17,756
say the parameters they are going to be
24516
18:25:14,399 --> 18:25:19,360
of type t and we can pass them by value
24517
18:25:17,755 --> 18:25:21,835
just for now and after this we're going
24518
18:25:19,360 --> 18:25:23,600
to go in the body of our function
24519
18:25:21,835 --> 18:25:26,720
template and then we can return
24520
18:25:23,600 --> 18:25:28,796
whichever parameter is the maximum we're
24521
18:25:26,720 --> 18:25:31,516
going to say a greater than b here we're
24522
18:25:28,796 --> 18:25:34,000
going to use our ternary operator and if
24523
18:25:31,516 --> 18:25:36,320
a is greater we're going to return a if
24524
18:25:34,000 --> 18:25:38,320
b is greater we're going to return b and
24525
18:25:36,320 --> 18:25:40,400
this is our function here okay now that
24526
18:25:38,320 --> 18:25:42,720
this function is set up let's set up a
24527
18:25:40,399 --> 18:25:44,959
few variables to really play with that
24528
18:25:42,720 --> 18:25:46,876
so we're going to include the string
24529
18:25:44,960 --> 18:25:49,116
library because we're going to be using
24530
18:25:46,876 --> 18:25:52,476
it a little bit and we're going to go
24531
18:25:49,115 --> 18:25:56,475
down in the main function and put in our
24532
18:25:52,475 --> 18:26:00,155
few variables we have a through f here a
24533
18:25:56,475 --> 18:26:04,155
and b are end c and d are of type double
24534
18:26:00,156 --> 18:26:06,244
and e and f are of type std strand the
24535
18:26:04,156 --> 18:26:09,195
first thing we can do we can say auto
24536
18:26:06,244 --> 18:26:11,920
max and we can assign whichever is the
24537
18:26:09,195 --> 18:26:13,755
maximum between a and b and once we do
24538
18:26:11,919 --> 18:26:16,796
this we're going to have that maximum
24539
18:26:13,755 --> 18:26:19,679
stored in max here but what i want you
24540
18:26:16,796 --> 18:26:22,639
to see is what the compiler does when it
24541
18:26:19,679 --> 18:26:25,115
sees the code like this the compiler has
24542
18:26:25,115 --> 18:26:30,475
to know the function template instance
24543
18:26:28,320 --> 18:26:33,040
it should really generate it is going to
24544
18:26:30,475 --> 18:26:34,875
look at the types we have here a and b
24545
18:26:33,039 --> 18:26:38,000
it's going to see that they are of type
24546
18:26:34,876 --> 18:26:40,156
and it's going to see that it can use
24547
18:26:38,000 --> 18:26:41,919
the function template we have here and
24548
18:26:40,156 --> 18:26:43,279
it's going to use that and generate a
24549
18:26:41,919 --> 18:26:45,599
template instance that it's going to
24550
18:26:43,279 --> 18:26:48,080
take and and it is going to call it to
24551
18:26:45,600 --> 18:26:50,080
get our maximum here again we can prove
24552
18:26:48,080 --> 18:26:51,835
this through the debugger we're going to
24553
18:26:50,080 --> 18:26:55,279
set up a breakpoint we're going to go to
24554
18:26:51,835 --> 18:26:57,360
our run tab here and we're going to run
24555
18:26:57,360 --> 18:27:01,919
we're going to build our thing and when
24556
18:26:59,436 --> 18:27:05,040
we hit the main function you're going to
24557
18:27:01,919 --> 18:27:08,399
see that a is 10 b is 23 which is what
24558
18:27:05,039 --> 18:27:11,195
we have here cd we have our values n and
24559
18:27:08,399 --> 18:27:13,919
std string because it is a compound type
24560
18:27:11,195 --> 18:27:15,516
or a custom type we can expand on this
24561
18:27:13,919 --> 18:27:17,679
and really see more information about
24562
18:27:15,516 --> 18:27:19,836
this but we don't have enough tools to
24563
18:27:17,679 --> 18:27:22,795
really understand this by now so we're
24564
18:27:19,835 --> 18:27:25,279
going to just to use this as a wrapper
24565
18:27:22,796 --> 18:27:27,360
on our stream information here now we
24566
18:27:25,279 --> 18:27:30,244
want to call the maximum function and
24567
18:27:27,360 --> 18:27:32,080
see what was generated by the compiler
24568
18:27:30,244 --> 18:27:34,000
and we can step into this function
24569
18:27:32,080 --> 18:27:34,796
because we have hit the breakpoint by
24570
18:27:34,796 --> 18:27:39,279
so if we hit step into we're going to
24571
18:27:37,279 --> 18:27:41,755
step into this function and we're going
24572
18:27:39,279 --> 18:27:44,244
to see that it is an int function
24573
18:27:41,755 --> 18:27:46,399
instance that was generated this is
24574
18:27:46,399 --> 18:27:51,115
if we change our call here to use c and
24575
18:27:49,360 --> 18:27:53,360
d we're going to generate a double
24576
18:27:51,115 --> 18:27:55,360
instance so let's do that we're going to
24577
18:27:53,360 --> 18:27:56,960
generate a double instance and if we
24578
18:27:55,360 --> 18:27:59,195
print this out we're going to see this
24579
18:27:56,960 --> 18:28:01,116
printed out but we can use the debugger
24580
18:27:59,195 --> 18:28:03,195
to really prove this not that we know
24581
18:28:01,115 --> 18:28:05,515
how to use it we don't have to look
24582
18:28:03,195 --> 18:28:07,279
through the terminal output window but
24583
18:28:05,516 --> 18:28:09,680
you can do that if you want you can set
24584
18:28:07,279 --> 18:28:12,244
up sddc out and print max here you're
24585
18:28:09,679 --> 18:28:13,919
going to see it printed out so let's run
24586
18:28:12,244 --> 18:28:16,400
our debugger we're going to see the
24587
18:28:13,919 --> 18:28:18,399
template instance that was generated
24588
18:28:16,399 --> 18:28:21,279
through the divider we're going to hit
24589
18:28:18,399 --> 18:28:23,515
the breakpoint at line 17 here
24590
18:28:21,279 --> 18:28:25,835
if we step inside we're going to see the
24591
18:28:23,516 --> 18:28:26,796
local variables for our function here a
24592
18:28:26,796 --> 18:28:31,516
and we're going to have the maximum
24593
18:28:29,115 --> 18:28:33,360
function to the top of the call stack
24594
18:28:31,516 --> 18:28:35,836
and you're going to see that it is a
24595
18:28:33,360 --> 18:28:37,360
double instance for our function
24596
18:28:37,360 --> 18:28:43,195
okay this is what we mean by
24597
18:28:39,919 --> 18:28:45,195
template type deduction it is the
24598
18:28:45,195 --> 18:28:50,796
that the compiler uses to know
24599
18:28:48,156 --> 18:28:53,195
which template instance to generate from
24600
18:28:50,796 --> 18:28:55,040
your function calls but as we have seen
24601
18:28:53,195 --> 18:28:56,475
in the last lecture this can be
24602
18:28:56,475 --> 18:29:02,080
one way this can be bad is if you pass
24603
18:28:59,600 --> 18:29:05,360
different types to the maximum function
24604
18:29:02,080 --> 18:29:07,680
here let's pass in a and c for example
24605
18:29:05,360 --> 18:29:09,516
or a and d this is going to work equally
24606
18:29:07,679 --> 18:29:12,475
well you see that we get a compiler
24607
18:29:09,516 --> 18:29:15,680
error because the compiler now it says
24608
18:29:12,475 --> 18:29:18,080
that we are calling with different types
24609
18:29:15,679 --> 18:29:20,079
but the template parameters here are
24610
18:29:18,080 --> 18:29:22,320
really of the same type they should be
24611
18:29:20,080 --> 18:29:24,960
of the same type because t is going to
24612
18:29:22,320 --> 18:29:26,876
be replaced for a single time so the
24613
18:29:24,960 --> 18:29:28,960
call we do here is going to fail and if
24614
18:29:26,876 --> 18:29:31,279
we run this through the compiler again
24615
18:29:28,960 --> 18:29:32,876
let's do that we're going to use gcc
24616
18:29:31,279 --> 18:29:34,720
we're going to get a compiler error and
24617
18:29:32,876 --> 18:29:36,796
it is going to say deduce conflicting
24618
18:29:36,796 --> 18:29:41,360
and then double so it can't really know
24619
18:29:39,436 --> 18:29:43,756
which one you want you want ent or
24620
18:29:41,360 --> 18:29:46,639
double the compiler doesn't know and it
24621
18:29:43,755 --> 18:29:48,399
is going to give us a compiler error but
24622
18:29:46,639 --> 18:29:50,720
now we're going to see a mechanism we
24623
18:29:48,399 --> 18:29:53,835
can use to make this work and that's
24624
18:29:50,720 --> 18:29:56,720
going to be explicit template arguments
24625
18:29:53,835 --> 18:29:59,115
okay what we can do to do this we can go
24626
18:29:56,720 --> 18:30:02,244
down and put in our call we're going to
24627
18:29:59,115 --> 18:30:03,835
say auto and say result or max we can
24628
18:30:02,244 --> 18:30:05,436
call this however we want we're going to
24629
18:30:03,835 --> 18:30:07,195
say the name of the function and we're
24630
18:30:07,195 --> 18:30:12,475
the template type that we want generated
24631
18:30:10,080 --> 18:30:14,876
for our function template here so if we
24632
18:30:12,475 --> 18:30:17,360
do something like this with double
24633
18:30:14,876 --> 18:30:19,600
inside angle brackets here we're going
24634
18:30:17,360 --> 18:30:22,555
to be basically telling the compiler
24635
18:30:19,600 --> 18:30:25,516
please generate a double template
24636
18:30:22,555 --> 18:30:28,000
instance for this call we are doing here
24637
18:30:25,516 --> 18:30:29,600
so if we pass in c and d for example
24638
18:30:28,000 --> 18:30:31,835
this is going to give us what we want
24639
18:30:29,600 --> 18:30:34,320
and we can print this out if we
24640
18:30:31,835 --> 18:30:37,835
want so let's say max okay this is going
24641
18:30:34,320 --> 18:30:39,280
to work if we build let's build with gcc
24642
18:30:39,279 --> 18:30:43,600
the build is going to be good because we
24643
18:30:43,600 --> 18:30:48,639
arguments and if we run this we should
24644
18:30:46,000 --> 18:30:51,360
see our maximum let's bring up a
24645
18:30:48,639 --> 18:30:53,679
terminal window and a visual studio code
24646
18:30:51,360 --> 18:30:55,680
here so that we can use that to see
24647
18:30:53,679 --> 18:30:57,919
things running we're going to clear and
24648
18:30:55,679 --> 18:31:02,243
run rooster you see that we have our
24649
18:30:57,919 --> 18:31:04,555
maximum here but using explicit template
24650
18:31:02,244 --> 18:31:07,279
arguments like we are doing here is
24651
18:31:04,555 --> 18:31:10,080
going to allow us to even pass different
24652
18:31:07,279 --> 18:31:12,080
types for our template arguments and for
24653
18:31:10,080 --> 18:31:14,475
example now we can change the first
24654
18:31:12,080 --> 18:31:16,400
argument here to ba which is going to be
24655
18:31:14,475 --> 18:31:19,755
an end and we're going to leave the
24656
18:31:16,399 --> 18:31:21,919
second one to bd which is of type double
24657
18:31:19,755 --> 18:31:24,079
now the compiler is going to see that
24658
18:31:21,919 --> 18:31:26,959
we're going to generate a template
24659
18:31:24,080 --> 18:31:28,960
instance of type double and it is going
24660
18:31:26,960 --> 18:31:31,756
to know that it can do implicit
24661
18:31:28,960 --> 18:31:34,556
conversions for the arguments we pass in
24662
18:31:31,755 --> 18:31:36,639
here so this is going to work if we pass
24663
18:31:34,555 --> 18:31:39,599
an argument that is implicitly
24664
18:31:36,639 --> 18:31:42,720
convertible to the type we passed in the
24665
18:31:39,600 --> 18:31:44,960
angle brackets here and let's debug this
24666
18:31:42,720 --> 18:31:47,516
again to show you that we're going to
24667
18:31:44,960 --> 18:31:49,196
generate a double template instance that
24668
18:31:47,516 --> 18:31:52,400
is going to be called and give us the
24669
18:31:49,195 --> 18:31:55,195
maximum that we print here so we can run
24670
18:31:52,399 --> 18:31:57,679
our debugger by hitting the green run
24671
18:31:55,195 --> 18:31:59,195
button here let's minimize this so that
24672
18:31:59,195 --> 18:32:04,399
our terminal window and it is down here
24673
18:32:02,000 --> 18:32:07,039
let's grab it and put it to the left so
24674
18:32:04,399 --> 18:32:08,795
that we can really see things printed
24675
18:32:08,796 --> 18:32:13,360
we have hit the breakpoint here and we
24676
18:32:11,516 --> 18:32:15,116
have our local variables you can look at
24677
18:32:13,360 --> 18:32:17,279
this if you want it is basically what we
24678
18:32:15,115 --> 18:32:19,919
have in the main function here but what
24679
18:32:17,279 --> 18:32:20,876
we want is to step into this maximum
24680
18:32:22,639 --> 18:32:27,755
the template instance that was generated
24681
18:32:25,279 --> 18:32:30,156
you see that it is of a double type here
24682
18:32:27,755 --> 18:32:34,000
okay hopefully now you can see that even
24683
18:32:30,156 --> 18:32:36,000
if we passed different values for our
24684
18:32:34,000 --> 18:32:38,960
template arguments i should say
24685
18:32:36,000 --> 18:32:42,080
different types because a is of type and
24686
18:32:38,960 --> 18:32:44,556
and d is of type double but we're not
24687
18:32:42,080 --> 18:32:47,436
getting a compiler error the compiler is
24688
18:32:44,555 --> 18:32:50,796
going to insert implicit conversions
24689
18:32:47,436 --> 18:32:53,600
from whatever arguments we pass here to
24690
18:32:50,796 --> 18:32:56,400
the explicit template argument that we
24691
18:32:53,600 --> 18:32:58,556
specified here again the explicit
24692
18:32:56,399 --> 18:33:01,195
template argument like we are doing here
24693
18:32:58,555 --> 18:33:03,516
using the syntax with angle brackets and
24694
18:33:01,195 --> 18:33:06,399
putting in our type is going to tell the
24695
18:33:03,516 --> 18:33:09,116
compiler please use this type and
24696
18:33:06,399 --> 18:33:11,679
replace that for t in our function
24697
18:33:09,115 --> 18:33:14,155
template here and generate a template
24698
18:33:11,679 --> 18:33:16,399
instance we can call to service this
24699
18:33:14,156 --> 18:33:18,639
call here and we're going to do implicit
24700
18:33:18,639 --> 18:33:22,876
and to double because that's what we
24701
18:33:20,555 --> 18:33:24,876
want then d is going to be of double
24702
18:33:22,876 --> 18:33:26,555
type we're not going to do any implicit
24703
18:33:24,876 --> 18:33:28,476
conversion then we're going to call this
24704
18:33:26,555 --> 18:33:30,475
function we're going to return a double
24705
18:33:28,475 --> 18:33:32,319
from it because that's our template
24706
18:33:30,475 --> 18:33:34,155
instance and we're going to print that
24707
18:33:32,320 --> 18:33:36,720
out here this is what is happening and
24708
18:33:34,156 --> 18:33:39,436
we can prove that a double instance was
24709
18:33:36,720 --> 18:33:42,639
generated through our call stack here we
24710
18:33:39,436 --> 18:33:44,475
see the maximum function is taking in
24711
18:33:42,639 --> 18:33:48,399
double parameters and it's going to
24712
18:33:44,475 --> 18:33:50,243
return double as our explicit
24713
18:33:48,399 --> 18:33:54,155
template argument here this is the
24714
18:33:50,244 --> 18:33:56,556
syntax that gcc uses is using but we
24715
18:33:54,156 --> 18:33:59,360
know now that it is a double template
24716
18:33:56,555 --> 18:34:02,000
instance for a function call here okay
24717
18:33:59,360 --> 18:34:04,796
if you're not happy with what we are
24718
18:34:02,000 --> 18:34:07,516
seeing with the debugger you can also
24719
18:34:04,796 --> 18:34:09,279
use cpp insights to really prove this
24720
18:34:07,516 --> 18:34:11,600
let's open this up we're going to say
24721
18:34:11,600 --> 18:34:16,000
let's do that and we're going to have it
24722
18:34:13,835 --> 18:34:17,835
open here okay we're going to
24723
18:34:16,000 --> 18:34:20,475
erase whatever we have in here and we're
24724
18:34:17,835 --> 18:34:23,436
going to put in another piece of code we
24725
18:34:20,475 --> 18:34:25,599
have our maximum function i should say
24726
18:34:23,436 --> 18:34:27,436
template function or function template
24727
18:34:25,600 --> 18:34:30,876
and we have alcohol here and it is
24728
18:34:27,436 --> 18:34:32,720
passing different types a and d remember
24729
18:34:30,876 --> 18:34:35,600
the last time we did something like this
24730
18:34:32,720 --> 18:34:38,475
by passing in different types for the
24731
18:34:35,600 --> 18:34:40,796
template argument this guy failed it
24732
18:34:38,475 --> 18:34:43,115
couldn't really generate a function
24733
18:34:40,796 --> 18:34:45,919
template instance because the template
24734
18:34:43,115 --> 18:34:48,080
parameters we have on top here specify
24735
18:34:45,919 --> 18:34:50,475
that these guys should be of the same
24736
18:34:48,080 --> 18:34:53,516
type but now we are able to use
24737
18:34:50,475 --> 18:34:56,319
different types as arguments because we
24738
18:34:53,516 --> 18:34:58,476
have an explicit argument specified
24739
18:34:56,320 --> 18:35:00,960
let's run this and see the template
24740
18:34:58,475 --> 18:35:02,959
instance that is generated and you can
24741
18:35:00,960 --> 18:35:06,244
see that it is of double type we
24742
18:35:02,960 --> 18:35:08,960
basically replaced every instance of t
24743
18:35:06,244 --> 18:35:11,279
here with double and this function is
24744
18:35:08,960 --> 18:35:13,280
going to be called to service the call
24745
18:35:11,279 --> 18:35:15,279
we are making here okay this is really
24746
18:35:13,279 --> 18:35:17,195
all we set out to do in this lecture i
24747
18:35:15,279 --> 18:35:19,600
hope you found it interesting the main
24748
18:35:17,195 --> 18:35:22,796
message was template type deduction a
24749
18:35:19,600 --> 18:35:24,960
default mechanism c plus plus uses to
24750
18:35:22,796 --> 18:35:27,680
know which template instances to
24751
18:35:24,960 --> 18:35:30,156
generate from your function calls but if
24752
18:35:27,679 --> 18:35:33,279
the defaults aren't working for you you
24753
18:35:30,156 --> 18:35:36,400
can use explicit template arguments to
24754
18:35:33,279 --> 18:35:39,039
specify the template instance you want
24755
18:35:36,399 --> 18:35:40,720
to generate it we are going to stop here
24756
18:35:39,039 --> 18:35:42,795
in this lecture in the next one we're
24757
18:35:40,720 --> 18:35:45,195
going to see how we can pass template
24758
18:35:45,195 --> 18:35:49,115
go ahead and finish up here and meet me
24759
18:35:47,516 --> 18:35:51,436
there in this lecture we're going to
24760
18:35:49,115 --> 18:35:54,319
show you that you can pass your template
24761
18:35:51,436 --> 18:35:56,244
type parameters by reference and we're
24762
18:35:54,320 --> 18:35:58,320
going to look at a simple example to
24763
18:35:56,244 --> 18:36:00,320
really drive this home what we have seen
24764
18:35:58,320 --> 18:36:03,116
so far is that we can do things like
24765
18:36:00,320 --> 18:36:05,280
this and specify our t like this and
24766
18:36:03,115 --> 18:36:08,475
this is going to generate a template
24767
18:36:05,279 --> 18:36:11,115
instance that passes our arguments by
24768
18:36:08,475 --> 18:36:13,755
value for example if we pass in double a
24769
18:36:11,115 --> 18:36:16,243
and double b here for our maximum we're
24770
18:36:13,755 --> 18:36:18,555
going to generate a template instance
24771
18:36:16,244 --> 18:36:20,796
which takes double as parameters and
24772
18:36:18,555 --> 18:36:23,115
returns a double here and this is going
24773
18:36:20,796 --> 18:36:25,516
to be doing things by value okay this is
24774
18:36:23,115 --> 18:36:27,515
what i want you to focus on right now it
24775
18:36:25,516 --> 18:36:30,476
is that this is going to do things by
24776
18:36:27,516 --> 18:36:32,400
value so if we go in our function here
24777
18:36:30,475 --> 18:36:34,720
and compute the maximum you're going to
24778
18:36:32,399 --> 18:36:37,195
see that the addresses we have on the
24779
18:36:34,720 --> 18:36:39,919
outside are going to be different from
24780
18:36:37,195 --> 18:36:42,639
the addresses we have on the inside here
24781
18:36:39,919 --> 18:36:44,959
if we try to print them out but you can
24782
18:36:42,639 --> 18:36:47,436
also pass your template parameters by
24783
18:36:44,960 --> 18:36:50,000
reference and the syntax to do that is
24784
18:36:47,436 --> 18:36:52,400
ridiculously easy you just use this like
24785
18:36:50,000 --> 18:36:54,639
you would use any reference we say cast
24786
18:36:52,399 --> 18:36:58,000
t reference here and this is going to
24787
18:36:54,639 --> 18:37:00,000
just replace in whatever type that you
24788
18:36:58,000 --> 18:37:02,555
pass when you call the function here for
24789
18:37:00,000 --> 18:37:05,516
example here we are passing in double
24790
18:37:02,555 --> 18:37:08,319
arguments so this is going to deduce a
24791
18:37:05,516 --> 18:37:11,279
double template instance which basically
24792
18:37:08,320 --> 18:37:13,196
says cost double reference maximum cost
24793
18:37:11,279 --> 18:37:15,436
double reference a and cost double
24794
18:37:13,195 --> 18:37:17,516
reference b and this is going to be the
24795
18:37:15,436 --> 18:37:20,320
function that is called so this is going
24796
18:37:17,516 --> 18:37:22,639
to really do things by reference and the
24797
18:37:20,320 --> 18:37:25,680
values we have inside a function
24798
18:37:22,639 --> 18:37:27,919
template body here are going to be true
24799
18:37:25,679 --> 18:37:29,679
references to the values we have on the
24800
18:37:27,919 --> 18:37:31,599
outside if we happen to do any
24801
18:37:29,679 --> 18:37:33,679
modification inside the body of the
24802
18:37:31,600 --> 18:37:35,920
function the modification is going to be
24803
18:37:33,679 --> 18:37:38,000
visible on the outside what we're going
24804
18:37:35,919 --> 18:37:40,080
to be doing in this lecture is just
24805
18:37:38,000 --> 18:37:42,080
printing the addresses here and we're
24806
18:37:40,080 --> 18:37:45,436
going to see that they are the same here
24807
18:37:42,080 --> 18:37:48,000
on the outside and inside the body of
24808
18:37:45,436 --> 18:37:50,320
our function template here okay this is
24809
18:37:48,000 --> 18:37:52,720
what we want to really play with in this
24810
18:37:50,320 --> 18:37:54,960
lecture but before we head over to
24811
18:37:52,720 --> 18:37:57,195
visual studio code i want to show you
24812
18:37:54,960 --> 18:37:59,836
that you can confuse your compiler if
24813
18:37:57,195 --> 18:38:02,399
you are not careful if you set up these
24814
18:37:59,835 --> 18:38:04,555
two function templates you see here
24815
18:38:02,399 --> 18:38:06,319
they are going to be overloads and we
24816
18:38:04,555 --> 18:38:08,243
can use function overloads with
24817
18:38:06,320 --> 18:38:10,476
templates but for now we're just going
24818
18:38:08,244 --> 18:38:12,960
to focus on the parameters that we are
24819
18:38:10,475 --> 18:38:15,115
passing in here the first one is taken
24820
18:38:15,115 --> 18:38:19,360
and the second one is taking thanks by
24821
18:38:19,360 --> 18:38:24,000
and if we issue a call like this we're
24822
18:38:21,600 --> 18:38:26,556
going to have the same problem we have
24823
18:38:24,000 --> 18:38:28,320
seen with function overloads before this
24824
18:38:26,555 --> 18:38:30,639
is not going to know whether you are
24825
18:38:28,320 --> 18:38:32,800
calling by value or by reference and
24826
18:38:30,639 --> 18:38:34,720
this is going to cause a compiler error
24827
18:38:32,800 --> 18:38:36,160
i really want you to be aware of this
24828
18:38:34,720 --> 18:38:38,160
okay now that you know this we're going
24829
18:38:36,160 --> 18:38:40,160
to head over to visual studio code and
24830
18:38:38,160 --> 18:38:42,800
really play with us a little more okay
24831
18:38:40,160 --> 18:38:45,512
here we are in our working folder the
24832
18:38:42,800 --> 18:38:47,680
current project is template parameters
24833
18:38:45,512 --> 18:38:50,800
by reference we're going to grab our
24834
18:38:47,679 --> 18:38:52,871
template files and put them in place so
24835
18:38:50,800 --> 18:38:55,512
let's do that and we are going to open
24836
18:38:52,872 --> 18:38:58,080
this little guy in visual studio code by
24837
18:38:55,512 --> 18:39:00,160
dragging and dropping here the folder is
24838
18:38:58,080 --> 18:39:02,080
going to open up we're going to open it
24839
18:39:00,160 --> 18:39:05,919
and we're going to close the left pane
24840
18:39:02,080 --> 18:39:08,000
here and clean up our main file here and
24841
18:39:05,919 --> 18:39:10,319
we are going to put in our function
24842
18:39:08,000 --> 18:39:12,399
template one thing i want you to see in
24843
18:39:10,320 --> 18:39:14,480
this lecture is that it is possible to
24844
18:39:12,399 --> 18:39:16,799
separate these things into function
24845
18:39:14,479 --> 18:39:18,800
declaration and function definition
24846
18:39:16,800 --> 18:39:20,872
let's just try and do that here so that
24847
18:39:18,800 --> 18:39:22,551
you can really see this and then you're
24848
18:39:20,872 --> 18:39:24,639
going to have to choose what you like a
24849
18:39:22,551 --> 18:39:27,039
little more so let's grab a function
24850
18:39:24,639 --> 18:39:29,279
header here and use that as a prototype
24851
18:39:27,039 --> 18:39:31,439
we're going to put that in front of the
24852
18:39:29,279 --> 18:39:34,551
main function and that's going to be our
24853
18:39:31,440 --> 18:39:37,191
declaration and if we go down after the
24854
18:39:34,551 --> 18:39:39,440
main function here what we have is our
24855
18:39:37,191 --> 18:39:41,831
definition this could work and this is
24856
18:39:39,440 --> 18:39:44,080
going to generate template instances for
24857
18:39:41,831 --> 18:39:45,919
the calls we do in the main function
24858
18:39:44,080 --> 18:39:47,919
here okay now that we have this we can
24859
18:39:45,919 --> 18:39:50,319
head in the main function and really
24860
18:39:47,919 --> 18:39:51,759
play with the function template here
24861
18:39:50,320 --> 18:39:53,600
we're going to set up two double
24862
18:39:51,759 --> 18:39:56,399
parameters and we're going to call the
24863
18:39:53,600 --> 18:39:58,639
function for example we say addon result
24864
18:39:56,399 --> 18:40:00,319
and we're going to call the maximum
24865
18:39:58,639 --> 18:40:02,551
function and we're going to pass in a
24866
18:40:02,551 --> 18:40:08,159
default template type deduction and it
24867
18:40:05,039 --> 18:40:10,319
is going to generate a double function
24868
18:40:08,160 --> 18:40:12,080
template instance here but what we
24869
18:40:10,320 --> 18:40:14,480
really want to prove is that this is
24870
18:40:12,080 --> 18:40:16,720
going to pass things by value and one
24871
18:40:14,479 --> 18:40:20,159
way we have to prove this is to bridge
24872
18:40:16,720 --> 18:40:22,320
the addresses both on the outside and on
24873
18:40:20,160 --> 18:40:24,240
the inside of the function here you see
24874
18:40:22,320 --> 18:40:26,240
we are already doing that in our
24875
18:40:24,240 --> 18:40:28,639
function template body we are going to
24876
18:40:26,240 --> 18:40:32,080
print the address of a so we can really
24877
18:40:28,639 --> 18:40:33,279
grab this and we use this stdc out
24878
18:40:33,279 --> 18:40:37,512
and we are going to change it to say out
24879
18:40:36,080 --> 18:40:40,160
here and we're going to print the
24880
18:40:37,512 --> 18:40:42,800
address of a let's grab this again and
24881
18:40:40,160 --> 18:40:44,720
use this after the function call and
24882
18:40:44,720 --> 18:40:50,160
is some address on the outside so for
24883
18:40:47,831 --> 18:40:54,639
example we may have something like zero
24884
18:40:50,160 --> 18:40:57,040
x and a one one one abc which is some
24885
18:40:54,639 --> 18:40:59,191
hex number here and that's the same
24886
18:40:57,039 --> 18:41:01,119
thing we're going to have on the outside
24887
18:40:59,191 --> 18:41:04,000
because the value we have before the
24888
18:41:01,119 --> 18:41:05,831
function call and the value we have
24889
18:41:04,000 --> 18:41:08,551
after the function call are going to be
24890
18:41:05,831 --> 18:41:11,191
leaving at the same address but what we
24891
18:41:08,551 --> 18:41:13,440
have inside the function body is going
24892
18:41:11,191 --> 18:41:15,679
to be a copy so it's going to live at
24893
18:41:13,440 --> 18:41:16,960
some other address for example let's say
24894
18:41:16,960 --> 18:41:20,872
and uh the main point here is that what
24895
18:41:19,119 --> 18:41:22,551
we have on the outside is going to be
24896
18:41:20,872 --> 18:41:24,551
different from what we have on the east
24897
18:41:22,551 --> 18:41:27,191
side and hopefully this is going to
24898
18:41:24,551 --> 18:41:30,080
prove that we are passing by value so
24899
18:41:27,191 --> 18:41:32,159
let's print out our maximum here and see
24900
18:41:30,080 --> 18:41:35,360
the addresses printed out we're going to
24901
18:41:32,160 --> 18:41:38,400
build with gcc and we're going to build
24902
18:41:35,360 --> 18:41:40,240
successfully we can bring up a terminal
24903
18:41:38,399 --> 18:41:42,479
to play with us a little more we can
24904
18:41:40,240 --> 18:41:45,040
clear and run rooster we're going to see
24905
18:41:42,479 --> 18:41:48,720
that the address on the outside ends in
24906
18:41:45,039 --> 18:41:51,511
dd8 and the address on the outside ends
24907
18:41:48,720 --> 18:41:53,759
with dd8 after the function call but
24908
18:41:51,512 --> 18:41:56,160
inside you see that we have a different
24909
18:41:53,759 --> 18:41:58,799
address and this is going to tell us
24910
18:41:56,160 --> 18:42:01,360
that we are passing by value and what we
24911
18:41:58,800 --> 18:42:04,400
have inside the body of the function is
24912
18:42:01,360 --> 18:42:06,720
basically a copy again i don't expect
24913
18:42:04,399 --> 18:42:08,551
you to see the same addresses as me here
24914
18:42:06,720 --> 18:42:10,872
because your operating system is going
24915
18:42:08,551 --> 18:42:13,039
to set up the addresses however it wants
24916
18:42:10,872 --> 18:42:15,279
the main point here is that the
24917
18:42:13,039 --> 18:42:17,191
addresses you see on the outside are
24918
18:42:15,279 --> 18:42:19,600
going to be different from the addresses
24919
18:42:17,191 --> 18:42:22,159
you see on the inside here and this
24920
18:42:19,600 --> 18:42:24,639
proves that we are passing by value but
24921
18:42:22,160 --> 18:42:27,120
what if you don't really want to pass by
24922
18:42:24,639 --> 18:42:29,600
value and make your function template
24923
18:42:27,119 --> 18:42:31,512
work by reference well we can do that we
24924
18:42:29,600 --> 18:42:33,600
can change our function here to do
24925
18:42:31,512 --> 18:42:34,400
things by reference and all we have to
24926
18:42:34,399 --> 18:42:39,919
is use t reference like this okay and
24927
18:42:37,512 --> 18:42:42,551
when we start using references we really
24928
18:42:39,919 --> 18:42:45,440
need to be careful and make sure people
24929
18:42:42,551 --> 18:42:48,080
don't modify things without our
24930
18:42:45,440 --> 18:42:50,639
knowledge and a good practice is to mark
24931
18:42:48,080 --> 18:42:52,639
your things as cost references so we're
24932
18:42:50,639 --> 18:42:55,191
going to do that and we are going to do
24933
18:42:52,639 --> 18:42:57,360
the same in our function definition so
24934
18:42:55,191 --> 18:43:00,080
we're going to change this to cost t
24935
18:42:57,360 --> 18:43:02,720
reference let's do that and let's say
24936
18:43:00,080 --> 18:43:05,191
cost t reference for the first parameter
24937
18:43:02,720 --> 18:43:07,919
here and say the same for the second
24938
18:43:05,191 --> 18:43:10,319
parameter here and this should be it we
24939
18:43:07,919 --> 18:43:12,551
shouldn't be able to use this reference
24940
18:43:10,320 --> 18:43:14,552
to modify the data inside the body of
24941
18:43:12,551 --> 18:43:16,872
the function and our function is a
24942
18:43:14,551 --> 18:43:18,639
little safer but what the compiler is
24943
18:43:16,872 --> 18:43:20,479
going to do is really what it's been
24944
18:43:18,639 --> 18:43:22,160
doing all along it's going to look at
24945
18:43:20,479 --> 18:43:23,599
the arguments that we pass to the
24946
18:43:22,160 --> 18:43:26,080
function call here it's going to see
24947
18:43:23,600 --> 18:43:28,872
that it is double and it's going to do
24948
18:43:26,080 --> 18:43:31,759
default template type deduction so it's
24949
18:43:28,872 --> 18:43:34,000
going to generate a double template
24950
18:43:31,759 --> 18:43:36,639
instance for the function template here
24951
18:43:34,000 --> 18:43:38,080
and it's going to replace in double and
24952
18:43:36,639 --> 18:43:40,479
we're going to have const double
24953
18:43:38,080 --> 18:43:42,872
reference maximum cost double reference
24954
18:43:40,479 --> 18:43:46,159
a constant double reference b
24955
18:43:42,872 --> 18:43:48,479
and we can prove this by going into cpp
24956
18:43:46,160 --> 18:43:51,040
insight i think we can do that so we are
24957
18:43:48,479 --> 18:43:52,959
here in cpp insights we can take out
24958
18:43:51,039 --> 18:43:55,511
whatever we had we're going to put in
24959
18:43:57,360 --> 18:44:03,119
to generate our instances and here we
24960
18:44:00,399 --> 18:44:05,679
have our template instance here
24961
18:44:03,119 --> 18:44:08,871
generated you see that it is going to
24962
18:44:05,679 --> 18:44:10,719
generate a double version of our
24963
18:44:08,872 --> 18:44:13,279
function template here and this is what
24964
18:44:10,720 --> 18:44:16,240
we have so const double reference
24965
18:44:13,279 --> 18:44:18,399
maximum and it is going to put in a
24966
18:44:16,240 --> 18:44:20,639
double explicit argument here but this
24967
18:44:18,399 --> 18:44:23,439
is business of the compiler what we
24968
18:44:20,639 --> 18:44:25,440
really care about is that it generated a
24969
18:44:23,440 --> 18:44:27,600
double template instance for our
24970
18:44:25,440 --> 18:44:29,040
function template here now if we run
24971
18:44:27,600 --> 18:44:31,512
this it is going to be passing
24972
18:44:29,039 --> 18:44:33,511
parameters by reference and what we have
24973
18:44:31,512 --> 18:44:36,160
on the inside should have the same
24974
18:44:33,512 --> 18:44:37,512
address as what we have on the outside
24975
18:44:37,512 --> 18:44:40,960
to really drive this home we should
24976
18:44:40,960 --> 18:44:46,240
our address to abc to comply with what
24977
18:44:44,080 --> 18:44:48,240
we have on the outside here we can try
24978
18:44:46,240 --> 18:44:50,400
and build our program we're going to use
24979
18:44:48,240 --> 18:44:52,480
the gcc to do that the build is going to
24980
18:44:50,399 --> 18:44:54,639
be good we're going to clear and if we
24981
18:44:52,479 --> 18:44:59,440
run rooster we should see the addresses
24982
18:44:54,639 --> 18:45:02,479
being the same out d e 0 in d e 0 and
24983
18:44:59,440 --> 18:45:04,551
out d e 0 and you see now we are passing
24984
18:45:02,479 --> 18:45:07,039
our parameters by reference and if you
24985
18:45:04,551 --> 18:45:10,399
want to set up a function template that
24986
18:45:07,039 --> 18:45:12,239
passes template parameters by reference
24987
18:45:12,240 --> 18:45:16,552
and i think we can also try and debug
24988
18:45:14,479 --> 18:45:18,959
this and see if we can see any more
24989
18:45:16,551 --> 18:45:21,759
information on how this works we're
24990
18:45:18,960 --> 18:45:24,160
going to hit our run tab here and we're
24991
18:45:21,759 --> 18:45:26,000
going to hit the green button to start
24992
18:45:24,160 --> 18:45:29,600
debugging this program we're going to be
24993
18:45:26,000 --> 18:45:32,320
using the debugging tools from gcc
24994
18:45:29,600 --> 18:45:35,360
and we see our local variables here we
24995
18:45:32,320 --> 18:45:37,120
have hit the breakpoint and we have the
24996
18:45:35,360 --> 18:45:40,320
main function to the top of the call
24997
18:45:37,119 --> 18:45:42,479
stack this is what we have here and if
24998
18:45:40,320 --> 18:45:44,240
we try and step into the maximum
24999
18:45:42,479 --> 18:45:47,191
function we're going to see that the
25000
18:45:44,240 --> 18:45:49,832
template instance now is using const
25001
18:45:47,191 --> 18:45:52,720
double references and this is the
25002
18:45:49,831 --> 18:45:55,599
template instance that was generated i
25003
18:45:52,720 --> 18:45:58,551
think this is all we can really see here
25004
18:45:55,600 --> 18:46:00,080
and let's stop this and show you one
25005
18:46:00,080 --> 18:46:03,831
what i'm going to show you is that you
25006
18:46:03,831 --> 18:46:09,039
the function template that passes by
25007
18:46:07,119 --> 18:46:10,799
value and the other one passing by
25008
18:46:09,039 --> 18:46:12,719
reference if you do that you're going to
25009
18:46:10,800 --> 18:46:14,240
have problems when you issue the call
25010
18:46:12,720 --> 18:46:16,720
like this because the compiler is going
25011
18:46:14,240 --> 18:46:19,120
to be confused let's change the second
25012
18:46:16,720 --> 18:46:21,191
one here to pass by value so we're going
25013
18:46:19,119 --> 18:46:22,959
to remove the cost reference here i
25014
18:46:21,191 --> 18:46:25,279
think it's going to do let's do that
25015
18:46:22,960 --> 18:46:28,240
pretty quick we'll remove the cost and
25016
18:46:25,279 --> 18:46:31,119
the reference we remove the cost and the
25017
18:46:28,240 --> 18:46:33,919
reference here and we use this guy as
25018
18:46:31,119 --> 18:46:36,799
our function prototype in front of the
25019
18:46:33,919 --> 18:46:39,360
main function here and how can we say
25020
18:46:36,800 --> 18:46:41,120
that we're going to go on top here and
25021
18:46:39,360 --> 18:46:43,680
say that okay we're going to put our
25022
18:46:41,119 --> 18:46:45,831
semicolon and this is going to be our
25023
18:46:43,679 --> 18:46:47,679
declaration but the moment we do this
25024
18:46:45,831 --> 18:46:49,759
you see that our compiler is going to be
25025
18:46:47,679 --> 18:46:52,399
confused because we have two possible
25026
18:46:49,759 --> 18:46:55,191
candidates for the call here it can
25027
18:46:52,399 --> 18:46:56,959
either be by value or by reference and
25028
18:46:55,191 --> 18:46:59,279
if we try to build this program we're
25029
18:46:56,960 --> 18:47:01,040
going to get a compiler error and it is
25030
18:46:59,279 --> 18:47:03,360
basically going to be saying what is
25031
18:47:01,039 --> 18:47:05,759
wrong here so it's going to say call
25032
18:47:03,360 --> 18:47:08,720
overloaded maximum double ambiguous
25033
18:47:05,759 --> 18:47:11,511
because we have two candidates again one
25034
18:47:08,720 --> 18:47:14,240
by reference one by value and this call
25035
18:47:11,512 --> 18:47:16,479
can be surfaced by both of these
25036
18:47:14,240 --> 18:47:18,639
candidates here so the compiler is going
25037
18:47:16,479 --> 18:47:21,440
to give us a compiler error and we have
25038
18:47:18,639 --> 18:47:23,679
no choice but to use either of these two
25039
18:47:23,679 --> 18:47:28,551
in our code and for example if we take
25040
18:47:26,000 --> 18:47:31,039
out the one by value here and leaving
25041
18:47:28,551 --> 18:47:32,639
the one by reference so let's comment
25042
18:47:31,039 --> 18:47:34,799
this out again if we're boiled we're
25043
18:47:32,639 --> 18:47:36,399
going to bolt you see the world is good
25044
18:47:34,800 --> 18:47:38,551
and we're going to print our data
25045
18:47:36,399 --> 18:47:40,871
however we have it in our code we see
25046
18:47:38,551 --> 18:47:43,039
the addresses are the same and another
25047
18:47:40,872 --> 18:47:45,600
thing i don't think i really proved to
25048
18:47:43,039 --> 18:47:48,639
you is that we are passing by const
25049
18:47:45,600 --> 18:47:50,400
reference here so the template instance
25050
18:47:48,639 --> 18:47:52,479
that is going to be generated is going
25051
18:47:50,399 --> 18:47:54,399
to be passing by const double reference
25052
18:47:52,479 --> 18:47:57,512
because we are passing in double
25053
18:47:54,399 --> 18:48:00,000
parameters but because of this cost in
25054
18:47:57,512 --> 18:48:03,119
front of our arguments here we want to
25055
18:48:00,000 --> 18:48:05,440
be able to modify the data referenced by
25056
18:48:03,119 --> 18:48:08,080
this name here if we go inside for
25057
18:48:05,440 --> 18:48:10,639
example and say plus plus a try to
25058
18:48:08,080 --> 18:48:12,160
modify a in any way through this
25059
18:48:10,639 --> 18:48:13,919
reference we're going to get a compiler
25060
18:48:12,160 --> 18:48:17,192
error let's work again and we're going
25061
18:48:13,919 --> 18:48:18,240
to see that and uh world finished with
25062
18:48:20,160 --> 18:48:24,639
increment of read only reference a
25063
18:48:22,800 --> 18:48:26,551
because we are passing by const
25064
18:48:24,639 --> 18:48:29,119
reference here so you should really
25065
18:48:26,551 --> 18:48:31,440
remember this even if we are doing the
25066
18:48:29,119 --> 18:48:32,479
things in the context of function
25067
18:48:32,479 --> 18:48:35,759
this is really all we set out to do in
25068
18:48:34,080 --> 18:48:38,160
this lecture showing you that you can
25069
18:48:35,759 --> 18:48:41,039
set up function templates that take
25070
18:48:38,160 --> 18:48:43,512
parameters by reference and contrasting
25071
18:48:41,039 --> 18:48:45,831
this with passing by value and seeing
25072
18:48:43,512 --> 18:48:47,760
the differences between these two things
25073
18:48:45,831 --> 18:48:49,279
we're going to stop here in this lecture
25074
18:48:47,759 --> 18:48:52,319
and the next one we're going to learn
25075
18:48:49,279 --> 18:48:54,551
about template spatialization
25076
18:48:52,320 --> 18:48:55,512
go ahead and finish up here and meet me
25077
18:48:55,512 --> 18:48:59,680
in this lecture we're going to learn
25078
18:48:56,800 --> 18:49:02,160
about template specialization and this
25079
18:48:59,679 --> 18:49:05,599
is a feature we have in c plus plus to
25080
18:49:02,160 --> 18:49:08,240
bypass the default mechanism of how
25081
18:49:05,600 --> 18:49:10,872
function templates work in c plus plus
25082
18:49:08,240 --> 18:49:12,872
okay let's make myself super clear here
25083
18:49:10,872 --> 18:49:15,192
we have a simple function template we
25084
18:49:12,872 --> 18:49:17,279
have seen a thousand times by now it is
25085
18:49:15,191 --> 18:49:20,239
the maximum function and it is going to
25086
18:49:17,279 --> 18:49:22,399
compute the maximum between a and b here
25087
18:49:20,240 --> 18:49:24,720
and it is going to return that it is a
25088
18:49:22,399 --> 18:49:26,551
function template so if we pass in a and
25089
18:49:24,720 --> 18:49:29,279
b which are of type and we're going to
25090
18:49:26,551 --> 18:49:32,720
generate a net instance of the template
25091
18:49:29,279 --> 18:49:34,800
here if we pass in c and d of double
25092
18:49:32,720 --> 18:49:37,600
time we're going to generate a double
25093
18:49:34,800 --> 18:49:40,551
instance of the function template here
25094
18:49:37,600 --> 18:49:43,360
if we pass in hdd string parameters
25095
18:49:40,551 --> 18:49:45,599
we're going to generate an std string
25096
18:49:43,360 --> 18:49:47,680
instance of this template here and this
25097
18:49:45,600 --> 18:49:49,680
is going to basically be comparing the
25098
18:49:47,679 --> 18:49:52,319
parameters we pass so we're basically
25099
18:49:49,679 --> 18:49:55,511
going to say if a is greater than b then
25100
18:49:52,320 --> 18:49:58,080
return a if a is not greater than b then
25101
18:49:55,512 --> 18:50:00,320
return b okay that's going to work if
25102
18:49:58,080 --> 18:50:02,400
what we're doing is what we have here
25103
18:50:00,320 --> 18:50:06,000
but the moment we pass something like
25104
18:50:02,399 --> 18:50:08,000
what we have here closed car pointers
25105
18:50:06,000 --> 18:50:10,080
then we're going to have a problem
25106
18:50:08,000 --> 18:50:13,279
because we're going to be calling our
25107
18:50:10,080 --> 18:50:14,800
function template with cost car pointer
25108
18:50:15,679 --> 18:50:21,359
default mechanism is going to deduce
25109
18:50:18,720 --> 18:50:24,399
a template instance that works on cost
25110
18:50:21,360 --> 18:50:26,000
car pointer arguments here and what
25111
18:50:24,399 --> 18:50:28,959
we're going to be comparing now are
25112
18:50:26,000 --> 18:50:32,000
going to be pointers to the string
25113
18:50:28,960 --> 18:50:33,512
rather than the string data itself and
25114
18:50:32,000 --> 18:50:36,240
hopefully you can see that this is going
25115
18:50:33,512 --> 18:50:38,639
to be a problem template specialization
25116
18:50:36,240 --> 18:50:41,600
is a mechanism we have to tell the
25117
18:50:38,639 --> 18:50:44,160
compiler for a template function
25118
18:50:41,600 --> 18:50:47,360
if i pass you this type please don't do
25119
18:50:44,160 --> 18:50:48,240
the default thing you do of replacing in
25120
18:50:48,240 --> 18:50:53,440
argument type for the template parameter
25121
18:50:50,960 --> 18:50:55,360
instead use the implementation that i am
25122
18:50:53,440 --> 18:50:57,600
going to give you and you tell that to
25123
18:50:55,360 --> 18:51:00,551
the compiler using the syntax we have
25124
18:50:57,600 --> 18:51:03,600
here you put a template keyword here you
25125
18:51:00,551 --> 18:51:06,319
put an empty pair of angle brackets and
25126
18:51:03,600 --> 18:51:08,240
then you specify your function the way
25127
18:51:06,320 --> 18:51:10,400
you want it you see it's going to return
25128
18:51:08,240 --> 18:51:12,639
a const card pointer the function name
25129
18:51:10,399 --> 18:51:14,399
is maximum which should be the same as
25130
18:51:14,399 --> 18:51:19,511
it's going to be specialized for const
25131
18:51:16,639 --> 18:51:21,831
car pointer so we specify an explicit
25132
18:51:19,512 --> 18:51:24,551
template argument here and then we pass
25133
18:51:21,831 --> 18:51:27,119
our parameters which are also of cost
25134
18:51:24,551 --> 18:51:29,360
card pointer and when we do this then we
25135
18:51:27,119 --> 18:51:31,440
can head in the body of the function and
25136
18:51:29,360 --> 18:51:33,512
do the comparison however we want okay
25137
18:51:31,440 --> 18:51:36,160
so how do we do this comparison here
25138
18:51:33,512 --> 18:51:38,551
here is a simple implementation of the
25139
18:51:36,160 --> 18:51:40,720
function template we just saw on the
25140
18:51:38,551 --> 18:51:42,319
previous slide you see that it really is
25141
18:51:40,720 --> 18:51:44,800
the same thing we have the template
25142
18:51:42,320 --> 18:51:47,760
keyword we have our angle brackets and
25143
18:51:44,800 --> 18:51:50,080
we have the function header here it's
25144
18:51:47,759 --> 18:51:52,319
going to return cost car pointer it's
25145
18:51:50,080 --> 18:51:55,040
going to be called maximum and an
25146
18:51:52,320 --> 18:51:57,440
explicit template argument is specified
25147
18:51:55,039 --> 18:52:00,479
within these angle brackets and then we
25148
18:51:57,440 --> 18:52:02,479
have our parameters what is really
25149
18:52:00,479 --> 18:52:04,239
important about this function is that
25150
18:52:02,479 --> 18:52:06,159
it's not going to do the comparison
25151
18:52:04,240 --> 18:52:08,080
we've been doing all along it's going to
25152
18:52:08,080 --> 18:52:12,800
and it's a c plus plus standard library
25153
18:52:10,320 --> 18:52:15,600
which is specialized for comparing c
25154
18:52:12,800 --> 18:52:17,800
strings okay if we come at cpp reference
25155
18:52:15,600 --> 18:52:21,120
here and look at a function called
25156
18:52:17,800 --> 18:52:23,040
htrcmp we have seen this before i guess
25157
18:52:21,119 --> 18:52:24,399
it is going to compare two null
25158
18:52:24,399 --> 18:52:28,871
lexicographically and you see this is
25159
18:52:26,240 --> 18:52:30,800
really what we want we have two const
25160
18:52:28,872 --> 18:52:32,320
car pointers one is going to be the
25161
18:52:30,800 --> 18:52:34,000
first parameter the other is going to be
25162
18:52:32,320 --> 18:52:36,400
the second parameter we're going to
25163
18:52:34,000 --> 18:52:38,160
compare them and look at the return
25164
18:52:36,399 --> 18:52:40,639
value we get from this function we're
25165
18:52:38,160 --> 18:52:43,192
going to get a negative return value if
25166
18:52:40,639 --> 18:52:45,919
the first parameter comes before the
25167
18:52:43,191 --> 18:52:48,080
second parameter in lexicographical
25168
18:52:45,919 --> 18:52:49,360
order we're going to get a zero if they
25169
18:52:49,360 --> 18:52:54,399
and we're going to get a positive value
25170
18:52:51,600 --> 18:52:57,120
if the first parameter comes after the
25171
18:52:54,399 --> 18:52:58,479
second parameter in lexicographical
25172
18:52:57,119 --> 18:53:00,639
order so we're going to use this
25173
18:52:58,479 --> 18:53:03,512
information here and compare
25174
18:53:00,639 --> 18:53:06,000
our two c strings here and return
25175
18:53:03,512 --> 18:53:07,600
something in visual studio code okay so
25176
18:53:06,000 --> 18:53:10,800
this is the function here it's going to
25177
18:53:07,600 --> 18:53:12,800
be using the logic from hdr cmp
25178
18:53:10,800 --> 18:53:15,192
and notice what we return we're going to
25179
18:53:15,191 --> 18:53:19,512
compares the greater to the other so
25180
18:53:17,119 --> 18:53:22,080
we're going to do strcmp we're going to
25181
18:53:19,512 --> 18:53:23,512
pass in our two arguments here and we're
25182
18:53:23,512 --> 18:53:28,551
if this returns something greater than 0
25183
18:53:31,080 --> 18:53:35,040
lexicographically this is the comparison
25184
18:53:33,191 --> 18:53:36,639
we want to do here and otherwise you're
25185
18:53:35,039 --> 18:53:38,871
going to return b and this is going to
25186
18:53:36,639 --> 18:53:41,119
compare our strings and not compare
25187
18:53:38,872 --> 18:53:43,040
pointers directly which is what we are
25188
18:53:41,119 --> 18:53:45,119
trying to avoid here and you see that
25189
18:53:43,039 --> 18:53:48,479
template specialization is really
25190
18:53:45,119 --> 18:53:51,279
helping out here now if we have this n
25191
18:53:48,479 --> 18:53:53,119
and the compiler sees a call like this
25192
18:53:51,279 --> 18:53:55,679
it's not going to compare pointers it's
25193
18:53:53,119 --> 18:53:58,080
going to use the template specialization
25194
18:53:55,679 --> 18:53:59,279
because the compiler knows that this is
25195
18:53:59,279 --> 18:54:04,319
fit for the call that we are doing here
25196
18:54:02,000 --> 18:54:06,479
because we are passing cost card
25197
18:54:04,320 --> 18:54:08,872
pointers this is how template
25198
18:54:06,479 --> 18:54:11,831
specialization works and it can really
25199
18:54:08,872 --> 18:54:14,160
come in handy if you are doing things
25200
18:54:11,831 --> 18:54:16,239
that work with pointers we are going to
25201
18:54:14,160 --> 18:54:18,160
head over to visual studio code and play
25202
18:54:16,240 --> 18:54:20,320
with this a little more okay here we are
25203
18:54:18,160 --> 18:54:22,400
in our working folder the current
25204
18:54:20,320 --> 18:54:25,192
project is template specialization we're
25205
18:54:22,399 --> 18:54:27,511
going to grab our template files
25206
18:54:25,191 --> 18:54:29,440
we're going to put them in place and
25207
18:54:27,512 --> 18:54:32,240
we're going to open this in visual
25208
18:54:29,440 --> 18:54:34,479
studio code by dragging and dropping on
25209
18:54:32,240 --> 18:54:36,080
top of visual studio code here this is
25210
18:54:34,479 --> 18:54:38,159
going to open our project and we're
25211
18:54:36,080 --> 18:54:39,919
going to clean it up a little bit and
25212
18:54:38,160 --> 18:54:41,832
we're going to close the left pane here
25213
18:54:39,919 --> 18:54:43,599
we don't need it anymore the first thing
25214
18:54:41,831 --> 18:54:46,000
we're going to do is to put in our
25215
18:54:43,600 --> 18:54:48,480
function template the same thing we have
25216
18:54:46,000 --> 18:54:50,800
been doing for a gazillion times by now
25217
18:54:48,479 --> 18:54:53,679
the maximum function is going to return
25218
18:54:50,800 --> 18:54:55,760
whichever is greater between a and b and
25219
18:54:53,679 --> 18:54:57,439
it is doing this by value after that
25220
18:54:55,759 --> 18:54:59,599
we're going to head over in the main
25221
18:54:57,440 --> 18:55:01,440
function and set up a piece of code to
25222
18:54:59,600 --> 18:55:03,360
really play with us we're going to set
25223
18:55:01,440 --> 18:55:06,960
up a few variables and we're going to
25224
18:55:03,360 --> 18:55:09,039
call our functions so we're going to say
25225
18:55:06,960 --> 18:55:11,192
maximum a and b this is going to return
25226
18:55:09,039 --> 18:55:14,000
the maximum between a and b the compiler
25227
18:55:11,191 --> 18:55:16,159
is going to deduce that the template
25228
18:55:14,000 --> 18:55:18,240
instance should be of ant type so it's
25229
18:55:16,160 --> 18:55:20,000
going to generate that and call it it's
25230
18:55:18,240 --> 18:55:22,000
going to give us the return value here
25231
18:55:20,000 --> 18:55:23,919
we can print it out and see it and we're
25232
18:55:22,000 --> 18:55:26,639
going to basically do the same
25233
18:55:23,919 --> 18:55:27,919
for double type and the string types
25234
18:55:26,639 --> 18:55:30,080
here and you're going to see that this
25235
18:55:27,919 --> 18:55:32,639
is going to work just fine so let's
25236
18:55:30,080 --> 18:55:35,919
build this we're going to use gcc to do
25237
18:55:32,639 --> 18:55:38,479
that the bolt is good we can clear and i
25238
18:55:35,919 --> 18:55:40,319
bring up a terminal to run this
25239
18:55:38,479 --> 18:55:43,679
and really see the output here we can
25240
18:55:40,320 --> 18:55:46,080
clear and run rooster you see max end is
25241
18:55:43,679 --> 18:55:48,079
23 because that's what we have here max
25242
18:55:48,080 --> 18:55:53,600
and that's what we have here and we
25243
18:55:50,720 --> 18:55:55,919
called max double to be of int type we
25244
18:55:53,600 --> 18:55:57,760
should use auto type deduction here to
25245
18:55:57,759 --> 18:56:00,959
because the compiler can do this better
25246
18:56:00,960 --> 18:56:05,280
that's what we're going to do and we're
25247
18:56:02,800 --> 18:56:08,479
going to deduce max sdr here and we're
25248
18:56:05,279 --> 18:56:10,959
going to build again let's weld with gcc
25249
18:56:08,479 --> 18:56:13,512
because that's my favorite compiler i'm
25250
18:56:10,960 --> 18:56:16,000
going to clear and run rooster now we
25251
18:56:13,512 --> 18:56:18,320
have correct output we have 23 which is
25252
18:56:18,320 --> 18:56:24,160
we have 34.7 which was deduced to be of
25253
18:56:21,919 --> 18:56:26,639
type double here and then we have the
25254
18:56:24,160 --> 18:56:28,552
maximum strength which happens to be
25255
18:56:28,551 --> 18:56:32,440
when comparing strengths the default is
25256
18:56:32,440 --> 18:56:38,240
lexicographically and what that means
25257
18:56:35,119 --> 18:56:40,000
the one that comes after the other in
25258
18:56:38,240 --> 18:56:42,800
alphabetical order is going to be
25259
18:56:40,000 --> 18:56:45,279
greater by that logic world is greater
25260
18:56:42,800 --> 18:56:47,120
than hello and it is what we are seeing
25261
18:56:45,279 --> 18:56:50,160
printed out here okay this is working
25262
18:56:47,119 --> 18:56:52,479
just fine but what if we use cost card
25263
18:56:50,160 --> 18:56:55,120
pointers and try to call our maximum
25264
18:56:52,479 --> 18:56:57,039
function template and by that i mean
25265
18:56:55,119 --> 18:56:58,159
doing something like this we have two
25266
18:56:58,160 --> 18:57:04,000
g and h which are of type cost card
25267
18:57:01,600 --> 18:57:06,080
pointers so they are c strings they are
25268
18:57:04,000 --> 18:57:08,551
going to be now terminated because we
25269
18:57:06,080 --> 18:57:10,960
are initializing them with a string
25270
18:57:08,551 --> 18:57:13,599
electron and we are comparing them here
25271
18:57:10,960 --> 18:57:15,760
we are saying maximum g and h and we're
25272
18:57:13,600 --> 18:57:18,160
going to print whichever is the maximum
25273
18:57:15,759 --> 18:57:19,919
after we return that from the function
25274
18:57:18,160 --> 18:57:21,512
when the compiler sees the call like
25275
18:57:19,919 --> 18:57:23,679
this it's going to do what it knows to
25276
18:57:21,512 --> 18:57:26,639
do it's going to replace an
25277
18:57:23,679 --> 18:57:28,399
scar pointer in our function template
25278
18:57:26,639 --> 18:57:30,080
here so it's going to return cost card
25279
18:57:28,399 --> 18:57:32,319
pointer it's going to pass the
25280
18:57:30,080 --> 18:57:33,600
parameters as coast guard pointers and
25281
18:57:32,320 --> 18:57:36,080
we're going to be comparing these
25282
18:57:33,600 --> 18:57:39,120
pointers here and we're going to return
25283
18:57:36,080 --> 18:57:41,119
whichever pointer is greater again here
25284
18:57:39,119 --> 18:57:43,191
you must be noticing the problem we're
25285
18:57:41,119 --> 18:57:45,360
going to return whichever pointer is
25286
18:57:43,191 --> 18:57:47,831
greater and we're not going to be
25287
18:57:45,360 --> 18:57:50,399
returning the actual string data we're
25288
18:57:47,831 --> 18:57:52,799
going to be returning just the address
25289
18:57:50,399 --> 18:57:55,511
and this can be really wrong because if
25290
18:57:52,800 --> 18:57:57,832
the addresses happen to be messed up
25291
18:57:55,512 --> 18:58:00,720
we're going to get the wrong output so
25292
18:57:57,831 --> 18:58:02,871
let's try and prove this again for that
25293
18:58:00,720 --> 18:58:05,040
i am going to comment out what we had on
25294
18:58:02,872 --> 18:58:06,400
top here because this could mess things
25295
18:58:06,399 --> 18:58:10,639
so i'm going to comment all this now and
25296
18:58:10,639 --> 18:58:15,360
so we're going to look at this line here
25297
18:58:15,360 --> 18:58:22,160
cos car pointer result and i say equals
25298
18:58:18,800 --> 18:58:24,160
max c mom g and h and i printed the
25299
18:58:22,160 --> 18:58:26,080
result here this is going to make it
25300
18:58:24,160 --> 18:58:29,440
easier to step into this function
25301
18:58:26,080 --> 18:58:31,440
without the noise from stdc out here so
25302
18:58:29,440 --> 18:58:33,760
we're going to set up our breakpoint
25303
18:58:33,759 --> 18:58:37,511
run tab and we're going to debug this
25304
18:58:36,000 --> 18:58:40,399
program and we're going to hit this
25305
18:58:37,512 --> 18:58:43,360
breakpoint here let's see the types that
25306
18:58:40,399 --> 18:58:45,511
we have inside our function call
25307
18:58:43,360 --> 18:58:48,720
so now that we are here we're going to
25308
18:58:45,512 --> 18:58:51,832
see that our locals are g and h and they
25309
18:58:48,720 --> 18:58:54,240
contain our strength if we go inside
25310
18:58:51,831 --> 18:58:56,399
we're going to see that g is really a
25311
18:58:54,240 --> 18:58:59,279
pointer to the first element in our
25312
18:59:03,279 --> 18:59:08,000
and h is going to be a pointer to a
25313
18:59:05,831 --> 18:59:10,479
that's what we have here okay
25314
18:59:08,000 --> 18:59:13,039
and result is going to contain some junk
25315
18:59:10,479 --> 18:59:15,599
data because it's not initialized yet
25316
18:59:13,039 --> 18:59:18,551
but we can step into this function
25317
18:59:15,600 --> 18:59:21,040
and see things happening a again is an
25318
18:59:18,551 --> 18:59:23,191
address and b is an address you see that
25319
18:59:21,039 --> 18:59:25,360
the debugger is really smart it's
25320
18:59:23,191 --> 18:59:27,512
noticing that this is a pointer to a
25321
18:59:25,360 --> 18:59:29,831
strength and it's going to show us the
25322
18:59:27,512 --> 18:59:33,360
string here but what we compare are
25323
18:59:29,831 --> 18:59:36,239
these two addresses and you see that b
25324
18:59:33,360 --> 18:59:40,160
lives in a larger address it leaves at
25325
18:59:36,240 --> 18:59:43,440
address that ends in 55 and a lives at
25326
18:59:40,160 --> 18:59:45,919
the address that ends in 50. so if we
25327
18:59:43,440 --> 18:59:48,720
really execute this function we're going
25328
18:59:45,919 --> 18:59:51,119
to return the pointer to b but you see
25329
18:59:48,720 --> 18:59:52,639
that b is not really the greater string
25330
18:59:51,119 --> 18:59:54,639
and this is really something bad you
25331
18:59:52,639 --> 18:59:56,720
should be aware of this this is what the
25332
18:59:54,639 --> 18:59:59,440
compiler is doing by default and it is
25333
18:59:56,720 --> 19:00:02,240
going to give us a result that is not
25334
18:59:59,440 --> 19:00:05,119
correct let's close this and see a way
25335
19:00:02,240 --> 19:00:07,680
we can solve this problem and we can use
25336
19:00:05,119 --> 19:00:10,319
template specialization for this what we
25337
19:00:07,679 --> 19:00:12,551
really need is a way to compare c
25338
19:00:10,320 --> 19:00:14,080
strings and not compare pointers like we
25339
19:00:12,551 --> 19:00:16,720
are doing here we're going to do that
25340
19:00:14,080 --> 19:00:18,800
using a template specialization
25341
19:00:16,720 --> 19:00:21,440
and the syntax for this to work you say
25342
19:00:18,800 --> 19:00:24,320
template and you specify an empty pair
25343
19:00:21,440 --> 19:00:26,400
of angle brackets and then you specify
25344
19:00:24,320 --> 19:00:28,160
whatever function you want to use so
25345
19:00:26,399 --> 19:00:30,079
we're going to go down here and specify
25346
19:00:28,160 --> 19:00:31,040
that we want to return the cost card
25347
19:00:31,039 --> 19:00:34,871
the function is going to be called
25348
19:00:32,399 --> 19:00:38,079
maximum we're going to specify an
25349
19:00:34,872 --> 19:00:40,400
explicit template argument which is of
25350
19:00:38,080 --> 19:00:42,872
const car pointer because we want this
25351
19:00:40,399 --> 19:00:43,831
template instance to work for scar
25352
19:00:43,831 --> 19:00:47,679
so once we have this end we're going to
25353
19:00:45,831 --> 19:00:50,639
specify our parameters we're going to
25354
19:00:47,679 --> 19:00:53,039
say cos car pointer a and cost car
25355
19:00:50,639 --> 19:00:55,759
pointer b and we're going to head into
25356
19:00:53,039 --> 19:00:58,159
the body of our function template here
25357
19:00:55,759 --> 19:01:00,479
now we have our two parameters and we're
25358
19:00:58,160 --> 19:01:02,800
going to compare them as if they were
25359
19:01:00,479 --> 19:01:04,720
const color strengths and we have seen
25360
19:01:02,800 --> 19:01:07,360
that we have a built-in facility from
25361
19:01:04,720 --> 19:01:10,639
the c plus plus standard library it is
25362
19:01:07,360 --> 19:01:12,639
this htr cmp function we can use it to
25363
19:01:10,639 --> 19:01:14,800
compare two strengths and we're going to
25364
19:01:12,639 --> 19:01:17,191
use the logic that we have here so if
25365
19:01:14,800 --> 19:01:19,360
the first parameter is less than the
25366
19:01:17,191 --> 19:01:21,191
second parameter i am talking in a
25367
19:01:19,360 --> 19:01:23,039
lexicographical order we're going to
25368
19:01:21,191 --> 19:01:24,871
return something negative if they are
25369
19:01:23,039 --> 19:01:27,511
equal dexicographically we're going to
25370
19:01:27,512 --> 19:01:33,119
first parameter is greater than the
25371
19:01:30,240 --> 19:01:36,000
second parameter lexicographically we're
25372
19:01:33,119 --> 19:01:38,871
going to return a positive value so
25373
19:01:36,000 --> 19:01:41,119
let's transform this logic into a
25374
19:01:38,872 --> 19:01:46,320
ternary operator we're going to say
25375
19:01:41,119 --> 19:01:47,599
return sdd str cmp we can say that and
25376
19:01:46,320 --> 19:01:50,160
if you have access to this function
25377
19:01:47,600 --> 19:01:52,320
we're going to need to include c string
25378
19:01:50,160 --> 19:01:55,440
let's do that we're going to include the
25379
19:01:52,320 --> 19:01:58,160
c string library and now we can say this
25380
19:01:55,440 --> 19:02:00,400
and we're going to pass in a and b and
25381
19:01:58,160 --> 19:02:02,480
we're going to ask ourselves is this
25382
19:02:00,399 --> 19:02:05,439
greater than zero okay if it's greater
25383
19:02:02,479 --> 19:02:07,360
than zero then if the first parameter is
25384
19:02:05,440 --> 19:02:09,832
greater than the second parameter let's
25385
19:02:07,360 --> 19:02:10,720
see graphically so we're going to return
25386
19:02:10,720 --> 19:02:14,320
if it's not the case we're going to
25387
19:02:12,080 --> 19:02:16,960
return b this is our ternary operator
25388
19:02:14,320 --> 19:02:19,360
here and it is going to work now that we
25389
19:02:16,960 --> 19:02:22,639
have this n the compiler is going to
25390
19:02:19,360 --> 19:02:25,039
know we have a template specialization
25391
19:02:22,639 --> 19:02:27,039
for a const car pointer if we call the
25392
19:02:25,039 --> 19:02:29,511
function like we did here calling the
25393
19:02:27,039 --> 19:02:31,759
maximum function the compiler is not
25394
19:02:29,512 --> 19:02:34,240
going to use this function template we
25395
19:02:31,759 --> 19:02:37,831
have on top here it's going to see that
25396
19:02:34,240 --> 19:02:40,240
this template specialization is better
25397
19:02:37,831 --> 19:02:42,871
for the cost card pointer type that we
25398
19:02:40,240 --> 19:02:45,120
are passing here and now if we try to
25399
19:02:42,872 --> 19:02:47,512
build and run the program the boat is
25400
19:02:45,119 --> 19:02:49,440
going to be good if we clear and run
25401
19:02:47,512 --> 19:02:51,279
rooster we're going to see that now the
25402
19:02:51,279 --> 19:02:56,319
let's see what we see if we don't have
25403
19:02:54,320 --> 19:02:58,240
this specialization and we're going to
25404
19:02:56,320 --> 19:03:00,160
comment this out because i don't think i
25405
19:02:58,240 --> 19:03:02,552
really showed you we're going to build
25406
19:03:00,160 --> 19:03:04,320
again and again if we do this
25407
19:03:02,551 --> 19:03:06,159
this function template is going to be
25408
19:03:04,320 --> 19:03:08,872
used and you know that it is going to
25409
19:03:06,160 --> 19:03:10,872
deduce a function that compares pointers
25410
19:03:08,872 --> 19:03:13,600
directly and that's going to be really
25411
19:03:10,872 --> 19:03:16,400
bad we can build this with gcc and
25412
19:03:13,600 --> 19:03:18,720
really see what we get as output we can
25413
19:03:16,399 --> 19:03:21,439
clear and run rooster now you see that
25414
19:03:18,720 --> 19:03:23,600
we are saying animal is the maximum
25415
19:03:21,440 --> 19:03:27,680
between these two guys but that's not
25416
19:03:23,600 --> 19:03:30,639
true animal is less than wild in
25417
19:03:27,679 --> 19:03:32,079
lexicographical order we need a way to
25418
19:03:32,080 --> 19:03:36,639
c strings properly and our template
25419
19:03:36,639 --> 19:03:43,039
is really doing that using the htd crmp
25420
19:03:40,240 --> 19:03:44,872
function and it is working pretty well
25421
19:03:44,872 --> 19:03:49,360
specialization is all about you're going
25422
19:03:47,039 --> 19:03:51,439
to do this if the default function
25423
19:03:49,360 --> 19:03:53,919
template you have is really not working
25424
19:03:51,440 --> 19:03:56,320
according to your needs for the type
25425
19:03:53,919 --> 19:03:58,000
that you want to use for this and use
25426
19:03:56,320 --> 19:04:00,160
this to your advantage because it's
25427
19:03:58,000 --> 19:04:02,320
available to you and now you know how to
25428
19:04:00,160 --> 19:04:04,639
use this the syntax is really simple you
25429
19:04:02,320 --> 19:04:07,192
say template and you say angle brackets
25430
19:04:04,639 --> 19:04:09,600
and then you specify whichever
25431
19:04:07,191 --> 19:04:12,000
implementation you want for your
25432
19:04:09,600 --> 19:04:14,000
specific type for example here our
25433
19:04:12,000 --> 19:04:16,872
specific type for which we want to
25434
19:04:14,000 --> 19:04:17,759
specify this function template is cost
25435
19:04:17,759 --> 19:04:22,399
you specify that as an explicit
25436
19:04:20,551 --> 19:04:25,039
template argument and then you specify
25437
19:04:22,399 --> 19:04:27,360
your return value your parameters and
25438
19:04:25,039 --> 19:04:29,759
you do whatever logic you need to do to
25439
19:04:27,360 --> 19:04:32,320
do things right in the body of this
25440
19:04:29,759 --> 19:04:34,551
template specialization here i would
25441
19:04:32,320 --> 19:04:36,240
like to welcome you in this new chapter
25442
19:04:34,551 --> 19:04:40,000
where we're going to be learning about
25443
19:04:36,240 --> 19:04:42,320
concepts concepts are a mechanism we can
25444
19:04:42,320 --> 19:04:47,512
restrictions on the template parameters
25445
19:04:45,039 --> 19:04:49,439
in our function templates for example we
25446
19:04:47,512 --> 19:04:51,680
can use this technique to say that we
25447
19:04:49,440 --> 19:04:53,680
want our function to be only called with
25448
19:04:51,679 --> 19:04:55,919
integers and if you call it with
25449
19:04:53,679 --> 19:04:58,079
something that isn't an integer it's
25450
19:04:55,919 --> 19:05:00,551
going to give you a compiler one thing i
25451
19:04:58,080 --> 19:05:03,279
should emphasize is that concepts are
25452
19:05:00,551 --> 19:05:05,119
one of the big four features in c plus
25453
19:05:03,279 --> 19:05:07,279
plus 20. so we're going to be learning
25454
19:05:05,119 --> 19:05:09,440
about this in this chapter we have just
25455
19:05:07,279 --> 19:05:12,551
said that we use them to place
25456
19:05:09,440 --> 19:05:14,400
constraints on our template parameters
25457
19:05:12,551 --> 19:05:16,872
but we saw that we could do something
25458
19:05:14,399 --> 19:05:19,119
like that in the last chapter where we
25459
19:05:16,872 --> 19:05:21,680
could use type trades and static
25460
19:05:19,119 --> 19:05:22,959
concerns for example if you look at the
25461
19:05:21,679 --> 19:05:25,359
function here it's going to print a
25462
19:05:22,960 --> 19:05:28,160
number but we have a requirement for
25463
19:05:25,360 --> 19:05:30,240
this number to be an integral type
25464
19:05:28,160 --> 19:05:32,480
through the static assert that we have
25465
19:05:30,240 --> 19:05:35,440
here we're going to see that we can do
25466
19:05:32,479 --> 19:05:37,759
something really similar with concepts
25467
19:05:35,440 --> 19:05:40,832
but it's going to be much cleaner and
25468
19:05:37,759 --> 19:05:43,039
that the logic to enforce our
25469
19:05:40,831 --> 19:05:45,191
constraints is not going to be in the
25470
19:05:43,039 --> 19:05:47,360
function body it's going to be somewhat
25471
19:05:45,191 --> 19:05:49,440
in the function declaration in the
25472
19:05:47,360 --> 19:05:50,872
constraints that we put on the template
25473
19:05:49,440 --> 19:05:53,760
parameter here we're going to see
25474
19:05:50,872 --> 19:05:56,080
specific syntaxes of how you can do this
25475
19:05:53,759 --> 19:05:59,039
starting in the next lecture there are
25476
19:05:56,080 --> 19:06:01,279
two sides to concepts in c plus plus
25477
19:05:59,039 --> 19:06:03,119
there are standard built-in concepts
25478
19:06:01,279 --> 19:06:05,759
that come with the c plus plus
25479
19:06:03,119 --> 19:06:08,399
programming language but if for some
25480
19:06:05,759 --> 19:06:10,319
reason these happen not to be enough you
25481
19:06:08,399 --> 19:06:12,319
can build your own and we're going to
25482
19:06:10,320 --> 19:06:15,040
see how we can do that later in this
25483
19:06:12,320 --> 19:06:17,280
chapter here are a few examples of
25484
19:06:15,039 --> 19:06:19,599
concepts you can use in your c plus plus
25485
19:06:17,279 --> 19:06:21,919
program you can use the integral
25486
19:06:19,600 --> 19:06:24,320
concepts to enforce that your parameters
25487
19:06:21,919 --> 19:06:26,399
be integrals you can use the floating
25488
19:06:24,320 --> 19:06:29,040
point concept to enforce that your
25489
19:06:26,399 --> 19:06:31,119
template parameters be of floating point
25490
19:06:29,039 --> 19:06:33,919
type you can do all kinds of crazy
25491
19:06:31,119 --> 19:06:35,440
things okay concepts are really cool and
25492
19:06:33,919 --> 19:06:38,240
they are going to make your function
25493
19:06:35,440 --> 19:06:40,320
templates much safer to work with we are
25494
19:06:38,240 --> 19:06:42,872
going to stop here in this lecture and
25495
19:06:40,320 --> 19:06:45,040
show you how you can use concepts
25496
19:06:42,872 --> 19:06:47,760
starting in the next lecture go ahead
25497
19:06:45,039 --> 19:06:49,599
and finish up here and meet me there in
25498
19:06:47,759 --> 19:06:53,279
this lecture we're going to learn about
25499
19:06:49,600 --> 19:06:56,400
concepts again concepts are a mechanism
25500
19:06:53,279 --> 19:06:59,831
we have in place in c plus 20 to place
25501
19:06:56,399 --> 19:07:01,759
constraints on our function templates
25502
19:06:59,831 --> 19:07:03,119
for example we can use concepts to
25503
19:07:03,119 --> 19:07:08,551
that we want our function template to
25504
19:07:05,600 --> 19:07:10,639
only be called with integers or doubles
25505
19:07:10,639 --> 19:07:15,512
and when somebody violates our concept
25506
19:07:13,679 --> 19:07:17,511
they're going to get a compiler error in
25507
19:07:15,512 --> 19:07:19,360
this lecture i am going to show you how
25508
19:07:17,512 --> 19:07:21,832
you can set up your concept and the
25509
19:07:19,360 --> 19:07:23,600
different syntaxes you can use and how
25510
19:07:23,600 --> 19:07:28,480
but before we do that please note that
25511
19:07:25,919 --> 19:07:31,360
there are two sides to concepts there
25512
19:07:28,479 --> 19:07:34,319
are concepts that are standard and built
25513
19:07:31,360 --> 19:07:36,399
into the c plus plus standard library
25514
19:07:34,320 --> 19:07:37,920
and those are ready to use and these are
25515
19:07:36,399 --> 19:07:40,720
what we're going to be using in this
25516
19:07:37,919 --> 19:07:43,360
lecture but know that you can also build
25517
19:07:40,720 --> 19:07:45,759
your own concepts and use them to do
25518
19:07:43,360 --> 19:07:48,320
whatever it is you want to do here are a
25519
19:07:45,759 --> 19:07:50,319
few examples of built-in concepts we can
25520
19:07:48,320 --> 19:07:53,192
use from the c plus plus standard
25521
19:07:50,320 --> 19:07:55,040
library we have for example a concept we
25522
19:07:55,039 --> 19:08:00,639
that people call our functions only with
25523
19:07:57,679 --> 19:08:02,551
integral types if they violate this
25524
19:08:00,639 --> 19:08:04,800
they're going to get a compiler error we
25525
19:08:02,551 --> 19:08:07,039
can also enforce for our template
25526
19:08:04,800 --> 19:08:09,192
parameters to be floating point we can
25527
19:08:07,039 --> 19:08:11,279
do all kinds of crazy things okay now
25528
19:08:09,191 --> 19:08:13,759
that you know this let's see how we can
25529
19:08:11,279 --> 19:08:16,240
set up a concept on our function
25530
19:08:13,759 --> 19:08:18,239
templates and this is the first syntax
25531
19:08:16,240 --> 19:08:21,120
we're going to look at all you really
25532
19:08:18,240 --> 19:08:23,192
have to do is to put in your template
25533
19:08:21,119 --> 19:08:26,159
declaration like we have been doing all
25534
19:08:23,191 --> 19:08:29,679
along you also have to add in the
25535
19:08:26,160 --> 19:08:31,512
requires keyword here after the requires
25536
19:08:29,679 --> 19:08:34,799
keyword you're going to specify your
25537
19:08:31,512 --> 19:08:37,512
concept and specify your template
25538
19:08:34,800 --> 19:08:39,919
parameter in angle brackets here
25539
19:08:37,512 --> 19:08:42,240
when you have this thing in front of
25540
19:08:39,919 --> 19:08:44,551
your function template like we have here
25541
19:08:42,240 --> 19:08:47,680
the function template can only work
25542
19:08:44,551 --> 19:08:50,399
right if the concept in here is
25543
19:08:47,679 --> 19:08:53,279
satisfied and this concept in this case
25544
19:08:50,399 --> 19:08:56,079
is going to be satisfied if somebody
25545
19:08:53,279 --> 19:08:59,119
tries to call this function template
25546
19:08:56,080 --> 19:09:00,872
only with integral types if they violate
25547
19:08:59,119 --> 19:09:03,191
that again they are going to get a
25548
19:09:00,872 --> 19:09:05,680
compiler error okay once we have this
25549
19:09:03,191 --> 19:09:08,799
concept set up we can look at the piece
25550
19:09:05,679 --> 19:09:11,119
of code that tries to use it and try to
25551
19:09:08,800 --> 19:09:12,800
guess what is going to happen here is a
25552
19:09:11,119 --> 19:09:15,191
piece of code we would set up in the
25553
19:09:12,800 --> 19:09:17,919
main function and try to call a function
25554
19:09:15,191 --> 19:09:20,479
template we have two variables of car
25555
19:09:17,919 --> 19:09:23,679
type we know that car is an integral
25556
19:09:20,479 --> 19:09:25,831
type so if we issue a call like this
25557
19:09:23,679 --> 19:09:28,159
this call is going to work the template
25558
19:09:25,831 --> 19:09:29,919
instance is going to be generated and
25559
19:09:28,160 --> 19:09:32,080
it's going to be called and give us the
25560
19:09:29,919 --> 19:09:35,039
results that we can print here this is
25561
19:09:32,080 --> 19:09:38,160
right on the second piece of code here
25562
19:09:35,039 --> 19:09:40,000
we have two variables of type and
25563
19:09:38,160 --> 19:09:42,639
we're going to call them we're going to
25564
19:09:40,000 --> 19:09:45,512
call our function template with and
25565
19:09:42,639 --> 19:09:47,279
and this is also an integral type int is
25566
19:09:45,512 --> 19:09:50,000
an integral type so this is going to
25567
19:09:47,279 --> 19:09:51,600
generate our function template instance
25568
19:09:50,000 --> 19:09:54,240
and we're going to call it and get the
25569
19:09:51,600 --> 19:09:56,800
results that we print here and if we try
25570
19:09:54,240 --> 19:09:58,400
to call our function template with
25571
19:09:58,399 --> 19:10:02,399
the concept is not going to be satisfied
25572
19:10:00,639 --> 19:10:04,960
and we're going to get some kind of
25573
19:10:02,399 --> 19:10:06,871
error and our function template instance
25574
19:10:04,960 --> 19:10:09,832
is not going to be generated this is
25575
19:10:06,872 --> 19:10:13,120
really how you can use concepts to force
25576
19:10:09,831 --> 19:10:15,439
some rules on users of your function
25577
19:10:13,119 --> 19:10:17,512
templates if i can say it like that we
25578
19:10:15,440 --> 19:10:19,512
have been able to do something like this
25579
19:10:17,512 --> 19:10:22,240
using typed traits and the static
25580
19:10:19,512 --> 19:10:24,872
asserts in the last chapter but concepts
25581
19:10:22,240 --> 19:10:27,040
are much cleaner and that they are kind
25582
19:10:24,872 --> 19:10:28,800
of built into the signature of your
25583
19:10:27,039 --> 19:10:30,871
function you don't have to go in the
25584
19:10:28,800 --> 19:10:33,440
body of your function and set up static
25585
19:10:30,872 --> 19:10:36,720
asserts the function is already
25586
19:10:33,440 --> 19:10:38,800
supporting concepts when you declare and
25587
19:10:36,720 --> 19:10:40,960
define it and this is really cool okay
25588
19:10:38,800 --> 19:10:43,192
this is our first syntax we can use to
25589
19:10:43,191 --> 19:10:47,679
for our function templates using the
25590
19:10:45,360 --> 19:10:50,479
requires close after our template
25591
19:10:47,679 --> 19:10:53,191
declaration and following that with
25592
19:10:50,479 --> 19:10:55,360
whatever concept we want to enforce on
25593
19:10:53,191 --> 19:10:57,512
our function template here please note
25594
19:10:55,360 --> 19:10:58,720
that you can also use type traits
25595
19:10:58,720 --> 19:11:03,680
in the required clause here and this is
25596
19:11:00,720 --> 19:11:05,680
going to work and this really says that
25597
19:11:03,679 --> 19:11:07,279
all you really have to put after the
25598
19:11:07,279 --> 19:11:13,679
is an expression that can be evaluated
25599
19:11:09,919 --> 19:11:16,639
at compile time but also results in a
25600
19:11:13,679 --> 19:11:19,359
boolean value once you satisfy these few
25601
19:11:16,639 --> 19:11:21,512
requirements you can really set up your
25602
19:11:19,360 --> 19:11:24,639
concept however you want you just have
25603
19:11:21,512 --> 19:11:27,680
to be careful that the expiration can be
25604
19:11:24,639 --> 19:11:30,551
evaluated at compile time and that it
25605
19:11:27,679 --> 19:11:32,719
evaluates to a boolean value and when
25606
19:11:30,551 --> 19:11:35,599
the expression evaluates to true the
25607
19:11:32,720 --> 19:11:37,831
concept is going to succeed if the
25608
19:11:35,600 --> 19:11:39,600
expression evaluates to false you're
25609
19:11:37,831 --> 19:11:42,080
going to get a compiler error because
25610
19:11:39,600 --> 19:11:44,160
the concept is not satisfied this is how
25611
19:11:42,080 --> 19:11:46,800
these things work now that we have seen
25612
19:11:44,160 --> 19:11:48,872
the first syntax i think it is big time
25613
19:11:46,800 --> 19:11:51,760
we looked at the second way you can set
25614
19:11:48,872 --> 19:11:53,919
up concepts and that's going to be in
25615
19:11:51,759 --> 19:11:55,831
your template declaration you're going
25616
19:11:53,919 --> 19:11:58,399
to say template put in your angle
25617
19:11:55,831 --> 19:12:00,639
brackets and inside instead of saying
25618
19:11:58,399 --> 19:12:03,511
type name t like we have been doing all
25619
19:12:00,639 --> 19:12:06,872
along you just specify your concept
25620
19:12:03,512 --> 19:12:09,760
directly and save the template parameter
25621
19:12:06,872 --> 19:12:12,080
like this once you do this this concept
25622
19:12:09,759 --> 19:12:14,159
is going to be enforced on this function
25623
19:12:12,080 --> 19:12:16,160
template here this is just another
25624
19:12:14,160 --> 19:12:18,720
syntax to really do the same thing we
25625
19:12:16,160 --> 19:12:21,512
also have a third syntax we can use if
25626
19:12:18,720 --> 19:12:23,919
we use auto to set up our function
25627
19:12:21,512 --> 19:12:26,872
templates and the way this works is to
25628
19:12:23,919 --> 19:12:30,000
just add your concept in front of the
25629
19:12:26,872 --> 19:12:31,919
auto keyword and once you do this the
25630
19:12:30,000 --> 19:12:33,919
compiler is going to enforce for the
25631
19:12:31,919 --> 19:12:35,279
first parameter and the second parameter
25632
19:12:35,279 --> 19:12:41,279
to satisfy the integral concepts so if
25633
19:12:38,960 --> 19:12:43,360
you have to use auto to set up function
25634
19:12:41,279 --> 19:12:45,600
templates this is how you can use
25635
19:12:45,600 --> 19:12:50,000
ways in which people use your function
25636
19:12:47,831 --> 19:12:52,871
we still have another way we can use
25637
19:12:50,000 --> 19:12:54,720
concepts in c plus plus and this is how
25638
19:12:52,872 --> 19:12:56,872
you do it you specify your template
25639
19:12:54,720 --> 19:12:59,759
declaration like we have been doing all
25640
19:12:56,872 --> 19:13:02,872
along you specify your function template
25641
19:12:59,759 --> 19:13:05,119
but after the parameter list as we see
25642
19:13:02,872 --> 19:13:07,600
here you're going to put your requires
25643
19:13:05,119 --> 19:13:10,159
close and you can put that in this place
25644
19:13:07,600 --> 19:13:12,552
here and it is going to work i realize
25645
19:13:10,160 --> 19:13:14,552
these are many syntaxes to process for
25646
19:13:12,551 --> 19:13:16,479
the first time but some of these
25647
19:13:14,551 --> 19:13:19,440
syntaxes are going to work better in
25648
19:13:16,479 --> 19:13:21,759
some situations and they are there just
25649
19:13:19,440 --> 19:13:24,240
to make it flexible for you to use
25650
19:13:21,759 --> 19:13:26,239
concepts in your c plus plus code okay
25651
19:13:24,240 --> 19:13:28,400
now that we have seen different ways we
25652
19:13:26,240 --> 19:13:30,552
can set up concepts for our function
25653
19:13:28,399 --> 19:13:32,871
templates i think this big time we
25654
19:13:30,551 --> 19:13:35,679
headed over to visual studio code and
25655
19:13:32,872 --> 19:13:37,832
tried them out okay here we are in our
25656
19:13:35,679 --> 19:13:40,079
working folder the current chapter is
25657
19:13:37,831 --> 19:13:42,639
concepts the current lecture is using
25658
19:13:40,080 --> 19:13:45,279
concepts we're going to grab our
25659
19:13:42,639 --> 19:13:46,479
template files we are going to put them
25660
19:13:46,479 --> 19:13:50,800
and we are going to open this thing in
25661
19:13:48,800 --> 19:13:53,279
visual studio code by dragging and
25662
19:13:50,800 --> 19:13:55,832
dropping on top of visual studio code
25663
19:13:53,279 --> 19:13:57,831
here we do that this is going to open
25664
19:13:55,831 --> 19:14:01,439
our folder we're going to open up our
25665
19:13:57,831 --> 19:14:02,959
main cpp file and close the sidebar here
25666
19:14:01,440 --> 19:14:04,551
and we're going to clean things up a
25667
19:14:02,960 --> 19:14:06,320
little bit and we're going to set up a
25668
19:14:04,551 --> 19:14:08,000
function template which is going to add
25669
19:14:06,320 --> 19:14:10,080
two numbers we already know how to do
25670
19:14:08,000 --> 19:14:12,399
that so we're going to say template type
25671
19:14:10,080 --> 19:14:14,872
name and it's going to have a template
25672
19:14:12,399 --> 19:14:17,039
parameter of t then we're going to set
25673
19:14:14,872 --> 19:14:19,192
up the function like we have been doing
25674
19:14:17,039 --> 19:14:22,079
all along we're going to say add we're
25675
19:14:19,191 --> 19:14:25,039
going to say t a and t b and this is
25676
19:14:22,080 --> 19:14:27,680
going to return the sum of a and b once
25677
19:14:25,039 --> 19:14:30,079
you have the function in we can go in
25678
19:14:27,679 --> 19:14:32,399
the main function and set up code that
25679
19:14:30,080 --> 19:14:34,551
would call this function and if we try
25680
19:14:32,399 --> 19:14:37,759
to compile this program it is going to
25681
19:14:34,551 --> 19:14:40,239
work now because we are not placing any
25682
19:14:37,759 --> 19:14:43,039
constraints on this function template
25683
19:14:40,240 --> 19:14:45,192
here let's try to build with gcc like we
25684
19:14:43,039 --> 19:14:47,831
have been doing all along you see it is
25685
19:14:45,191 --> 19:14:50,159
going to weld okay you see the world is
25686
19:14:47,831 --> 19:14:52,239
good world finished successfully and if
25687
19:14:50,160 --> 19:14:54,639
we want we can run this application and
25688
19:14:52,240 --> 19:14:57,760
it is going to print result a
25689
19:14:54,639 --> 19:14:59,679
result b let's take this out because we
25690
19:14:57,759 --> 19:15:02,000
haven't done this yet but it's not going
25691
19:14:59,679 --> 19:15:03,919
to print result c but if we want we can
25692
19:15:02,000 --> 19:15:04,960
really print it it's going to work so
25693
19:15:04,960 --> 19:15:11,120
put that in and we're going to say
25694
19:15:07,119 --> 19:15:13,440
result c and print result c here and
25695
19:15:11,119 --> 19:15:14,799
world again let's world now to take this
25696
19:15:14,800 --> 19:15:19,600
world is good we can bring up a terminal
25697
19:15:16,800 --> 19:15:22,400
to try this out and we can clear and run
25698
19:15:19,600 --> 19:15:24,872
rooster now you see result a is 30
25699
19:15:22,399 --> 19:15:27,679
because that's the sum of a and b here
25700
19:15:24,872 --> 19:15:31,360
result b should be 16 which is what we
25701
19:15:27,679 --> 19:15:34,000
have result c is 13 which is what we
25702
19:15:31,360 --> 19:15:35,279
should get by adding these two double
25703
19:15:35,279 --> 19:15:41,919
now we wanted to constrain this function
25704
19:15:38,479 --> 19:15:44,239
to only work if somebody passes integral
25705
19:15:41,919 --> 19:15:46,551
types and when we put that constraint in
25706
19:15:44,240 --> 19:15:49,760
place it is going to work if we add up
25707
19:15:46,551 --> 19:15:52,159
two character variables because they are
25708
19:15:49,759 --> 19:15:54,319
integral types it's going to work if we
25709
19:15:52,160 --> 19:15:57,040
add up two integer variables because
25710
19:15:54,320 --> 19:15:58,552
they are integral types but once we hit
25711
19:15:58,551 --> 19:16:03,759
with the double variables we should get
25712
19:16:00,551 --> 19:16:05,919
a compiler error because the constraint
25713
19:16:03,759 --> 19:16:08,159
is not satisfied let's do that we're
25714
19:16:05,919 --> 19:16:11,039
going to comment the double thing first
25715
19:16:08,160 --> 19:16:13,120
because we want to really isolate it and
25716
19:16:11,039 --> 19:16:14,719
see it and see the compiler error that
25717
19:16:13,119 --> 19:16:17,440
we get and we're going to add a
25718
19:16:14,720 --> 19:16:20,080
constraint to our function template
25719
19:16:17,440 --> 19:16:22,479
using concepts okay if you want to use
25720
19:16:20,080 --> 19:16:24,479
concepts in c plus plus 20 the first
25721
19:16:22,479 --> 19:16:27,440
thing you need to do is to include the
25722
19:16:24,479 --> 19:16:28,959
library that gives us access to concepts
25723
19:16:27,440 --> 19:16:31,512
and we're going to do that by saying
25724
19:16:28,960 --> 19:16:33,440
include concepts this is easy now that
25725
19:16:31,512 --> 19:16:36,080
we have this end we're going to use the
25726
19:16:33,440 --> 19:16:38,400
first syntax we saw in the slides and
25727
19:16:36,080 --> 19:16:40,551
we're going to add the requires close
25728
19:16:38,399 --> 19:16:43,511
after the template declaration
25729
19:16:40,551 --> 19:16:45,039
and we're going to say std integral and
25730
19:16:43,512 --> 19:16:46,639
we're going to say the template
25731
19:16:45,039 --> 19:16:49,599
parameter here i think this is the
25732
19:16:46,639 --> 19:16:52,399
syntax okay watch what happens if we do
25733
19:16:49,600 --> 19:16:54,639
this down in the code we are calling the
25734
19:16:55,512 --> 19:17:00,400
integer types so this is going to
25735
19:16:57,191 --> 19:17:03,191
compile fine because the concept here
25736
19:17:00,399 --> 19:17:05,679
is satisfied this concept is going to
25737
19:17:03,191 --> 19:17:08,720
enforce for the template parameters we
25738
19:17:05,679 --> 19:17:12,079
call a function template with to be
25739
19:17:08,720 --> 19:17:14,960
integral types let's build and see if we
25740
19:17:12,080 --> 19:17:16,872
get to compile successfully you see both
25741
19:17:14,960 --> 19:17:19,040
finished good everything is going to
25742
19:17:16,872 --> 19:17:21,279
work and if we run our program we should
25743
19:17:19,039 --> 19:17:23,679
see results a and result to be printed
25744
19:17:21,279 --> 19:17:25,919
out let's run the program we see our
25745
19:17:23,679 --> 19:17:29,759
result here now we're going to comment
25746
19:17:25,919 --> 19:17:32,000
out the others and leave in the double
25747
19:17:29,759 --> 19:17:33,831
example and we're going to uncomment
25748
19:17:32,000 --> 19:17:36,399
that and i want you to see the problem
25749
19:17:36,399 --> 19:17:40,479
our function template with double
25750
19:17:38,160 --> 19:17:42,400
variables here you see visual studio
25751
19:17:40,479 --> 19:17:44,800
code is already complaining it is saying
25752
19:17:42,399 --> 19:17:47,279
there is something wrong if we look at
25753
19:17:44,800 --> 19:17:48,960
the problems tab is going to say no
25754
19:17:47,279 --> 19:17:50,959
instance of function template add
25755
19:17:48,960 --> 19:17:53,440
matches the argument list but this is
25756
19:17:50,960 --> 19:17:56,639
really not descriptive enough but the
25757
19:17:53,440 --> 19:17:59,360
problem is our concept is not satisfied
25758
19:17:56,639 --> 19:18:03,119
by calling our function template with
25759
19:17:59,360 --> 19:18:05,600
double types because we clearly said
25760
19:18:03,119 --> 19:18:08,551
that we want the function to only be
25761
19:18:05,600 --> 19:18:10,480
called with integral types let's build
25762
19:18:08,551 --> 19:18:12,080
our program we're going to pass this
25763
19:18:12,080 --> 19:18:16,800
and we're going to get a compiler error
25764
19:18:14,240 --> 19:18:18,320
that says that some concept was
25765
19:18:18,320 --> 19:18:25,440
and we see we see in function main
25766
19:18:21,512 --> 19:18:28,479
use of function t add with double with
25767
19:18:25,440 --> 19:18:30,720
unsatisfied constraints and this is
25768
19:18:28,479 --> 19:18:32,639
really clear when we see an error like
25769
19:18:30,720 --> 19:18:35,191
this we will go and look at the
25770
19:18:32,639 --> 19:18:37,360
constraints that the function has and
25771
19:18:35,191 --> 19:18:39,599
we're going to see if we satisfied those
25772
19:18:39,600 --> 19:18:42,960
like we did in the main function here
25773
19:18:41,191 --> 19:18:45,599
and we will know that the function
25774
19:18:42,960 --> 19:18:48,080
doesn't support non-integral types and
25775
19:18:45,600 --> 19:18:50,552
we will fix this problem this is really
25776
19:18:50,551 --> 19:18:55,679
in writing safer function templates now
25777
19:18:53,440 --> 19:18:57,832
that we have seen the first syntax i
25778
19:18:55,679 --> 19:19:00,479
think it is big time we looked at the
25779
19:18:57,831 --> 19:19:01,919
other syntaxes so let's do that let's
25780
19:19:00,479 --> 19:19:04,872
copy the code here because we're going
25781
19:19:01,919 --> 19:19:07,119
to be reusing this a couple of times and
25782
19:19:04,872 --> 19:19:10,240
adapt it instead of typing this entire
25783
19:19:07,119 --> 19:19:12,959
thing the second syntax involves getting
25784
19:19:10,240 --> 19:19:16,480
rid of the requires close all together
25785
19:19:12,960 --> 19:19:19,192
and just using the concept instead of
25786
19:19:16,479 --> 19:19:21,599
type name here so i'm going to say std
25787
19:19:19,191 --> 19:19:23,919
integral and this is going to be enough
25788
19:19:21,600 --> 19:19:27,040
this is going to tell the compiler to
25789
19:19:23,919 --> 19:19:27,831
enforce this concept for this function
25790
19:19:27,831 --> 19:19:33,919
for all the template parameters that go
25791
19:19:31,191 --> 19:19:36,399
in the place of t here i hope this makes
25792
19:19:33,919 --> 19:19:38,720
sense now if we go back we see that we
25793
19:19:36,399 --> 19:19:41,039
still have our squiggly lines here if we
25794
19:19:38,720 --> 19:19:43,360
try to compile we will get the same
25795
19:19:41,039 --> 19:19:46,319
compiler error okay and you see we have
25796
19:19:43,360 --> 19:19:49,191
the same compiler error function add t
25797
19:19:46,320 --> 19:19:50,800
called with unsatisfied constraints i
25798
19:19:49,191 --> 19:19:53,599
think if you go down we're going to see
25799
19:19:50,800 --> 19:19:57,832
even more stuff out of this it's going
25800
19:19:53,600 --> 19:20:00,639
to say required the satisfaction of std
25801
19:19:57,831 --> 19:20:03,191
integral with t but now we are trying to
25802
19:20:00,639 --> 19:20:06,240
call this with double so this is really
25803
19:20:03,191 --> 19:20:08,159
going to lead to a compiler error so
25804
19:20:06,240 --> 19:20:10,400
this is the second syntax and it is
25805
19:20:08,160 --> 19:20:13,192
going to do the same thing now that we
25806
19:20:10,399 --> 19:20:15,599
have seen this we also have a third way
25807
19:20:13,191 --> 19:20:18,720
we can do this and that's through the
25808
19:20:15,600 --> 19:20:21,279
auto mechanism let's set up a function
25809
19:20:18,720 --> 19:20:24,320
using auto so we're going to say auto
25810
19:20:21,279 --> 19:20:26,319
add auto a and auto b we have seen that
25811
19:20:24,320 --> 19:20:28,720
we can do that in the last chapter and
25812
19:20:26,320 --> 19:20:31,120
we're going to return a and b a plus b i
25813
19:20:28,720 --> 19:20:33,360
should say if we do this you see that
25814
19:20:31,119 --> 19:20:35,919
the squiggly line goes away and we can
25815
19:20:33,360 --> 19:20:37,831
add these things up and print the result
25816
19:20:35,919 --> 19:20:40,240
the return type is going to be deduced
25817
19:20:37,831 --> 19:20:41,831
by the compiler automatically but know
25818
19:20:40,240 --> 19:20:44,240
that this is going to generate a
25819
19:20:41,831 --> 19:20:46,319
function template behind the scenes this
25820
19:20:44,240 --> 19:20:48,960
is just a nicer syntax we have to use
25821
19:20:46,320 --> 19:20:52,000
auto to set up functions that work for
25822
19:20:48,960 --> 19:20:55,040
multiple types let's build and uh see
25823
19:20:52,000 --> 19:20:57,831
how gcc handles this the world is good
25824
19:20:55,039 --> 19:21:00,159
because we have no constraints here and
25825
19:20:57,831 --> 19:21:03,119
if we run our program it's going to work
25826
19:21:00,160 --> 19:21:07,440
it's going to give us 13 as the sum of
25827
19:21:03,119 --> 19:21:09,512
11.1 and 1.9 but we can also place
25828
19:21:07,440 --> 19:21:12,639
constraints on this function here and
25829
19:21:09,512 --> 19:21:15,360
you do that by specifying your concept
25830
19:21:12,639 --> 19:21:18,639
in front of the auto keyword here so for
25831
19:21:15,360 --> 19:21:21,039
example we can say std integral and std
25832
19:21:18,639 --> 19:21:23,759
integral fold the second parameter here
25833
19:21:21,039 --> 19:21:26,719
let's say that and once we do this if we
25834
19:21:23,759 --> 19:21:28,551
go down we should see our squiggly line
25835
19:21:26,720 --> 19:21:31,360
on the call of the function here because
25836
19:21:28,551 --> 19:21:34,159
now the way we are calling this function
25837
19:21:31,360 --> 19:21:37,512
is not valid the function clearly says
25838
19:21:34,160 --> 19:21:41,440
that it wants to be called only with
25839
19:21:37,512 --> 19:21:43,680
arguments that satisfy this concept here
25840
19:21:41,440 --> 19:21:45,279
if we're trying to build again with gcc
25841
19:21:43,679 --> 19:21:47,599
we're going to get the semicompiler
25842
19:21:45,279 --> 19:21:50,119
error let's do that and it's going to
25843
19:21:50,119 --> 19:21:55,831
unsatisfied constraints the same error
25844
19:21:52,872 --> 19:21:58,720
and if we go down we should see that it
25845
19:21:58,720 --> 19:22:03,831
concept to be satisfied here so this is
25846
19:22:01,759 --> 19:22:06,479
the third syntax you can use if you
25847
19:22:03,831 --> 19:22:08,639
happen to be using the auto syntax for
25848
19:22:06,479 --> 19:22:10,639
your function templates let's comment
25849
19:22:08,639 --> 19:22:12,872
this out because we still have another
25850
19:22:10,639 --> 19:22:15,360
syntax we need to learn about this is
25851
19:22:12,872 --> 19:22:17,680
going to be our syntax three and we're
25852
19:22:15,360 --> 19:22:19,440
going to comment this out and the last
25853
19:22:19,440 --> 19:22:23,832
just leaving in our function template
25854
19:22:22,160 --> 19:22:26,080
let's copy this because i don't want to
25855
19:22:23,831 --> 19:22:28,159
type this again we're going to go down
25856
19:22:26,080 --> 19:22:30,240
and say syntax form and put in our
25857
19:22:28,160 --> 19:22:32,960
function template we're going to take
25858
19:22:30,240 --> 19:22:36,240
this requires close we're going to cut
25859
19:22:32,960 --> 19:22:38,552
it out and we're going to put it after
25860
19:22:38,551 --> 19:22:41,191
like this and this is going to be valid
25861
19:22:41,191 --> 19:22:46,799
syntax to enforce a concept on your
25862
19:22:44,160 --> 19:22:49,360
function template if we go down you see
25863
19:22:46,800 --> 19:22:51,440
we have this wiggly line and i should
25864
19:22:49,360 --> 19:22:54,000
prove that this works with other
25865
19:22:51,440 --> 19:22:56,551
integral types here let's just comment
25866
19:22:54,000 --> 19:22:59,919
out the double line here and uncomment
25867
19:22:56,551 --> 19:23:01,919
the other we had for car and ant if we
25868
19:22:59,919 --> 19:23:03,679
try to build this program now it is
25869
19:23:01,919 --> 19:23:06,639
going to work fine because the
25870
19:23:03,679 --> 19:23:09,831
constraints are satisfied but the moment
25871
19:23:06,639 --> 19:23:12,080
we uncomment the calls with double types
25872
19:23:09,831 --> 19:23:14,551
we're going to get a squiggly line which
25873
19:23:12,080 --> 19:23:17,440
is a good warning that we have a problem
25874
19:23:14,551 --> 19:23:19,919
but if we ignore the squiggly lines
25875
19:23:17,440 --> 19:23:22,720
and adjust build with gcc we're going to
25876
19:23:19,919 --> 19:23:25,512
get the same compiler error and it's
25877
19:23:22,720 --> 19:23:27,759
going to say that to call our function
25878
19:23:27,759 --> 19:23:33,279
the integral concept for the arguments
25879
19:23:31,191 --> 19:23:35,512
that we pass here and the double
25880
19:23:33,279 --> 19:23:37,759
arguments we're passing in here are
25881
19:23:35,512 --> 19:23:40,080
violating our concept so we get a
25882
19:23:37,759 --> 19:23:43,191
compiler error this is really how you
25883
19:23:40,080 --> 19:23:45,680
can use concepts in c plus plus i tried
25884
19:23:43,191 --> 19:23:47,831
and came up with simple examples to show
25885
19:23:45,679 --> 19:23:49,359
you different syntaxes you can use
25886
19:23:49,360 --> 19:23:54,960
and this is really it try to get
25887
19:23:52,000 --> 19:23:57,191
yourself familiar with these syntaxes
25888
19:23:54,960 --> 19:23:59,120
and it's not going to be really hard to
25889
19:23:57,191 --> 19:24:01,919
use concepts in your c plus plus
25890
19:23:59,119 --> 19:24:04,551
programs okay this is really all i had
25891
19:24:01,919 --> 19:24:07,759
to share in terms of the syntaxes you
25892
19:24:04,551 --> 19:24:09,512
can use with c plus plus 20 concepts if
25893
19:24:07,759 --> 19:24:12,000
you go to the documentation you're going
25894
19:24:09,512 --> 19:24:14,240
to have more information about this but
25895
19:24:12,000 --> 19:24:16,720
we're going to do a few more lectures to
25896
19:24:14,240 --> 19:24:19,680
really drive this dancehall for now you
25897
19:24:16,720 --> 19:24:22,551
can come to cpp reference here and see
25898
19:24:19,679 --> 19:24:25,279
more concepts that you can use we have a
25899
19:24:22,551 --> 19:24:27,599
lot of this and we can really use this
25900
19:24:25,279 --> 19:24:29,759
to tune our function templates however
25901
19:24:27,600 --> 19:24:31,760
we want okay for example you see our
25902
19:24:29,759 --> 19:24:34,871
integral concepts you see a floating
25903
19:24:31,759 --> 19:24:37,039
point concepts and there are even more
25904
19:24:37,039 --> 19:24:41,439
classes but we haven't learned about
25905
19:24:39,279 --> 19:24:43,831
classes yet and we will do that starting
25906
19:24:41,440 --> 19:24:47,119
at the next chapter but now i just want
25907
19:24:43,831 --> 19:24:49,679
you to be familiar with concepts that
25908
19:24:47,119 --> 19:24:51,599
were introduced in c plus plus 20. and
25909
19:24:49,679 --> 19:24:53,831
here is another piece of documentation
25910
19:24:51,600 --> 19:24:56,552
you can look at just to complement what
25911
19:24:53,831 --> 19:24:58,799
we are talking about in this chapter but
25912
19:24:56,551 --> 19:25:00,551
i wouldn't recommend reading this just
25913
19:24:58,800 --> 19:25:02,872
yet because it's just going to confuse
25914
19:25:00,551 --> 19:25:04,639
you there is a lot of things we still
25915
19:25:02,872 --> 19:25:06,639
need to learn to really be able to
25916
19:25:04,639 --> 19:25:08,800
understand this so try to go through
25917
19:25:06,639 --> 19:25:11,191
this chapter and i am going to try and
25918
19:25:08,800 --> 19:25:13,512
break this down in ways that you can
25919
19:25:11,191 --> 19:25:16,239
understand this the main message is that
25920
19:25:13,512 --> 19:25:18,872
there are more concepts here you can try
25921
19:25:16,240 --> 19:25:20,800
in your c plus plus code if it makes
25922
19:25:18,872 --> 19:25:23,040
sense for the problem you are trying to
25923
19:25:20,800 --> 19:25:24,960
solve with c plus plus we are going to
25924
19:25:23,039 --> 19:25:26,799
stop here in this lecture in the next
25925
19:25:24,960 --> 19:25:29,760
one we're going to show you how you can
25926
19:25:26,800 --> 19:25:32,000
set up your own concepts in c plus plus
25927
19:25:29,759 --> 19:25:33,831
go ahead and finish up here and meet me
25928
19:25:32,000 --> 19:25:36,720
there in this lecture we're going to see
25929
19:25:33,831 --> 19:25:38,639
how you can build your own concepts and
25930
19:25:36,720 --> 19:25:41,440
this is going to bring us into the
25931
19:25:38,639 --> 19:25:44,080
second part of concepts we can use in c
25932
19:25:41,440 --> 19:25:46,479
plus plus in the last lecture we used
25933
19:25:44,080 --> 19:25:48,479
the concepts from the standard library
25934
19:25:46,479 --> 19:25:51,119
that are built into the c plus plus
25935
19:25:48,479 --> 19:25:53,440
programming language starting in c plus
25936
19:25:51,119 --> 19:25:56,720
plus 20. in this one we're going to be
25937
19:25:53,440 --> 19:25:59,119
building our own concepts and without
25938
19:25:56,720 --> 19:26:01,360
waiting anymore let's see how you can do
25939
19:25:59,119 --> 19:26:03,679
that and this is the syntax you can use
25940
19:26:01,360 --> 19:26:05,831
to do that and it is really simple the
25941
19:26:03,679 --> 19:26:08,319
way you do that you say a template
25942
19:26:05,831 --> 19:26:11,191
declaration specifying the template
25943
19:26:08,320 --> 19:26:13,280
parameter you want to constrain and then
25944
19:26:11,191 --> 19:26:16,319
you say concept you say the keyword
25945
19:26:13,279 --> 19:26:19,279
concept you give your concept a name you
25946
19:26:16,320 --> 19:26:22,000
put the equal sign after that and then
25947
19:26:19,279 --> 19:26:24,720
you're going to specify the requirements
25948
19:26:22,000 --> 19:26:28,960
for your concept so for example here we
25949
19:26:24,720 --> 19:26:31,360
are using a type trait to specify that
25950
19:26:28,960 --> 19:26:34,080
this type trait is going to determine
25951
19:26:31,360 --> 19:26:36,872
what works for this concept here and
25952
19:26:34,080 --> 19:26:39,680
what this is going to do is to enforce
25953
19:26:36,872 --> 19:26:41,832
for our template parameter to only be
25954
19:26:39,679 --> 19:26:43,831
integral if it's not integral we're
25955
19:26:41,831 --> 19:26:46,239
going to get a compiler error and one
25956
19:26:43,831 --> 19:26:49,191
thing i should tell you is that the std
25957
19:26:46,240 --> 19:26:51,512
integral concept is exactly built like
25958
19:26:49,191 --> 19:26:53,599
this in the c plus plus standard library
25959
19:26:51,512 --> 19:26:55,600
this is really cool so if you want to
25960
19:26:53,600 --> 19:26:58,000
set up your own concept and you want to
25961
19:26:55,600 --> 19:26:59,512
do that using typed traits you can do
25962
19:26:58,000 --> 19:27:03,039
that like this and it is going to
25963
19:26:59,512 --> 19:27:06,479
enforce for your template parameters to
25964
19:27:03,039 --> 19:27:09,360
satisfy that typed rate or to be exact
25965
19:27:06,479 --> 19:27:12,399
this concept is going to be satisfied
25966
19:27:09,360 --> 19:27:14,639
when the type trait evaluates to true if
25967
19:27:12,399 --> 19:27:17,119
the typed rate evaluates to false at
25968
19:27:14,639 --> 19:27:19,279
compile time the concept is not going to
25969
19:27:17,119 --> 19:27:21,759
be satisfied that's another way to look
25970
19:27:19,279 --> 19:27:24,319
at that down here we have another syntax
25971
19:27:21,759 --> 19:27:26,799
we can use if we have multiple
25972
19:27:24,320 --> 19:27:30,160
statements in our concept all you have
25973
19:27:26,800 --> 19:27:32,551
to do is specify the concept keyword you
25974
19:27:30,160 --> 19:27:35,440
give it a name you go to the equal sign
25975
19:27:32,551 --> 19:27:37,512
and then you add a requires close the
25976
19:27:35,440 --> 19:27:39,512
requires close is going to specify the
25977
19:27:37,512 --> 19:27:42,240
template parameters for which you want
25978
19:27:39,512 --> 19:27:45,440
to enforce your concept and then you're
25979
19:27:42,240 --> 19:27:48,000
going to put a pair of curly braces and
25980
19:27:45,440 --> 19:27:51,191
inside that you're going to specify the
25981
19:27:48,000 --> 19:27:53,039
syntax you want your concept to satisfy
25982
19:27:53,039 --> 19:27:58,551
for the two parameters to be
25983
19:27:55,679 --> 19:28:00,871
supporting the multiplication operator
25984
19:27:58,551 --> 19:28:03,039
if this multiplication operator is not
25985
19:28:00,872 --> 19:28:05,192
supported for the template parameters
25986
19:28:03,039 --> 19:28:09,119
that we passed the concept is going to
25987
19:28:05,191 --> 19:28:11,599
fail and again i should emphasize that
25988
19:28:09,119 --> 19:28:13,759
this doesn't check for the value of a
25989
19:28:11,600 --> 19:28:16,160
multiplied by b it's just going to
25990
19:28:13,759 --> 19:28:18,551
enforce from the syntax to be supported
25991
19:28:16,160 --> 19:28:21,680
so for example if you call a function
25992
19:28:18,551 --> 19:28:24,080
template with this concept and you try
25993
19:28:21,679 --> 19:28:26,399
to pass in integers it's going to work
25994
19:28:24,080 --> 19:28:29,440
because you can multiply integers but if
25995
19:28:26,399 --> 19:28:31,360
you pass two strings this is going to
25996
19:28:29,440 --> 19:28:33,760
fail because it doesn't really make
25997
19:28:31,360 --> 19:28:36,080
sense to multiply strings okay this is
25998
19:28:33,759 --> 19:28:38,479
the syntax now we only have one
25999
19:28:36,080 --> 19:28:41,119
statement to enforce inside but if you
26000
19:28:38,479 --> 19:28:42,959
want you can even put more statements if
26001
19:28:41,119 --> 19:28:45,679
you go down here we have another example
26002
19:28:42,960 --> 19:28:48,000
called incrementable this is going to
26003
19:28:45,679 --> 19:28:50,639
require for the template parameter to be
26004
19:28:48,000 --> 19:28:53,512
incrementable we specify the concept key
26005
19:28:50,639 --> 19:28:56,319
world we say the concept name we put in
26006
19:28:53,512 --> 19:28:58,639
our equal sign and then we say requires
26007
19:28:56,320 --> 19:29:01,192
we put on template parameter and put in
26008
19:28:58,639 --> 19:29:04,720
our requirements for any template
26009
19:29:01,191 --> 19:29:07,119
parameter that is using this concept the
26010
19:29:04,720 --> 19:29:09,279
syntax here must make sense so you must
26011
19:29:07,119 --> 19:29:11,679
be able to take the value that you get
26012
19:29:09,279 --> 19:29:13,600
from here and for example say i plus
26013
19:29:11,679 --> 19:29:16,319
equals one this is going to be valid
26014
19:29:13,600 --> 19:29:18,240
syntax you're going to say plus plus a
26015
19:29:16,320 --> 19:29:21,440
and plus plus b all these are going to
26016
19:29:18,240 --> 19:29:23,600
be valid c plus plus syntaxes for the
26017
19:29:21,440 --> 19:29:26,000
template parameter that you try to call
26018
19:29:23,600 --> 19:29:27,832
this function template with and if this
26019
19:29:26,000 --> 19:29:30,160
doesn't work you're going to get a
26020
19:29:27,831 --> 19:29:32,720
compiler error because your template
26021
19:29:30,160 --> 19:29:34,960
argument isn't really satisfying this
26022
19:29:32,720 --> 19:29:37,831
concept so this is really how you can
26023
19:29:34,960 --> 19:29:40,000
set up your own concepts in c plus plus
26024
19:29:37,831 --> 19:29:42,319
once you have your own concepts set up
26025
19:29:40,000 --> 19:29:44,720
you can use them like we have been using
26026
19:29:42,320 --> 19:29:47,280
the other concept from the ziploc plus
26027
19:29:44,720 --> 19:29:50,551
standard library for example we can use
26028
19:29:47,279 --> 19:29:53,759
syntax one to put a requires clues and
26029
19:29:50,551 --> 19:29:56,551
say that we want to satisfy our own
26030
19:29:53,759 --> 19:29:59,191
concept with this particular syntax you
26031
19:29:56,551 --> 19:30:01,679
will have to put in these angle brackets
26032
19:29:59,191 --> 19:30:03,831
and put your template parameter inside
26033
19:30:01,679 --> 19:30:06,799
this is the syntax you have to use you
26034
19:30:03,831 --> 19:30:09,599
can also use syntax 2 and specify my
26035
19:30:06,800 --> 19:30:11,680
integral directly in this angle brackets
26036
19:30:09,600 --> 19:30:14,000
in your template declaration and this is
26037
19:30:11,679 --> 19:30:16,399
also going to work we can even use this
26038
19:30:14,000 --> 19:30:18,551
with the auto syntax for our function
26039
19:30:16,399 --> 19:30:20,479
templates it is going to work okay now
26040
19:30:18,551 --> 19:30:22,551
that you have sent this i think it is
26041
19:30:20,479 --> 19:30:24,800
time we headed over to visual studio
26042
19:30:22,551 --> 19:30:27,360
code and play with us a little more okay
26043
19:30:24,800 --> 19:30:29,512
here we are in our working folder the
26044
19:30:27,360 --> 19:30:31,759
current project is building your own
26045
19:30:29,512 --> 19:30:34,000
concepts we're going to grab our
26046
19:30:31,759 --> 19:30:35,919
template files like we always do and
26047
19:30:34,000 --> 19:30:38,479
we're going to put them in place and
26048
19:30:35,919 --> 19:30:41,360
we're going to open this thing in visual
26049
19:30:38,479 --> 19:30:44,239
studio code let's do that we have our
26050
19:30:41,360 --> 19:30:45,759
project open here or folder i should say
26051
19:30:44,240 --> 19:30:47,832
we're going to clean this up a little
26052
19:30:45,759 --> 19:30:50,720
bit and we're going to include our
26053
19:30:47,831 --> 19:30:52,959
concepts library and we wanted to set up
26054
19:30:50,720 --> 19:30:56,479
our own concept the first syntax we're
26055
19:30:52,960 --> 19:30:59,280
going to see is by using type trades and
26056
19:30:56,479 --> 19:31:01,440
we're going to say template type name t
26057
19:30:59,279 --> 19:31:04,399
and we're going to say this concept we
26058
19:31:01,440 --> 19:31:06,080
want this template parameter to satisfy
26059
19:31:04,399 --> 19:31:08,720
we're going to say concept and we're
26060
19:31:06,080 --> 19:31:10,551
going to say my integral which is going
26061
19:31:08,720 --> 19:31:12,720
to be the name of our concept we're
26062
19:31:10,551 --> 19:31:14,000
going to put an ecosign and then we're
26063
19:31:14,000 --> 19:31:21,679
std integral v and specify that we want
26064
19:31:18,551 --> 19:31:23,919
this type trait to be satisfied for this
26065
19:31:21,679 --> 19:31:26,399
concept here and after this we need to
26066
19:31:23,919 --> 19:31:29,512
put in our semicolon and i think we need
26067
19:31:26,399 --> 19:31:32,000
to include the type traits library
26068
19:31:29,512 --> 19:31:35,440
because we are using that we should say
26069
19:31:32,000 --> 19:31:37,440
std is integral so sorry for this and
26070
19:31:35,440 --> 19:31:40,479
this is going to work now okay now that
26071
19:31:37,440 --> 19:31:43,119
we have the concept set up we can use it
26072
19:31:40,479 --> 19:31:45,191
like we have been using other concept
26073
19:31:43,119 --> 19:31:47,440
for example we can set up a function
26074
19:31:45,191 --> 19:31:50,479
which is going to add up two numbers and
26075
19:31:47,440 --> 19:31:52,872
it is going to use this concept here we
26076
19:31:50,479 --> 19:31:54,639
have multiple syntaxes we can use so
26077
19:31:52,872 --> 19:31:56,960
let's go down and try this out we're
26078
19:31:54,639 --> 19:31:59,360
going to say template and say type name
26079
19:31:56,960 --> 19:32:02,080
t and we're going to require this
26080
19:31:59,360 --> 19:32:04,479
concept to be satisfied for our function
26081
19:32:02,080 --> 19:32:07,831
template we saw that we could use the
26082
19:32:04,479 --> 19:32:10,159
requires close here and say my integral
26083
19:32:07,831 --> 19:32:12,551
and say the template parameter we want
26084
19:32:10,160 --> 19:32:14,320
to enforce this on and after this we're
26085
19:32:12,551 --> 19:32:16,159
going to just put in our function
26086
19:32:14,320 --> 19:32:18,080
template we're going to say add what we
26087
19:32:16,160 --> 19:32:20,639
have been doing all along in the last
26088
19:32:18,080 --> 19:32:23,759
lecture we're going to say t a
26089
19:32:20,639 --> 19:32:26,479
and t b and we're going to return a plus
26090
19:32:23,759 --> 19:32:28,871
b now this function is going to support
26091
19:32:26,479 --> 19:32:31,440
our concept let's go down and set up two
26092
19:32:28,872 --> 19:32:33,919
variables we're going to say and x
26093
19:32:31,440 --> 19:32:36,479
and we're going to say 6 for example and
26094
19:32:33,919 --> 19:32:39,119
into y and i'm going to make this a 7
26095
19:32:36,479 --> 19:32:41,440
why not and we're going to say add
26096
19:32:39,119 --> 19:32:43,831
x and y once we do this you see that we
26097
19:32:41,440 --> 19:32:46,320
have no problem because the concept is
26098
19:32:43,831 --> 19:32:49,831
satisfied for the arguments that we are
26099
19:32:46,320 --> 19:32:52,480
passing in here the concept is satisfied
26100
19:32:49,831 --> 19:32:54,959
because the type trait here is going to
26101
19:32:52,479 --> 19:32:57,119
return true for this type here because
26102
19:32:54,960 --> 19:32:59,280
it is an integral type when the type
26103
19:32:57,119 --> 19:33:01,759
trait returns true then the concept is
26104
19:32:59,279 --> 19:33:04,160
going to be satisfied if the type trait
26105
19:33:01,759 --> 19:33:06,959
returns false the concept is going to
26106
19:33:04,160 --> 19:33:08,960
fail let's try and bolt and really drive
26107
19:33:06,960 --> 19:33:11,440
this home you see that the world is good
26108
19:33:08,960 --> 19:33:13,440
our function is working so the function
26109
19:33:11,440 --> 19:33:15,600
template and stands for this code here
26110
19:33:13,440 --> 19:33:17,832
is going to be successfully generated
26111
19:33:15,600 --> 19:33:19,192
and we're going to call it when the
26112
19:33:19,191 --> 19:33:24,720
now let's change the type of these guys
26113
19:33:21,831 --> 19:33:26,959
to double and try to violate our concept
26114
19:33:24,720 --> 19:33:29,440
and make it fail once we do this you see
26115
19:33:26,960 --> 19:33:31,360
the call here has a squiggly line and a
26116
19:33:29,440 --> 19:33:34,000
visual studio code is not going to say
26117
19:33:31,360 --> 19:33:36,960
that it is a concept problem which is a
26118
19:33:34,000 --> 19:33:39,191
shame but we can still run this through
26119
19:33:36,960 --> 19:33:41,280
the compiler and the compiler is going
26120
19:33:39,191 --> 19:33:44,639
to tell us what is wrong so it's going
26121
19:33:41,279 --> 19:33:47,440
to say use of function add with
26122
19:33:44,639 --> 19:33:49,360
unsatisfied constraints and if we go
26123
19:33:47,440 --> 19:33:52,320
down we're going to see the exact
26124
19:33:49,360 --> 19:33:55,039
constraints we violated and we're going
26125
19:33:52,320 --> 19:33:57,832
to say required for the satisfaction of
26126
19:33:55,039 --> 19:33:59,919
my integral with t we are calling this
26127
19:33:57,831 --> 19:34:03,279
with double and double is going to
26128
19:33:59,919 --> 19:34:05,039
evaluate this to false hopefully you can
26129
19:34:03,279 --> 19:34:08,000
see that you can really set up your own
26130
19:34:05,039 --> 19:34:09,679
concepts using the syntax here and we
26131
19:34:08,000 --> 19:34:11,440
can use our concept with all the
26132
19:34:09,679 --> 19:34:13,599
syntaxes we have seen in the last
26133
19:34:11,440 --> 19:34:16,479
lecture so for example we can take out
26134
19:34:13,600 --> 19:34:18,800
the requires close all together here and
26135
19:34:18,800 --> 19:34:23,192
template declaration here so we're going
26136
19:34:20,800 --> 19:34:25,832
to say my integral and if we do this
26137
19:34:23,191 --> 19:34:28,239
we're going to fail again because the
26138
19:34:25,831 --> 19:34:30,399
concept is not going to be satisfied
26139
19:34:28,240 --> 19:34:33,279
we're going to have the same problem we
26140
19:34:30,399 --> 19:34:35,831
can change the syntax to use the auto
26141
19:34:33,279 --> 19:34:39,279
syntax but before we do that let's
26142
19:34:35,831 --> 19:34:42,159
change this back to type name t and then
26143
19:34:39,279 --> 19:34:44,639
put our requires close after the
26144
19:34:42,160 --> 19:34:46,552
parameter list of our function template
26145
19:34:46,551 --> 19:34:51,759
and we're going to say my integral and
26146
19:34:48,960 --> 19:34:54,000
specify the template parameter and this
26147
19:34:51,759 --> 19:34:56,399
is a valid function template with a
26148
19:34:54,000 --> 19:34:57,600
concept applied to app and if we both
26149
19:34:56,399 --> 19:35:00,551
again we're going to get the same
26150
19:34:57,600 --> 19:35:03,440
compiler error so you see the same error
26151
19:35:00,551 --> 19:35:05,599
and we can use the auto syntax let's do
26152
19:35:03,440 --> 19:35:08,000
that we're going to take out the
26153
19:35:05,600 --> 19:35:10,552
template declaration here we're going to
26154
19:35:08,000 --> 19:35:14,551
take out the requires close here and
26155
19:35:10,551 --> 19:35:16,000
we're going to change our t to auto and
26156
19:35:14,551 --> 19:35:19,279
the way we do that we're going to say
26157
19:35:16,000 --> 19:35:21,279
std no no std we are using our own
26158
19:35:19,279 --> 19:35:24,160
concept so we're going to say my
26159
19:35:21,279 --> 19:35:26,800
integral auto this is going to work and
26160
19:35:24,160 --> 19:35:29,279
we're going to say my integral auto and
26161
19:35:26,800 --> 19:35:31,832
my integral auto here the moment we do
26162
19:35:29,279 --> 19:35:34,872
this you see that we have squiggly lines
26163
19:35:31,831 --> 19:35:36,479
here because our concept is violated but
26164
19:35:34,872 --> 19:35:38,800
if we're trying to build again we're
26165
19:35:36,479 --> 19:35:40,959
going to use gcc to do that the build is
26166
19:35:38,800 --> 19:35:43,760
going to fail you see that the same
26167
19:35:40,960 --> 19:35:46,872
concept is violated and we are able to
26168
19:35:43,759 --> 19:35:49,119
use our concept throughout the four
26169
19:35:46,872 --> 19:35:50,800
syntaxes that we saw in the last lecture
26170
19:35:49,119 --> 19:35:53,191
and this is really cool now that we have
26171
19:35:50,800 --> 19:35:55,192
this we're going to comment this out and
26172
19:35:53,191 --> 19:35:58,799
we're going to see that we can set up
26173
19:35:55,191 --> 19:36:01,440
concepts that have requirements spanning
26174
19:35:58,800 --> 19:36:03,512
multiple statements or multiple lines
26175
19:36:01,440 --> 19:36:05,919
okay let's go down and do that suppose
26176
19:36:03,512 --> 19:36:07,832
we want to set up a concept that is
26177
19:36:05,919 --> 19:36:10,639
going to enforce for the templates
26178
19:36:07,831 --> 19:36:13,279
parameters to be multipliable
26179
19:36:10,639 --> 19:36:15,679
with the multiplication operator we have
26180
19:36:13,279 --> 19:36:17,440
here we can use this syntax here we're
26181
19:36:15,679 --> 19:36:19,279
going to put in our template declaration
26182
19:36:17,440 --> 19:36:20,960
we're going to say concept we're going
26183
19:36:19,279 --> 19:36:22,872
to say the concept name we're going to
26184
19:36:20,960 --> 19:36:25,680
put in an equal sign and then we're
26185
19:36:22,872 --> 19:36:28,400
going to put in a requires close
26186
19:36:25,679 --> 19:36:30,399
with our template parameters and and
26187
19:36:28,399 --> 19:36:33,119
after that we're going to put a pair of
26188
19:36:30,399 --> 19:36:35,679
curly braces and inside the curlies
26189
19:36:33,119 --> 19:36:38,551
we're going to put the requirements for
26190
19:36:35,679 --> 19:36:41,191
example in this case we require for the
26191
19:36:38,551 --> 19:36:43,599
template parameter here to support the
26192
19:36:41,191 --> 19:36:45,831
multiplication operator between two of
26193
19:36:43,600 --> 19:36:48,000
these types if the multiplication
26194
19:36:45,831 --> 19:36:49,759
operator is not supported we're going to
26195
19:36:48,000 --> 19:36:52,240
have a problem and that this is the
26196
19:36:49,759 --> 19:36:54,080
concept that is going to enforce that
26197
19:36:52,240 --> 19:36:56,080
one thing you should know is that this
26198
19:36:56,080 --> 19:37:02,639
that multiplying a and b is valid syntax
26199
19:37:00,080 --> 19:37:04,639
it's not going to check the value of a
26200
19:37:02,639 --> 19:37:07,119
multiplied by b and you should really
26201
19:37:04,639 --> 19:37:09,039
understand this now that we have this n
26202
19:37:07,119 --> 19:37:12,159
we can set up a function to use these
26203
19:37:09,039 --> 19:37:14,319
two guys why not use the function we
26204
19:37:12,160 --> 19:37:16,320
have seen before to add two numbers
26205
19:37:14,320 --> 19:37:18,400
let's do that and we're going to put in
26206
19:37:16,320 --> 19:37:22,640
our requires close and we're going to
26207
19:37:18,399 --> 19:37:24,720
require now to support the multipliable
26208
19:37:22,639 --> 19:37:27,759
concept and we're going to specify our
26209
19:37:24,720 --> 19:37:30,080
template parameter we have the concept n
26210
19:37:27,759 --> 19:37:32,239
so we can use that to do whatever we
26211
19:37:30,080 --> 19:37:35,512
want now we're going to say t
26212
19:37:32,240 --> 19:37:38,240
add and we're going to say t a and t b
26213
19:37:35,512 --> 19:37:40,240
and we're going to return a plus b this
26214
19:37:38,240 --> 19:37:42,872
is the same function we've been using
26215
19:37:40,240 --> 19:37:45,120
all along okay now we have our concept
26216
19:37:42,872 --> 19:37:47,440
in place and we have a function template
26217
19:37:45,119 --> 19:37:51,440
that is going to use this concept
26218
19:37:47,440 --> 19:37:53,191
let's see if we can add up x and y and
26219
19:37:51,440 --> 19:37:55,119
see what we get we're going to world
26220
19:37:53,191 --> 19:37:57,191
with gcc we're going to see that the
26221
19:37:55,119 --> 19:38:01,039
world is going to be good because our
26222
19:37:57,191 --> 19:38:03,919
concept here is satisfied we are passing
26223
19:38:01,039 --> 19:38:06,399
double types for our function template
26224
19:38:03,919 --> 19:38:08,399
and it is legal to multiply two double
26225
19:38:06,399 --> 19:38:10,239
variables if we multiply two doubles
26226
19:38:08,399 --> 19:38:12,799
we're going to get a value and that's
26227
19:38:10,240 --> 19:38:15,040
going to be valid c plus plus syntax but
26228
19:38:12,800 --> 19:38:17,600
let's see what happens if we try to
26229
19:38:15,039 --> 19:38:20,000
change our arguments to hdd strength
26230
19:38:17,600 --> 19:38:22,639
let's do that so we're going to say x is
26231
19:38:20,000 --> 19:38:25,440
hello and we're going to say why is
26232
19:38:22,639 --> 19:38:27,831
world why not let's go down and put in a
26233
19:38:25,440 --> 19:38:30,800
semicolon and the moment we do that you
26234
19:38:27,831 --> 19:38:34,239
see that we have a problem and visual
26235
19:38:30,800 --> 19:38:36,400
studio code is not good at this yet
26236
19:38:36,399 --> 19:38:42,159
and run this through gcc we're going to
26237
19:38:38,800 --> 19:38:44,240
get that our concept is violated let's
26238
19:38:42,160 --> 19:38:47,279
look at the compiler error here it's
26239
19:38:44,240 --> 19:38:49,512
going to say constraints not satisfied
26240
19:38:47,279 --> 19:38:52,319
and it's going to tell us that we are
26241
19:38:49,512 --> 19:38:54,800
calling the add function with the values
26242
19:38:52,320 --> 19:38:56,872
that can't be multiplied it's going to
26243
19:38:54,800 --> 19:38:59,512
say the required expression here is
26244
19:38:56,872 --> 19:39:01,680
invalid and this is how you can set up a
26245
19:38:59,512 --> 19:39:02,800
concept like this and you can really use
26246
19:39:02,800 --> 19:39:08,240
put constraints however you want on your
26247
19:39:05,440 --> 19:39:11,040
function templates but here we have just
26248
19:39:08,240 --> 19:39:13,919
used one statement inside our concept
26249
19:39:11,039 --> 19:39:15,511
here we can even put in more so to drive
26250
19:39:13,919 --> 19:39:17,831
this home we're going to set up another
26251
19:39:15,512 --> 19:39:20,000
concept let's go down and put that in
26252
19:39:17,831 --> 19:39:22,319
place the concept is going to be called
26253
19:39:20,000 --> 19:39:24,639
incremental it's going to be using the
26254
19:39:22,320 --> 19:39:26,640
same syntax we saw here but we're going
26255
19:39:24,639 --> 19:39:29,191
to be putting a requirement on the
26256
19:39:26,639 --> 19:39:32,080
template parameter here to support
26257
19:39:29,191 --> 19:39:34,799
incrementation and we want for every
26258
19:39:32,080 --> 19:39:37,512
type that goes in the place of t here we
26259
19:39:34,800 --> 19:39:40,400
must be able to say a plus equals one
26260
19:39:37,512 --> 19:39:42,551
this must be valid c plus plus syntax we
26261
19:39:40,399 --> 19:39:45,119
must be able to say plus plus a this
26262
19:39:42,551 --> 19:39:47,599
must be valid c plus plus syntax and we
26263
19:39:45,119 --> 19:39:50,720
must be able to say a plus plus this
26264
19:39:47,600 --> 19:39:53,040
must be valid c plus plus syntax
26265
19:39:50,720 --> 19:39:56,000
now that we have this we can change our
26266
19:39:53,039 --> 19:39:58,719
add function to use this concept why not
26267
19:39:56,000 --> 19:40:01,600
we're going to say incrementable and now
26268
19:39:58,720 --> 19:40:04,399
this function is going to be required to
26269
19:40:01,600 --> 19:40:06,800
use things that we can increment on and
26270
19:40:04,399 --> 19:40:08,720
you see it is failing already because we
26271
19:40:06,800 --> 19:40:10,872
can't really increment strengths what
26272
19:40:08,720 --> 19:40:13,040
does that even mean so let's build and
26273
19:40:10,872 --> 19:40:16,000
show you the compiler error okay you see
26274
19:40:13,039 --> 19:40:18,639
incremental is not satisfied and that
26275
19:40:16,000 --> 19:40:21,831
the required expressions aren't valid
26276
19:40:18,639 --> 19:40:25,279
you see plus plus a is not valid a plus
26277
19:40:21,831 --> 19:40:28,080
plus is not valid and a plus equals one
26278
19:40:25,279 --> 19:40:30,240
should not also be valid but we're not
26279
19:40:28,080 --> 19:40:33,680
seeing that here but hopefully you see
26280
19:40:30,240 --> 19:40:36,400
the message here that our concept is
26281
19:40:33,679 --> 19:40:39,119
failing here if we comment out our
26282
19:40:36,399 --> 19:40:40,871
strengths here and uncomment double all
26283
19:40:39,119 --> 19:40:43,440
these operations we have here are
26284
19:40:40,872 --> 19:40:46,551
supported for the double type
26285
19:40:43,440 --> 19:40:49,119
so we should not fail here if we try to
26286
19:40:46,551 --> 19:40:50,872
compile this because the concept is
26287
19:40:53,440 --> 19:40:56,479
compiler to build you see the build is
26288
19:40:56,479 --> 19:41:01,759
and we can clear and we can bring up a
26289
19:40:58,720 --> 19:41:04,800
terminal to really see this that our
26290
19:41:01,759 --> 19:41:06,479
binary was generated let's do the ir
26291
19:41:04,800 --> 19:41:08,960
we're going to see our rooster
26292
19:41:06,479 --> 19:41:10,872
executable here and if we go down let's
26293
19:41:08,960 --> 19:41:13,280
say done we're going to see that if we
26294
19:41:10,872 --> 19:41:15,832
build again to bring this in
26295
19:41:13,279 --> 19:41:18,000
consideration clear run rooster the
26296
19:41:15,831 --> 19:41:21,599
program was generated and it is really
26297
19:41:18,000 --> 19:41:23,279
running because the concept here
26298
19:41:23,279 --> 19:41:30,240
with our call using double arguments
26299
19:41:27,600 --> 19:41:32,160
here okay so this is really all i set
26300
19:41:30,240 --> 19:41:34,639
out to share with you guys in this
26301
19:41:32,160 --> 19:41:37,120
lecture i hope you know the syntaxes you
26302
19:41:34,639 --> 19:41:39,279
can use to create your own concepts you
26303
19:41:37,119 --> 19:41:41,759
can either use type traits like we have
26304
19:41:39,279 --> 19:41:45,600
seen here and the syntax is to put the
26305
19:41:41,759 --> 19:41:47,919
keyword concept put in your concept name
26306
19:41:45,600 --> 19:41:50,160
put an ecosign and then specify your
26307
19:41:47,919 --> 19:41:51,679
type trait here this is going to work if
26308
19:41:50,160 --> 19:41:53,760
you need something a little more
26309
19:41:51,679 --> 19:41:55,919
complicated then you're going to use
26310
19:41:55,919 --> 19:42:01,919
requirements for your concept in these
26311
19:41:59,119 --> 19:42:04,399
curly braces you can either put one
26312
19:42:01,919 --> 19:42:07,279
statement like we did here or you can
26313
19:42:04,399 --> 19:42:08,799
even put as many statements as you want
26314
19:42:07,279 --> 19:42:10,800
just remember to end them with
26315
19:42:08,800 --> 19:42:13,512
semicolons and another thing you
26316
19:42:10,800 --> 19:42:16,320
shouldn't really take lightly is that
26317
19:42:13,512 --> 19:42:18,080
this is just going to check for syntax
26318
19:42:16,320 --> 19:42:21,280
it's not going to check for the value
26319
19:42:18,080 --> 19:42:23,119
you get after you add one to a here for
26320
19:42:21,279 --> 19:42:25,360
example it's not going to check for the
26321
19:42:23,119 --> 19:42:28,551
value you get after you multiply b it's
26322
19:42:25,360 --> 19:42:32,639
just going to see that a multiply b
26323
19:42:28,551 --> 19:42:35,440
is valid syntax for the types that our
26324
19:42:32,639 --> 19:42:37,831
template parameter is using here we are
26325
19:42:35,440 --> 19:42:40,160
going to stop here in this lecture this
26326
19:42:37,831 --> 19:42:43,039
one we're going to zoom in a little more
26327
19:42:40,160 --> 19:42:44,320
on the requires close here go ahead and
26328
19:42:44,320 --> 19:42:49,120
and meet me there in this lecture we're
26329
19:42:46,479 --> 19:42:52,080
going to learn about some more things we
26330
19:42:49,119 --> 19:42:54,799
can do with our requires close but
26331
19:42:52,080 --> 19:42:57,759
before we do that let's look at the
26332
19:42:54,800 --> 19:43:00,639
kinds of requirements we can put in our
26333
19:42:57,759 --> 19:43:02,799
requires close the first one is a simple
26334
19:43:00,639 --> 19:43:04,960
requirement which is what we have seen
26335
19:43:02,800 --> 19:43:06,479
so far we can also do a nested
26336
19:43:04,960 --> 19:43:08,720
requirement and we're going to learn
26337
19:43:06,479 --> 19:43:10,959
about this in a minute and we can do a
26338
19:43:08,720 --> 19:43:13,512
compound requirement which is going to
26339
19:43:10,960 --> 19:43:16,480
allow us to specify more things about
26340
19:43:13,512 --> 19:43:19,191
what we require for our concept there
26341
19:43:16,479 --> 19:43:21,119
are also type requirements but these are
26342
19:43:19,191 --> 19:43:22,639
really advanced for the scope of this
26343
19:43:21,119 --> 19:43:24,479
course so we're not going to talk about
26344
19:43:22,639 --> 19:43:27,759
these in this course what we're going to
26345
19:43:24,479 --> 19:43:30,239
look at are these three first here so
26346
19:43:27,759 --> 19:43:32,080
let's look at a simple requirement this
26347
19:43:30,240 --> 19:43:35,192
is what we have seen already here we
26348
19:43:32,080 --> 19:43:38,080
have our template declaration we have a
26349
19:43:35,191 --> 19:43:40,319
concept declared the concept name is
26350
19:43:38,080 --> 19:43:42,639
tiny type we're going to put in our
26351
19:43:40,320 --> 19:43:45,192
requires close we're going to put in our
26352
19:43:42,639 --> 19:43:48,000
parameter list and we're going to put in
26353
19:43:45,191 --> 19:43:50,799
our curly braces inside the requires
26354
19:43:48,000 --> 19:43:54,240
close we have a statement here which is
26355
19:43:50,800 --> 19:43:55,832
going to enforce that size of t is less
26356
19:43:55,831 --> 19:44:01,279
and what this really means it's going to
26357
19:43:58,080 --> 19:44:04,000
check that size of t the syntax here is
26358
19:44:01,279 --> 19:44:06,479
correct and this can really throw people
26359
19:44:04,000 --> 19:44:09,119
off i have said this in the last lecture
26360
19:44:06,479 --> 19:44:11,599
but i set up this little example to
26361
19:44:09,119 --> 19:44:14,479
really drive this home and show you that
26362
19:44:11,600 --> 19:44:16,800
if you are not careful your concepts are
26363
19:44:14,479 --> 19:44:19,279
going to be really wrong this is going
26364
19:44:16,800 --> 19:44:22,240
to check for the syntax so for example
26365
19:44:19,279 --> 19:44:25,191
if we call a function template with this
26366
19:44:25,191 --> 19:44:30,080
the concept is going to be satisfied
26367
19:44:27,191 --> 19:44:32,551
even if the size of the car is less than
26368
19:44:30,080 --> 19:44:34,800
4 obviously but that's not going to be
26369
19:44:32,551 --> 19:44:37,679
the job of this concept here this
26370
19:44:34,800 --> 19:44:40,160
concept is not going to enforce for the
26371
19:44:37,679 --> 19:44:42,479
expression here to evaluate to true it's
26372
19:44:40,160 --> 19:44:45,919
going to just check the syntax and if
26373
19:44:42,479 --> 19:44:48,639
you pass something smaller than a net in
26374
19:44:45,919 --> 19:44:50,872
a function template with this concept
26375
19:44:48,639 --> 19:44:53,191
this is going to be valid c plus plus
26376
19:44:50,872 --> 19:44:55,919
syntax so the concept is going to work
26377
19:44:53,191 --> 19:44:58,720
so now you must be asking how can i
26378
19:44:55,919 --> 19:45:00,160
enforce for the value of this expression
26379
19:45:00,160 --> 19:45:06,720
using concept well for that you will
26380
19:45:03,679 --> 19:45:08,799
have to use nested requirements and a
26381
19:45:06,720 --> 19:45:11,831
nested requirement is going to have
26382
19:45:08,800 --> 19:45:14,551
another requires keyword inserted in
26383
19:45:11,831 --> 19:45:16,720
front of it now if you use the syntax
26384
19:45:14,551 --> 19:45:19,599
like this now this is going to check
26385
19:45:16,720 --> 19:45:22,080
that size of t is actually less than 4.
26386
19:45:19,600 --> 19:45:24,480
if it's not less than 4 this is going to
26387
19:45:22,080 --> 19:45:26,320
return false here and the concept is
26388
19:45:24,479 --> 19:45:29,360
going to fail and this is how you can
26389
19:45:26,320 --> 19:45:31,920
use nested requirements to enforce for
26390
19:45:29,360 --> 19:45:33,831
some expressions to be true in your
26391
19:45:31,919 --> 19:45:35,679
requires close another kind of
26392
19:45:33,831 --> 19:45:38,871
requirement you can set up for your
26393
19:45:35,679 --> 19:45:41,759
concept is the compound requirement and
26394
19:45:38,872 --> 19:45:43,760
this is going to allow you to check if
26395
19:45:41,759 --> 19:45:46,551
something doesn't throw an exception you
26396
19:45:43,759 --> 19:45:48,159
can do that using the no accept keyword
26397
19:45:46,551 --> 19:45:50,959
but we're not going to use this now
26398
19:45:48,160 --> 19:45:53,360
because this is not in scope for what we
26399
19:45:50,960 --> 19:45:56,000
can do at this point in the course but
26400
19:45:53,360 --> 19:45:59,600
you can also check the return type of an
26401
19:45:56,000 --> 19:46:02,479
expression and divorce that it satisfies
26402
19:45:59,600 --> 19:46:05,760
some type trait for example so here we
26403
19:46:02,479 --> 19:46:08,639
are saying for our concept and if we
26404
19:46:05,759 --> 19:46:11,679
pass in two parameters the syntax for
26405
19:46:08,639 --> 19:46:14,639
adding a and b must be correct and
26406
19:46:11,679 --> 19:46:18,079
supported for those types but the result
26407
19:46:14,639 --> 19:46:20,160
of a and b must also be convertible to
26408
19:46:18,080 --> 19:46:21,680
ant and you can do something like this
26409
19:46:20,160 --> 19:46:23,919
and this is going to work you can
26410
19:46:21,679 --> 19:46:26,479
enforce these kinds of things using
26411
19:46:23,919 --> 19:46:28,720
compound requirements okay now that you
26412
19:46:26,479 --> 19:46:31,679
know about these kinds of requirements
26413
19:46:28,720 --> 19:46:34,080
you can put in your requires close let's
26414
19:46:31,679 --> 19:46:36,000
head over to visual studio code and play
26415
19:46:34,080 --> 19:46:38,479
with us a little more okay here we are
26416
19:46:36,000 --> 19:46:41,440
in our working folder the current
26417
19:46:38,479 --> 19:46:43,919
project is zooming in on requires close
26418
19:46:41,440 --> 19:46:46,080
we're going to grab our template files
26419
19:46:43,919 --> 19:46:47,919
and we're going to put them in place and
26420
19:46:46,080 --> 19:46:50,240
we're going to open that in visual
26421
19:46:47,919 --> 19:46:52,399
studio code pretty quick by dragging and
26422
19:46:50,240 --> 19:46:54,240
dropping here this is going to open up
26423
19:46:52,399 --> 19:46:56,239
our folder we're going to do the usual
26424
19:46:54,240 --> 19:46:59,120
we're going to close the pane here we're
26425
19:46:56,240 --> 19:47:01,512
going to clean things up a little bit
26426
19:46:59,119 --> 19:47:03,919
and we're going to include our concepts
26427
19:47:01,512 --> 19:47:05,680
library let's do that we are going to
26428
19:47:03,919 --> 19:47:07,512
set up a simple concept we're going to
26429
19:47:05,679 --> 19:47:10,079
say template and we're going to say what
26430
19:47:07,512 --> 19:47:12,479
the concept is the concept is going to
26431
19:47:10,080 --> 19:47:13,600
be called the tiny type and we're going
26432
19:47:13,600 --> 19:47:19,360
what makes this concept a tiny time
26433
19:47:16,800 --> 19:47:21,192
we're going to put in our requires close
26434
19:47:19,360 --> 19:47:23,680
and we're going to put in the template
26435
19:47:21,191 --> 19:47:25,919
parameter call it t why not and we're
26436
19:47:23,679 --> 19:47:28,479
going to put in our closing semicolon
26437
19:47:25,919 --> 19:47:31,279
here now what is going to make this
26438
19:47:28,479 --> 19:47:33,191
concept a tiny type is that the size of
26439
19:47:31,279 --> 19:47:35,360
the template parameter view is going to
26440
19:47:33,191 --> 19:47:37,440
be less than four let's suppose we are
26441
19:47:35,360 --> 19:47:38,240
doing the function and we wanted to use
26442
19:47:38,240 --> 19:47:43,600
integral types that are smaller than
26443
19:47:41,360 --> 19:47:45,680
four bytes in memory suppose you want to
26444
19:47:45,679 --> 19:47:49,679
in the problem that you are trying to
26445
19:47:47,600 --> 19:47:52,480
solve in c plus plus the way we can
26446
19:47:49,679 --> 19:47:55,359
enforce this we can say size of t is
26447
19:47:52,479 --> 19:47:57,831
supposed to be less than four let's say
26448
19:47:55,360 --> 19:47:59,119
size of properly can't type can i okay
26449
19:47:57,831 --> 19:48:01,191
the moment we do this you're going to
26450
19:47:59,119 --> 19:48:03,360
see that this is valid c plus plus
26451
19:48:01,191 --> 19:48:06,000
syntax so we're not going to have any
26452
19:48:03,360 --> 19:48:08,551
squiggly lines but what you should know
26453
19:48:06,000 --> 19:48:11,039
is that this is a simple requirement in
26454
19:48:08,551 --> 19:48:12,399
c plus plus concepts and what this is
26455
19:48:12,399 --> 19:48:17,831
it's just going to enforce the syntax of
26456
19:48:15,600 --> 19:48:20,552
what we do here what we put here must be
26457
19:48:17,831 --> 19:48:22,720
valid c plus plus syntax so only
26458
19:48:20,551 --> 19:48:24,872
enforces syntax this is what you should
26459
19:48:22,720 --> 19:48:27,600
really remember okay now that we have
26460
19:48:24,872 --> 19:48:30,000
this end let's try it out and show you
26461
19:48:27,600 --> 19:48:31,600
some problems you can really run into
26462
19:48:30,000 --> 19:48:33,440
we're going to set up two character
26463
19:48:31,600 --> 19:48:35,279
variables we're going to call the first
26464
19:48:33,440 --> 19:48:39,119
one x we're going to initialize this
26465
19:48:35,279 --> 19:48:41,440
with 57 why not 67 and we're going to
26466
19:48:39,119 --> 19:48:44,959
put in the other variable which is going
26467
19:48:41,440 --> 19:48:47,040
to be y and it's going to have a 56 n
26468
19:48:44,960 --> 19:48:49,120
you can put in whatever you want just
26469
19:48:47,039 --> 19:48:51,831
make sure that you are within the range
26470
19:48:49,119 --> 19:48:54,399
of the card type which is between 0 and
26471
19:48:51,831 --> 19:48:56,959
255 if you remember okay now that we
26472
19:48:54,399 --> 19:48:59,919
have this n i realize we don't have a
26473
19:48:56,960 --> 19:49:01,680
function we can try this on let's set up
26474
19:48:59,919 --> 19:49:03,919
another function pretty quick we're
26475
19:49:01,679 --> 19:49:06,399
going to say tiny type auto we can do
26476
19:49:03,919 --> 19:49:09,440
that you already know this syntax and
26477
19:49:06,399 --> 19:49:12,551
we're going to say add tiny type auto a
26478
19:49:09,440 --> 19:49:15,191
and a tiny type auto p we can do that
26479
19:49:12,551 --> 19:49:18,080
and we're going to return a plus b now
26480
19:49:15,191 --> 19:49:19,599
that we have this let's say a and b down
26481
19:49:18,080 --> 19:49:22,000
here and call this function we're going
26482
19:49:19,600 --> 19:49:24,160
to say x and y and we're going to try
26483
19:49:22,000 --> 19:49:26,872
and compile this program and it is going
26484
19:49:24,160 --> 19:49:29,192
to compile fine because the type we are
26485
19:49:26,872 --> 19:49:31,440
using to call the function which is car
26486
19:49:29,191 --> 19:49:33,119
its size is going to be less than four
26487
19:49:31,440 --> 19:49:34,400
okay so this is going to work and it is
26488
19:49:34,399 --> 19:49:40,159
let's build with gcc you're going to see
26489
19:49:36,720 --> 19:49:42,720
that the build is good let's try and uh
26490
19:49:40,160 --> 19:49:45,360
change the type here to end or even
26491
19:49:42,720 --> 19:49:47,680
double you know double is 8 bytes in
26492
19:49:45,360 --> 19:49:49,919
memory so we expect this to probably
26493
19:49:47,679 --> 19:49:52,319
give us something wrong double type is
26494
19:49:49,919 --> 19:49:54,240
eight bytes in memory so we expect the
26495
19:49:54,240 --> 19:49:59,760
to be false because the size of t is
26496
19:49:57,191 --> 19:50:02,239
going to be eight and eight is not less
26497
19:49:59,759 --> 19:50:04,871
than four this is going to be false so
26498
19:50:02,240 --> 19:50:05,760
some might expect this concept here to
26499
19:50:05,759 --> 19:50:11,191
but let's try and really prove you wrong
26500
19:50:08,551 --> 19:50:13,360
we're going to build with gcc and you
26501
19:50:11,191 --> 19:50:16,799
see it's building successfully what this
26502
19:50:13,360 --> 19:50:19,191
is really doing is that with simple
26503
19:50:16,800 --> 19:50:21,360
requirements like we have here c plus
26504
19:50:19,191 --> 19:50:24,639
plus is only going to enforce for this
26505
19:50:21,360 --> 19:50:26,720
to be valid c plus plus syntax and size
26506
19:50:26,720 --> 19:50:32,080
is going to be valid c plus plus syntax
26507
19:50:29,360 --> 19:50:34,479
even if this expression here evaluates
26508
19:50:32,080 --> 19:50:36,960
to false this is not going to enforce
26509
19:50:34,479 --> 19:50:38,959
for the value of this expression to be
26510
19:50:36,960 --> 19:50:41,360
false you can't do that with simple
26511
19:50:38,960 --> 19:50:44,480
requirements what you will do is check
26512
19:50:41,360 --> 19:50:46,720
that this is valid syntax now what do we
26513
19:50:44,479 --> 19:50:48,551
do if we really want to enforce that
26514
19:50:48,551 --> 19:50:53,831
less than four if you want that you
26515
19:50:50,872 --> 19:50:55,600
should use nested requirements and the
26516
19:50:53,831 --> 19:50:58,080
syntax to do that is really simple we
26517
19:50:55,600 --> 19:51:00,000
can go down here and put that in we're
26518
19:50:58,080 --> 19:51:02,800
going to say requires we're going to add
26519
19:51:00,000 --> 19:51:04,960
a requires keyword in front of this then
26520
19:51:02,800 --> 19:51:06,800
we're going to put our expression here
26521
19:51:04,960 --> 19:51:09,600
let's copy it and put it in i don't want
26522
19:51:06,800 --> 19:51:12,320
to type this again the moment we do this
26523
19:51:09,600 --> 19:51:15,760
now compilation is going to fail if we
26524
19:51:12,320 --> 19:51:16,552
pass a type whose size is not less than
26525
19:51:16,551 --> 19:51:20,080
and let's try and build again you're
26526
19:51:18,551 --> 19:51:22,000
going to see that the world is going to
26527
19:51:20,080 --> 19:51:24,551
fail now and we're going to have a
26528
19:51:22,000 --> 19:51:27,360
failed concept and you see world
26529
19:51:24,551 --> 19:51:29,679
finished with errors we have constraints
26530
19:51:27,360 --> 19:51:31,512
not satisfied and if we go down here
26531
19:51:29,679 --> 19:51:34,239
we're going to see required for the
26532
19:51:31,512 --> 19:51:37,512
satisfaction of tiny type auto and we
26533
19:51:34,240 --> 19:51:40,320
passed in a double type whose size is 8
26534
19:51:37,512 --> 19:51:43,119
bytes in memory and it is less than four
26535
19:51:40,320 --> 19:51:46,640
bytes you see the requirement here it is
26536
19:51:43,119 --> 19:51:49,191
not satisfied we can do this using
26537
19:51:46,639 --> 19:51:51,679
nested requirements okay if we go down
26538
19:51:49,191 --> 19:51:54,000
for example and change this to car some
26539
19:51:51,679 --> 19:51:56,719
people call this char but i call this
26540
19:51:54,000 --> 19:51:57,679
car that's my habit if we change this to
26541
19:51:57,679 --> 19:52:01,679
and try to bolt again you're going to
26542
19:51:59,119 --> 19:52:04,551
see that it is going to weld fine
26543
19:52:01,679 --> 19:52:07,359
because now what is wrong here let's see
26544
19:52:04,551 --> 19:52:10,239
what we got wrong huh we are getting a
26545
19:52:07,360 --> 19:52:11,759
compiler error here what is the problem
26546
19:52:11,759 --> 19:52:17,039
let's go up and try to analyze this a
26547
19:52:14,720 --> 19:52:19,512
little bit it's saying deduce the return
26548
19:52:17,039 --> 19:52:21,191
type does not satisfy placeholder
26549
19:52:21,191 --> 19:52:25,759
and we are requiring for the return type
26550
19:52:23,759 --> 19:52:28,000
of this guy to be tiny time uh-huh i
26551
19:52:25,759 --> 19:52:30,871
think i know what the problem is the
26552
19:52:28,000 --> 19:52:32,720
problem is the arithmetic operations
26553
19:52:30,872 --> 19:52:35,120
like the addition we're doing here are
26554
19:52:32,720 --> 19:52:37,919
not supported for types which are
26555
19:52:35,119 --> 19:52:40,000
smaller than ant and is the smallest
26556
19:52:37,919 --> 19:52:42,160
type we can use with arithmetic
26557
19:52:40,000 --> 19:52:44,160
operations so what the compiler is going
26558
19:52:42,160 --> 19:52:47,512
to do is going to do implicit
26559
19:52:44,160 --> 19:52:49,440
conversions from car to end and inside
26560
19:52:47,512 --> 19:52:52,320
here what we will have are going to be
26561
19:52:49,440 --> 19:52:54,479
ant the result of this is going to be
26562
19:52:52,320 --> 19:52:56,960
ant and the return type is going to be
26563
19:52:56,960 --> 19:53:01,920
is going to violate the requirement we
26564
19:52:59,440 --> 19:53:04,160
have here which is saying that the size
26565
19:53:01,919 --> 19:53:06,800
of tiny type here should be less than
26566
19:53:04,160 --> 19:53:09,680
four and the return of ant is not less
26567
19:53:06,800 --> 19:53:12,080
than four so we can try and fix this by
26568
19:53:09,679 --> 19:53:14,479
putting an equal sign here and i think
26569
19:53:12,080 --> 19:53:16,479
it's going to work let's do that and
26570
19:53:14,479 --> 19:53:18,319
world again this is a good learning
26571
19:53:16,479 --> 19:53:20,159
experience and now you see that the
26572
19:53:18,320 --> 19:53:22,480
build is going to work because now the
26573
19:53:20,160 --> 19:53:25,192
return type is going to satisfy our
26574
19:53:22,479 --> 19:53:27,440
requirements so let's prove that we are
26575
19:53:25,191 --> 19:53:29,512
getting a net out of this actually we're
26576
19:53:27,440 --> 19:53:31,919
going to do our own result and we're
26577
19:53:29,512 --> 19:53:33,919
going to say equal and grab the result
26578
19:53:31,919 --> 19:53:36,160
of this guy we should really prove these
26579
19:53:33,919 --> 19:53:38,800
thanks and after this we're going to
26580
19:53:36,160 --> 19:53:41,440
print the results we can do that and we
26581
19:53:38,800 --> 19:53:43,832
can even go further and print the size
26582
19:53:41,440 --> 19:53:46,160
of result here so we're going to say
26583
19:53:43,831 --> 19:53:49,439
size of result okay now that we have
26584
19:53:46,160 --> 19:53:52,480
this end we can weld with gcc and the
26585
19:53:49,440 --> 19:53:55,040
world is good don't mind this squiggly
26586
19:53:52,479 --> 19:53:56,720
line it is probably visual studio code
26587
19:53:55,039 --> 19:54:00,639
messing with us you see that the world
26588
19:53:56,720 --> 19:54:03,191
is good we can now bring up a terminal
26589
19:54:00,639 --> 19:54:05,360
and run this and see the size of the
26590
19:54:03,191 --> 19:54:07,831
return type and really prove
26591
19:54:05,360 --> 19:54:10,960
that the compiler turned that into an
26592
19:54:07,831 --> 19:54:13,511
end even if we called our function with
26593
19:54:10,960 --> 19:54:15,760
car arguments this is interesting so
26594
19:54:13,512 --> 19:54:18,479
clear and run rooster now we're going to
26595
19:54:15,759 --> 19:54:21,039
see results is going to be 123 and the
26596
19:54:18,479 --> 19:54:24,159
size of the result is for even if we
26597
19:54:21,039 --> 19:54:26,239
passed in car types as our arguments
26598
19:54:24,160 --> 19:54:29,040
okay so hopefully this proves that you
26599
19:54:26,240 --> 19:54:31,600
can set up nested requirements to
26600
19:54:29,039 --> 19:54:33,679
enforce for the expression here to be
26601
19:54:31,600 --> 19:54:36,400
checked another type of requirement you
26602
19:54:33,679 --> 19:54:38,399
can do is a compound requirement let's
26603
19:54:36,399 --> 19:54:40,479
put this in and we're going to put in a
26604
19:54:38,399 --> 19:54:42,639
simple example to drive this home i
26605
19:54:40,479 --> 19:54:46,000
think i should take this function and
26606
19:54:42,639 --> 19:54:48,319
put that below our concepts so a
26607
19:54:46,000 --> 19:54:51,191
compound requirement looks like this you
26608
19:54:48,320 --> 19:54:53,360
put your expression in acrylics like
26609
19:54:51,191 --> 19:54:56,000
this and then you can even put
26610
19:54:53,360 --> 19:54:58,000
requirements on the values of the
26611
19:54:56,000 --> 19:55:00,720
expression for example we can enforce
26612
19:54:58,000 --> 19:55:03,279
that the value of a plus b here should
26613
19:55:00,720 --> 19:55:05,919
be convertible to and if it's not
26614
19:55:03,279 --> 19:55:08,000
convertible to end the concept here is
26615
19:55:05,919 --> 19:55:10,800
going to fail this is a compound
26616
19:55:08,000 --> 19:55:13,191
requirement you can even put no except
26617
19:55:10,800 --> 19:55:15,600
keywords in here but we're not going to
26618
19:55:13,191 --> 19:55:18,000
go this far because we haven't really
26619
19:55:15,600 --> 19:55:19,920
learned about exceptions so for now i'm
26620
19:55:18,000 --> 19:55:22,000
going to test this out i just wanted you
26621
19:55:19,919 --> 19:55:24,319
to be aware that you can do that now
26622
19:55:22,000 --> 19:55:26,639
that we have this concept n let's play
26623
19:55:24,320 --> 19:55:29,120
with it and see how we can make it break
26624
19:55:26,639 --> 19:55:31,600
thanks we're going to change our concept
26625
19:55:29,119 --> 19:55:33,440
to edible let's say edible here and
26626
19:55:31,600 --> 19:55:34,480
we're going to say edible and we're
26627
19:55:34,479 --> 19:55:39,119
put in our car types here and it is
26628
19:55:39,119 --> 19:55:44,799
we can add two car variables and this is
26629
19:55:42,160 --> 19:55:47,279
going to work because we can add two car
26630
19:55:44,800 --> 19:55:48,960
variables and this is valid syntax what
26631
19:55:47,279 --> 19:55:50,959
we're going to get out of that is going
26632
19:55:48,960 --> 19:55:52,960
to be an ant because remember the
26633
19:55:50,960 --> 19:55:55,760
compiler is going to insert implicit
26634
19:55:52,960 --> 19:55:58,960
conversions from card to end because it
26635
19:55:55,759 --> 19:56:01,919
can't really add two card types and is
26636
19:55:58,960 --> 19:56:04,639
the smallest thing you can do arithmetic
26637
19:56:01,919 --> 19:56:06,240
operations on so the result of this is
26638
19:56:04,639 --> 19:56:07,831
going to be an end so a lens is
26639
19:56:06,240 --> 19:56:10,160
convertible to an edge this is going to
26640
19:56:07,831 --> 19:56:12,551
work let's build and show you that this
26641
19:56:10,160 --> 19:56:15,360
is going to work we're going to weld
26642
19:56:12,551 --> 19:56:17,191
this with the gcc you see build is good
26643
19:56:15,360 --> 19:56:20,000
we can try and run this and see what we
26644
19:56:17,191 --> 19:56:23,039
get after calling the function we get
26645
19:56:20,000 --> 19:56:25,279
result is 123 and this is going to be
26646
19:56:23,039 --> 19:56:27,360
the size of four because we get a net
26647
19:56:25,279 --> 19:56:29,600
out of this let's try and change this to
26648
19:56:27,360 --> 19:56:32,160
double and see what we get so double
26649
19:56:29,600 --> 19:56:34,720
let's say double here and if we would we
26650
19:56:32,160 --> 19:56:36,552
expect this to work because adding up
26651
19:56:34,720 --> 19:56:37,512
two doubles is going to give you a
26652
19:56:37,512 --> 19:56:40,872
and we're going to return a double from
26653
19:56:40,872 --> 19:56:45,440
and uh a double is convertible to a net
26654
19:56:43,919 --> 19:56:48,319
so we're going to return a double from
26655
19:56:45,440 --> 19:56:49,832
this guy and this should say eight now
26656
19:56:48,320 --> 19:56:51,760
because that's what we are returning
26657
19:56:49,831 --> 19:56:54,000
from the function here let's build with
26658
19:56:51,759 --> 19:56:56,720
gcc you see the both is good we can
26659
19:56:54,000 --> 19:57:00,000
clear and run rooster this is going to
26660
19:56:56,720 --> 19:57:01,919
say size of result is eight because now
26661
19:57:00,000 --> 19:57:04,080
what we are returning is going to be a
26662
19:57:01,919 --> 19:57:07,279
double from this function here and
26663
19:57:04,080 --> 19:57:10,160
double satisfies our concept adding up
26664
19:57:07,279 --> 19:57:12,160
two doubles is valid syntax and what we
26665
19:57:10,160 --> 19:57:14,480
get out of that is going to be a double
26666
19:57:12,160 --> 19:57:16,720
and a double is convertible to a net
26667
19:57:14,479 --> 19:57:19,279
this is going to work let's try and
26668
19:57:16,720 --> 19:57:21,440
change our parameters here to strength
26669
19:57:19,279 --> 19:57:23,512
we're going to comment out our x and y
26670
19:57:21,440 --> 19:57:26,872
variables here and we're going to set up
26671
19:57:23,512 --> 19:57:28,720
two strings going to say std string x
26672
19:57:26,872 --> 19:57:30,551
and we're going to say hello and you
26673
19:57:28,720 --> 19:57:33,279
know what we're going to say and why
26674
19:57:30,551 --> 19:57:35,919
we're going to say std strength y
26675
19:57:33,279 --> 19:57:37,759
and we're going to say world why not and
26676
19:57:35,919 --> 19:57:40,551
the moment we do this you see that we
26677
19:57:37,759 --> 19:57:44,000
have a problem why do we have a problem
26678
19:57:40,551 --> 19:57:46,399
because it is now a requirement for the
26679
19:57:44,000 --> 19:57:48,639
result of a and b to be convertible to
26680
19:57:46,399 --> 19:57:51,831
end remember that you can add up two
26681
19:57:48,639 --> 19:57:55,039
strands for example you can say auto s
26682
19:57:51,831 --> 19:57:57,039
and say x plus y this is going to work
26683
19:57:55,039 --> 19:57:58,871
because you can add up two strings and
26684
19:57:57,039 --> 19:58:02,000
this is going to concatenate them so
26685
19:57:58,872 --> 19:58:04,551
this is valid syntax why are we failing
26686
19:58:02,000 --> 19:58:07,191
here because we have a requirement for
26687
19:58:04,551 --> 19:58:09,759
this to be convertible to an end and the
26688
19:58:07,191 --> 19:58:12,399
strength isn't really convertible to an
26689
19:58:09,759 --> 19:58:14,639
end so this is going to fail let's build
26690
19:58:12,399 --> 19:58:16,871
this program and show you that this is
26691
19:58:14,639 --> 19:58:20,240
actually the case we're going to see
26692
19:58:16,872 --> 19:58:22,720
world finished with arrows and let's see
26693
19:58:20,240 --> 19:58:25,279
the error we have okay so constraints
26694
19:58:22,720 --> 19:58:28,320
not satisfied it's going to say required
26695
19:58:25,279 --> 19:58:30,720
the satisfaction of audible with auto
26696
19:58:28,320 --> 19:58:31,512
here in requirement and it's going to
26697
19:58:31,512 --> 19:58:36,639
a plus b does not satisfy the type
26698
19:58:34,240 --> 19:58:39,919
requirement because what we get after
26699
19:58:36,639 --> 19:58:42,000
adding a and b is not convertible to an
26700
19:58:42,000 --> 19:58:47,039
a plus b convertible to an end this is
26701
19:58:44,639 --> 19:58:50,080
going to fail okay so let's try and
26702
19:58:47,039 --> 19:58:52,719
remove this requirement to convert to
26703
19:58:50,080 --> 19:58:54,551
end and see that this actually works
26704
19:58:52,720 --> 19:58:56,160
we're going to remove this i'm going to
26705
19:58:56,160 --> 19:59:00,960
and try to build again i am going to use
26706
19:58:58,479 --> 19:59:03,360
gcc to build and now you see that this
26707
19:59:00,960 --> 19:59:06,080
is welding because we no longer
26708
19:59:03,360 --> 19:59:08,399
have the requirement of the return value
26709
19:59:06,080 --> 19:59:11,119
of this expression or result i should
26710
19:59:08,399 --> 19:59:13,360
say the result of this function
26711
19:59:11,119 --> 19:59:15,039
now doesn't have to be convertible to an
26712
19:59:13,360 --> 19:59:17,360
okay let's put this back because i want
26713
19:59:15,039 --> 19:59:19,439
you to see this later as a reference and
26714
19:59:17,360 --> 19:59:22,551
now you know how you can use compound
26715
19:59:19,440 --> 19:59:25,279
requirements to really put constraints
26716
19:59:22,551 --> 19:59:27,360
on your function templates this is
26717
19:59:25,279 --> 19:59:29,759
really all we set out to do in this
26718
19:59:27,360 --> 19:59:32,639
lecture i hope you found it interesting
26719
19:59:29,759 --> 19:59:35,119
i think i should comment out these guys
26720
19:59:32,639 --> 19:59:37,919
because i don't like to leave you with
26721
19:59:35,119 --> 19:59:39,831
code that has compiler errors let's turn
26722
19:59:37,919 --> 19:59:41,919
this back to double so that this works
26723
19:59:39,831 --> 19:59:44,239
we're going to weld again okay the world
26724
19:59:41,919 --> 19:59:45,919
is good and we are going to stop here in
26725
19:59:44,240 --> 19:59:48,480
this lecture in the next one we're going
26726
19:59:45,919 --> 19:59:50,551
to see how we can combine concepts and
26727
19:59:50,551 --> 19:59:54,959
go ahead and finish up here and meet me
26728
19:59:52,872 --> 19:59:57,680
there in this lecture we're going to see
26729
19:59:54,960 --> 20:00:00,160
how we can combine concepts using
26730
19:59:57,679 --> 20:00:03,279
logical operators we can combine
26731
20:00:00,160 --> 20:00:06,552
concepts using the and operator and the
26732
20:00:03,279 --> 20:00:09,600
r operator as you see here let's look at
26733
20:00:06,551 --> 20:00:12,080
a simple example here we have a concept
26734
20:00:09,600 --> 20:00:14,720
it is time type we have seen before and
26735
20:00:12,080 --> 20:00:17,119
it's going to check that the size of the
26736
20:00:14,720 --> 20:00:19,279
template parameter we pass is less than
26737
20:00:17,119 --> 20:00:21,599
four it's going to enforce the syntax
26738
20:00:19,279 --> 20:00:23,679
with a simple requirement but it's also
26739
20:00:21,600 --> 20:00:25,680
going to enforce for the value of this
26740
20:00:23,679 --> 20:00:28,159
expression to be true if the value is
26741
20:00:25,679 --> 20:00:30,551
not true the concept is going to fail
26742
20:00:28,160 --> 20:00:33,192
and we are using a nested requirement
26743
20:00:30,551 --> 20:00:35,599
for this so this is our concept here
26744
20:00:33,191 --> 20:00:38,479
let's try and set up a function and see
26745
20:00:35,600 --> 20:00:41,440
how we can combine this concept with
26746
20:00:38,479 --> 20:00:43,440
other concepts here we have a function
26747
20:00:41,440 --> 20:00:45,760
it is going to return a t the name of
26748
20:00:43,440 --> 20:00:48,160
the function is func it is taking in our
26749
20:00:45,759 --> 20:00:50,159
parameter and here we have the body of
26750
20:00:48,160 --> 20:00:52,960
the function within these two curly
26751
20:00:50,160 --> 20:00:55,832
braces but what we have here is a
26752
20:00:52,960 --> 20:00:58,320
concept we want to apply to this
26753
20:00:55,831 --> 20:01:00,319
function here and the first line here is
26754
20:00:58,320 --> 20:01:01,440
going to show that we can combine the
26755
20:01:01,440 --> 20:01:06,872
like we do here so this entire thing is
26756
20:01:03,759 --> 20:01:09,039
going to be a logical combination of
26757
20:01:06,872 --> 20:01:11,440
concepts so we can require that the
26758
20:01:09,039 --> 20:01:14,799
template parameter be either an integral
26759
20:01:11,440 --> 20:01:17,600
type or a floating point type using the
26760
20:01:14,800 --> 20:01:20,160
or operator here another thing we can do
26761
20:01:17,600 --> 20:01:22,400
is use the and operator as you see down
26762
20:01:20,160 --> 20:01:24,080
here in the second line and we're going
26763
20:01:24,960 --> 20:01:30,720
template parameter is both integral and
26764
20:01:28,320 --> 20:01:33,120
a tiny type and the compiler is going to
26765
20:01:30,720 --> 20:01:35,119
enforce these things as we are about to
26766
20:01:33,119 --> 20:01:37,831
see in a minute when we hit visual
26767
20:01:35,119 --> 20:01:40,639
studio code you can even specify your
26768
20:01:37,831 --> 20:01:43,279
concepts in place for example the third
26769
20:01:40,639 --> 20:01:46,160
line here is going to say we require for
26770
20:01:43,279 --> 20:01:48,160
the concept to be integral so it should
26771
20:01:46,160 --> 20:01:51,760
be an integral type and we're going to
26772
20:01:48,160 --> 20:01:54,639
specify our tiny type concept in place
26773
20:01:51,759 --> 20:01:56,720
you see we are doing that right here in
26774
20:01:54,639 --> 20:01:58,479
the function declaration and this is
26775
20:01:56,720 --> 20:02:01,191
going to work this is a valid c plus
26776
20:01:58,479 --> 20:02:02,639
plus syntax but i don't recommend this
26777
20:02:01,191 --> 20:02:05,599
because this is going to make your
26778
20:02:02,639 --> 20:02:07,039
function declarations really ugly so now
26779
20:02:05,600 --> 20:02:08,960
that you know this we're going to head
26780
20:02:07,039 --> 20:02:11,039
over to visual studio code and play with
26781
20:02:08,960 --> 20:02:14,240
this a little more it's just using the
26782
20:02:11,039 --> 20:02:16,799
or and and operator to combine concepts
26783
20:02:14,240 --> 20:02:18,960
okay here we are in our working folder
26784
20:02:16,800 --> 20:02:21,192
the current project is combining
26785
20:02:18,960 --> 20:02:23,600
concepts we're going to grab our
26786
20:02:21,191 --> 20:02:25,759
template files pretty quick and put them
26787
20:02:23,600 --> 20:02:28,240
in place and we're going to open this in
26788
20:02:25,759 --> 20:02:30,319
visual studio code as we always do by
26789
20:02:28,240 --> 20:02:32,800
dragging and dropping here we have our
26790
20:02:30,320 --> 20:02:34,960
file we're going to open that up and
26791
20:02:32,800 --> 20:02:37,440
close the left pane here i don't like it
26792
20:02:34,960 --> 20:02:40,080
and we're going to include our concepts
26793
20:02:37,440 --> 20:02:41,680
library let's do that we have this and
26794
20:02:40,080 --> 20:02:44,639
the first thing we're going to do is to
26795
20:02:41,679 --> 20:02:47,119
put in our tiny type concept here so it
26796
20:02:44,639 --> 20:02:49,360
is tiny type it's going to require that
26797
20:02:47,119 --> 20:02:51,191
the syntax for the size of t less than
26798
20:02:49,360 --> 20:02:53,119
4b supported this is a simple
26799
20:02:51,191 --> 20:02:56,239
requirement again and we're going to
26800
20:02:53,119 --> 20:02:57,759
require that this expression be true and
26801
20:02:57,759 --> 20:03:02,639
using a nested requirement okay now that
26802
20:03:00,160 --> 20:03:05,600
we have this concept we can combine this
26803
20:03:02,639 --> 20:03:07,600
with other concepts let's use the same
26804
20:03:05,600 --> 20:03:09,680
function we've been using all along so
26805
20:03:07,600 --> 20:03:12,320
we're going to say template type name
26806
20:03:09,679 --> 20:03:14,079
team and we're going to put in our
26807
20:03:12,320 --> 20:03:17,440
requires clause so we're going to say
26808
20:03:14,080 --> 20:03:18,639
requires we can use std intergroup and
26809
20:03:18,639 --> 20:03:24,800
and say or it should be htd floating
26810
20:03:22,320 --> 20:03:28,000
point i think we have this end this is a
26811
20:03:24,800 --> 20:03:30,160
concept we have which is built into the
26812
20:03:28,000 --> 20:03:32,399
c plus plus standard library we can use
26813
20:03:30,160 --> 20:03:35,279
this now that we have this we can then
26814
20:03:32,399 --> 20:03:38,239
say the signature of a function t x is
26815
20:03:35,279 --> 20:03:40,720
going to add up t a and t b and it's
26816
20:03:38,240 --> 20:03:42,480
going to return the sum of a and b now
26817
20:03:40,720 --> 20:03:45,040
you can only call this function with
26818
20:03:42,479 --> 20:03:47,679
either integers or floating points if
26819
20:03:45,039 --> 20:03:49,439
you try to deviate from this the concept
26820
20:03:47,679 --> 20:03:51,831
is going to fail and we're going to get
26821
20:03:49,440 --> 20:03:54,080
a compiler error let's go down and try
26822
20:03:51,831 --> 20:03:57,191
this out we're going to say and x and
26823
20:03:54,080 --> 20:03:59,440
put in a 6 for example and into y and
26824
20:03:57,191 --> 20:04:02,159
put in a 4 and we're going to add this
26825
20:03:59,440 --> 20:04:04,479
up we're going to say add x and y and if
26826
20:04:02,160 --> 20:04:06,552
we do this this is going to work because
26827
20:04:04,479 --> 20:04:09,759
this is an integer so the concept here
26828
20:04:06,551 --> 20:04:11,191
is going to succeed let's weld with gcc
26829
20:04:09,759 --> 20:04:13,511
and show you that the build is good the
26830
20:04:11,191 --> 20:04:15,039
world is good so no problem we can
26831
20:04:13,512 --> 20:04:17,919
change this to double it is going to
26832
20:04:15,039 --> 20:04:20,799
work because double is a floating point
26833
20:04:17,919 --> 20:04:22,399
let's say double properly and if we blow
26834
20:04:20,800 --> 20:04:25,120
it again the bullet is going to go
26835
20:04:22,399 --> 20:04:27,831
through but if we try and use for
26836
20:04:25,119 --> 20:04:30,639
example a strength let's say std
26837
20:04:27,831 --> 20:04:32,799
strength string that's a strength and
26838
20:04:30,639 --> 20:04:35,831
we're going to change this into double
26839
20:04:32,800 --> 20:04:39,192
quotes we can do that and say std
26840
20:04:35,831 --> 20:04:42,239
strength and i put this in quotes again
26841
20:04:39,191 --> 20:04:44,871
double quotes okay if we do this you see
26842
20:04:42,240 --> 20:04:48,000
we have a squiggly line and if we walk
26843
20:04:44,872 --> 20:04:50,800
we're going to have violated our concept
26844
20:04:48,000 --> 20:04:53,191
because the parameters that we pass
26845
20:04:50,800 --> 20:04:55,832
don't satisfy this concept it's neither
26846
20:04:53,191 --> 20:04:58,239
an integral type or a floating point
26847
20:04:55,831 --> 20:05:01,119
type and if we go up here we're going to
26848
20:04:58,240 --> 20:05:03,832
see that we have violated a concept
26849
20:05:01,119 --> 20:05:06,080
constraint not satisfied and it's going
26850
20:05:03,831 --> 20:05:09,039
to say the concept that was not
26851
20:05:06,080 --> 20:05:11,119
satisfied here which is right here okay
26852
20:05:09,039 --> 20:05:13,439
you can combine two concepts using the
26853
20:05:11,119 --> 20:05:14,479
or operator but we can also use the and
26854
20:05:14,479 --> 20:05:18,872
let's go down and try and put up a
26855
20:05:16,479 --> 20:05:21,039
simple example that is going to do that
26856
20:05:18,872 --> 20:05:23,440
now what we're going to require for
26857
20:05:21,039 --> 20:05:24,719
people to use this function is to
26858
20:05:24,720 --> 20:05:30,800
both tiny type and integral so we're
26859
20:05:27,831 --> 20:05:32,551
going to say requires std integral i
26860
20:05:30,800 --> 20:05:33,832
think we have this n and we're going to
26861
20:05:33,831 --> 20:05:38,080
tiny time and we're going to say our
26862
20:05:35,440 --> 20:05:40,872
template parameter here the moment we do
26863
20:05:38,080 --> 20:05:44,000
this and let's turn this back to being
26864
20:05:40,872 --> 20:05:46,960
at let's say ant x and put in a seven
26865
20:05:44,000 --> 20:05:49,919
what we had before and at y and let's
26866
20:05:46,960 --> 20:05:51,360
say four or a five doesn't matter
26867
20:05:51,360 --> 20:05:57,440
let's see our thing again so tiny type
26868
20:05:54,872 --> 20:05:58,400
requires for the size to be less or
26869
20:05:58,399 --> 20:06:02,399
to four so ant is going to work this is
26870
20:06:00,720 --> 20:06:04,960
going to build because the concept is
26871
20:06:02,399 --> 20:06:07,119
going to be satisfied it is both
26872
20:06:07,119 --> 20:06:13,119
let's work and see this run you see the
26873
20:06:10,000 --> 20:06:16,320
world is good our concept is satisfied
26874
20:06:13,119 --> 20:06:18,639
but the moment we try and use something
26875
20:06:18,639 --> 20:06:23,360
we're going to have a problem
26876
20:06:20,639 --> 20:06:26,240
let's use a double for example we're
26877
20:06:23,360 --> 20:06:29,039
going to change this to double and world
26878
20:06:26,240 --> 20:06:32,400
we expect compilation to fail because
26879
20:06:29,039 --> 20:06:34,551
the type which is double doesn't satisfy
26880
20:06:32,399 --> 20:06:36,959
the tiny type concept and we're going to
26881
20:06:34,551 --> 20:06:39,360
see that here okay so we're going to see
26882
20:06:36,960 --> 20:06:41,760
weld finished with arrows and we're
26883
20:06:39,360 --> 20:06:44,479
going to have a lengthy error here but
26884
20:06:41,759 --> 20:06:47,360
the meat of this is that we have a
26885
20:06:44,479 --> 20:06:48,959
constraint which is not satisfied
26886
20:06:48,960 --> 20:06:55,120
that for required for the satisfaction
26887
20:06:51,679 --> 20:06:57,599
of std integral so double is not going
26888
20:06:55,119 --> 20:06:59,360
to satisfy this i think double was a
26889
20:06:57,600 --> 20:07:01,680
really bad example because it's not
26890
20:06:59,360 --> 20:07:04,000
integral so integral is going to fail
26891
20:07:01,679 --> 20:07:05,039
what if we pass in long ant okay which
26892
20:07:05,039 --> 20:07:10,319
an integral type but it's not going to
26893
20:07:07,039 --> 20:07:12,639
satisfy tiny type so let's say long end
26894
20:07:10,320 --> 20:07:15,600
and we're going to build now we are
26895
20:07:12,639 --> 20:07:18,319
going to violate let's use long long ant
26896
20:07:15,600 --> 20:07:20,552
because i think long end is not large
26897
20:07:18,320 --> 20:07:23,280
enough so we're going to build now we're
26898
20:07:20,551 --> 20:07:25,599
going to fail because tiny type is not
26899
20:07:23,279 --> 20:07:27,919
satisfied you see required for a
26900
20:07:25,600 --> 20:07:31,040
dissatisfaction of tiny type and it's
26901
20:07:27,919 --> 20:07:34,399
going to say size of t is less than 4 is
26902
20:07:31,039 --> 20:07:37,831
not satisfied because guess what the
26903
20:07:34,399 --> 20:07:40,159
size of lung lung ant is greater than 4.
26904
20:07:37,831 --> 20:07:44,159
you can try and prove that by taking out
26905
20:07:40,160 --> 20:07:47,440
this guy here and saying stdc out size
26906
20:07:44,160 --> 20:07:49,279
of a long long end we're going to see
26907
20:07:49,279 --> 20:07:52,551
and if we're boiled now we're not going
26908
20:07:50,872 --> 20:07:54,551
to violate our concepts because we're
26909
20:07:54,551 --> 20:07:58,872
the word is going to be good what we
26910
20:07:56,479 --> 20:08:01,512
want to do is run the program and see
26911
20:07:58,872 --> 20:08:05,360
the size of lung lung ant we can do this
26912
20:08:01,512 --> 20:08:08,240
rooster eight the size of lung lung ant
26913
20:08:05,360 --> 20:08:11,512
is eight and it is going to violate our
26914
20:08:08,240 --> 20:08:13,680
tiny type concept okay you can do things
26915
20:08:11,512 --> 20:08:16,639
like this and combine the concepts but
26916
20:08:13,679 --> 20:08:19,279
we can even put our concepts in place we
26917
20:08:16,639 --> 20:08:21,679
can do something crazy and for example
26918
20:08:19,279 --> 20:08:24,639
say let's copy this and we're going to
26919
20:08:21,679 --> 20:08:27,039
go down and say requires integral but
26920
20:08:24,639 --> 20:08:28,479
we're going to put timely type in place
26921
20:08:27,039 --> 20:08:31,039
for example we're going to grab the
26922
20:08:28,479 --> 20:08:33,759
requires close here and copy it
26923
20:08:31,039 --> 20:08:35,511
and put that in place of tiny type here
26924
20:08:35,512 --> 20:08:39,191
and you're going to see that this is
26925
20:08:36,800 --> 20:08:41,279
going to be valid c plus plus syntax if
26926
20:08:39,191 --> 20:08:43,831
we take out the semicolon because it
26927
20:08:41,279 --> 20:08:45,440
shouldn't be there but look at this this
26928
20:08:43,831 --> 20:08:48,159
is really ugly this is going to make
26929
20:08:45,440 --> 20:08:50,479
your functions really hard to read but
26930
20:08:48,160 --> 20:08:52,552
it is going to work exactly the same way
26931
20:08:50,479 --> 20:08:55,279
it did if we call this function we're
26932
20:08:52,551 --> 20:08:57,512
going to violate tiny type let's do that
26933
20:08:55,279 --> 20:09:00,080
we're going to build with gcc we have an
26934
20:08:57,512 --> 20:09:02,872
error let's bring this up so that we can
26935
20:09:00,080 --> 20:09:05,680
see what is wrong nested requirement
26936
20:09:02,872 --> 20:09:08,479
size of t is not satisfied this is a
26937
20:09:05,679 --> 20:09:10,159
syntax you can use but i don't really
26938
20:09:08,479 --> 20:09:12,479
recommend this because this is going to
26939
20:09:10,160 --> 20:09:14,720
make you code hard to read and this is
26940
20:09:12,479 --> 20:09:16,800
really all we set out to do in this
26941
20:09:14,720 --> 20:09:20,000
lecture looking at how we can combine
26942
20:09:16,800 --> 20:09:22,960
our concepts using the and operator and
26943
20:09:20,000 --> 20:09:26,000
the or operator and you can really use
26944
20:09:22,960 --> 20:09:28,639
this in all the syntaxes for concepts we
26945
20:09:26,000 --> 20:09:30,960
have seen but i just used this in this
26946
20:09:28,639 --> 20:09:32,639
lecture because it is simpler to show
26947
20:09:30,960 --> 20:09:34,480
we are going to stop here in this
26948
20:09:32,639 --> 20:09:37,512
lecture the next one we're going to look
26949
20:09:34,479 --> 20:09:39,919
at concepts and auto go ahead and finish
26950
20:09:37,512 --> 20:09:41,512
up here and meet me there in this
26951
20:09:39,919 --> 20:09:44,160
lecture we're going to zoom in on
26952
20:09:41,512 --> 20:09:46,000
concepts and the auto key world we have
26953
20:09:44,160 --> 20:09:48,639
already seen that we can do something
26954
20:09:46,000 --> 20:09:51,191
like this use the auto keywords with our
26955
20:09:48,639 --> 20:09:53,360
functions and let the compiler generate
26956
20:09:51,191 --> 20:09:55,279
a function template behind the scenes
26957
20:09:53,360 --> 20:09:58,320
and this worked pretty well we could use
26958
20:09:55,279 --> 20:10:00,479
this syntax to put constraints on our
26959
20:09:58,320 --> 20:10:03,280
other keywords and we saw that the
26960
20:10:00,479 --> 20:10:05,759
compiler could actually enforce this and
26961
20:10:03,279 --> 20:10:08,639
throw a compiler error if our concept
26962
20:10:05,759 --> 20:10:11,279
here is violated what i haven't shown
26963
20:10:08,639 --> 20:10:13,919
you is that you can even enforce
26964
20:10:11,279 --> 20:10:15,919
concepts on variables that you declare
26965
20:10:13,919 --> 20:10:18,000
you can do something like this set up a
26966
20:10:15,919 --> 20:10:21,119
variable say auto x and call the
26967
20:10:18,000 --> 20:10:23,679
variable x and enforce for the variable
26968
20:10:21,119 --> 20:10:26,551
to be an integral type i don't really
26969
20:10:23,679 --> 20:10:29,039
think you have much use for this because
26970
20:10:26,551 --> 20:10:31,831
once you call the function and assign a
26971
20:10:29,039 --> 20:10:34,079
value to a variable you already have an
26972
20:10:31,831 --> 20:10:36,479
idea of what is going to come out of the
26973
20:10:34,080 --> 20:10:38,720
function but if you have a use case for
26974
20:10:36,479 --> 20:10:40,551
something like this please go ahead and
26975
20:10:38,720 --> 20:10:43,360
use this it is going to enforce your
26976
20:10:40,551 --> 20:10:45,759
concepts you can even use concepts like
26977
20:10:43,360 --> 20:10:48,399
this set up a variable and assign a
26978
20:10:45,759 --> 20:10:51,511
literal to the variable name using the
26979
20:10:48,399 --> 20:10:54,319
auto keyword here but i personally find
26980
20:10:51,512 --> 20:10:55,832
this useless because you are putting in
26981
20:10:55,831 --> 20:11:00,319
why do you want to put a protection if
26982
20:10:58,872 --> 20:11:02,240
you know that you are putting in a
26983
20:11:00,320 --> 20:11:05,040
double literal then the variable should
26984
20:11:02,240 --> 20:11:07,440
be a double type i find this a little
26985
20:11:05,039 --> 20:11:09,360
bit useless but it is supported in c
26986
20:11:07,440 --> 20:11:11,832
plus plus if you have a use case for
26987
20:11:09,360 --> 20:11:13,360
this please go ahead and use this now
26988
20:11:11,831 --> 20:11:15,599
that you know this we're going to head
26989
20:11:13,360 --> 20:11:18,240
over to visual studio code and play with
26990
20:11:15,600 --> 20:11:20,320
us a little more okay here we are in our
26991
20:11:18,240 --> 20:11:22,872
working folder the current project is
26992
20:11:20,320 --> 20:11:24,960
concepts and auto we're going to grab
26993
20:11:22,872 --> 20:11:27,120
our template files and we're going to
26994
20:11:24,960 --> 20:11:29,440
put them in place and we're going to
26995
20:11:27,119 --> 20:11:31,360
open this up in visual studio code let's
26996
20:11:29,440 --> 20:11:33,279
do that pretty quick we're going to have
26997
20:11:31,360 --> 20:11:36,399
our folder open we're going to open the
26998
20:11:33,279 --> 20:11:38,551
main cpp file close the left pane and
26999
20:11:36,399 --> 20:11:41,360
clean things up a little bit and we're
27000
20:11:38,551 --> 20:11:43,512
going to include our concepts library
27001
20:11:41,360 --> 20:11:45,191
and we're going to put in our function
27002
20:11:43,512 --> 20:11:46,720
which is going to be using the auto
27003
20:11:46,720 --> 20:11:51,759
really make the syntax nice and cool but
27004
20:11:49,600 --> 20:11:54,960
we're going to be constraining our auto
27005
20:11:51,759 --> 20:11:56,639
parameters here to use integral types if
27006
20:11:54,960 --> 20:11:59,040
we call this function with something
27007
20:11:56,639 --> 20:12:00,639
that is not an integer or any trigger
27008
20:11:59,039 --> 20:12:02,871
type really we're going to get a
27009
20:12:00,639 --> 20:12:05,720
compiler error so if we go down here for
27010
20:12:02,872 --> 20:12:09,360
example and say add and say
27011
20:12:05,720 --> 20:12:14,160
10.9 and 0.1 we're going to get a
27012
20:12:09,360 --> 20:12:16,639
compiler error because 10.9 and 0.1 are
27013
20:12:14,160 --> 20:12:19,120
double literals and we only support
27014
20:12:16,639 --> 20:12:21,191
integral types in this function here so
27015
20:12:19,119 --> 20:12:23,039
let's work and show you the error but
27016
20:12:21,191 --> 20:12:25,440
you must know this by now because we
27017
20:12:23,039 --> 20:12:27,279
have done this like a gazillion times
27018
20:12:25,440 --> 20:12:29,760
the concept integral is going to be
27019
20:12:27,279 --> 20:12:32,800
violated and it's going to say required
27020
20:12:29,759 --> 20:12:34,720
for the satisfaction of integral so the
27021
20:12:32,800 --> 20:12:36,639
concept is failing here we're going to
27022
20:12:34,720 --> 20:12:39,600
get a compiler error but if we change
27023
20:12:36,639 --> 20:12:41,600
this for example to 10 and 5 put in
27024
20:12:39,600 --> 20:12:42,872
whatever you want which is an integer
27025
20:12:41,600 --> 20:12:44,800
this is going to work we're going to
27026
20:12:44,800 --> 20:12:49,760
you see the wealth is good so you can
27027
20:12:46,720 --> 20:12:51,831
use auto with concepts like this we have
27028
20:12:49,759 --> 20:12:53,759
seen this syntax already a couple of
27029
20:12:51,831 --> 20:12:55,919
times in this chapter what we haven't
27030
20:12:53,759 --> 20:12:59,039
seen is that for example you can set up
27031
20:12:55,919 --> 20:13:02,240
a variable in main and call this x y
27032
20:12:59,039 --> 20:13:05,191
naught and say this variable should
27033
20:13:02,240 --> 20:13:06,960
satisfy the concept and specify the
27034
20:13:05,191 --> 20:13:09,279
concept you want for example let's say
27035
20:13:06,960 --> 20:13:11,192
std integral and if you do something
27036
20:13:09,279 --> 20:13:12,800
like this let's see what we get from
27037
20:13:11,191 --> 20:13:14,871
this we're going to world you see the
27038
20:13:12,800 --> 20:13:17,360
work is good because if we add up these
27039
20:13:14,872 --> 20:13:19,512
guys we're going to generate an integer
27040
20:13:17,360 --> 20:13:22,080
instance for this function and we're
27041
20:13:19,512 --> 20:13:23,832
going to deduce the return type as ant
27042
20:13:22,080 --> 20:13:26,479
so the return type is going to be
27043
20:13:23,831 --> 20:13:29,759
integral and it's going to be assignable
27044
20:13:26,479 --> 20:13:31,679
in our variable here but if we change to
27045
20:13:29,759 --> 20:13:34,239
floating point i think we have this
27046
20:13:31,679 --> 20:13:36,399
concept in place yes we do but it is
27047
20:13:34,240 --> 20:13:38,639
going to fail because what we get from
27048
20:13:36,399 --> 20:13:41,191
this function is going to be an integer
27049
20:13:38,639 --> 20:13:43,119
and we can't assign to this because this
27050
20:13:43,119 --> 20:13:48,239
what you try to assign to this variable
27051
20:13:46,080 --> 20:13:50,000
here should be a floating point this is
27052
20:13:48,240 --> 20:13:52,240
the meaning here and if we do this we're
27053
20:13:50,000 --> 20:13:54,800
going to get to the error probably so we
27054
20:13:52,240 --> 20:13:57,440
have the arrow and it's going to say
27055
20:13:54,800 --> 20:13:59,192
constraint not satisfied and it is going
27056
20:13:59,191 --> 20:14:03,759
constraint we didn't satisfy which is
27057
20:14:01,679 --> 20:14:06,319
its floating point here this is how you
27058
20:14:03,759 --> 20:14:08,799
can put constraints on your variables
27059
20:14:06,320 --> 20:14:11,512
even when you are declaring them so
27060
20:14:08,800 --> 20:14:12,800
another thing we can try here is to
27061
20:14:12,800 --> 20:14:18,720
a literal to this variable here let's
27062
20:14:15,360 --> 20:14:20,551
put in a 3.9 and see if this actually
27063
20:14:22,872 --> 20:14:27,832
you see the build is good and the
27064
20:14:24,872 --> 20:14:30,479
requirement is for what we assigned to
27065
20:14:27,831 --> 20:14:33,360
this variable here should be a double
27066
20:14:30,479 --> 20:14:36,399
and a 3.9 is already a double so no
27067
20:14:33,360 --> 20:14:38,080
problem but if we try and make this
27068
20:14:38,080 --> 20:14:42,639
this is going to fail so let's build
27069
20:14:40,639 --> 20:14:45,279
again you see the concept is going to
27070
20:14:42,639 --> 20:14:48,551
fail and this is how you can use these
27071
20:14:45,279 --> 20:14:50,720
things to constrain your variables i
27072
20:14:48,551 --> 20:14:53,119
personally find this a little bit
27073
20:14:50,720 --> 20:14:56,551
useless at least in this case here
27074
20:14:53,119 --> 20:14:57,679
because i know that i have an integer
27075
20:14:57,679 --> 20:15:02,479
and i am assigning this to a variable
27076
20:15:00,000 --> 20:15:03,440
why do i need the help of concepts to
27077
20:15:03,440 --> 20:15:07,832
constrain my variable here but in the
27078
20:15:05,919 --> 20:15:11,679
case where you are calling a function
27079
20:15:07,831 --> 20:15:14,080
for example using a 5 and an 8
27080
20:15:11,679 --> 20:15:16,799
this can come in handy because it's not
27081
20:15:14,080 --> 20:15:18,720
easy to keep track of the return type
27082
20:15:16,800 --> 20:15:21,440
you get from a function because the
27083
20:15:18,720 --> 20:15:24,399
function might have a return expression
27084
20:15:21,440 --> 20:15:26,551
that has multiple different variables
27085
20:15:24,399 --> 20:15:28,871
and it's not easy to keep track of what
27086
20:15:26,551 --> 20:15:31,919
you get back from a function and you can
27087
20:15:28,872 --> 20:15:33,832
use a constraint like this to make sure
27088
20:15:31,919 --> 20:15:35,919
what you get from the function is what
27089
20:15:33,831 --> 20:15:37,831
you want and if it's not what you want
27090
20:15:35,919 --> 20:15:40,000
you're going to throw a compiler error
27091
20:15:37,831 --> 20:15:42,159
because the concept you use is going to
27092
20:15:40,000 --> 20:15:43,831
fail i would like to welcome you in this
27093
20:15:42,160 --> 20:15:46,872
new chapter where we're going to be
27094
20:15:43,831 --> 20:15:49,439
learning about classes classes are a
27095
20:15:46,872 --> 20:15:52,479
mechanism we have in c plus plus to
27096
20:15:49,440 --> 20:15:54,800
build our own types and use them like we
27097
20:15:52,479 --> 20:15:57,119
have been using other bulletin types
27098
20:15:54,800 --> 20:15:59,120
like and to double or whatever and we're
27099
20:15:57,119 --> 20:16:03,279
going to be able to do that by setting
27100
20:15:59,119 --> 20:16:05,599
up blueprints of our class types and
27101
20:16:03,279 --> 20:16:08,479
we're going to be using those blueprints
27102
20:16:05,600 --> 20:16:10,639
to build actual objects that we can use
27103
20:16:08,479 --> 20:16:12,959
in our c plus plus program so for
27104
20:16:10,639 --> 20:16:16,160
example we can have a class as a
27105
20:16:12,960 --> 20:16:19,600
blueprint and we can create real class
27106
20:16:16,160 --> 20:16:21,760
objects in our c plus plus program as we
27107
20:16:19,600 --> 20:16:24,320
need them and we're going to be learning
27108
20:16:21,759 --> 20:16:25,919
all about this in the next few chapters
27109
20:16:24,320 --> 20:16:28,320
we are going to head over in the next
27110
20:16:25,919 --> 20:16:31,039
lecture and let you set up your very
27111
20:16:28,320 --> 20:16:33,760
first c plus plus class go ahead and
27112
20:16:31,039 --> 20:16:35,919
finish up here and meet me there in this
27113
20:16:33,759 --> 20:16:39,191
lecture you are going to build your
27114
20:16:35,919 --> 20:16:42,080
first c plus plus class classes are a
27115
20:16:39,191 --> 20:16:45,039
mechanism we have in c plus plus to be
27116
20:16:42,080 --> 20:16:47,279
able to build our own types if you
27117
20:16:45,039 --> 20:16:50,000
remember so far in this course we have
27118
20:16:47,279 --> 20:16:50,959
been using basic types like ant and
27119
20:16:50,960 --> 20:16:55,600
and we were using them like this we said
27120
20:16:53,360 --> 20:16:57,360
the type of the variable we give the
27121
20:16:55,600 --> 20:16:59,760
name of the variable and then we
27122
20:16:57,360 --> 20:17:03,279
initialize this variable and we can use
27123
20:16:59,759 --> 20:17:05,919
this throughout our program now we are
27124
20:17:03,279 --> 20:17:08,800
at a point where we need to start
27125
20:17:05,919 --> 20:17:12,720
designing our own types suppose we want
27126
20:17:08,800 --> 20:17:15,192
to build our own type that models a
27127
20:17:12,720 --> 20:17:17,440
person for example suppose a person is
27128
20:17:17,440 --> 20:17:23,760
the age and the address and we want to
27129
20:17:23,759 --> 20:17:29,679
and use them as players for example and
27130
20:17:27,119 --> 20:17:31,679
when we have the properties of a person
27131
20:17:29,679 --> 20:17:33,439
we can do all kinds of crazy things with
27132
20:17:31,679 --> 20:17:35,919
them we can make them jump up for
27133
20:17:33,440 --> 20:17:38,479
example if we are designing a game we
27134
20:17:35,919 --> 20:17:40,800
can make them run we can make them fly
27135
20:17:38,479 --> 20:17:42,239
we can do all kinds of crazy things in
27136
20:17:40,800 --> 20:17:44,720
this lecture we're going to use a
27137
20:17:42,240 --> 20:17:48,000
cylinder as an example and we're going
27138
20:17:44,720 --> 20:17:51,119
to model a cylinder in our c plus plus
27139
20:17:48,000 --> 20:17:54,000
program a cylinder is defined by two
27140
20:17:51,119 --> 20:17:56,871
things it has a base radius which is
27141
20:17:54,000 --> 20:17:58,240
modeled by this r you see here and it
27142
20:17:58,240 --> 20:18:03,512
and when we have this information about
27143
20:18:00,720 --> 20:18:05,279
our cylinder we can really do all kinds
27144
20:18:03,512 --> 20:18:08,551
of crazy things for example we can
27145
20:18:05,279 --> 20:18:10,872
compute its area the base area and the
27146
20:18:10,872 --> 20:18:16,400
r squared this is a formula you get from
27147
20:18:13,679 --> 20:18:18,159
your basic mathematics education
27148
20:18:16,399 --> 20:18:21,511
you can compute the volume of the
27149
20:18:18,160 --> 20:18:24,160
cylinder and the formula to do that is
27150
20:18:21,512 --> 20:18:26,639
area multiplied by the height and we can
27151
20:18:24,160 --> 20:18:30,000
really do all kinds of crazy things with
27152
20:18:26,639 --> 20:18:32,160
the cylinder if we have this information
27153
20:18:30,000 --> 20:18:35,679
so we're going to use this information
27154
20:18:32,160 --> 20:18:38,160
and model a cylinder we can use in our c
27155
20:18:35,679 --> 20:18:41,039
plus plus program and we're going to be
27156
20:18:38,160 --> 20:18:43,192
using classes to do that the syntax to
27157
20:18:41,039 --> 20:18:45,439
set up your class in c plus plus it's
27158
20:18:43,191 --> 20:18:48,551
really simple you say class this is the
27159
20:18:45,440 --> 20:18:50,960
keyword you have to put in here you say
27160
20:18:48,551 --> 20:18:53,679
the name of your class in this case it
27161
20:18:50,960 --> 20:18:57,120
is cylander as you see here and then we
27162
20:18:53,679 --> 20:18:59,759
put a pair of curly braces in place the
27163
20:18:57,119 --> 20:19:02,239
start is on top here and the end is down
27164
20:18:59,759 --> 20:19:04,319
here and after your class definition
27165
20:19:02,240 --> 20:19:07,120
you're going to put a semicolon inside
27166
20:19:04,320 --> 20:19:09,440
the class we really have two parts we
27167
20:19:07,119 --> 20:19:11,599
have member variables which are going to
27168
20:19:09,440 --> 20:19:14,240
model the properties that your class is
27169
20:19:11,600 --> 20:19:16,872
going to have in this case we have two
27170
20:19:14,240 --> 20:19:19,120
properties that really define a cylinder
27171
20:19:16,872 --> 20:19:21,760
we have the best radius and we have the
27172
20:19:19,119 --> 20:19:24,959
height we have decided to model these
27173
20:19:21,759 --> 20:19:27,599
things as double types inside our class
27174
20:19:24,960 --> 20:19:30,720
and this is going to make the first part
27175
20:19:27,600 --> 20:19:33,279
of our class the member variables the
27176
20:19:30,720 --> 20:19:37,360
second part is going to be made of
27177
20:19:33,279 --> 20:19:40,639
behaviors or functions that do things on
27178
20:19:37,360 --> 20:19:43,440
the class using the properties and one
27179
20:19:40,639 --> 20:19:45,440
function we have is the volume function
27180
20:19:43,440 --> 20:19:48,720
which is going to help us compute the
27181
20:19:45,440 --> 20:19:51,832
volume of our cylinder here if you look
27182
20:19:48,720 --> 20:19:54,000
at its syntax it really is a function we
27183
20:19:51,831 --> 20:19:56,319
have a return type we have the name of
27184
20:19:54,000 --> 20:19:58,320
the function we have the parameter list
27185
20:19:56,320 --> 20:20:01,680
which is empty by now and we have our
27186
20:19:58,320 --> 20:20:03,832
curly braces that delimit the body of
27187
20:20:01,679 --> 20:20:05,439
our function inside the function we're
27188
20:20:03,831 --> 20:20:08,239
going to do nothing special we're just
27189
20:20:05,440 --> 20:20:10,320
going to return the volume of our
27190
20:20:08,240 --> 20:20:13,040
function here and if you remember the
27191
20:20:13,039 --> 20:20:19,119
multiplied by the height and this thing
27192
20:20:16,399 --> 20:20:20,799
here is going to model the base area you
27193
20:20:20,800 --> 20:20:25,832
multiplied by the square of the radius
27194
20:20:24,240 --> 20:20:27,680
and then we're going to multiply this by
27195
20:20:25,831 --> 20:20:30,551
the height and we're going to return the
27196
20:20:27,679 --> 20:20:32,000
volume for use by whoever is calling
27197
20:20:32,000 --> 20:20:36,720
one thing we haven't really talked about
27198
20:20:34,160 --> 20:20:40,080
is this public thing you see here
27199
20:20:36,720 --> 20:20:42,160
and what this says is that the members
27200
20:20:40,080 --> 20:20:44,960
that we have in this class are going to
27201
20:20:42,160 --> 20:20:47,512
be accessible from the outside of the
27202
20:20:44,960 --> 20:20:49,832
class for now we can't really understand
27203
20:20:47,512 --> 20:20:52,160
this but when we hit visual studio code
27204
20:20:49,831 --> 20:20:53,191
i'm going to show you what this exactly
27205
20:20:53,191 --> 20:20:58,000
now that we have the class declared we
27206
20:20:55,679 --> 20:21:00,551
can really use it like we use any other
27207
20:20:58,000 --> 20:21:03,119
types in c plus plus for example we can
27208
20:21:03,119 --> 20:21:07,512
and set up a variable called cylinder
27209
20:21:05,279 --> 20:21:10,080
one as you see here is type is going to
27210
20:21:07,512 --> 20:21:12,960
be cylinder and notice that this is
27211
20:21:10,080 --> 20:21:15,119
really a type that we build ourselves
27212
20:21:12,960 --> 20:21:17,760
and we can really use it like we use
27213
20:21:15,119 --> 20:21:20,551
other variables for example we can call
27214
20:21:17,759 --> 20:21:22,720
it function using the syntax here and
27215
20:21:20,551 --> 20:21:25,279
print the volume this is going to print
27216
20:21:22,720 --> 20:21:27,831
the volume using the volume function
27217
20:21:25,279 --> 20:21:30,872
that we just set up in a minute if we go
27218
20:21:27,831 --> 20:21:33,511
down we can modify things about our
27219
20:21:30,872 --> 20:21:36,320
cylinder for example we can use the dot
27220
20:21:33,512 --> 20:21:38,479
notation here to change the base radius
27221
20:21:36,320 --> 20:21:41,192
and change the height and if we try to
27222
20:21:38,479 --> 20:21:43,512
print the volume again this information
27223
20:21:41,191 --> 20:21:46,080
is going to be picked up and be used by
27224
20:21:43,512 --> 20:21:48,479
the volume function to compute the
27225
20:21:46,080 --> 20:21:50,400
volume of our cylinder here this is
27226
20:21:48,479 --> 20:21:52,319
really cool if you want you can also set
27227
20:21:50,399 --> 20:21:54,239
up another cylinder like we do here and
27228
20:21:52,320 --> 20:21:56,872
we're going to print the volume and we
27229
20:21:54,240 --> 20:21:59,192
can really do all kinds of crazy things
27230
20:21:56,872 --> 20:22:01,760
with our types like this okay this is
27231
20:21:59,191 --> 20:22:04,799
our class and we can really use it to do
27232
20:22:01,759 --> 20:22:07,279
a lot before we head over to visual
27233
20:22:04,800 --> 20:22:09,919
studio code and play with us i want to
27234
20:22:07,279 --> 20:22:11,279
bring to your attention that members of
27235
20:22:11,279 --> 20:22:16,800
are private by default and what i mean
27236
20:22:14,240 --> 20:22:19,832
by that is that for example if we don't
27237
20:22:16,800 --> 20:22:21,192
put this public keywords in here we want
27238
20:22:21,191 --> 20:22:27,279
to use the volume function for example
27239
20:22:24,080 --> 20:22:30,000
like we have used it in our main
27240
20:22:30,000 --> 20:22:35,279
if the member is private it won't be
27241
20:22:32,479 --> 20:22:37,512
usable outside the class this is what we
27242
20:22:35,279 --> 20:22:39,831
mean here we are trying to use this
27243
20:22:37,512 --> 20:22:42,400
member in the main function
27244
20:22:39,831 --> 20:22:45,360
outside the class definition it won't be
27245
20:22:42,399 --> 20:22:48,399
accessible if it is private and we make
27246
20:22:45,360 --> 20:22:50,479
it public by putting the public keyword
27247
20:22:48,399 --> 20:22:52,720
and the column like we do here
27248
20:22:50,479 --> 20:22:55,119
everything after this public keyword is
27249
20:22:52,720 --> 20:22:57,512
going to be public until we change this
27250
20:22:55,119 --> 20:23:00,399
to private somewhere in our program if
27251
20:22:57,512 --> 20:23:02,800
we need that now that you have an idea
27252
20:23:00,399 --> 20:23:05,599
about how you can declare and use your
27253
20:23:02,800 --> 20:23:07,440
class in c plus plus let's head over to
27254
20:23:05,600 --> 20:23:10,240
visual studio code and play with us a
27255
20:23:07,440 --> 20:23:12,720
little more okay here we are in our
27256
20:23:10,240 --> 20:23:14,872
working folder the current project is
27257
20:23:12,720 --> 20:23:17,360
your first class you are going to build
27258
20:23:14,872 --> 20:23:19,760
your very first class in c plus plus
27259
20:23:17,360 --> 20:23:22,080
we're going to grab our template files
27260
20:23:19,759 --> 20:23:24,399
we're going to copy them and put them in
27261
20:23:22,080 --> 20:23:26,720
place and then we're going to open this
27262
20:23:24,399 --> 20:23:29,119
little guy in visual studio code by
27263
20:23:26,720 --> 20:23:31,040
dragging and dropping here this is going
27264
20:23:29,119 --> 20:23:33,440
to open our folder we're going to close
27265
20:23:31,039 --> 20:23:35,759
the left pane here and clean things up a
27266
20:23:33,440 --> 20:23:38,872
little bit the first thing we want to do
27267
20:23:38,872 --> 20:23:43,040
but before we do that we're going to
27268
20:23:40,639 --> 20:23:45,119
need the pi variable because remember
27269
20:23:45,119 --> 20:23:51,191
for use in computing the area and the
27270
20:23:48,000 --> 20:23:53,279
volume of our cylinder that we want to
27271
20:23:51,191 --> 20:23:54,959
model like we did in the slides so the
27272
20:23:53,279 --> 20:23:57,191
way we're going to do that i am going to
27273
20:23:54,960 --> 20:23:58,720
declare a const variable and i am going
27274
20:23:58,720 --> 20:24:04,479
and i am going to initialize this with
27275
20:24:01,119 --> 20:24:07,279
pi to get pi i'm going to cheat a little
27276
20:24:04,479 --> 20:24:10,239
bit i'm going to go in my calculator and
27277
20:24:07,279 --> 20:24:12,479
let's see if i can get pi here and i
27278
20:24:10,240 --> 20:24:15,040
click on this and i'm going to grab pi
27279
20:24:12,479 --> 20:24:17,831
here and copy it this is the easiest way
27280
20:24:15,039 --> 20:24:19,679
i can find so i'm going to put it in
27281
20:24:17,831 --> 20:24:21,759
here and this is going to be our
27282
20:24:19,679 --> 20:24:24,319
variable now that we have this we're
27283
20:24:21,759 --> 20:24:27,511
going to set up our class and that to
27284
20:24:24,320 --> 20:24:29,760
define a class you say class you have to
27285
20:24:27,512 --> 20:24:31,600
put in this keyword and then we're going
27286
20:24:29,759 --> 20:24:34,159
to say the name of the class the name of
27287
20:24:31,600 --> 20:24:36,160
the class is going to be cylinder and
27288
20:24:34,160 --> 20:24:38,960
after we do this we're going to put a
27289
20:24:36,160 --> 20:24:41,440
pair of curly braces and we're going to
27290
20:24:38,960 --> 20:24:43,680
end this with a semi-colon you have to
27291
20:24:41,440 --> 20:24:45,919
remember this if you don't put it here
27292
20:24:43,679 --> 20:24:47,119
the ziploc plus compiler is going to
27293
20:24:47,119 --> 20:24:51,919
now that we have the class blueprint
27294
20:24:49,831 --> 20:24:53,679
here we're going to put in our member
27295
20:24:51,919 --> 20:24:56,319
variable and these are going to be the
27296
20:24:53,679 --> 20:24:58,959
variables we use to model the base
27297
20:24:56,320 --> 20:25:01,040
radius and the height of our cylinder
27298
20:24:58,960 --> 20:25:03,120
we're going to put in a double variable
27299
20:25:01,039 --> 20:25:05,511
and we're going to call this base radius
27300
20:25:03,119 --> 20:25:07,759
and we're going to brace initialize this
27301
20:25:05,512 --> 20:25:10,240
to zero we can do this and we're going
27302
20:25:07,759 --> 20:25:12,479
to set up another one and call it height
27303
20:25:10,240 --> 20:25:14,400
and we're going to also initialize this
27304
20:25:12,479 --> 20:25:17,512
to zero okay now that we have this we're
27305
20:25:14,399 --> 20:25:20,000
going to put functions or methods in our
27306
20:25:17,512 --> 20:25:22,400
class and we do that by just putting the
27307
20:25:20,000 --> 20:25:24,872
function definition in our class so our
27308
20:25:22,399 --> 20:25:26,639
function is going to be returning double
27309
20:25:24,872 --> 20:25:27,832
because it's going to be returning the
27310
20:25:27,831 --> 20:25:32,399
of our cylinder so it's going to return
27311
20:25:30,800 --> 20:25:34,960
double here the name is going to be
27312
20:25:32,399 --> 20:25:37,360
volume and it's going to be computing
27313
20:25:34,960 --> 20:25:40,080
the volume and returning that remember
27314
20:25:37,360 --> 20:25:42,960
the formula to compute the volume
27315
20:25:40,080 --> 20:25:45,440
is going to be pi we have a pi variable
27316
20:25:42,960 --> 20:25:48,160
on top and we're going to multiply by
27317
20:25:45,440 --> 20:25:50,800
this radius twice because the base
27318
20:25:48,160 --> 20:25:53,040
radius has to be squared let's do that
27319
20:25:50,800 --> 20:25:55,040
and multiply by base radius again and
27320
20:25:53,039 --> 20:25:58,319
then we're going to multiply by height
27321
20:25:55,039 --> 20:26:00,551
and notice that these are guys declared
27322
20:25:58,320 --> 20:26:02,872
in the body of the class if i can say
27323
20:26:00,551 --> 20:26:05,279
that this is the definition of the class
27324
20:26:02,872 --> 20:26:08,160
we are able to use this guys because we
27325
20:26:05,279 --> 20:26:10,479
are inside this class here okay now that
27326
20:26:08,160 --> 20:26:13,360
we have this our class is really defined
27327
20:26:10,479 --> 20:26:15,512
but we can't really use it quite yet
27328
20:26:13,360 --> 20:26:17,600
what do i mean by that let's go in the
27329
20:26:15,512 --> 20:26:20,240
main function and we're going to set up
27330
20:26:17,600 --> 20:26:23,680
a variable of type cylinder we can do
27331
20:26:20,240 --> 20:26:26,400
that and let's call this cylinder one if
27332
20:26:23,679 --> 20:26:28,319
we do this and try to compile this this
27333
20:26:26,399 --> 20:26:29,439
is going to work fine let's do that
27334
20:26:31,512 --> 20:26:36,000
world finished successfully this is
27335
20:26:33,440 --> 20:26:38,800
welding but we have a function called
27336
20:26:36,000 --> 20:26:42,000
volume here and we can try and call it
27337
20:26:38,800 --> 20:26:44,080
using the dot notation that we saw in
27338
20:26:42,000 --> 20:26:46,800
the slides let's try and print the
27339
20:26:44,080 --> 20:26:48,872
volume of our cylinder here and see what
27340
20:26:46,800 --> 20:26:50,720
we get so we're going to say volume we
27341
20:26:48,872 --> 20:26:53,600
can save that and we're going to say
27342
20:26:50,720 --> 20:26:55,600
cylinder one and do volume okay let's
27343
20:26:53,600 --> 20:26:57,440
see if we can call this function here
27344
20:26:55,600 --> 20:27:00,552
and the moment we do that you see that
27345
20:26:57,440 --> 20:27:02,800
we have a squiggly line here so visual
27346
20:27:00,551 --> 20:27:05,512
studio code has detected that something
27347
20:27:02,800 --> 20:27:08,000
is wrong let's hit the problems tab here
27348
20:27:05,512 --> 20:27:12,551
and see what we get it's going to say
27349
20:27:08,000 --> 20:27:14,720
expected an identifier on line what this
27350
20:27:14,720 --> 20:27:19,440
uh we put three columns here let's
27351
20:27:19,440 --> 20:27:26,320
and the error is going to change to be
27352
20:27:23,191 --> 20:27:29,191
suddenly the volume declared at line 6
27353
20:27:26,320 --> 20:27:31,832
is inaccessible from this location here
27354
20:27:29,191 --> 20:27:33,191
this is what the error says and it is
27355
20:27:33,191 --> 20:27:40,000
because members of the class are private
27356
20:27:36,800 --> 20:27:42,080
by default so they want to be accessible
27357
20:27:40,000 --> 20:27:44,160
from the outside of the class like we
27358
20:27:42,080 --> 20:27:46,960
are doing in the main function here
27359
20:27:44,160 --> 20:27:48,639
notice that we are able to access them
27360
20:27:46,960 --> 20:27:51,600
from the inside of the class you see
27361
20:27:48,639 --> 20:27:53,759
base radius is declared down here and we
27362
20:27:51,600 --> 20:27:56,240
are able to use in the function because
27363
20:27:53,759 --> 20:27:59,679
the function volume here is inside the
27364
20:27:56,240 --> 20:28:02,160
class so the members are accessible even
27365
20:27:59,679 --> 20:28:04,551
if they are private but private members
27366
20:28:02,160 --> 20:28:06,872
can't be accessible from the outside of
27367
20:28:04,551 --> 20:28:08,551
the class like we are doing in the main
27368
20:28:06,872 --> 20:28:10,800
function here that's why we have this
27369
20:28:08,551 --> 20:28:13,191
problem let's see what the compiler says
27370
20:28:10,800 --> 20:28:14,960
we're going to pass this through gcc and
27371
20:28:13,191 --> 20:28:18,319
we're going to get a compiler error that
27372
20:28:14,960 --> 20:28:20,639
we expect and the compiler is really
27373
20:28:18,320 --> 20:28:23,192
specific on this it's going to say
27374
20:28:20,639 --> 20:28:26,080
double cylinder volume the volume
27375
20:28:23,191 --> 20:28:28,871
function from the cylinder class is
27376
20:28:26,080 --> 20:28:31,919
private within this context and which
27377
20:28:28,872 --> 20:28:34,639
context the line 19 when we are trying
27378
20:28:31,919 --> 20:28:37,279
to use it in the main function so if you
27379
20:28:34,639 --> 20:28:40,319
really want thanks inside the class to
27380
20:28:37,279 --> 20:28:43,119
be accessible from the outside you need
27381
20:28:40,320 --> 20:28:45,920
to make them public and change them from
27382
20:28:43,119 --> 20:28:47,919
private how do we do that it is really
27383
20:28:45,919 --> 20:28:50,000
simple you use the syntax we saw in the
27384
20:28:47,919 --> 20:28:53,039
slides we're going to say public and put
27385
20:28:50,000 --> 20:28:55,512
a column here and when you do this it is
27386
20:28:53,039 --> 20:28:58,399
advised to align your things a little
27387
20:28:55,512 --> 20:29:01,440
bit properly so when we do this
27388
20:28:58,399 --> 20:29:04,159
everything after this public keyword is
27389
20:29:01,440 --> 20:29:07,440
going to be public in this class and it
27390
20:29:04,160 --> 20:29:09,360
will be accessible from the outside
27391
20:29:07,440 --> 20:29:11,512
let's try and build now but before we
27392
20:29:09,360 --> 20:29:14,479
build let's show you that the squiggly
27393
20:29:11,512 --> 20:29:17,279
line should be gone visual studio code
27394
20:29:14,479 --> 20:29:19,512
is still confused let's try and vault
27395
20:29:17,279 --> 20:29:21,831
let's pass this through gcc now you see
27396
20:29:19,512 --> 20:29:23,680
that the world is good okay now if you
27397
20:29:21,831 --> 20:29:26,159
try and print the volume here we're
27398
20:29:23,679 --> 20:29:29,191
going to get zero because the base
27399
20:29:26,160 --> 20:29:31,680
radius is braced initialized to zero the
27400
20:29:29,191 --> 20:29:33,119
height is zero and if we multiply like
27401
20:29:31,679 --> 20:29:35,759
this we're going to get a zero and
27402
20:29:33,119 --> 20:29:37,831
return that let's try and run this
27403
20:29:35,759 --> 20:29:40,159
program because we just build it
27404
20:29:37,831 --> 20:29:43,279
successfully we can bring up a terminal
27405
20:29:40,160 --> 20:29:45,832
to do that and let's clear and run
27406
20:29:43,279 --> 20:29:48,639
rooster and we can see that the volume
27407
20:29:45,831 --> 20:29:50,959
is zero and it is what we expect okay
27408
20:29:48,639 --> 20:29:54,000
now our class is working but there is
27409
20:29:50,960 --> 20:29:57,120
really something bad about it and
27410
20:29:54,000 --> 20:29:59,360
that is because the public keyword is
27411
20:29:57,119 --> 20:30:01,512
going to make everything public in this
27412
20:29:59,360 --> 20:30:04,080
class the member variables are also
27413
20:30:01,512 --> 20:30:06,080
going to be public so we can go down
27414
20:30:04,080 --> 20:30:08,000
here and print the base radius and the
27415
20:30:06,080 --> 20:30:10,240
height for example let's do that and
27416
20:30:08,000 --> 20:30:12,800
show you that this is the case so we're
27417
20:30:10,240 --> 20:30:15,760
going to say cylinder one and say base
27418
20:30:12,800 --> 20:30:18,400
radius this is going to print and we're
27419
20:30:15,759 --> 20:30:21,039
going to say hi we're going to print
27420
20:30:18,399 --> 20:30:23,831
this out if we try and print these guys
27421
20:30:21,039 --> 20:30:26,399
let's build and pass this through gcc
27422
20:30:23,831 --> 20:30:28,479
you see the bolt is good and if we clear
27423
20:30:26,399 --> 20:30:31,679
and run rooster we're going to see that
27424
20:30:28,479 --> 20:30:33,599
this radius and height are or accessible
27425
20:30:31,679 --> 20:30:36,000
to show you that this can also be
27426
20:30:33,600 --> 20:30:38,639
different from zero let's change the
27427
20:30:36,000 --> 20:30:42,320
base radius to one and the height to one
27428
20:30:38,639 --> 20:30:44,479
to make it a unit cylinder let's try and
27429
20:30:42,320 --> 20:30:46,920
weld we're going to change these guys to
27430
20:30:44,479 --> 20:30:49,831
one and the volume is going to be
27431
20:30:46,919 --> 20:30:52,160
3.14 or something let's run rooster
27432
20:30:49,831 --> 20:30:54,479
we're going to see our volume here and
27433
20:30:52,160 --> 20:30:57,360
we have the base radius and the height
27434
20:30:54,479 --> 20:30:59,119
but this is really bad design because
27435
20:30:59,119 --> 20:31:04,159
in most cases you're going to want to
27436
20:31:01,191 --> 20:31:07,039
keep them private from the outside
27437
20:31:04,160 --> 20:31:09,120
because users of your class don't really
27438
20:31:07,039 --> 20:31:11,039
care about the member variables they
27439
20:31:09,119 --> 20:31:12,871
just want to do things with your class
27440
20:31:11,039 --> 20:31:15,511
for example calling the volume function
27441
20:31:12,872 --> 20:31:18,720
here so what we usually do in
27442
20:31:15,512 --> 20:31:21,279
practice is to flag our member variables
27443
20:31:18,720 --> 20:31:24,080
as private and we can do that using the
27444
20:31:21,279 --> 20:31:27,191
private keyword as we do here and at the
27445
20:31:24,080 --> 20:31:29,512
moment we do this everything after this
27446
20:31:27,191 --> 20:31:31,919
private keyword is going to be private
27447
20:31:29,512 --> 20:31:34,400
to the class it is only going to be
27448
20:31:31,919 --> 20:31:36,551
accessible from the inside of the class
27449
20:31:34,399 --> 20:31:38,319
but if we try to access that from the
27450
20:31:36,551 --> 20:31:41,279
outside we're going to get the same
27451
20:31:38,320 --> 20:31:44,320
compiler error we saw before when we
27452
20:31:41,279 --> 20:31:46,319
tried to access private stuff from the
27453
20:31:44,320 --> 20:31:48,000
class in the main function here visual
27454
20:31:46,320 --> 20:31:49,920
studio code is going to give us a
27455
20:31:48,000 --> 20:31:52,639
problem saying that these member
27456
20:31:49,919 --> 20:31:54,959
variables are not accessible from this
27457
20:31:52,639 --> 20:31:57,512
context here and if we pass this through
27458
20:31:54,960 --> 20:32:00,160
gcc we're going to get a clear compiler
27459
20:31:57,512 --> 20:32:01,600
error saying that the height
27460
20:32:01,600 --> 20:32:07,120
base radius are now private in the class
27461
20:32:04,720 --> 20:32:09,279
and we can't access them from the
27462
20:32:07,119 --> 20:32:12,080
outside this is really what i wanted you
27463
20:32:09,279 --> 20:32:14,639
to see and this is good design okay now
27464
20:32:12,080 --> 20:32:16,960
that we have our class declared and that
27465
20:32:14,639 --> 20:32:19,440
we can use it in the main function i
27466
20:32:16,960 --> 20:32:22,160
want you to see that it is possible to
27467
20:32:19,440 --> 20:32:24,720
change these member variables but to do
27468
20:32:22,160 --> 20:32:26,400
that we will need to turn this back to
27469
20:32:24,720 --> 20:32:29,119
public and we're going to see a better
27470
20:32:26,399 --> 20:32:30,871
way to do this later but for now let's
27471
20:32:29,119 --> 20:32:33,512
make them public and show you that we
27472
20:32:30,872 --> 20:32:35,760
can change things around and make our
27473
20:32:33,512 --> 20:32:37,760
cylinders a little more interesting so
27474
20:32:35,759 --> 20:32:40,159
now that they are public we can go in
27475
20:32:37,759 --> 20:32:42,239
the main function and do crazy things
27476
20:32:40,160 --> 20:32:44,240
change the data for example we can
27477
20:32:42,240 --> 20:32:46,400
change our member variables to be
27478
20:32:44,240 --> 20:32:49,832
something else let's go down and say
27479
20:32:46,399 --> 20:32:53,039
cylinder one and say base radius we can
27480
20:32:49,831 --> 20:32:55,279
use the dot notation and put an ecosign
27481
20:32:53,039 --> 20:32:58,799
and give another value to our base
27482
20:32:55,279 --> 20:33:01,119
radius let's make it 10 for example and
27483
20:32:58,800 --> 20:33:03,192
change the height to be something else
27484
20:33:01,119 --> 20:33:06,479
we can change that and we're going to
27485
20:33:03,191 --> 20:33:08,479
put in a 3 for example why not now if we
27486
20:33:06,479 --> 20:33:10,639
print the volume again we're going to
27487
20:33:08,479 --> 20:33:12,399
get another value let's copy this and
27488
20:33:12,399 --> 20:33:18,399
our changes here and if we build the
27489
20:33:15,831 --> 20:33:19,439
program it should well define the world
27490
20:33:19,440 --> 20:33:24,240
so we can hit enter and clear and if we
27491
20:33:22,399 --> 20:33:25,871
run rooster we're going to get
27492
20:33:25,872 --> 20:33:31,279
3.14 first here the first line here and
27493
20:33:29,600 --> 20:33:33,680
the second line is going to give us
27494
20:33:31,279 --> 20:33:35,919
another volume and if we multiply these
27495
20:33:35,919 --> 20:33:39,919
and if we use our formula to compute the
27496
20:33:38,320 --> 20:33:42,480
volume we're going to basically get the
27497
20:33:39,919 --> 20:33:45,119
same thing let's try and prove this with
27498
20:33:42,479 --> 20:33:48,239
our calculator we have it around so we
27499
20:33:45,119 --> 20:33:49,440
have pi in here we're going to multiply
27500
20:33:51,440 --> 20:33:56,639
the radius squared we're going to put
27501
20:33:54,240 --> 20:33:58,960
100 here and we're going to multiply
27502
20:33:56,639 --> 20:34:01,720
this with 3 which is our height let's
27503
20:34:01,720 --> 20:34:06,399
942.47 which is what we have here
27504
20:34:04,320 --> 20:34:08,320
roughly the same thing so you see that
27505
20:34:06,399 --> 20:34:10,799
our function is really computing our
27506
20:34:08,320 --> 20:34:12,800
volume we can even go down and change
27507
20:34:10,800 --> 20:34:15,760
the height to something else for example
27508
20:34:12,800 --> 20:34:17,680
we're going to change the height to
27509
20:34:15,759 --> 20:34:19,759
let's make an eight and i printed the
27510
20:34:17,679 --> 20:34:22,399
volume again you can keep playing with
27511
20:34:22,399 --> 20:34:27,511
that our volume function is computing
27512
20:34:24,720 --> 20:34:29,279
our volume using the data that we have
27513
20:34:27,512 --> 20:34:32,080
in the member variables this is the
27514
20:34:29,279 --> 20:34:34,240
message here let's build again the world
27515
20:34:32,080 --> 20:34:36,872
should be good we're going to clear and
27516
20:34:34,240 --> 20:34:39,760
run rooster now we see another
27517
20:34:36,872 --> 20:34:42,000
number for our volume and this is really
27518
20:34:39,759 --> 20:34:43,919
how you can declare a class again you
27519
20:34:42,000 --> 20:34:46,720
use the syntax you see here class you
27520
20:34:43,919 --> 20:34:49,119
say the class name you put a pair of
27521
20:34:46,720 --> 20:34:50,639
curly braces and you put your semicolon
27522
20:34:50,639 --> 20:34:55,759
members of your class are private by
27523
20:34:53,191 --> 20:34:58,319
default but you can make them public if
27524
20:34:55,759 --> 20:35:00,239
you want using the public keyword as we
27525
20:34:58,320 --> 20:35:02,080
did here inside your class you're going
27526
20:35:00,240 --> 20:35:03,919
to have two parts you're going to have
27527
20:35:02,080 --> 20:35:06,800
the member variables which are going to
27528
20:35:03,919 --> 20:35:09,360
be properties that define what your
27529
20:35:06,800 --> 20:35:12,240
class is and we're going to have
27530
20:35:09,360 --> 20:35:14,800
functions or methods let's say that and
27531
20:35:12,240 --> 20:35:17,279
these are going to be behaviors
27532
20:35:14,800 --> 20:35:19,832
of your class you're going to go through
27533
20:35:17,279 --> 20:35:21,919
these functions to make your classes do
27534
20:35:19,831 --> 20:35:24,159
things and once you have the class
27535
20:35:21,919 --> 20:35:25,119
definition in place you can use it to
27536
20:35:25,119 --> 20:35:30,319
variables as we do in the main function
27537
20:35:27,600 --> 20:35:33,040
here and the variables we create from
27538
20:35:30,320 --> 20:35:35,760
our class are usually called objects in
27539
20:35:33,039 --> 20:35:39,039
c plus plus terminology okay the class
27540
20:35:35,759 --> 20:35:42,479
is really a blueprint and we create
27541
20:35:39,039 --> 20:35:45,360
objects using that blueprint and objects
27542
20:35:42,479 --> 20:35:47,440
are going to have runtime data that we
27543
20:35:45,360 --> 20:35:49,919
store in our class okay so for example
27544
20:35:47,440 --> 20:35:52,000
if we hit this point here the base
27545
20:35:49,919 --> 20:35:54,000
radius is going to be 10 and the height
27546
20:35:52,000 --> 20:35:57,512
is going to be eight and that's going to
27547
20:35:54,000 --> 20:36:00,160
be runtime information for our class
27548
20:35:57,512 --> 20:36:03,279
object stored in this variable that we
27549
20:36:00,160 --> 20:36:05,680
call cylinder one here this is really
27550
20:36:03,279 --> 20:36:08,080
what i wanted you to see okay let's try
27551
20:36:05,679 --> 20:36:10,871
and recap what we know about classes so
27552
20:36:08,080 --> 20:36:13,600
far a class can have member variables
27553
20:36:10,872 --> 20:36:16,080
but so far we have used member variables
27554
20:36:13,600 --> 20:36:18,720
as stack variables if we go back for
27555
20:36:16,080 --> 20:36:21,040
example you see that we say base radius
27556
20:36:18,720 --> 20:36:23,191
here you notice it is not a pointer or a
27557
20:36:21,039 --> 20:36:26,000
reference or anything it is a stack
27558
20:36:23,191 --> 20:36:29,440
variable inside our class so member
27559
20:36:26,000 --> 20:36:32,320
variables can only be stack variables
27560
20:36:29,440 --> 20:36:34,639
like we have here but they can also be
27561
20:36:32,320 --> 20:36:37,832
pointers but they can never be
27562
20:36:34,639 --> 20:36:41,039
references and the reason is a reference
27563
20:36:37,831 --> 20:36:42,959
can never be left uninitialized and in
27564
20:36:41,039 --> 20:36:45,599
the classes when we declare member
27565
20:36:42,960 --> 20:36:48,480
variables the ability to leave them
27566
20:36:45,600 --> 20:36:50,872
uninitialized is really important and we
27567
20:36:48,479 --> 20:36:53,512
can't really do that with references i
27568
20:36:50,872 --> 20:36:56,240
can't really go into the details of that
27569
20:36:53,512 --> 20:36:58,479
as we will see that as we progress in
27570
20:36:56,240 --> 20:37:00,320
the chapter but know that member
27571
20:36:58,479 --> 20:37:03,039
variables can either be stacked
27572
20:37:00,320 --> 20:37:05,760
variables or pointers but they can never
27573
20:37:03,039 --> 20:37:08,000
be references in z plus okay that's what
27574
20:37:05,759 --> 20:37:11,279
we just said here members can't be
27575
20:37:08,000 --> 20:37:13,831
references classes can have functions or
27576
20:37:11,279 --> 20:37:16,399
methods that let them do things we saw
27577
20:37:13,831 --> 20:37:19,191
an example of this with our volume
27578
20:37:16,399 --> 20:37:21,759
function class methods have access to
27579
20:37:19,191 --> 20:37:24,000
the member variables regardless of
27580
20:37:21,759 --> 20:37:26,720
whether they are public or private we
27581
20:37:24,000 --> 20:37:30,000
have seen that the volume function will
27582
20:37:26,720 --> 20:37:32,399
have access to our member variables
27583
20:37:30,000 --> 20:37:35,360
regardless of whether it is public or
27584
20:37:32,399 --> 20:37:38,551
private and last but not least private
27585
20:37:35,360 --> 20:37:40,872
members of classes aren't accessible
27586
20:37:38,551 --> 20:37:43,119
from the outside as we saw in the main
27587
20:37:40,872 --> 20:37:45,760
function you can't access them from the
27588
20:37:43,119 --> 20:37:47,759
main function you can only do that from
27589
20:37:45,759 --> 20:37:49,599
the class definition itself this is
27590
20:37:47,759 --> 20:37:52,000
really all i had to share in this
27591
20:37:49,600 --> 20:37:54,320
lecture i hope you found it interesting
27592
20:37:52,000 --> 20:37:56,080
we are going to stop here in this one in
27593
20:37:54,320 --> 20:37:58,960
the next one we're going to see how
27594
20:37:58,960 --> 20:38:04,160
from constructors go ahead and finish up
27595
20:38:01,440 --> 20:38:06,800
here and meet me there in this lecture
27596
20:38:04,160 --> 20:38:10,080
we're going to learn about constructors
27597
20:38:06,800 --> 20:38:12,240
and constructors are special class
27598
20:38:12,240 --> 20:38:18,080
that are called by the compiler to
27599
20:38:15,119 --> 20:38:20,720
construct your class objects and they
27600
20:38:18,080 --> 20:38:23,119
are special because they have no return
27601
20:38:20,720 --> 20:38:26,080
type a constructor can never have a
27602
20:38:23,119 --> 20:38:28,399
return type as you see here they have
27603
20:38:26,080 --> 20:38:31,040
the same name as the class so for
27604
20:38:28,399 --> 20:38:33,599
example for our class in the last
27605
20:38:31,039 --> 20:38:35,439
lecture that was called silenter the
27606
20:38:33,600 --> 20:38:37,360
constructors are also going to have the
27607
20:38:35,440 --> 20:38:41,040
same name as the class they are going to
27608
20:38:37,360 --> 20:38:43,600
be called also slander constructors can
27609
20:38:41,039 --> 20:38:46,079
have parameters but if it makes sense
27610
20:38:43,600 --> 20:38:48,480
for whatever it is you are trying to do
27611
20:38:46,080 --> 20:38:51,512
you can also leave the parameters out
27612
20:38:48,479 --> 20:38:54,551
and constructors are usually used to
27613
20:38:51,512 --> 20:38:57,119
initialize the member variables and put
27614
20:38:54,551 --> 20:38:59,279
them in a state where you want them in
27615
20:38:59,279 --> 20:39:03,679
let's look at how you can declare
27616
20:39:01,440 --> 20:39:06,720
constructors for your classes
27617
20:39:03,679 --> 20:39:08,551
here is our cylinder class you see we
27618
20:39:06,720 --> 20:39:11,360
have our member variables we had they
27619
20:39:11,360 --> 20:39:15,759
a public section which is going to have
27620
20:39:13,512 --> 20:39:17,832
our functions or behaviors as you see
27621
20:39:15,759 --> 20:39:20,720
here the member variables are what we
27622
20:39:17,831 --> 20:39:24,080
have seen from the last lecture but if
27623
20:39:20,720 --> 20:39:24,872
you look here we have a few new things
27624
20:39:24,872 --> 20:39:29,440
we have two things that look like
27625
20:39:27,279 --> 20:39:30,959
functions but they don't have return
27626
20:39:29,440 --> 20:39:32,000
values that's something you should
27627
20:39:32,000 --> 20:39:37,512
they have a parameter list as you see
27628
20:39:34,479 --> 20:39:39,679
here and we have a pair of curly braces
27629
20:39:37,512 --> 20:39:41,919
because these are really functions and
27630
20:39:39,679 --> 20:39:44,639
these are special functions that are
27631
20:39:41,919 --> 20:39:47,759
going to be called by the compiler to
27632
20:39:44,639 --> 20:39:50,551
initialize your class objects if you
27633
20:39:47,759 --> 20:39:52,080
look here in this example we are
27634
20:39:52,080 --> 20:39:57,119
constructor with no parameters to
27635
20:39:54,320 --> 20:39:59,680
initialize our member variables to 2 and
27636
20:39:57,119 --> 20:40:01,191
we have another constructor as you see
27637
20:39:59,679 --> 20:40:03,919
down here which is going to take
27638
20:40:01,191 --> 20:40:06,319
parameters directly and it's going to
27639
20:40:03,919 --> 20:40:09,360
take the radius parameter and the height
27640
20:40:06,320 --> 20:40:11,512
parameter the parameters are of double
27641
20:40:09,360 --> 20:40:14,000
type because that's what we expect in
27642
20:40:11,512 --> 20:40:16,479
our class and we are passing them by
27643
20:40:14,000 --> 20:40:18,872
value here because they are fundamental
27644
20:40:16,479 --> 20:40:20,959
types and we don't really mind copying
27645
20:40:18,872 --> 20:40:23,832
them but please keep in mind that they
27646
20:40:20,960 --> 20:40:26,800
are going to be passed by value and what
27647
20:40:23,831 --> 20:40:30,159
you have inside your constructor body
27648
20:40:26,800 --> 20:40:32,240
are going to be copies of the original
27649
20:40:30,160 --> 20:40:34,320
arguments that were passed to your
27650
20:40:32,240 --> 20:40:37,120
constructor and this is really how you
27651
20:40:34,320 --> 20:40:39,120
declare constructors for your c plus
27652
20:40:37,119 --> 20:40:41,440
plus classes constructors can either
27653
20:40:39,119 --> 20:40:44,319
have parameters like we have again on
27654
20:40:41,440 --> 20:40:46,639
this example here or they can have no
27655
20:40:44,320 --> 20:40:48,480
parameters and this is going to be a
27656
20:40:46,639 --> 20:40:50,872
default constructor we're going to see
27657
20:40:48,479 --> 20:40:52,319
that this is going to be called when you
27658
20:40:52,320 --> 20:40:58,240
variables of this cylinder type without
27659
20:40:55,679 --> 20:40:59,919
passing the parenthesis like we do when
27660
20:40:58,240 --> 20:41:01,512
we call this second constructor here
27661
20:40:59,919 --> 20:41:03,599
we're going to see this in a minute okay
27662
20:41:01,512 --> 20:41:05,440
this is all i think i have to share in
27663
20:41:03,600 --> 20:41:08,000
the slides about how you declare
27664
20:41:05,440 --> 20:41:09,680
constructors let's head over to visual
27665
20:41:08,000 --> 20:41:12,320
studio code and play with this a little
27666
20:41:09,679 --> 20:41:14,319
more okay here we are in our working
27667
20:41:12,320 --> 20:41:17,680
folder the current project is
27668
20:41:14,320 --> 20:41:20,000
constructors we're going to put in our
27669
20:41:17,679 --> 20:41:22,000
template files pretty quick let's do
27670
20:41:20,000 --> 20:41:24,320
that and we are going to open this in
27671
20:41:22,000 --> 20:41:26,240
visual studio code by dragging and
27672
20:41:26,240 --> 20:41:31,760
this is going to open our folder let's
27673
20:41:31,759 --> 20:41:35,831
and we're going to take out what we
27674
20:41:33,279 --> 20:41:39,039
don't need in the main function and on
27675
20:41:35,831 --> 20:41:40,959
top here and i am going to reuse code
27676
20:41:39,039 --> 20:41:43,599
from the last lecture because we don't
27677
20:41:40,960 --> 20:41:45,512
want to type that again so let's put in
27678
20:41:43,600 --> 20:41:48,320
our class definition we have our
27679
20:41:45,512 --> 20:41:51,360
variable pi which is going to be used to
27680
20:41:48,320 --> 20:41:53,680
compute the volume in the class here and
27681
20:41:51,360 --> 20:41:56,080
we have member variables okay now that
27682
20:41:53,679 --> 20:41:58,719
we are here let's change the member
27683
20:41:56,080 --> 20:42:01,279
variables to be private because making
27684
20:41:58,720 --> 20:42:03,680
them public is really going to be bad
27685
20:42:01,279 --> 20:42:05,759
design it's going to expose them in the
27686
20:42:03,679 --> 20:42:08,799
main function and people can mess with
27687
20:42:05,759 --> 20:42:12,479
them and really change the logic of how
27688
20:42:08,800 --> 20:42:14,872
our class works without our concept it
27689
20:42:12,479 --> 20:42:17,119
is advised to make your member variables
27690
20:42:14,872 --> 20:42:20,080
private unless you really have a
27691
20:42:17,119 --> 20:42:22,871
compelling reasons to make them public
27692
20:42:20,080 --> 20:42:24,960
okay now that we have our class here
27693
20:42:22,872 --> 20:42:26,551
let's set up constructors for it so
27694
20:42:24,960 --> 20:42:29,040
we're going to go down here in the
27695
20:42:26,551 --> 20:42:30,872
public scope and say constructors and
27696
20:42:29,039 --> 20:42:33,039
we're going to set up the first
27697
20:42:30,872 --> 20:42:35,360
constructor which is not going to take
27698
20:42:33,039 --> 20:42:37,511
any parameter so we're going to say the
27699
20:42:35,360 --> 20:42:40,320
name of the class remember a constructor
27700
20:42:37,512 --> 20:42:43,360
doesn't have a return type and it has to
27701
20:42:40,320 --> 20:42:45,192
have the same name as the class so we
27702
20:42:43,360 --> 20:42:48,720
need to comply with that and we're going
27703
20:42:45,191 --> 20:42:50,239
to put our pair of curly braces and
27704
20:42:48,720 --> 20:42:53,191
inside we're going to initialize our
27705
20:42:50,240 --> 20:42:54,480
member variables however we want so what
27706
20:42:53,191 --> 20:42:57,440
we're going to do here we're going to
27707
20:42:54,479 --> 20:43:00,479
set the base radius to something let's
27708
20:42:57,440 --> 20:43:02,400
make it a 2 like we saw in the slides no
27709
20:43:00,479 --> 20:43:04,639
problem with that and we're going to set
27710
20:43:02,399 --> 20:43:07,191
the height to something else and we are
27711
20:43:04,639 --> 20:43:10,160
going to set the height to 2 as well we
27712
20:43:07,191 --> 20:43:13,191
can do that you can use what you want
27713
20:43:10,160 --> 20:43:16,000
and now we have our constructor and it
27714
20:43:13,191 --> 20:43:18,399
is initializing our thanks okay now that
27715
20:43:16,000 --> 20:43:20,800
we have the constructor in place
27716
20:43:18,399 --> 20:43:23,831
how is it really called by the compiler
27717
20:43:20,800 --> 20:43:26,479
and notice that our constructor is in
27718
20:43:23,831 --> 20:43:28,959
the public scope of the class
27719
20:43:26,479 --> 20:43:31,599
if it isn't public you want to be able
27720
20:43:28,960 --> 20:43:34,320
to access it from the outside and the
27721
20:43:31,600 --> 20:43:36,080
compiler will fail to build your objects
27722
20:43:34,320 --> 20:43:38,000
and we're going to see this in a minute
27723
20:43:36,080 --> 20:43:40,400
but before we do that let's try and
27724
20:43:38,000 --> 20:43:42,800
create a cylinder object now so we're
27725
20:43:40,399 --> 20:43:45,360
going to say cylinder and say cylinder
27726
20:43:42,800 --> 20:43:48,720
one like we did in the last lecture
27727
20:43:45,360 --> 20:43:52,639
and when we do this notice what we see
27728
20:43:48,720 --> 20:43:55,279
if we print the volume of our cylinder
27729
20:43:52,639 --> 20:43:58,240
object here this is an object because
27730
20:43:55,279 --> 20:44:00,240
we're creating this from our blueprint
27731
20:43:58,240 --> 20:44:02,160
which is the class definition here you
27732
20:44:00,240 --> 20:44:04,720
really need to know this this is a class
27733
20:44:02,160 --> 20:44:06,720
object let's say that and we're going to
27734
20:44:04,720 --> 20:44:08,800
print its volume we're going to say
27735
20:44:06,720 --> 20:44:11,191
cylinder one and we're going to call our
27736
20:44:08,800 --> 20:44:12,639
volume method we should say and if we
27737
20:44:11,191 --> 20:44:14,159
build you're going to see that this is
27738
20:44:14,160 --> 20:44:19,440
the volume is not going to be coming
27739
20:44:16,160 --> 20:44:22,639
from the initial values we have here we
27740
20:44:19,440 --> 20:44:25,119
will have changed these guys to 2
27741
20:44:22,639 --> 20:44:26,960
from our constructor here because the
27742
20:44:25,119 --> 20:44:29,831
compiler is going to look at this line
27743
20:44:26,960 --> 20:44:32,320
here and see that we are trying to build
27744
20:44:29,831 --> 20:44:34,239
a silent object it's going to look at
27745
20:44:32,320 --> 20:44:36,960
the class definition and it is going to
27746
20:44:34,240 --> 20:44:39,192
say do i have any constructor
27747
20:44:36,960 --> 20:44:41,360
that i can use to build an object from
27748
20:44:39,191 --> 20:44:43,831
the syntax i see here and it's going to
27749
20:44:41,360 --> 20:44:45,680
see that it has a constructor that
27750
20:44:43,831 --> 20:44:48,871
doesn't take any parameter and it's
27751
20:44:45,679 --> 20:44:50,959
going to use it to build our object and
27752
20:44:48,872 --> 20:44:53,680
it's going to be using this information
27753
20:44:50,960 --> 20:44:55,512
to build our cylinder object so the base
27754
20:44:53,679 --> 20:44:57,359
radius is going to be two the height is
27755
20:44:55,512 --> 20:44:59,832
going to be two and it's going to use
27756
20:44:59,831 --> 20:45:04,159
that we print here you really need to
27757
20:45:05,440 --> 20:45:11,680
if gcc accepts this you see the both is
27758
20:45:08,872 --> 20:45:13,760
good now we can bring up a terminal and
27759
20:45:11,679 --> 20:45:16,399
clear and run rooster you're going to
27760
20:45:13,759 --> 20:45:19,679
see that we have 25 something which is a
27761
20:45:16,399 --> 20:45:22,479
result of using this information we have
27762
20:45:19,679 --> 20:45:24,959
here if we take pi multiplied by this
27763
20:45:22,479 --> 20:45:27,279
base radius multiply by this base radius
27764
20:45:24,960 --> 20:45:29,280
again and multiply by height we're going
27765
20:45:27,279 --> 20:45:31,679
to get this here you can try this out it
27766
20:45:29,279 --> 20:45:34,720
is going to be what you see here and
27767
20:45:31,679 --> 20:45:37,599
this hopefully proves that the compiler
27768
20:45:34,720 --> 20:45:39,512
is using our constructor here but we can
27769
20:45:39,512 --> 20:45:44,800
let's set up a breakpoint here
27770
20:45:42,800 --> 20:45:47,760
and we're going to run this through our
27771
20:45:44,800 --> 20:45:48,479
debugger we can come back to the run tab
27772
20:45:50,399 --> 20:45:55,191
and we're going to try and use the
27773
20:45:55,191 --> 20:46:00,080
with the gcc compiler that's what we can
27774
20:45:57,679 --> 20:46:01,119
use if you are on windows you can also
27775
20:46:01,119 --> 20:46:05,599
tools that come with the compiler from
27776
20:46:03,440 --> 20:46:08,240
microsoft but we're not going to use
27777
20:46:05,600 --> 20:46:10,080
that now gcc is going to be fine we're
27778
20:46:08,240 --> 20:46:12,872
going to start the debugging and we
27779
20:46:10,080 --> 20:46:15,440
should hit our breakpoint when the build
27780
20:46:12,872 --> 20:46:17,192
is done let's wait a minute okay we have
27781
20:46:17,191 --> 20:46:22,479
we can minimize this a little bit and i
27782
20:46:20,160 --> 20:46:24,720
show the terminal to the right here i
27783
20:46:22,479 --> 20:46:27,191
think we can do that let's do that let's
27784
20:46:24,720 --> 20:46:29,279
put that a little bit to the right here
27785
20:46:27,191 --> 20:46:32,639
and minimize a little bit okay we have
27786
20:46:29,279 --> 20:46:34,479
our thunk in place we have hit our break
27787
20:46:32,639 --> 20:46:36,800
point you see these are the local
27788
20:46:34,479 --> 20:46:40,080
variables we have here we have a
27789
20:46:36,800 --> 20:46:42,240
cylinder object which is not initialized
27790
20:46:40,080 --> 20:46:45,440
yet because you see what we have inside
27791
20:46:42,240 --> 20:46:48,480
is really junk data we haven't put in
27792
20:46:45,440 --> 20:46:51,119
anything yet but now that we are at this
27793
20:46:48,479 --> 20:46:54,639
break point here we can hit step into
27794
20:46:51,119 --> 20:46:57,360
and step into the code that constructs
27795
20:46:54,639 --> 20:47:01,119
our cylinder object because at this
27796
20:46:57,360 --> 20:47:02,872
point liner 25 here hasn't run yet so
27797
20:47:01,119 --> 20:47:05,360
we're going to step into and you're
27798
20:47:02,872 --> 20:47:08,551
going to see that we hit the constructor
27799
20:47:09,360 --> 20:47:14,240
this again proves that our constructor
27800
20:47:11,759 --> 20:47:15,360
is being used to build our cylinder
27801
20:47:15,360 --> 20:47:19,440
now we can move to the next line we're
27802
20:47:17,119 --> 20:47:22,239
going to set up the base radius and if
27803
20:47:19,440 --> 20:47:24,479
we hit next here this is going to set
27804
20:47:24,479 --> 20:47:29,279
and you see that height is in one
27805
20:47:26,639 --> 20:47:31,279
because we haven't set it up yet but if
27806
20:47:29,279 --> 20:47:33,039
we execute this line you're going to see
27807
20:47:31,279 --> 20:47:33,919
that height is also going to change to
27808
20:47:33,919 --> 20:47:38,872
and now if we hit next we're going to
27809
20:47:36,080 --> 20:47:40,872
get out of our constructor and our
27810
20:47:38,872 --> 20:47:43,512
cylinder object will be already
27811
20:47:40,872 --> 20:47:46,160
constructed if we look again here we're
27812
20:47:43,512 --> 20:47:49,040
going to see that radius is 2 height is
27813
20:47:46,160 --> 20:47:50,720
2 and we can print the volume and if we
27814
20:47:49,039 --> 20:47:53,279
hit step over we're going to see our
27815
20:47:50,720 --> 20:47:56,399
volume printed out here hopefully again
27816
20:47:53,279 --> 20:47:58,319
this proves that our constructor here is
27817
20:47:58,320 --> 20:48:04,400
objects and it is doing that because it
27818
20:48:01,440 --> 20:48:07,440
is the syntax here we don't pass any
27819
20:48:04,399 --> 20:48:10,159
parameter to our cylinder object as we
27820
20:48:07,440 --> 20:48:12,800
created so this must be calling the
27821
20:48:10,160 --> 20:48:15,192
default constructor which doesn't take
27822
20:48:12,800 --> 20:48:17,760
any parameter this is the message here
27823
20:48:15,191 --> 20:48:20,799
let's close our debugging session and
27824
20:48:17,759 --> 20:48:22,159
maximize our visual studio code instance
27825
20:48:20,800 --> 20:48:23,832
because we're going to set up another
27826
20:48:22,160 --> 20:48:26,240
constructor which is going to take
27827
20:48:23,831 --> 20:48:28,551
parameters now and you have seen the
27828
20:48:26,240 --> 20:48:30,639
syntax to do that in the slides it is
27829
20:48:28,551 --> 20:48:32,239
nothing complicated we're going to say
27830
20:48:30,639 --> 20:48:33,919
the name of the constructor which is
27831
20:48:32,240 --> 20:48:35,600
going to be the name of the class and
27832
20:48:35,600 --> 20:48:40,160
and say rad param for radius and we're
27833
20:48:42,639 --> 20:48:46,080
height and we're going to make this
27834
20:48:44,551 --> 20:48:49,191
double and after that we're going to
27835
20:48:46,080 --> 20:48:51,831
head in the body of our constructor and
27836
20:48:49,191 --> 20:48:54,239
we're going to initialize our guides to
27837
20:48:51,831 --> 20:48:55,919
the parameters that will pass to the
27838
20:48:54,240 --> 20:48:58,080
function here and this is really
27839
20:48:55,919 --> 20:49:00,551
powerful after we have this constructor
27840
20:49:00,551 --> 20:49:05,512
parameters that will be used to
27841
20:49:02,800 --> 20:49:08,080
construct our cylinder object so we can
27842
20:49:08,080 --> 20:49:13,512
red param and we can say height and say
27843
20:49:11,191 --> 20:49:16,159
height param here and these are going to
27844
20:49:13,512 --> 20:49:18,720
be used to construct our object now we
27845
20:49:16,160 --> 20:49:20,872
can head over in the main function and
27846
20:49:18,720 --> 20:49:23,831
change how we construct our cylinder
27847
20:49:20,872 --> 20:49:25,440
object if we want to use tan as the
27848
20:49:27,679 --> 20:49:33,511
height we can do that by passing
27849
20:49:29,831 --> 20:49:35,439
arguments to our constructor here
27850
20:49:33,512 --> 20:49:37,919
let's run this through the debugger
27851
20:49:35,440 --> 20:49:39,512
again and see that our information here
27852
20:49:39,512 --> 20:49:44,551
now this constructor here is going to be
27853
20:49:42,080 --> 20:49:47,040
chosen by the compiler because it is
27854
20:49:44,551 --> 20:49:50,000
more fitting for the call that we are
27855
20:49:47,039 --> 20:49:53,119
doing here let's run our debugging
27856
20:49:50,000 --> 20:49:55,600
session the program is going to be bolt
27857
20:49:53,119 --> 20:49:58,479
and we are going to try and maximize
27858
20:49:55,600 --> 20:50:00,800
this a little bit and bring up our
27859
20:49:58,479 --> 20:50:03,360
terminal output okay we have hit the
27860
20:50:00,800 --> 20:50:05,760
breakpoint here we can step into our
27861
20:50:03,360 --> 20:50:08,000
constructor and notice the constructor
27862
20:50:05,759 --> 20:50:10,399
that the compiler chooses our
27863
20:50:08,000 --> 20:50:13,440
constructor that takes parameters is
27864
20:50:10,399 --> 20:50:16,159
chosen here and we can do things inside
27865
20:50:13,440 --> 20:50:18,960
let's hit next we're going to initialize
27866
20:50:16,160 --> 20:50:21,360
the base radius to 10 and we're going to
27867
20:50:21,360 --> 20:50:26,320
four okay we can see that to the left
27868
20:50:23,759 --> 20:50:28,000
here if we hit next the height is going
27869
20:50:26,320 --> 20:50:29,680
to be changed to four and our
27870
20:50:28,000 --> 20:50:31,191
constructor is going to be done we're
27871
20:50:31,191 --> 20:50:35,512
in the main function again and if we
27872
20:50:33,440 --> 20:50:38,160
step over now we're going to print a new
27873
20:50:35,512 --> 20:50:41,040
volume which is based on the information
27874
20:50:38,160 --> 20:50:43,760
we used to construct our object here
27875
20:50:41,039 --> 20:50:46,639
this is really what constructors do they
27876
20:50:43,759 --> 20:50:49,191
are used by the compiler to build your
27877
20:50:46,639 --> 20:50:52,000
objects and we saw the syntax we can use
27878
20:50:49,191 --> 20:50:54,639
to set up constructors for our own
27879
20:50:52,000 --> 20:50:57,679
classes okay now you must be saying if
27880
20:50:54,639 --> 20:50:58,960
we need constructors to build our
27881
20:50:58,960 --> 20:51:02,400
why was the code in the last lecture
27882
20:51:02,399 --> 20:51:06,959
in the last lecture we did something
27883
20:51:04,320 --> 20:51:10,080
like this we said cylinder cylinder one
27884
20:51:06,960 --> 20:51:12,800
cylinder one and this was welding and
27885
20:51:10,080 --> 20:51:15,040
compiling fine and let's try and take
27886
20:51:12,800 --> 20:51:17,760
out our constructors we can do that
27887
20:51:15,039 --> 20:51:19,119
let's comment them out and if you look
27888
20:51:17,759 --> 20:51:21,439
you're going to see that the code is
27889
20:51:19,119 --> 20:51:24,319
going to compile fine even if we don't
27890
20:51:21,440 --> 20:51:27,040
have any constructors in here let's
27891
20:51:24,320 --> 20:51:30,080
build with gcc to show you that the code
27892
20:51:27,039 --> 20:51:32,239
is going to compile both is good so how
27893
20:51:32,240 --> 20:51:37,600
constructing our objects even if we
27894
20:51:35,119 --> 20:51:40,159
don't have any constructors in here well
27895
20:51:37,600 --> 20:51:42,872
the reason is the compiler is going to
27896
20:51:40,160 --> 20:51:44,800
set up its own constructor and what it
27897
20:51:42,872 --> 20:51:47,360
is going to set up is a constructor
27898
20:51:44,800 --> 20:51:49,680
which is really empty and doesn't have
27899
20:51:47,360 --> 20:51:52,479
anything inside it's basically going to
27900
20:51:49,679 --> 20:51:54,799
be as if we put in an empty constructor
27901
20:51:52,479 --> 20:51:57,759
let's copy this and actually show you
27902
20:51:54,800 --> 20:52:00,400
this we can do that and we're going to
27903
20:51:57,759 --> 20:52:02,551
make this constructor empty and not do
27904
20:52:00,399 --> 20:52:04,720
anything in the body this is the
27905
20:52:02,551 --> 20:52:07,919
constructor that your compiler is going
27906
20:52:04,720 --> 20:52:09,440
to generate and if we're both now and i
27907
20:52:09,440 --> 20:52:13,919
set up a break point here you're going
27908
20:52:11,512 --> 20:52:16,479
to see that our empty constructor is
27909
20:52:13,919 --> 20:52:18,160
going to be chosen let's debug and show
27910
20:52:16,479 --> 20:52:20,399
you that okay you see that we're going
27911
20:52:18,160 --> 20:52:22,400
to hit the breakpoint here and if we
27912
20:52:20,399 --> 20:52:24,399
step into the compiler is going to
27913
20:52:22,399 --> 20:52:27,191
choose this guy and it's not going to do
27914
20:52:24,399 --> 20:52:29,279
anything so it's basically going to take
27915
20:52:29,279 --> 20:52:33,679
they are and it's going to use the
27916
20:52:31,279 --> 20:52:34,399
information to print the volume here we
27917
20:52:35,919 --> 20:52:41,191
and get out of our constructor
27918
20:52:41,191 --> 20:52:47,360
step over we should print our volume
27919
20:52:44,639 --> 20:52:48,479
which is going to be 3.14 because the
27920
20:52:50,872 --> 20:52:55,919
initial values we have in our member
27921
20:52:53,119 --> 20:52:58,639
variables here so again the message is
27922
20:52:55,919 --> 20:53:01,191
if you don't have any constructor in
27923
20:52:58,639 --> 20:53:03,600
your class the compiler is going to
27924
20:53:01,191 --> 20:53:05,512
generate an empty constructor for you
27925
20:53:03,600 --> 20:53:08,000
and the empty constructor is going to
27926
20:53:05,512 --> 20:53:09,832
take no parameters and it's not going to
27927
20:53:08,000 --> 20:53:13,039
have anything in the body it's going to
27928
20:53:09,831 --> 20:53:15,831
be an empty constructor and it is called
27929
20:53:13,039 --> 20:53:18,239
a default constructor generated by the
27930
20:53:15,831 --> 20:53:19,919
compiler this is really all i had to
27931
20:53:18,240 --> 20:53:22,160
share in this lecture i hope you found
27932
20:53:19,919 --> 20:53:24,240
it interesting now you should have
27933
20:53:22,160 --> 20:53:26,872
enough knowledge to build your own
27934
20:53:24,240 --> 20:53:29,040
constructors for your classes we are
27935
20:53:26,872 --> 20:53:30,800
going to stop here in this lecture the
27936
20:53:29,039 --> 20:53:32,799
next one we're going to learn about
27937
20:53:34,639 --> 20:53:38,080
and meet me there in this lecture we're
27938
20:53:38,080 --> 20:53:43,512
constructors and this is a syntax you
27939
20:53:43,512 --> 20:53:48,639
generate a default constructor for you
27940
20:53:46,320 --> 20:53:51,120
all you have to do is do things like
27941
20:53:48,639 --> 20:53:52,800
this you're going to say the name of the
27942
20:53:51,119 --> 20:53:54,399
constructor which is going to be the
27943
20:53:52,800 --> 20:53:56,872
same name as the class you're going to
27944
20:53:54,399 --> 20:53:59,831
put in an empty parameter list and then
27945
20:53:56,872 --> 20:54:01,919
you're going to say equals default
27946
20:53:59,831 --> 20:54:05,039
if you do this the compiler is going to
27947
20:54:01,919 --> 20:54:05,831
generate a default empty constructor for
27948
20:54:05,831 --> 20:54:10,080
in the last lecture we have seen that we
27949
20:54:07,919 --> 20:54:13,039
can set up our own constructors
27950
20:54:10,080 --> 20:54:15,759
basically like this what i haven't told
27951
20:54:13,039 --> 20:54:19,191
you is that the moment you set up your
27952
20:54:15,759 --> 20:54:22,080
own constructor the compiler is going to
27953
20:54:19,191 --> 20:54:24,479
not generate the default constructor and
27954
20:54:22,080 --> 20:54:27,360
if you want to keep the ability to
27955
20:54:24,479 --> 20:54:29,831
construct objects without passing
27956
20:54:27,360 --> 20:54:32,080
parameters you're going to have to put
27957
20:54:29,831 --> 20:54:35,360
in your own default constructor and you
27958
20:54:32,080 --> 20:54:37,600
can use this syntax here to do that
27959
20:54:35,360 --> 20:54:39,680
let's head over to visual studio code
27960
20:54:37,600 --> 20:54:42,400
and talk about this a little more okay
27961
20:54:39,679 --> 20:54:44,399
here we are in our working folder the
27962
20:54:44,399 --> 20:54:49,039
constructors we're going to grab our
27963
20:54:46,960 --> 20:54:51,440
template files and we're going to put
27964
20:54:49,039 --> 20:54:53,679
them in place and we are going to open
27965
20:54:51,440 --> 20:54:55,512
this in visual studio code by dragging
27966
20:54:53,679 --> 20:54:58,399
and dropping here and we're going to
27967
20:54:55,512 --> 20:55:00,800
open our main cpp file let's take out
27968
20:54:58,399 --> 20:55:03,039
what we don't need we're going to clean
27969
20:55:00,800 --> 20:55:05,600
the main function here and we are going
27970
20:55:03,039 --> 20:55:07,511
to bring in the class definition we had
27971
20:55:07,512 --> 20:55:12,800
if you remember we had two constructors
27972
20:55:10,160 --> 20:55:16,320
and one constructor which didn't take
27973
20:55:12,800 --> 20:55:18,551
any parameter and another constructor
27974
20:55:16,320 --> 20:55:21,040
which was initializing our member
27975
20:55:18,551 --> 20:55:24,000
variables with parameters that we passed
27976
20:55:21,039 --> 20:55:27,439
in this parameter list here but in this
27977
20:55:24,000 --> 20:55:30,080
lecture let's take out this constructor
27978
20:55:27,440 --> 20:55:32,720
that doesn't take any parameter
27979
20:55:30,080 --> 20:55:35,279
and show you that when you set up your
27980
20:55:32,720 --> 20:55:37,600
own constructor the compiler is not
27981
20:55:35,279 --> 20:55:39,440
going to generate a default constructor
27982
20:55:37,600 --> 20:55:42,552
for you and we're going to lose the
27983
20:55:39,440 --> 20:55:45,119
ability to construct objects without
27984
20:55:42,551 --> 20:55:46,720
passing parameters the syntax we
27985
20:55:45,119 --> 20:55:49,512
basically see here we're going to say
27986
20:55:46,720 --> 20:55:52,320
cylinder and say cylinder one let's use
27987
20:55:49,512 --> 20:55:54,160
a lowercase c and if we do this you see
27988
20:55:52,320 --> 20:55:56,400
that we have a squiggly line the
27989
20:55:54,160 --> 20:56:00,400
compiler is not going to generate an
27990
20:55:56,399 --> 20:56:02,000
empty non-parameter taking constructor
27991
20:56:00,399 --> 20:56:04,319
because it sees that we have a
27992
20:56:02,000 --> 20:56:07,191
constructor here this is how c plus plus
27993
20:56:04,320 --> 20:56:09,360
compilers work if they see that you have
27994
20:56:07,191 --> 20:56:11,440
any constructor in your class they're
27995
20:56:09,360 --> 20:56:13,360
not going to generate a default empty
27996
20:56:11,440 --> 20:56:15,279
constructor and if we try to build we're
27997
20:56:13,360 --> 20:56:17,279
going to get an arrow that says
27998
20:56:17,279 --> 20:56:21,440
we don't have a constructor that can
27999
20:56:19,279 --> 20:56:23,919
basically construct an object from the
28000
20:56:21,440 --> 20:56:26,479
line here it's going to say no matching
28001
20:56:23,919 --> 20:56:28,240
function call for cylinder cylinder you
28002
20:56:26,479 --> 20:56:30,872
see here it is trying to call a
28003
20:56:28,240 --> 20:56:32,639
constructor that doesn't take any
28004
20:56:30,872 --> 20:56:35,600
parameter but we have no such
28005
20:56:32,639 --> 20:56:37,831
constructor in our code we could go in
28006
20:56:37,831 --> 20:56:43,279
and for example say cylinder and put an
28007
20:56:40,872 --> 20:56:46,000
empty parameter list and put an empty
28008
20:56:43,279 --> 20:56:47,919
body now this line here is going to work
28009
20:56:46,000 --> 20:56:50,960
because we have a default empty
28010
20:56:47,919 --> 20:56:53,191
constructor and if we weld you see that
28011
20:56:50,960 --> 20:56:56,552
the build is going to be good okay we
28012
20:56:53,191 --> 20:56:59,679
are building fine but having to type all
28013
20:56:56,551 --> 20:57:01,039
this if what you really want is an empty
28014
20:57:01,039 --> 20:57:06,239
is too much type in and in c plus plus
28015
20:57:03,919 --> 20:57:08,639
we have a syntax we can use to let the
28016
20:57:06,240 --> 20:57:10,720
compiler generate this kind of
28017
20:57:08,639 --> 20:57:13,759
constructor for us and the way we do
28018
20:57:10,720 --> 20:57:15,759
that is say cylinder and we say the name
28019
20:57:13,759 --> 20:57:18,479
of the constructor we say equals and we
28020
20:57:15,759 --> 20:57:20,319
say default if we save this the compiler
28021
20:57:18,479 --> 20:57:22,399
is going to generate this constructor
28022
20:57:20,320 --> 20:57:25,440
for us and the line here is going to
28023
20:57:22,399 --> 20:57:28,319
work so let's bring this up and build
28024
20:57:25,440 --> 20:57:29,760
again we're going to build with gcc
28025
20:57:28,320 --> 20:57:32,872
you're going to see that the build is
28026
20:57:29,759 --> 20:57:35,439
good and we can bring up the terminal
28027
20:57:32,872 --> 20:57:37,279
and clear and run rooster we're not
28028
20:57:35,440 --> 20:57:40,720
going to see anything because we're not
28029
20:57:37,279 --> 20:57:42,319
printing the volume of our cylinder here
28030
20:57:40,720 --> 20:57:44,720
but we can do that let's call this
28031
20:57:42,320 --> 20:57:46,800
cylinder one to be consistent with what
28032
20:57:44,720 --> 20:57:49,040
we did in the last few lectures and
28033
20:57:46,800 --> 20:57:51,120
we're going to say hddc out and print
28034
20:57:49,039 --> 20:57:54,319
the volume of this cylinder we're going
28035
20:57:51,119 --> 20:57:56,799
to say volume and call our volume method
28036
20:57:54,320 --> 20:57:58,960
and now that we have this we can weld
28037
20:57:56,800 --> 20:58:01,760
we're going to use gcc to do that the
28038
20:57:58,960 --> 20:58:03,512
build is good we can go down and clear
28039
20:58:01,759 --> 20:58:06,000
and run rooster we're going to see that
28040
20:58:03,512 --> 20:58:08,000
we see our volume here and this is
28041
20:58:06,000 --> 20:58:10,399
really all i wanted to share with you in
28042
20:58:08,000 --> 20:58:13,279
this lecture that you can use this
28043
20:58:10,399 --> 20:58:16,399
default syntax here to set up an empty
28044
20:58:13,279 --> 20:58:18,800
default constructor for your classes and
28045
20:58:18,800 --> 20:58:25,279
is that your constructors have to be
28046
20:58:22,080 --> 20:58:27,600
public to be able to be called like this
28047
20:58:25,279 --> 20:58:29,831
and to show you that let's go up and
28048
20:58:27,600 --> 20:58:31,600
actually change this to private and show
28049
20:58:29,831 --> 20:58:33,511
you what happens the moment we do this
28050
20:58:31,600 --> 20:58:36,320
we're going to get a squiggly line in
28051
20:58:33,512 --> 20:58:39,040
the main function here and if we try to
28052
20:58:36,320 --> 20:58:41,192
build but before we build let's show you
28053
20:58:39,039 --> 20:58:44,079
what visual studio code is saying it's
28054
20:58:41,191 --> 20:58:46,159
going to say cylinder cylinder declared
28055
20:58:44,080 --> 20:58:49,119
is inaccessible so you see the
28056
20:58:46,160 --> 20:58:51,120
constructor which is declared inside of
28057
20:58:51,119 --> 20:58:56,720
it accessible from the outside when we
28058
20:58:54,000 --> 20:59:00,639
try to call it to build our cylinder
28059
20:58:56,720 --> 20:59:02,720
objects so for constructors to be usable
28060
20:59:00,639 --> 20:59:05,360
on the outside here and both your
28061
20:59:02,720 --> 20:59:08,399
objects they have to be public let's
28062
20:59:05,360 --> 20:59:09,831
build and see what gcc says about this
28063
20:59:08,399 --> 20:59:12,479
we basically going to have the same
28064
20:59:09,831 --> 20:59:14,959
error the constructor is private within
28065
20:59:12,479 --> 20:59:16,872
this context so we can't really call it
28066
20:59:14,960 --> 20:59:19,512
so if we want our code to build we need
28067
20:59:16,872 --> 20:59:20,639
to make our constructors public and this
28068
20:59:20,639 --> 20:59:25,279
you need to know let's build again and
28069
20:59:22,872 --> 20:59:27,440
see that the cold is now building the
28070
20:59:25,279 --> 20:59:29,279
world is good and this is really all i
28071
20:59:27,440 --> 20:59:31,360
had to share in this lecture we are
28072
20:59:29,279 --> 20:59:32,959
going to stop here in this one in the
28073
20:59:31,360 --> 20:59:36,639
next one we're going to see how we can
28074
20:59:32,960 --> 20:59:39,040
use setters and getters to modify things
28075
20:59:39,039 --> 20:59:42,239
go ahead and finish up here and meet me
28076
20:59:42,240 --> 20:59:46,480
in this lecture we're going to learn
28077
20:59:43,679 --> 20:59:49,511
about setters and gators and these are
28078
20:59:46,479 --> 20:59:52,551
methods in our class that we can use to
28079
20:59:49,512 --> 20:59:55,119
read member variables or modify data in
28080
20:59:52,551 --> 20:59:58,080
our member variables let's look at a
28081
20:59:55,119 --> 21:00:00,959
simple example and by the way i am sorry
28082
20:59:58,080 --> 21:00:03,600
for my bad pronunciation of cylinder
28083
21:00:00,960 --> 21:00:05,832
here i have said it was cylinder and
28084
21:00:03,600 --> 21:00:08,639
after some careful thought i checked
28085
21:00:05,831 --> 21:00:11,119
online for the pronunciation on this and
28086
21:00:08,639 --> 21:00:13,919
i found that it was cylinder sorry for
28087
21:00:11,119 --> 21:00:16,159
this if it was bothering you i apologize
28088
21:00:13,919 --> 21:00:18,551
for the bad pronunciation and i am going
28089
21:00:16,160 --> 21:00:21,600
to do this right starting from now okay
28090
21:00:18,551 --> 21:00:23,919
here we have our cylinder class we have
28091
21:00:21,600 --> 21:00:26,800
a few member variables and we have the
28092
21:00:23,919 --> 21:00:28,872
base radius we have the height and now
28093
21:00:26,800 --> 21:00:31,279
we want to go through some public
28094
21:00:28,872 --> 21:00:33,192
functions to do operations on these
28095
21:00:31,279 --> 21:00:35,759
member variables because now that they
28096
21:00:33,191 --> 21:00:38,479
are private we can't really modify them
28097
21:00:35,759 --> 21:00:40,959
or manipulate them from the outside and
28098
21:00:38,479 --> 21:00:43,119
we really need to do things with them so
28099
21:00:40,960 --> 21:00:45,360
if we want to read things from them we
28100
21:00:43,119 --> 21:00:47,360
will use the getter functions
28101
21:00:45,360 --> 21:00:50,240
and if you look here this is a simple
28102
21:00:47,360 --> 21:00:52,960
function the only special thing about it
28103
21:00:50,240 --> 21:00:55,040
is that it leaves inside the class it
28104
21:00:52,960 --> 21:00:56,872
has a return value it has a function
28105
21:00:55,039 --> 21:00:59,439
name it has a parameter list and then
28106
21:00:56,872 --> 21:01:01,512
the body we're just going to return the
28107
21:00:59,440 --> 21:01:04,240
member variable of interest because this
28108
21:01:01,512 --> 21:01:06,551
is a getter we use that to get stuff
28109
21:01:04,240 --> 21:01:08,400
from the class this is the meaning here
28110
21:01:06,551 --> 21:01:10,399
here we have another getter function
28111
21:01:08,399 --> 21:01:13,439
which is going to return the height and
28112
21:01:10,399 --> 21:01:16,871
notice that these functions live in the
28113
21:01:13,440 --> 21:01:19,040
public scope of our class this is key
28114
21:01:16,872 --> 21:01:22,479
because we want to be able to go through
28115
21:01:19,039 --> 21:01:25,039
them to modify and do things with our
28116
21:01:22,479 --> 21:01:27,919
member variables but they will be used
28117
21:01:25,039 --> 21:01:29,831
from the outside so they must be public
28118
21:01:27,919 --> 21:01:33,119
otherwise they want to be accessible
28119
21:01:29,831 --> 21:01:35,191
from the outside we also have a pair of
28120
21:01:33,119 --> 21:01:38,319
setup functions they are going to be
28121
21:01:35,191 --> 21:01:40,720
modifying our member variables so set
28122
21:01:38,320 --> 21:01:42,872
base radius is going to take a parameter
28123
21:01:40,720 --> 21:01:44,960
that it's going to use to set a base
28124
21:01:42,872 --> 21:01:46,639
radius set height is going to do the
28125
21:01:44,960 --> 21:01:49,600
same it's going to take a parameter and
28126
21:01:46,639 --> 21:01:52,240
it's going to use that to assign a value
28127
21:01:49,600 --> 21:01:55,040
to our height member variable here and
28128
21:01:52,240 --> 21:01:56,160
because these functions are members of
28129
21:01:56,160 --> 21:02:02,552
they have access to our member variables
28130
21:01:59,831 --> 21:02:04,871
regardless of whether they are public or
28131
21:02:02,551 --> 21:02:06,399
private so this is going to work we're
28132
21:02:04,872 --> 21:02:08,400
going to go through them from the
28133
21:02:06,399 --> 21:02:11,439
outside and they are going to do the
28134
21:02:08,399 --> 21:02:14,159
dairy work for us and do things using
28135
21:02:11,440 --> 21:02:15,760
our member variables to which we don't
28136
21:02:15,759 --> 21:02:20,080
from the outside this is the meaning
28137
21:02:17,600 --> 21:02:22,080
here now that you have an idea about
28138
21:02:20,080 --> 21:02:23,759
this we're going to head over to visual
28139
21:02:22,080 --> 21:02:26,720
studio code and play with us a little
28140
21:02:23,759 --> 21:02:28,959
more okay here we are in our working
28141
21:02:26,720 --> 21:02:30,800
folder the current project is setters
28142
21:02:28,960 --> 21:02:33,120
and getters we're going to grab our
28143
21:02:30,800 --> 21:02:34,320
template files pretty quick and put them
28144
21:02:34,320 --> 21:02:38,872
setters and getters it is let's grab the
28145
21:02:36,960 --> 21:02:40,800
folder and we're going to open this in
28146
21:02:38,872 --> 21:02:42,872
video studio code by dragging and
28147
21:02:40,800 --> 21:02:45,760
dropping here this is going to open our
28148
21:02:42,872 --> 21:02:47,680
folder we're going to open our main cpp
28149
21:02:45,759 --> 21:02:49,831
file and we're going to clean it up a
28150
21:02:47,679 --> 21:02:53,039
little bit we are going to grab the
28151
21:02:49,831 --> 21:02:55,679
cylinder class from our previous lecture
28152
21:02:53,039 --> 21:02:57,919
and use that as a starting point here
28153
21:02:55,679 --> 21:03:00,551
and if you look we have a pair of
28154
21:02:57,919 --> 21:03:02,160
constructors here we have the volume
28155
21:03:00,551 --> 21:03:04,959
function which is going to give us the
28156
21:03:02,160 --> 21:03:07,360
volume of our cylinder here and we have
28157
21:03:04,960 --> 21:03:10,240
our member variables now what we want to
28158
21:03:07,360 --> 21:03:13,119
do is to be able to do things with these
28159
21:03:10,240 --> 21:03:15,192
member variables from the outside in the
28160
21:03:13,119 --> 21:03:17,512
main function here and we're going to go
28161
21:03:15,191 --> 21:03:20,479
through setter and getter methods which
28162
21:03:17,512 --> 21:03:22,872
must be public so let's do that so we're
28163
21:03:20,479 --> 21:03:25,279
going to set up our getter first so
28164
21:03:22,872 --> 21:03:27,279
we're going to say double get base
28165
21:03:25,279 --> 21:03:29,759
radius it's going to return double it's
28166
21:03:27,279 --> 21:03:32,160
not going to take anything and and in
28167
21:03:29,759 --> 21:03:34,399
the body we're just going to return our
28168
21:03:32,160 --> 21:03:36,320
radius let's return that okay so we're
28169
21:03:34,399 --> 21:03:38,479
going to set up another getter which is
28170
21:03:36,320 --> 21:03:40,552
going to give us the height and it's not
28171
21:03:38,479 --> 21:03:43,512
going to take anything and it's going to
28172
21:03:40,551 --> 21:03:46,159
just return our height member variable
28173
21:03:43,512 --> 21:03:49,040
now these are our getters they are going
28174
21:03:46,160 --> 21:03:50,960
to be getting things from the class
28175
21:03:49,039 --> 21:03:52,719
object we're going to set up other
28176
21:03:50,960 --> 21:03:54,960
functions that are going to be our
28177
21:03:52,720 --> 21:03:57,119
setters they're not going to return
28178
21:03:54,960 --> 21:03:59,120
anything and we're going to say set base
28179
21:03:57,119 --> 21:04:01,360
radius and it's going to take a double
28180
21:03:59,119 --> 21:04:03,279
parameter in and we're going to use that
28181
21:04:01,360 --> 21:04:05,440
to set our base radius so we're going to
28182
21:04:03,279 --> 21:04:07,360
say base radius and we're going to say
28183
21:04:05,440 --> 21:04:09,832
equals red parameter here and we're
28184
21:04:07,360 --> 21:04:11,680
going to do the same for our height so
28185
21:04:09,831 --> 21:04:13,511
it's not going to return anything the
28186
21:04:11,679 --> 21:04:15,279
function here and we're going to say set
28187
21:04:13,512 --> 21:04:17,832
height and we're going to take our
28188
21:04:15,279 --> 21:04:20,240
parameter n so i'm going to say double
28189
21:04:17,831 --> 21:04:21,039
height param and we're going to use that
28190
21:04:22,080 --> 21:04:27,279
stuff to our member variable we're going
28191
21:04:24,639 --> 21:04:30,240
to say hi and we're going to say height
28192
21:04:27,279 --> 21:04:33,191
param okay so this is our thing here now
28193
21:04:30,240 --> 21:04:35,760
we have two functions to get stuff from
28194
21:04:33,191 --> 21:04:38,639
our class and we have two functions to
28195
21:04:35,759 --> 21:04:41,039
set data to our member variables here
28196
21:04:38,639 --> 21:04:44,240
and again remember that we can't have
28197
21:04:41,039 --> 21:04:46,159
direct access to these member variables
28198
21:04:44,240 --> 21:04:48,000
on the outside of the class and if we
28199
21:04:46,160 --> 21:04:50,552
want to do that we're going to be able
28200
21:04:48,000 --> 21:04:52,872
to do that through our setter and getter
28201
21:04:50,551 --> 21:04:54,551
functions now for these functions
28202
21:04:52,872 --> 21:04:57,279
setters and getters to be accessible
28203
21:04:54,551 --> 21:04:59,759
from the outside they needed to leave in
28204
21:04:57,279 --> 21:05:01,679
the public section of our class you see
28205
21:04:59,759 --> 21:05:05,191
this public keyword here is going to
28206
21:05:01,679 --> 21:05:07,919
apply to anything after it until we
28207
21:05:05,191 --> 21:05:10,080
change this to private software so the
28208
21:05:07,919 --> 21:05:11,831
public scope is basically going from the
28209
21:05:11,831 --> 21:05:17,191
all the way to our set height function
28210
21:05:14,720 --> 21:05:19,279
and once we put this private keyword
28211
21:05:17,191 --> 21:05:21,831
here everything after that is going to
28212
21:05:19,279 --> 21:05:23,831
be private this is how these things work
28213
21:05:21,831 --> 21:05:25,919
so let's try and use this in main we're
28214
21:05:23,831 --> 21:05:28,639
going to set up a cylinder object
28215
21:05:25,919 --> 21:05:31,360
cylinder one and let's put in for
28216
21:05:28,639 --> 21:05:33,440
example two and three why not and now if
28217
21:05:31,360 --> 21:05:36,551
we want to have access to the base
28218
21:05:33,440 --> 21:05:39,440
radius remember if we tried to access
28219
21:05:36,551 --> 21:05:41,759
that directly let's say that if we try
28220
21:05:39,440 --> 21:05:44,080
to do something like cylinder one and
28221
21:05:41,759 --> 21:05:45,679
say base radius you're going to see that
28222
21:05:44,080 --> 21:05:47,191
we're going to have a squiggly line
28223
21:05:45,679 --> 21:05:48,871
meaning that there's something wrong
28224
21:05:47,191 --> 21:05:49,919
with our call here let's bring up a
28225
21:05:49,919 --> 21:05:53,440
and see what visual studio code thinks
28226
21:05:51,759 --> 21:05:55,439
about this membership base radius
28227
21:05:53,440 --> 21:05:57,440
declared this inaccessible here if we
28228
21:05:55,440 --> 21:05:59,600
try to weld we probably going to get a
28229
21:05:57,440 --> 21:06:02,320
compiler error that says that base
28230
21:05:59,600 --> 21:06:04,480
radius is private in this scope and
28231
21:06:02,320 --> 21:06:07,040
that's what we have here declare the
28232
21:06:04,479 --> 21:06:09,440
private here so we can't access this
28233
21:06:07,039 --> 21:06:12,079
from the main function here but now that
28234
21:06:09,440 --> 21:06:14,551
we have our getter functions we can go
28235
21:06:12,080 --> 21:06:16,872
through them and have access to
28236
21:06:14,551 --> 21:06:19,759
private member variables and notice that
28237
21:06:16,872 --> 21:06:21,680
because we are returning by value here
28238
21:06:19,759 --> 21:06:24,399
what return is going to be a copy you
28239
21:06:21,679 --> 21:06:26,399
really need to keep an eye for whether
28240
21:06:24,399 --> 21:06:29,599
what you are manipulating is the
28241
21:06:26,399 --> 21:06:31,511
original stuff or a copy so here we're
28242
21:06:29,600 --> 21:06:33,920
going to be returning by value and we're
28243
21:06:31,512 --> 21:06:36,800
going to return a copy but this is still
28244
21:06:33,919 --> 21:06:39,119
useful in some cases so here we can use
28245
21:06:36,800 --> 21:06:42,240
allocator let's take out this here and
28246
21:06:39,119 --> 21:06:45,279
say get base radius it is a method or a
28247
21:06:42,240 --> 21:06:47,832
function so we need to put our function
28248
21:06:45,279 --> 21:06:50,000
call here and now if we try to build
28249
21:06:47,831 --> 21:06:52,959
let's pass this through gcc and see what
28250
21:06:50,000 --> 21:06:55,512
we get you see the build is good we can
28251
21:06:52,960 --> 21:06:57,040
run this program let's clear and run
28252
21:06:55,512 --> 21:06:59,512
rooster you're going to see that the
28253
21:06:57,039 --> 21:07:01,919
base radius is two now now that we have
28254
21:06:59,512 --> 21:07:05,440
this sense we can actually modify stuff
28255
21:07:01,919 --> 21:07:07,831
about our cylinder here let's put in 10
28256
21:07:05,440 --> 21:07:09,832
and 10 just to be able to follow this
28257
21:07:07,831 --> 21:07:12,639
easily and we're going to print the
28258
21:07:09,831 --> 21:07:14,959
volume let's say volume and we're going
28259
21:07:12,639 --> 21:07:16,720
to say volume here we're not going to
28260
21:07:14,960 --> 21:07:19,040
use the getter here i'm going to say
28261
21:07:16,720 --> 21:07:21,360
volume this is going to print our volume
28262
21:07:19,039 --> 21:07:24,319
but we're going to modify our member
28263
21:07:21,360 --> 21:07:26,080
variables remember this is an object of
28264
21:07:26,080 --> 21:07:31,040
so we're going to say cylinder 1 set
28265
21:07:28,800 --> 21:07:33,680
base radius we can do that and we can
28266
21:07:31,039 --> 21:07:36,871
change this to 100 for example and we
28267
21:07:33,679 --> 21:07:39,359
can change the height that height we can
28268
21:07:36,872 --> 21:07:41,832
use this member function because we have
28269
21:07:39,360 --> 21:07:44,320
it now and we're going to set this to 10
28270
21:07:41,831 --> 21:07:46,159
why not now if we print the volume
28271
21:07:44,320 --> 21:07:49,440
you're going to see that the volume has
28272
21:07:46,160 --> 21:07:50,480
changed because we are going through our
28273
21:07:50,479 --> 21:07:54,639
setter and getters methods so the
28274
21:07:52,720 --> 21:07:56,960
cylinder is now going to be using this
28275
21:07:54,639 --> 21:07:59,039
data and for the first case here the
28276
21:07:56,960 --> 21:08:01,440
cylinder is going to be using the data
28277
21:07:59,039 --> 21:08:03,759
we used in our constructor here let's
28278
21:08:01,440 --> 21:08:06,479
both and run this application the build
28279
21:08:03,759 --> 21:08:07,831
is good we can clear and run rooster now
28280
21:08:06,479 --> 21:08:10,399
for the first time we're going to see
28281
21:08:07,831 --> 21:08:13,039
that our volume is this number and for
28282
21:08:10,399 --> 21:08:16,159
the second time our volume is going to
28283
21:08:13,039 --> 21:08:19,360
be multiplied by 10 because we changed
28284
21:08:16,160 --> 21:08:21,279
the base radius to 100 and if you put
28285
21:08:19,360 --> 21:08:23,360
these numbers in you're going to see
28286
21:08:21,279 --> 21:08:26,319
that they make sense we are able to
28287
21:08:23,360 --> 21:08:28,639
modify our member variables through our
28288
21:08:26,320 --> 21:08:30,960
setter and getter functions and again
28289
21:08:28,639 --> 21:08:33,440
for this setter and getter functions to
28290
21:08:30,960 --> 21:08:35,360
work they have to be in the public scope
28291
21:08:33,440 --> 21:08:36,872
of your class because if you make them
28292
21:08:35,360 --> 21:08:38,960
private they're not going to be
28293
21:08:36,872 --> 21:08:40,720
accessible from the outside and you're
28294
21:08:38,960 --> 21:08:43,040
going to get a compiler error let's try
28295
21:08:40,720 --> 21:08:45,191
and do that we are learning so we're not
28296
21:08:43,039 --> 21:08:47,439
afraid to break things a little bit so
28297
21:08:45,191 --> 21:08:50,080
let's make them private we can do that
28298
21:08:47,440 --> 21:08:51,832
and bring this a little bit to the left
28299
21:08:50,080 --> 21:08:54,400
and at the moment we do that we should
28300
21:08:51,831 --> 21:08:57,119
have a few squiggly lines in our main
28301
21:08:54,399 --> 21:08:59,511
function and we do expect this because
28302
21:08:57,119 --> 21:09:01,512
they are private now so we have no
28303
21:08:59,512 --> 21:09:04,160
business accessing them from the main
28304
21:09:01,512 --> 21:09:06,320
function like this they are meant to be
28305
21:09:04,160 --> 21:09:08,400
used from the inside of the class if
28306
21:09:06,320 --> 21:09:10,872
they are private like this and if you
28307
21:09:08,399 --> 21:09:13,191
try to use them from the outside you're
28308
21:09:10,872 --> 21:09:15,040
going to get a compiler error let's pass
28309
21:09:13,191 --> 21:09:17,360
this through gcc to really see the
28310
21:09:15,039 --> 21:09:20,079
compiler error and we're going to get
28311
21:09:17,360 --> 21:09:22,720
set height is private from the context
28312
21:09:20,080 --> 21:09:24,479
of the main function and if we go up i
28313
21:09:22,720 --> 21:09:28,080
think we're going to see the same thing
28314
21:09:24,479 --> 21:09:29,919
for a set base radius and that's here
28315
21:09:28,080 --> 21:09:32,080
this is really all we set out to do in
28316
21:09:29,919 --> 21:09:34,319
this lecture showing you how you can use
28317
21:09:32,080 --> 21:09:36,960
setters and getters to manipulate your
28318
21:09:34,320 --> 21:09:39,360
member variables from the outside
28319
21:09:36,960 --> 21:09:41,120
and i hope you found this useful we are
28320
21:09:39,360 --> 21:09:42,720
going to stop here in this lecture in
28321
21:09:41,119 --> 21:09:45,831
the next one we're going to show you how
28322
21:09:42,720 --> 21:09:49,191
you can split your class across multiple
28323
21:09:45,831 --> 21:09:50,959
files but before i let you go let's fix
28324
21:09:49,191 --> 21:09:53,039
this so that we don't have a compiler
28325
21:09:50,960 --> 21:09:55,680
error here so we're going to remove this
28326
21:09:53,039 --> 21:09:57,599
private keyword we have put here and
28327
21:09:55,679 --> 21:10:00,159
we're going to build again to make sure
28328
21:09:57,600 --> 21:10:03,040
the world is good let's use gcc for that
28329
21:10:00,160 --> 21:10:05,192
the world is good and i will see you in
28330
21:10:03,039 --> 21:10:07,919
the next lecture go ahead and finish up
28331
21:10:05,191 --> 21:10:10,080
here and meet me there in this lecture i
28332
21:10:07,919 --> 21:10:13,119
am going to show you how we can split
28333
21:10:10,080 --> 21:10:16,080
our class information across multiple
28334
21:10:13,119 --> 21:10:18,479
files so far what we have been doing is
28335
21:10:16,080 --> 21:10:21,919
really cramping everything in the main
28336
21:10:18,479 --> 21:10:24,800
function we had our constant declaration
28337
21:10:21,919 --> 21:10:27,039
we had our cylinder class definition and
28338
21:10:24,800 --> 21:10:30,240
we had our main function to use these
28339
21:10:27,039 --> 21:10:32,239
things all cramped into the main cpp
28340
21:10:30,240 --> 21:10:34,240
file now we're going to see how we can
28341
21:10:32,240 --> 21:10:38,000
do things better the first thing we can
28342
21:10:34,240 --> 21:10:40,800
do is move our constant in another file
28343
21:10:38,000 --> 21:10:43,360
because if you think about it users of
28344
21:10:40,800 --> 21:10:46,400
your class in the main function don't
28345
21:10:43,360 --> 21:10:49,191
care about this constant pi because it
28346
21:10:46,399 --> 21:10:51,599
really is an implementation detail
28347
21:10:49,191 --> 21:10:53,599
that should leave somewhere else or even
28348
21:10:51,600 --> 21:10:55,920
inside the cylinder class but we're
28349
21:10:53,600 --> 21:10:57,920
going to put this in a separate file
28350
21:10:55,919 --> 21:11:00,639
because that's going to give us room to
28351
21:10:57,919 --> 21:11:03,360
put as a constant if we need to do that
28352
21:11:00,639 --> 21:11:05,600
so if we split things up like this
28353
21:11:03,360 --> 21:11:08,320
when we want to use the pi variable we
28354
21:11:05,600 --> 21:11:10,400
will need to include the constants file
28355
21:11:08,320 --> 21:11:12,872
because that's going to give us access
28356
21:11:10,399 --> 21:11:15,039
to it but we don't have to maintain it
28357
21:11:12,872 --> 21:11:17,120
in the main function so this is a little
28358
21:11:15,039 --> 21:11:19,831
better but another thing we can do is
28359
21:11:17,119 --> 21:11:22,639
remove the cylinder in another separate
28360
21:11:19,831 --> 21:11:25,360
file and do something like this so now
28361
21:11:22,639 --> 21:11:27,600
you see that our cylinder declaration
28362
21:11:25,360 --> 21:11:29,831
and definition has moved in a file
28363
21:11:32,240 --> 21:11:35,512
living in another file called
28364
21:11:35,512 --> 21:11:40,639
and if we want to use our cylinder class
28365
21:11:37,831 --> 21:11:43,119
like we have been using it all along we
28366
21:11:40,639 --> 21:11:45,279
will need to include the header that
28367
21:11:43,119 --> 21:11:47,599
brings it in and this is how we're going
28368
21:11:45,279 --> 21:11:50,240
to do it and we will be able to use it
28369
21:11:47,600 --> 21:11:52,872
in the main function if we set things up
28370
21:11:50,240 --> 21:11:55,512
like this but we can go even further we
28371
21:11:52,872 --> 21:11:58,240
can split our class declaration and
28372
21:11:55,512 --> 21:11:59,600
definition in two separate files what
28373
21:11:58,240 --> 21:12:01,512
we're going to have in the header is
28374
21:11:59,600 --> 21:12:02,400
going to be really a preview of the
28375
21:12:02,399 --> 21:12:05,959
and in the cpp file which is going to be
28376
21:12:05,960 --> 21:12:11,440
cylinder.cpp we're going to have the
28377
21:12:08,000 --> 21:12:13,191
implementation details of our class and
28378
21:12:11,440 --> 21:12:15,680
again this is going to make things a
28379
21:12:13,191 --> 21:12:17,599
little easier to manage because it's
28380
21:12:15,679 --> 21:12:20,719
really not good to have everything
28381
21:12:17,600 --> 21:12:23,512
cramped into your main cpp file it
28382
21:12:20,720 --> 21:12:26,399
should really have high level details
28383
21:12:23,512 --> 21:12:28,551
about how your application works and all
28384
21:12:26,399 --> 21:12:31,360
the low level details should be split
28385
21:12:28,551 --> 21:12:33,831
into different files this is good design
28386
21:12:31,360 --> 21:12:36,080
now that you have an idea about this
28387
21:12:33,831 --> 21:12:37,759
let's head over to visual studio code
28388
21:12:36,080 --> 21:12:40,320
and show you how you can do this okay
28389
21:12:37,759 --> 21:12:43,119
here we are in our working folder the
28390
21:12:40,320 --> 21:12:46,400
current project is class across multiple
28391
21:12:43,119 --> 21:12:48,639
files we're going to grab our template
28392
21:12:46,399 --> 21:12:50,639
files and put them in place and we're
28393
21:12:48,639 --> 21:12:52,639
going to open this in visual studio code
28394
21:12:50,639 --> 21:12:55,440
so that we can really play with us this
28395
21:12:52,639 --> 21:12:58,399
is going to open our folder we can open
28396
21:12:55,440 --> 21:13:00,479
the main cpp file we are going to clean
28397
21:12:58,399 --> 21:13:03,039
it up a little bit and we are going to
28398
21:13:00,479 --> 21:13:05,440
grab our class definition and put that
28399
21:13:03,039 --> 21:13:07,439
on top here so this is our cylinder
28400
21:13:05,440 --> 21:13:10,000
class we have the constructors we have
28401
21:13:07,440 --> 21:13:12,080
the functions the volume function here
28402
21:13:10,000 --> 21:13:14,551
and we have our setters and getters
28403
21:13:12,080 --> 21:13:16,720
inside down we have our member variables
28404
21:13:14,551 --> 21:13:19,440
which happen to be private to this class
28405
21:13:16,720 --> 21:13:20,399
here now what we want to do is to
28406
21:13:20,399 --> 21:13:26,000
our code better and the first thing we
28407
21:13:22,872 --> 21:13:28,800
need to do is to move this constant from
28408
21:13:26,000 --> 21:13:31,831
the main file here because it's really
28409
21:13:28,800 --> 21:13:33,832
not that useful at this point here users
28410
21:13:31,831 --> 21:13:36,080
of your classes won't really care about
28411
21:13:33,831 --> 21:13:38,319
what pi is because it is an
28412
21:13:36,080 --> 21:13:40,320
implementation detail to the cylinder
28413
21:13:38,320 --> 21:13:42,800
class because we are using that to
28414
21:13:40,320 --> 21:13:45,192
compute our volume so this constant
28415
21:13:42,800 --> 21:13:46,960
really has no business being in the main
28416
21:13:45,191 --> 21:13:48,551
file we're going to move this in a
28417
21:13:46,960 --> 21:13:50,240
separate file we're going to set up a
28418
21:13:48,551 --> 21:13:52,959
new file we're going to come to the left
28419
21:13:50,240 --> 21:13:55,040
here click on the plus icon here that
28420
21:13:52,960 --> 21:13:57,720
says new file we're going to say
28421
21:13:55,039 --> 21:13:59,831
constants and we're going to call this
28422
21:13:57,720 --> 21:14:02,800
constants.h because it's going to be a
28423
21:13:59,831 --> 21:14:03,831
header file and we can just come from
28424
21:14:03,831 --> 21:14:08,239
main cpp file we're going to copy this
28425
21:14:06,320 --> 21:14:11,120
we're going to cut this actually and
28426
21:14:08,240 --> 21:14:13,832
we're going to put this in our separate
28427
21:14:13,831 --> 21:14:18,159
after we do this we're going to come in
28428
21:14:15,759 --> 21:14:20,799
our main cpp file and we're going to
28429
21:14:18,160 --> 21:14:24,160
include that header file so let's do
28430
21:14:20,800 --> 21:14:25,600
that we're going to include constants.h
28431
21:14:24,160 --> 21:14:28,080
and the moment we do that you're going
28432
21:14:25,600 --> 21:14:30,720
to see now visual studio code knows
28433
21:14:28,080 --> 21:14:32,800
where this constant is but we don't have
28434
21:14:30,720 --> 21:14:34,720
to deal with that directly here another
28435
21:14:32,800 --> 21:14:37,279
benefit of doing things like this is
28436
21:14:34,720 --> 21:14:40,399
that we can go in this header file and
28437
21:14:37,279 --> 21:14:42,399
declare thousands of other constants and
28438
21:14:40,399 --> 21:14:46,239
we can have access to them in the main
28439
21:14:42,399 --> 21:14:48,720
function by just using this single line
28440
21:14:46,240 --> 21:14:51,040
that includes our file here so this is
28441
21:14:48,720 --> 21:14:52,479
good design if we build our application
28442
21:14:51,039 --> 21:14:54,799
you're going to see that it is going to
28443
21:14:52,479 --> 21:14:57,679
work let's try and set up a cylinder
28444
21:14:54,800 --> 21:15:00,720
object we're going to say cylinder 1 and
28445
21:14:57,679 --> 21:15:02,551
we're going to put 10 and 10 n as our
28446
21:15:00,720 --> 21:15:04,800
parameters and we're going to print the
28447
21:15:02,551 --> 21:15:07,191
volume of this little guy so this is
28448
21:15:04,800 --> 21:15:08,800
easy to do now we're going to say volume
28449
21:15:07,191 --> 21:15:10,799
and we're going to print that out
28450
21:15:08,800 --> 21:15:13,120
cylinder one and we're going to call the
28451
21:15:10,800 --> 21:15:15,680
volume method and this is going to print
28452
21:15:13,119 --> 21:15:19,440
our thumb and again i am going to be
28453
21:15:15,679 --> 21:15:21,439
using the terms functions and methods
28454
21:15:19,440 --> 21:15:23,760
interchangeably in this course and what
28455
21:15:21,440 --> 21:15:25,600
i mean in the context of the class
28456
21:15:23,759 --> 21:15:27,679
that's going to be the member functions
28457
21:15:25,600 --> 21:15:30,160
of the class so don't be confused by
28458
21:15:27,679 --> 21:15:32,959
this right here if we build and run this
28459
21:15:30,160 --> 21:15:35,680
application it should be working right
28460
21:15:32,960 --> 21:15:37,040
because we have everything we need for
28461
21:15:37,039 --> 21:15:41,279
let's see if the world was good the
28462
21:15:39,191 --> 21:15:43,512
build was good we can bring up a
28463
21:15:41,279 --> 21:15:45,831
terminal and actually run this let's
28464
21:15:43,512 --> 21:15:47,832
clear and run rooster this is going to
28465
21:15:45,831 --> 21:15:49,919
print our volume so the code is working
28466
21:15:47,831 --> 21:15:52,479
right the second thing we want to do is
28467
21:15:49,919 --> 21:15:54,551
to move this class all together in
28468
21:15:52,479 --> 21:15:56,800
another file because we don't really
28469
21:15:56,800 --> 21:16:01,760
here in the main function what we really
28470
21:15:59,119 --> 21:16:04,399
want is to use stuff and we don't care
28471
21:16:01,759 --> 21:16:07,439
about how those things are set up in the
28472
21:16:04,399 --> 21:16:09,599
same logic we used when we used std
28473
21:16:07,440 --> 21:16:12,400
strength we didn't really care about how
28474
21:16:09,600 --> 21:16:14,639
hdd strength is put together all we
28475
21:16:12,399 --> 21:16:18,079
really wanted was to include the class
28476
21:16:14,639 --> 21:16:20,160
that brings it in and use it in our code
28477
21:16:18,080 --> 21:16:22,800
we're going to be setting up the same
28478
21:16:20,160 --> 21:16:24,720
behavior for our cylinder class here and
28479
21:16:22,800 --> 21:16:27,279
it is going to be given in its own
28480
21:16:24,720 --> 21:16:28,872
separate file so let's set up another
28481
21:16:27,279 --> 21:16:31,512
header file we're going to call this
28482
21:16:28,872 --> 21:16:33,919
cylinder dot h and we're going to grab
28483
21:16:31,512 --> 21:16:36,720
our class definition all together so
28484
21:16:33,919 --> 21:16:39,279
we're going to go from the bottom here
28485
21:16:36,720 --> 21:16:41,360
and select everything that includes our
28486
21:16:39,279 --> 21:16:43,831
class we're going to cut this out we're
28487
21:16:41,360 --> 21:16:46,000
going to go in our cylinder header and
28488
21:16:43,831 --> 21:16:47,679
we're going to paste this in there and
28489
21:16:46,000 --> 21:16:50,160
we're going to come back to our main
28490
21:16:47,679 --> 21:16:52,639
file and include our cylinder class so
28491
21:16:50,160 --> 21:16:54,872
let's do that we're going to include and
28492
21:16:52,639 --> 21:16:56,960
we're going to say cylinder.h
28493
21:16:54,872 --> 21:16:59,440
and this is going to make things work
28494
21:16:56,960 --> 21:17:01,760
remember the preprocessor is going to
28495
21:16:59,440 --> 21:17:04,000
put these things on the preprocessor is
28496
21:17:01,759 --> 21:17:06,319
basically going to go in constants it's
28497
21:17:04,000 --> 21:17:08,872
going to take whatever is inside and
28498
21:17:06,320 --> 21:17:11,280
then it's going to paste that here and
28499
21:17:08,872 --> 21:17:13,192
it's going to take everything inside our
28500
21:17:11,279 --> 21:17:15,759
cylinder class and it's going to paste
28501
21:17:13,191 --> 21:17:18,159
that here so it's basically going to be
28502
21:17:15,759 --> 21:17:20,399
like we are declaring these things in
28503
21:17:18,160 --> 21:17:23,040
the main function but our code is going
28504
21:17:20,399 --> 21:17:25,360
to be better organized now if we try to
28505
21:17:23,039 --> 21:17:27,919
build this program it is going to world
28506
21:17:25,360 --> 21:17:30,399
exactly like it did because we have all
28507
21:17:27,919 --> 21:17:32,720
the information for its world let's
28508
21:17:30,399 --> 21:17:35,119
build world has finished successfully so
28509
21:17:32,720 --> 21:17:36,960
the world is good and we can run this
28510
21:17:35,119 --> 21:17:39,191
program and it's going to do what it was
28511
21:17:36,960 --> 21:17:41,680
doing all along we can clear and run
28512
21:17:39,191 --> 21:17:43,512
rooster don't worry about visual studio
28513
21:17:41,679 --> 21:17:45,919
code here i don't know what the problem
28514
21:17:43,512 --> 21:17:48,320
is with that it's just having ah it's
28515
21:17:48,320 --> 21:17:53,512
constant here because it's not included
28516
21:17:50,320 --> 21:17:56,720
in here so what we can do is say include
28517
21:17:53,512 --> 21:17:58,639
and include our constants header and if
28518
21:17:56,720 --> 21:18:01,360
we do this the problem here is going to
28519
21:17:58,639 --> 21:18:03,360
go away but we're going to have a
28520
21:18:01,360 --> 21:18:05,600
problem if we're trying to run this
28521
21:18:03,360 --> 21:18:08,080
program now because try to think about
28522
21:18:05,600 --> 21:18:09,920
it in the main function we are including
28523
21:18:11,679 --> 21:18:17,439
header of cylinder we are also including
28524
21:18:14,551 --> 21:18:19,679
this little guy here so if the processor
28525
21:18:19,679 --> 21:18:24,399
this and it's going to have this little
28526
21:18:21,919 --> 21:18:26,399
guy inside our main function and the
28527
21:18:24,399 --> 21:18:29,039
cylinder is also going to include this
28528
21:18:26,399 --> 21:18:31,439
because it's including this header so
28529
21:18:29,039 --> 21:18:34,000
when the preprocessor is done we're
28530
21:18:31,440 --> 21:18:36,240
going to have our constant here declared
28531
21:18:34,000 --> 21:18:38,320
twice and if we try to build this
28532
21:18:36,240 --> 21:18:40,720
program you can expect bad things to
28533
21:18:38,320 --> 21:18:43,512
happen because it's really not good to
28534
21:18:40,720 --> 21:18:47,040
have the same thing defined more than
28535
21:18:43,512 --> 21:18:48,720
once in your entire program and let's
28536
21:18:47,039 --> 21:18:50,239
try and build and show you this
28537
21:18:48,720 --> 21:18:51,040
hopefully we're going to get a compiler
28538
21:18:51,039 --> 21:18:55,439
and it's going to blow up in our face
28539
21:18:53,039 --> 21:18:58,639
it's going to say hero redefinition of
28540
21:18:55,440 --> 21:19:01,760
const double pi so what is going on here
28541
21:18:58,639 --> 21:19:04,319
we are including this thing twice once
28542
21:19:01,759 --> 21:19:06,639
here and at the second time it's coming
28543
21:19:04,320 --> 21:19:09,280
in directly from the cylinder class
28544
21:19:06,639 --> 21:19:11,919
because we are including that in this
28545
21:19:09,279 --> 21:19:14,000
location here and what the preprocessor
28546
21:19:11,919 --> 21:19:16,551
is basically going to do it's going to
28547
21:19:14,000 --> 21:19:19,831
copy the entire file here and it's going
28548
21:19:16,551 --> 21:19:22,080
to paste that in the place of cylinder.h
28549
21:19:19,831 --> 21:19:24,319
here and this constants header is
28550
21:19:22,080 --> 21:19:26,160
basically going to be included twice so
28551
21:19:24,320 --> 21:19:28,800
it's going to be redefined here that's
28552
21:19:26,160 --> 21:19:32,160
the problem we have one way we have to
28553
21:19:28,800 --> 21:19:34,800
solve this in c plus plus is by using
28554
21:19:32,160 --> 21:19:37,680
include chords and the way we do that we
28555
21:19:34,800 --> 21:19:39,440
come in our constants header and we say
28556
21:19:42,240 --> 21:19:48,000
if something is not defined yet and
28557
21:19:45,039 --> 21:19:49,919
let's say cylinder underscore h and
28558
21:19:49,919 --> 21:19:56,160
cylinder underscore h and we're going to
28559
21:19:52,479 --> 21:19:57,599
come down to the end and say and f this
28560
21:19:57,600 --> 21:20:03,600
preprocessor to only do something or
28561
21:20:00,960 --> 21:20:07,832
include the code we have within these
28562
21:20:03,600 --> 21:20:10,720
things if the condition on top here is
28563
21:20:07,831 --> 21:20:14,080
satisfied so for example the code inside
28564
21:20:10,720 --> 21:20:15,440
here is going to be put in our c plus
28565
21:20:15,440 --> 21:20:21,360
if the cylinder name here is not defined
28566
21:20:18,960 --> 21:20:24,400
in the eyes of the preprocessor so it's
28567
21:20:21,360 --> 21:20:26,872
going to say if cylinder underscore h is
28568
21:20:24,399 --> 21:20:29,360
not defined i am going to define that
28569
21:20:26,872 --> 21:20:31,120
and i am going to put this code here but
28570
21:20:29,360 --> 21:20:32,872
if it's already defined it's going to
28571
21:20:31,119 --> 21:20:34,871
skip all these things and it's not going
28572
21:20:32,872 --> 21:20:37,120
to include this okay so this is the
28573
21:20:34,872 --> 21:20:39,120
logic here and i noticed this is really
28574
21:20:37,119 --> 21:20:41,119
not a cylinder file so we're going to
28575
21:20:41,119 --> 21:20:46,000
underscore h let's say that and let's do
28576
21:20:44,000 --> 21:20:48,639
the same here and this is going to do
28577
21:20:46,000 --> 21:20:51,119
our thing and we're going to go in our
28578
21:20:48,639 --> 21:20:54,080
cylinder header and do the same thing
28579
21:20:51,119 --> 21:20:56,799
and put in our include guard it is
28580
21:20:54,080 --> 21:20:58,551
basically a guard that is going to guard
28581
21:20:58,551 --> 21:21:03,831
being included more than once
28582
21:21:01,440 --> 21:21:06,240
so let's do that in our cylinder header
28583
21:21:03,831 --> 21:21:08,871
so we're going to wrap this inside our
28584
21:21:06,240 --> 21:21:10,872
include guards we're going to say if n
28585
21:21:08,872 --> 21:21:12,551
def you see visual studio code is really
28586
21:21:10,872 --> 21:21:14,551
helping out here and we're going to put
28587
21:21:12,551 --> 21:21:16,872
in the name we're going to use for this
28588
21:21:14,551 --> 21:21:19,191
this is a cylinder class so i think it
28589
21:21:16,872 --> 21:21:21,512
makes sense to call this cylinder
28590
21:21:19,191 --> 21:21:24,799
underscore h and we're going to do the
28591
21:21:21,512 --> 21:21:27,360
same thing here define cylinder and
28592
21:21:24,800 --> 21:21:29,440
we're going to end f at the end of the
28593
21:21:27,360 --> 21:21:31,279
file here so we're going to say end f
28594
21:21:29,440 --> 21:21:33,680
and again this is the syntax of the
28595
21:21:31,279 --> 21:21:35,440
preprocessor i don't want to get too
28596
21:21:33,679 --> 21:21:37,919
much into this because we will learn
28597
21:21:35,440 --> 21:21:41,040
about this later in the course but we
28598
21:21:37,919 --> 21:21:44,232
can now use this to guard against
28599
21:21:41,039 --> 21:21:46,079
something being included more than once
28600
21:21:44,232 --> 21:21:48,080
and if we're trying to build the program
28601
21:21:46,080 --> 21:21:50,479
now hopefully it's going to world let's
28602
21:21:48,080 --> 21:21:53,919
use the gcc and now you see that the
28603
21:21:50,479 --> 21:21:56,551
world is good even if we are including
28604
21:21:53,919 --> 21:21:59,679
the constant header multiple times in
28605
21:21:56,551 --> 21:22:02,000
the main file here we can even go down
28606
21:21:59,679 --> 21:22:03,599
and do that like a thousand times so
28607
21:22:02,000 --> 21:22:05,919
let's do that and you're going to see
28608
21:22:03,600 --> 21:22:09,440
that if we try to compile it is going to
28609
21:22:05,919 --> 21:22:11,360
boil define because now we have a guard
28610
21:22:09,440 --> 21:22:13,360
guarding against including this thing
28611
21:22:11,360 --> 21:22:15,831
more than once the preprocessor is
28612
21:22:13,360 --> 21:22:16,800
basically going to come in here and say
28613
21:22:16,800 --> 21:22:21,919
the constant's name is not defined i'm
28614
21:22:21,919 --> 21:22:26,399
and i am going to put the code here in
28615
21:22:24,160 --> 21:22:29,040
the source file that includes me
28616
21:22:26,399 --> 21:22:30,959
if it happens to be already defined this
28617
21:22:29,039 --> 21:22:33,919
condition here is going to fail it's not
28618
21:22:30,960 --> 21:22:35,680
going to do any more than in this file
28619
21:22:33,919 --> 21:22:38,000
the preprocessor is basically going to
28620
21:22:35,679 --> 21:22:40,719
give up on this file here this is what i
28621
21:22:38,000 --> 21:22:43,279
want you to know so now we should be
28622
21:22:40,720 --> 21:22:45,759
able to split our code into multiple
28623
21:22:43,279 --> 21:22:47,119
files and now that i think about it we
28624
21:22:45,759 --> 21:22:49,119
don't really need to include the
28625
21:22:47,119 --> 21:22:51,440
constants header here because it's going
28626
21:22:49,119 --> 21:22:53,679
to be broadened by the cylinder class
28627
21:22:51,440 --> 21:22:56,160
but it was a good opportunity to teach
28628
21:22:53,679 --> 21:22:57,679
you about the include guards here now
28629
21:22:56,160 --> 21:22:59,279
that you notice we're going to remove
28630
21:22:57,679 --> 21:23:01,919
this and we're going to build and show
28631
21:22:59,279 --> 21:23:04,639
you that this is going to work anyway so
28632
21:23:01,919 --> 21:23:06,959
weld is good we can run our program
28633
21:23:04,639 --> 21:23:08,551
clear and run rooster this is going to
28634
21:23:06,960 --> 21:23:11,760
work the last thing i want to show you
28635
21:23:08,551 --> 21:23:14,800
is that we can go even further and split
28636
21:23:11,759 --> 21:23:16,871
our class into two separate files
28637
21:23:14,800 --> 21:23:19,919
because people who come to the header
28638
21:23:16,872 --> 21:23:23,192
file are usually interested in your
28639
21:23:19,919 --> 21:23:25,279
class definition they are really not
28640
21:23:23,191 --> 21:23:27,512
interested in your implementation
28641
21:23:25,279 --> 21:23:30,232
details for example they want to see
28642
21:23:27,512 --> 21:23:32,160
that you have a volume function and they
28643
21:23:30,232 --> 21:23:34,400
want to know that they can call that
28644
21:23:32,160 --> 21:23:36,639
function but they don't really want to
28645
21:23:34,399 --> 21:23:38,639
know how you compute your volume and we
28646
21:23:36,639 --> 21:23:41,512
can really make events simple for them
28647
21:23:38,639 --> 21:23:44,160
and hide the implementation details in a
28648
21:23:41,512 --> 21:23:46,232
separate cpp file so let's do that we're
28649
21:23:44,160 --> 21:23:48,960
going to set up a new cpp file we're
28650
21:23:46,232 --> 21:23:50,480
going to call this cylinder that's cpp
28651
21:23:55,279 --> 21:24:01,191
in the cpp file and i am doing this just
28652
21:23:58,800 --> 21:24:02,872
to show you that it is possible in
28653
21:24:01,191 --> 21:24:04,551
practice you're going to have to decide
28654
21:24:02,872 --> 21:24:06,639
for yourself what you want to keep in
28655
21:24:04,551 --> 21:24:09,919
the header file and what you want to
28656
21:24:06,639 --> 21:24:11,512
keep in the cpp file so the cylinder
28657
21:24:09,919 --> 21:24:14,319
default constructor here is going to
28658
21:24:11,512 --> 21:24:16,960
stay this way but we can move the other
28659
21:24:14,320 --> 21:24:18,800
constructor here in the cpp file and the
28660
21:24:16,960 --> 21:24:20,800
way we do that we're going to just grab
28661
21:24:18,800 --> 21:24:23,120
this and i am going to change this line
28662
21:24:20,800 --> 21:24:25,120
by line so that you can see this
28663
21:24:23,119 --> 21:24:27,599
and in the cpp file the first thing we
28664
21:24:25,119 --> 21:24:30,000
want to do is to include the cylinder
28665
21:24:27,600 --> 21:24:32,639
header because the implementations here
28666
21:24:32,639 --> 21:24:36,720
and we're going to put in our
28667
21:24:33,759 --> 21:24:39,759
constructor and modify it to be fit for
28668
21:24:36,720 --> 21:24:42,479
living in a cpp file so let's come here
28669
21:24:39,759 --> 21:24:44,399
and do that the way we tell this that
28670
21:24:42,479 --> 21:24:47,191
this is really an implementation of a
28671
21:24:44,399 --> 21:24:49,039
function we have in our header here is
28672
21:24:47,191 --> 21:24:50,959
to put the class name in front we're
28673
21:24:49,039 --> 21:24:53,191
going to say cylinder and put two
28674
21:24:50,960 --> 21:24:55,120
columns the moment we do that the
28675
21:24:53,191 --> 21:24:58,000
compiler is going to know that this is
28676
21:24:55,119 --> 21:24:59,679
an implementation of a function we have
28677
21:24:58,000 --> 21:25:02,639
in our header file and this is the
28678
21:24:59,679 --> 21:25:05,191
function here and now we can take out
28679
21:25:02,639 --> 21:25:07,512
the body here and live this as a
28680
21:25:05,191 --> 21:25:09,759
prototype for the function which is our
28681
21:25:07,512 --> 21:25:12,232
constructor view we can do this
28682
21:25:09,759 --> 21:25:13,919
okay if we do this in world the code is
28683
21:25:12,232 --> 21:25:16,960
going to world it's going to construct
28684
21:25:13,919 --> 21:25:18,232
our objects let's go back in main cpb
28685
21:25:18,232 --> 21:25:24,160
constructor we are using it is we can
28686
21:25:20,960 --> 21:25:26,320
weld and make sure that what we just did
28687
21:25:24,160 --> 21:25:28,872
didn't break anything we are building
28688
21:25:26,320 --> 21:25:31,280
and we can clear things up a little bit
28689
21:25:28,872 --> 21:25:34,479
and run rooster this is going to give us
28690
21:25:31,279 --> 21:25:35,919
our volume and we have started to split
28691
21:25:35,919 --> 21:25:40,080
in our class here some things are going
28692
21:25:38,000 --> 21:25:41,279
to leave in the header file some other
28693
21:25:40,080 --> 21:25:43,759
things are going to leave in the
28694
21:25:41,279 --> 21:25:45,512
implementation file so we have moved our
28695
21:25:43,759 --> 21:25:47,511
constructor here let's move the volume
28696
21:25:45,512 --> 21:25:49,680
function we can grab it and i move
28697
21:25:47,512 --> 21:25:51,512
things line by line i think this is the
28698
21:25:51,512 --> 21:25:56,639
and i think we can move this things a
28699
21:25:53,919 --> 21:25:58,399
little bit to the left let's do that and
28700
21:25:56,639 --> 21:26:01,039
we're going to say that this is a
28701
21:25:58,399 --> 21:26:03,119
function implementation for some
28702
21:26:01,039 --> 21:26:05,599
function that is declared in the class
28703
21:26:03,119 --> 21:26:07,679
here so we're going to say cylinder and
28704
21:26:05,600 --> 21:26:09,360
we're going to put two columns this is
28705
21:26:07,679 --> 21:26:12,399
going to tell the compiler this is an
28706
21:26:09,360 --> 21:26:15,600
implementation of the function we have
28707
21:26:12,399 --> 21:26:18,720
in our class and the return type has to
28708
21:26:15,600 --> 21:26:21,279
live in front of this scope resolution
28709
21:26:18,720 --> 21:26:23,759
operator okay what we have here cylinder
28710
21:26:21,279 --> 21:26:26,080
column column is called the scope
28711
21:26:23,759 --> 21:26:29,191
resolution operator and is basically
28712
21:26:26,080 --> 21:26:32,400
telling the compiler that our function
28713
21:26:29,191 --> 21:26:34,799
called volume leaves in the scope of the
28714
21:26:32,399 --> 21:26:37,119
cylinder class this is what the syntax
28715
21:26:34,800 --> 21:26:39,192
here is saying and this little thing
28716
21:26:37,119 --> 21:26:40,399
here is called a scope resolution
28717
21:26:40,399 --> 21:26:45,360
okay so we have moved our volume
28718
21:26:42,720 --> 21:26:48,000
function we can now take the body out
28719
21:26:45,360 --> 21:26:50,232
from the class and keep the prototype
28720
21:26:48,000 --> 21:26:52,232
here we can go down and really practice
28721
21:26:50,232 --> 21:26:54,232
on the setters and gators so let's do
28722
21:26:52,232 --> 21:26:56,639
that so we're going to grab them all
28723
21:26:54,232 --> 21:26:59,360
together because now you have the gist
28724
21:26:56,639 --> 21:27:02,399
about how this works we can copy them
28725
21:26:59,360 --> 21:27:04,232
and move them into the cpp file and
28726
21:27:02,399 --> 21:27:07,119
we're going to fix the code lined by
28727
21:27:04,232 --> 21:27:11,040
line here so let's make sure they are
28728
21:27:07,119 --> 21:27:13,279
aligned properly we have two left to do
28729
21:27:11,039 --> 21:27:15,279
let's do that and i really have to show
28730
21:27:13,279 --> 21:27:18,160
you this life because some people are
28731
21:27:15,279 --> 21:27:20,639
going to have problems regarding how i
28732
21:27:18,160 --> 21:27:23,192
did this so i want you to see this live
28733
21:27:20,639 --> 21:27:25,440
as i do this i'm not going to edit this
28734
21:27:23,191 --> 21:27:28,000
out so we're going to put our scope
28735
21:27:25,440 --> 21:27:30,000
resolution operator after our return
28736
21:27:28,000 --> 21:27:32,639
type here i'm going to say cylinder
28737
21:27:30,000 --> 21:27:35,679
cylinder can't type can i okay we have
28738
21:27:32,639 --> 21:27:37,759
this in and we can really copy this and
28739
21:27:35,679 --> 21:27:40,319
paste this into place wherever it is
28740
21:27:37,759 --> 21:27:42,479
needed so i'm going to paste that here i
28741
21:27:40,320 --> 21:27:44,960
am going to paste that here and i am
28742
21:27:42,479 --> 21:27:47,440
going to paste that here now we have
28743
21:27:44,960 --> 21:27:49,720
successfully moved all the functions in
28744
21:27:49,720 --> 21:27:54,960
cylinder.cpp and we can go back in our
28745
21:27:52,800 --> 21:27:57,360
header and remove the bodies because we
28746
21:27:54,960 --> 21:27:59,040
don't need them here if we keep them
28747
21:27:57,360 --> 21:28:00,960
here we're going to have two definitions
28748
21:27:59,039 --> 21:28:03,679
for this functions and we're going to
28749
21:28:00,960 --> 21:28:05,440
have compiler errors let's take this out
28750
21:28:03,679 --> 21:28:07,359
we're going to take the body out we're
28751
21:28:05,440 --> 21:28:09,360
going to take the body out and we're
28752
21:28:07,360 --> 21:28:11,919
going to take the body out let's do that
28753
21:28:11,919 --> 21:28:17,119
and now if we build our program it
28754
21:28:14,320 --> 21:28:19,040
should work we're going to work with gcc
28755
21:28:17,119 --> 21:28:21,360
see the world is good and if we try to
28756
21:28:19,039 --> 21:28:23,679
run the program it should give us what
28757
21:28:21,360 --> 21:28:24,479
it was given before this is the volume
28758
21:28:24,479 --> 21:28:29,759
one thing i want you to see is that you
28759
21:28:26,720 --> 21:28:32,320
don't want to keep two definitions for
28760
21:28:29,759 --> 21:28:34,720
your functions so for example we can
28761
21:28:32,320 --> 21:28:36,400
grab the body here and bring this back
28762
21:28:34,720 --> 21:28:38,399
in the header file i want you to see
28763
21:28:36,399 --> 21:28:41,191
what's going to happen if you do that i
28764
21:28:38,399 --> 21:28:43,191
am going to paste that in here and i am
28765
21:28:41,191 --> 21:28:46,000
going to move things a little bit to the
28766
21:28:43,191 --> 21:28:48,319
right to align things properly here so
28767
21:28:46,000 --> 21:28:51,191
if we do this the compiler is going to
28768
21:28:48,320 --> 21:28:53,040
see that we are calling that constructor
28769
21:28:51,191 --> 21:28:55,360
and the compiler is going to have no
28770
21:28:53,039 --> 21:28:57,831
problem with us but once we hit the
28771
21:28:55,360 --> 21:28:59,759
linker stage the linker is going to find
28772
21:28:57,831 --> 21:29:02,000
that we have two definitions for the
28773
21:28:59,759 --> 21:29:04,319
constructor here we have one in the
28774
21:29:04,320 --> 21:29:09,600
implementation file and this is going to
28775
21:29:07,039 --> 21:29:12,399
raise a compiler error saying we have
28776
21:29:09,600 --> 21:29:14,960
two definitions for the constructor here
28777
21:29:12,399 --> 21:29:17,039
and the linker want to know which one to
28778
21:29:14,960 --> 21:29:18,800
use so it's going to give you an error
28779
21:29:17,039 --> 21:29:21,191
let's build and really show you this
28780
21:29:18,800 --> 21:29:22,872
because this can be hard to debug if you
28781
21:29:21,191 --> 21:29:25,919
don't know what is happening okay you
28782
21:29:22,872 --> 21:29:28,720
see we have world finished with errors
28783
21:29:25,919 --> 21:29:31,279
and the problem is cylinder cylinder
28784
21:29:28,720 --> 21:29:33,680
double double is redefined we don't want
28785
21:29:31,279 --> 21:29:36,232
to have two definitions for the sum
28786
21:29:33,679 --> 21:29:39,039
function so once you move things from
28787
21:29:36,232 --> 21:29:41,600
header to implementation file be sure
28788
21:29:39,039 --> 21:29:43,759
you don't have any more definitions left
28789
21:29:41,600 --> 21:29:46,552
in the header or you're going to have
28790
21:29:43,759 --> 21:29:49,439
really hard to debug problems
28791
21:29:46,551 --> 21:29:52,720
and now i think we have our program
28792
21:29:49,440 --> 21:29:55,600
organized fairly well for what we know
28793
21:29:52,720 --> 21:29:58,720
so far about c plus plus we have our
28794
21:29:55,600 --> 21:30:00,872
constants living in another header file
28795
21:29:58,720 --> 21:30:03,279
and we have learnt about include cards
28796
21:30:00,872 --> 21:30:05,600
what we can use to guard against our
28797
21:30:03,279 --> 21:30:08,232
stuff being included more than once by
28798
21:30:05,600 --> 21:30:10,480
the preprocessor we have our cylinder
28799
21:30:08,232 --> 21:30:12,552
class living in its own file and again
28800
21:30:10,479 --> 21:30:14,639
we have an include guard here and you
28801
21:30:12,551 --> 21:30:16,872
can see that this class now is really
28802
21:30:14,639 --> 21:30:18,872
easy to look at we can look at the
28803
21:30:16,872 --> 21:30:21,120
information about the member functions
28804
21:30:18,872 --> 21:30:23,192
we have for example we have a default
28805
21:30:21,119 --> 21:30:25,599
constructor we have a constructor that
28806
21:30:23,191 --> 21:30:28,399
takes two parameters but we don't see
28807
21:30:25,600 --> 21:30:30,720
the details about how these things do
28808
21:30:28,399 --> 21:30:33,439
their jobs for example we don't see the
28809
21:30:30,720 --> 21:30:36,551
details about how the volume is computed
28810
21:30:33,440 --> 21:30:38,400
those details are hidden in the cpp file
28811
21:30:36,551 --> 21:30:40,872
and if you want to see them you need to
28812
21:30:38,399 --> 21:30:43,599
go to this implementation file here this
28813
21:30:40,872 --> 21:30:46,160
is a good design and i encourage to
28814
21:30:43,600 --> 21:30:48,000
split your c plus plus programs in
28815
21:30:46,160 --> 21:30:50,160
multiple files like this this is going
28816
21:30:48,000 --> 21:30:52,399
to make your life easier in this lecture
28817
21:30:50,160 --> 21:30:55,512
we're going to see how we can manage our
28818
21:30:52,399 --> 21:30:58,319
class objects through pointers and in
28819
21:30:55,512 --> 21:31:01,191
most cases we need to manage our class
28820
21:30:58,320 --> 21:31:04,160
object through pointers if we are using
28821
21:31:01,191 --> 21:31:06,399
some form of dynamic memory allocation
28822
21:31:04,160 --> 21:31:08,960
here is a simple example we have our
28823
21:31:06,399 --> 21:31:11,119
cylinder class included and down here
28824
21:31:08,960 --> 21:31:13,360
you see that we can create cylinder
28825
21:31:11,119 --> 21:31:15,919
objects on the stack if we use the
28826
21:31:13,360 --> 21:31:18,080
syntax like we do here the objects are
28827
21:31:15,919 --> 21:31:20,080
going to be created on the stack and we
28828
21:31:18,080 --> 21:31:22,720
have seen that we can access the
28829
21:31:20,080 --> 21:31:25,512
behaviors or data inside our class
28830
21:31:22,720 --> 21:31:27,360
object using the data notation like we
28831
21:31:25,512 --> 21:31:30,400
do here for example here we are calling
28832
21:31:27,360 --> 21:31:32,479
our volume function but sometimes we
28833
21:31:30,399 --> 21:31:35,039
want to manage our objects through
28834
21:31:32,479 --> 21:31:37,440
pointers for example if you look at the
28835
21:31:35,039 --> 21:31:40,399
syntax we have here we are saying
28836
21:31:37,440 --> 21:31:42,320
cylinder and using the asterisk here
28837
21:31:40,399 --> 21:31:45,279
this is going to say that this is going
28838
21:31:42,320 --> 21:31:47,360
to be a pointer to a cylinder type
28839
21:31:45,279 --> 21:31:51,191
and i'm going to give it a name c2 and
28840
21:31:47,360 --> 21:31:53,680
we can allocate our object on the heap
28841
21:31:51,191 --> 21:31:56,720
using the new operator this is going to
28842
21:31:53,679 --> 21:31:58,719
dynamically allocate space from the heap
28843
21:31:56,720 --> 21:32:02,800
and that memory space is going to be
28844
21:31:58,720 --> 21:32:04,960
used to store our cylinder object now
28845
21:32:02,800 --> 21:32:08,080
the interesting thing is going to happen
28846
21:32:04,960 --> 21:32:10,872
when you try to access behaviors from
28847
21:32:08,080 --> 21:32:13,360
your cylinder object here for example if
28848
21:32:10,872 --> 21:32:16,400
we look at this line here we are trying
28849
21:32:13,360 --> 21:32:18,232
to print the volume of this cylinder and
28850
21:32:16,399 --> 21:32:20,799
you notice that we have to go through
28851
21:32:18,232 --> 21:32:24,320
ugly dereferencing here we have to
28852
21:32:20,800 --> 21:32:27,440
dereference the object and then call our
28853
21:32:24,320 --> 21:32:29,360
method through the dot operator here but
28854
21:32:27,440 --> 21:32:31,600
what i want you to see is that we can
28855
21:32:29,360 --> 21:32:34,320
avoid this ugly the reference that we
28856
21:32:31,600 --> 21:32:37,440
are doing here and use the pointer
28857
21:32:34,320 --> 21:32:40,080
access notation this dash greater than
28858
21:32:37,440 --> 21:32:42,800
symbol you see here is going to allow us
28859
21:32:40,080 --> 21:32:45,680
to access stuff directly using the
28860
21:32:42,800 --> 21:32:48,400
pointer to an object that is dynamically
28861
21:32:45,679 --> 21:32:51,279
allocated on the hip okay after we are
28862
21:32:48,399 --> 21:32:53,679
done using our cylinder object remember
28863
21:32:51,279 --> 21:32:55,831
it is memory that was dynamically
28864
21:32:53,679 --> 21:32:57,679
allocated from the hip we have to
28865
21:32:55,831 --> 21:33:00,319
release the memory so that it can be
28866
21:32:57,679 --> 21:33:02,551
used by the operating system and we
28867
21:33:00,320 --> 21:33:05,680
release the memory using the delete
28868
21:33:02,551 --> 21:33:07,599
operator as we do here okay the idea i
28869
21:33:05,679 --> 21:33:10,551
wanted to introduce here is that we can
28870
21:33:07,600 --> 21:33:12,960
use players to manage our cylinder
28871
21:33:10,551 --> 21:33:16,000
objects and this is one way we can do
28872
21:33:12,960 --> 21:33:19,040
this and once we are using a pointer as
28873
21:33:16,000 --> 21:33:22,551
a handle to our cylinder object we can
28874
21:33:19,039 --> 21:33:25,599
use the pointer access operator here to
28875
21:33:22,551 --> 21:33:27,759
access stuff from our class objects
28876
21:33:25,600 --> 21:33:29,440
easily and another thing you should know
28877
21:33:27,759 --> 21:33:32,231
is that we can actually create a
28878
21:33:29,440 --> 21:33:34,551
cylinder object and store in the address
28879
21:33:32,232 --> 21:33:36,160
of objects that we have on the stack and
28880
21:33:34,551 --> 21:33:38,800
we're going to see this in a minute when
28881
21:33:36,160 --> 21:33:41,832
we hit visual studio code now that you
28882
21:33:38,800 --> 21:33:43,512
have an idea about this let's head over
28883
21:33:41,831 --> 21:33:46,231
to visual studio code and play with this
28884
21:33:43,512 --> 21:33:48,800
a little more okay here we are in our
28885
21:33:46,232 --> 21:33:51,440
working folder the current project is
28886
21:33:48,800 --> 21:33:54,160
managing class objects through pointers
28887
21:33:51,440 --> 21:33:56,080
we can see the entire name here and now
28888
21:33:54,160 --> 21:33:58,800
we're not going to grab our template
28889
21:33:56,080 --> 21:34:02,000
project because we want to start from
28890
21:33:58,800 --> 21:34:04,320
the project we had in this lecture on a
28891
21:34:02,000 --> 21:34:06,639
class across multiple files so we're
28892
21:34:04,320 --> 21:34:08,400
going to go in that project and grab
28893
21:34:08,399 --> 21:34:12,479
except for the executable because we
28894
21:34:12,479 --> 21:34:17,191
and we're going to go in our current
28895
21:34:14,399 --> 21:34:18,639
project and paste in the code and this
28896
21:34:17,191 --> 21:34:21,512
is going to give us a good starting
28897
21:34:18,639 --> 21:34:23,759
point so we can grab this and open
28898
21:34:21,512 --> 21:34:25,279
this project in visual studio code it's
28899
21:34:23,759 --> 21:34:27,360
going to open the folder and we're going
28900
21:34:25,279 --> 21:34:29,512
to have everything we want to start
28901
21:34:27,360 --> 21:34:32,639
doing what we want to do in this lecture
28902
21:34:29,512 --> 21:34:35,512
here so now we should have access to our
28903
21:34:32,639 --> 21:34:38,160
cylinder class and if you look here we
28904
21:34:35,512 --> 21:34:41,760
have an object of cylinder type already
28905
21:34:38,160 --> 21:34:43,600
created by this line on liner number six
28906
21:34:41,759 --> 21:34:46,639
here and we have seen that we can use
28907
21:34:43,600 --> 21:34:49,760
the syntax like cylinder volume here
28908
21:34:46,639 --> 21:34:53,119
using the dot call operator to access
28909
21:34:49,759 --> 21:34:54,959
stuff from our class object and this is
28910
21:34:53,119 --> 21:34:57,119
going to work but we want to see that we
28911
21:34:54,960 --> 21:34:59,192
can use pointers to manage our object
28912
21:34:57,119 --> 21:35:01,679
here and the first thing i want you to
28913
21:34:59,191 --> 21:35:04,319
see is that we can manage a stack object
28914
21:35:01,679 --> 21:35:06,231
through pointers and to really show this
28915
21:35:06,232 --> 21:35:10,639
another variable it's going to be a
28916
21:35:07,831 --> 21:35:12,720
cylinder pointer and it's going to be p
28917
21:35:10,639 --> 21:35:15,279
cylinder one it's going to be a pointer
28918
21:35:12,720 --> 21:35:18,080
to cylinder one here that's what i mean
28919
21:35:15,279 --> 21:35:20,639
and we can give it an address of
28920
21:35:18,080 --> 21:35:22,960
cylinder one as a value so we can do
28921
21:35:20,639 --> 21:35:25,831
that for example and put in the address
28922
21:35:22,960 --> 21:35:27,832
of operator and this is going to work
28923
21:35:25,831 --> 21:35:30,551
now we can go through our pointer here
28924
21:35:27,831 --> 21:35:32,871
and do stuff with this cylinder object
28925
21:35:30,551 --> 21:35:35,440
but the syntax is going to be pretty
28926
21:35:32,872 --> 21:35:37,512
ugly so for example let's try and print
28927
21:35:37,512 --> 21:35:42,800
we're going to say htdcl and say volume
28928
21:35:40,551 --> 21:35:45,039
can save that and we're going to have to
28929
21:35:42,800 --> 21:35:47,512
go through the dereference operator so
28930
21:35:45,039 --> 21:35:50,231
if we do something like p cylinder one
28931
21:35:47,512 --> 21:35:53,119
and try to use the dot operator
28932
21:35:50,232 --> 21:35:56,080
you're going to see that we have the
28933
21:35:53,119 --> 21:35:59,119
volume function but if we try to call it
28934
21:35:56,080 --> 21:36:01,600
let's do that let's make sure we are
28935
21:35:59,119 --> 21:36:03,831
using the dot operator here if we try to
28936
21:36:01,600 --> 21:36:05,512
compile this program it's not going to
28937
21:36:05,512 --> 21:36:11,119
we are trying to call stuff from a
28938
21:36:08,160 --> 21:36:13,360
pointer and remember a pointer is just
28939
21:36:11,119 --> 21:36:16,000
going to store an address it doesn't
28940
21:36:13,360 --> 21:36:18,479
really have information about the type
28941
21:36:16,000 --> 21:36:20,000
that it is pointing to if we try to
28942
21:36:18,479 --> 21:36:22,720
compile this program we're going to get
28943
21:36:20,000 --> 21:36:23,679
a compiler error so let's use gcc to do
28944
21:36:23,679 --> 21:36:28,959
and we're going to get request for
28945
21:36:25,600 --> 21:36:31,512
member volume in pc lender 1. remember p
28946
21:36:28,960 --> 21:36:33,680
cylinder 1 is just a pointer it's not an
28947
21:36:31,512 --> 21:36:35,680
object so we can't really call the
28948
21:36:35,679 --> 21:36:40,079
if we want to use the dot call operator
28949
21:36:38,232 --> 21:36:42,320
here we have to the reference and
28950
21:36:42,320 --> 21:36:47,600
object that the pointer is pointing to
28951
21:36:45,119 --> 21:36:49,279
and we do that using the star operator
28952
21:36:47,600 --> 21:36:51,192
you already know how to dereference a
28953
21:36:49,279 --> 21:36:53,360
pointer so we can dereference our
28954
21:36:51,191 --> 21:36:55,679
pointer and then call the volume
28955
21:36:53,360 --> 21:36:57,360
function on what the pointer is pointing
28956
21:36:55,679 --> 21:37:00,159
to and this is going to work it's going
28957
21:36:57,360 --> 21:37:02,160
to print out volume let's build now now
28958
21:37:00,160 --> 21:37:04,160
that we are dereferencing correctly and
28959
21:37:02,160 --> 21:37:07,120
you see that this is going to work and
28960
21:37:04,160 --> 21:37:09,440
if we try to print this let's bring up a
28961
21:37:07,119 --> 21:37:11,360
terminal so that we can run this program
28962
21:37:09,440 --> 21:37:14,000
let's run rooster you're going to see
28963
21:37:11,360 --> 21:37:17,279
that we have our volume here so to
28964
21:37:14,000 --> 21:37:19,360
really get to what is pointed to
28965
21:37:17,279 --> 21:37:21,191
you need to use the reference operator
28966
21:37:19,360 --> 21:37:23,831
and then call whatever method you want
28967
21:37:21,191 --> 21:37:26,159
to call on your object but we can do
28968
21:37:23,831 --> 21:37:28,959
things even easier there is a syntax we
28969
21:37:26,160 --> 21:37:30,960
can use to use the pointer directly here
28970
21:37:28,960 --> 21:37:33,280
because going through all this
28971
21:37:30,960 --> 21:37:35,280
dereferencing ugliness is really not
28972
21:37:33,279 --> 21:37:37,831
cool so we're going to grab this and
28973
21:37:35,279 --> 21:37:40,479
show you that we can use the dash
28974
21:37:37,831 --> 21:37:41,679
greater than operator that's how i
28975
21:37:41,679 --> 21:37:45,439
and if we use that we don't need to the
28976
21:37:45,440 --> 21:37:50,960
all we need to do is use the dash
28977
21:37:48,479 --> 21:37:51,679
greater than symbol here and it's going
28978
21:37:51,679 --> 21:37:57,191
directly tell the compiler don't code
28979
21:37:54,720 --> 21:37:59,440
stuff on the pointer directly do the
28980
21:37:57,191 --> 21:38:01,512
reference the pointer internally and
28981
21:37:59,440 --> 21:38:04,232
then call the volume function on
28982
21:38:01,512 --> 21:38:07,279
whatever you get after referencing so
28983
21:38:04,232 --> 21:38:09,600
this is basically going to push the the
28984
21:38:07,279 --> 21:38:12,551
referencing ugliness here behind the
28985
21:38:09,600 --> 21:38:15,120
curtains of the compiler and we can use
28986
21:38:12,551 --> 21:38:17,440
a nice syntax like this and i think this
28987
21:38:15,119 --> 21:38:19,831
is much better than what we were doing
28988
21:38:17,440 --> 21:38:21,680
here so if we try to bolt now we're
28989
21:38:19,831 --> 21:38:23,279
going to build and print our volume
28990
21:38:21,679 --> 21:38:26,079
you're going to see the bolt is good you
28991
21:38:23,279 --> 21:38:28,399
can clear and run rooster you see we see
28992
21:38:26,080 --> 21:38:31,919
our volume here so this is what i want
28993
21:38:28,399 --> 21:38:35,191
you to see it is possible to manage your
28994
21:38:31,919 --> 21:38:37,039
cylinder objects through pointers and
28995
21:38:35,191 --> 21:38:39,759
this is one way we can do this by
28996
21:38:37,039 --> 21:38:41,831
managing a stack object through pointers
28997
21:38:39,759 --> 21:38:44,159
and this is what we are doing here if
28998
21:38:41,831 --> 21:38:47,191
you want to call stuff on your class
28999
21:38:44,160 --> 21:38:50,000
object you can either do the ugly stuff
29000
21:38:47,191 --> 21:38:52,639
we do here or you can use the nice
29001
21:38:50,000 --> 21:38:54,551
pointer access operator and it is going
29002
21:38:52,639 --> 21:38:57,119
to be cool okay now that we have seen
29003
21:38:54,551 --> 21:38:59,440
this let's see another use case in which
29004
21:38:57,119 --> 21:39:01,679
we're going to be creating a cylinder
29005
21:38:59,440 --> 21:39:03,832
object on the heap through the new
29006
21:39:01,679 --> 21:39:06,159
operator okay we can go down and save
29007
21:39:03,831 --> 21:39:07,679
that we're going to say cylinder pointer
29008
21:39:07,679 --> 21:39:12,719
c lender 2. we can call it like this and
29009
21:39:10,720 --> 21:39:15,040
then we're going to say new cylinder and
29010
21:39:12,720 --> 21:39:16,399
you're going to see that we can call a
29011
21:39:16,399 --> 21:39:21,919
we have two types of constructors we can
29012
21:39:19,039 --> 21:39:24,159
call we're going to call our constructor
29013
21:39:21,919 --> 21:39:26,720
that takes two parameters and we can
29014
21:39:26,720 --> 21:39:31,831
100 why not oh let's put the two after
29015
21:39:29,759 --> 21:39:34,551
here we can put in whatever we want this
29016
21:39:31,831 --> 21:39:36,479
is going to create a new cylinder object
29017
21:39:34,551 --> 21:39:38,872
the space for the cylinder object is
29018
21:39:36,479 --> 21:39:41,360
going to be allocated on the hip so this
29019
21:39:38,872 --> 21:39:43,360
is a hip object and because we are using
29020
21:39:43,360 --> 21:39:47,279
the other thing you should have in mind
29021
21:39:45,279 --> 21:39:49,759
is that you will need to release this
29022
21:39:47,279 --> 21:39:52,080
memory and let's go and do that directly
29023
21:39:49,759 --> 21:39:54,720
this is a good practice because you will
29024
21:39:52,080 --> 21:39:56,800
forget to release your memory if you
29025
21:39:54,720 --> 21:39:59,279
don't really keep this in mind so we are
29026
21:39:56,800 --> 21:40:02,479
going to delete p cylinder 2 because
29027
21:39:59,279 --> 21:40:05,191
that's what we used to allocate our hip
29028
21:40:02,479 --> 21:40:07,679
memory here okay now that we have taken
29029
21:40:05,191 --> 21:40:10,479
care of memory management we can go in
29030
21:40:07,679 --> 21:40:12,719
and use our p cylinder to object
29031
21:40:10,479 --> 21:40:16,872
and for example we can print its volume
29032
21:40:12,720 --> 21:40:18,872
by using the stdc out statement here so
29033
21:40:16,872 --> 21:40:21,120
let's go down and save that
29034
21:40:18,872 --> 21:40:22,960
let's align this properly and we're
29035
21:40:22,960 --> 21:40:27,280
cylinder 2 to really make this super
29036
21:40:25,279 --> 21:40:28,720
clear and then we're going to say p
29037
21:40:28,720 --> 21:40:33,919
and call the volume function here this
29038
21:40:30,800 --> 21:40:36,639
is going to work let's draw in world the
29039
21:40:33,919 --> 21:40:38,800
world is good we can clear and run
29040
21:40:36,639 --> 21:40:41,039
rooster this is going to give us our
29041
21:40:38,800 --> 21:40:43,040
volume and if we try and use this
29042
21:40:41,039 --> 21:40:45,039
information to create a cylinder we're
29043
21:40:43,039 --> 21:40:47,759
going to see that the volume is what we
29044
21:40:45,039 --> 21:40:49,360
see here we can even try and print its
29045
21:40:49,360 --> 21:40:54,639
let's do that we're going to say sdd cl
29046
21:40:52,639 --> 21:40:56,960
we're going to say p cylinder 2 and
29047
21:40:54,639 --> 21:40:59,039
we're going to say base radius we can
29048
21:40:56,960 --> 21:41:01,192
hit the dot operator here you're going
29049
21:40:59,039 --> 21:41:03,679
to see we're going to have a few options
29050
21:41:01,191 --> 21:41:05,919
in a visual studio code here if we
29051
21:41:03,679 --> 21:41:07,679
double click on get base radius here
29052
21:41:05,919 --> 21:41:09,919
you're going to see that visual studio
29053
21:41:07,679 --> 21:41:12,079
code is going to use the pointer access
29054
21:41:09,919 --> 21:41:14,872
operator here and this is really cool so
29055
21:41:12,080 --> 21:41:17,831
we can hit std and yeah we can close the
29056
21:41:14,872 --> 21:41:20,479
left pane here because we need some more
29057
21:41:17,831 --> 21:41:23,439
breathing space and if we try to
29058
21:41:20,479 --> 21:41:26,319
build and run this program and we have a
29059
21:41:23,440 --> 21:41:29,040
compiler error here and the reason is
29060
21:41:26,320 --> 21:41:32,640
get base radius is a function
29061
21:41:29,039 --> 21:41:34,479
if we go back in our cylinder class we
29062
21:41:32,639 --> 21:41:37,512
see that we have a function called get
29063
21:41:34,479 --> 21:41:39,759
base radius so if we want to call this
29064
21:41:37,512 --> 21:41:42,400
in the main function we need to call
29065
21:41:39,759 --> 21:41:45,119
that as a function so we need to put a
29066
21:41:42,399 --> 21:41:47,279
pair of parentheses here and if we build
29067
21:41:45,119 --> 21:41:48,399
we should build without a problem let's
29068
21:41:48,399 --> 21:41:52,319
you see the build is good and if we run
29069
21:41:50,479 --> 21:41:54,959
the program we're going to see exactly
29070
21:41:52,320 --> 21:41:58,320
what we expect let's run a rooster we're
29071
21:41:54,960 --> 21:42:01,040
going to see what we expect here and the
29072
21:41:58,320 --> 21:42:02,720
message here was really that you can
29073
21:42:02,720 --> 21:42:07,919
class object through pointers one case
29074
21:42:06,160 --> 21:42:10,080
is when you have a pointer that is
29075
21:42:07,919 --> 21:42:12,319
pointing to a stack object and we saw
29076
21:42:10,080 --> 21:42:15,119
that we could do that here we can also
29077
21:42:12,320 --> 21:42:17,512
use pointer notation to allocate
29078
21:42:15,119 --> 21:42:19,919
objects on the heap and point to them
29079
21:42:17,512 --> 21:42:21,600
with our pointer here and whenever we
29080
21:42:19,919 --> 21:42:24,551
are using a pointer we have the option
29081
21:42:21,600 --> 21:42:26,872
to use the pointer call operator here to
29082
21:42:24,551 --> 21:42:29,360
do things easily i am going to be
29083
21:42:26,872 --> 21:42:32,000
calling this the pointer call operator
29084
21:42:29,360 --> 21:42:34,080
to mean this from here on if we happen
29085
21:42:32,000 --> 21:42:36,720
to need this and you should know what i
29086
21:42:34,080 --> 21:42:38,639
mean by that this is really all i set
29087
21:42:36,720 --> 21:42:40,720
out to share in this lecture i hope you
29088
21:42:38,639 --> 21:42:42,800
found it interesting we are going to
29089
21:42:40,720 --> 21:42:44,320
stop here in this lecture the next one
29090
21:42:42,800 --> 21:42:45,680
we're going to learn about these
29091
21:42:45,679 --> 21:42:49,831
go ahead and finish up here and meet me
29092
21:42:48,080 --> 21:42:52,080
there in this lecture we're going to
29093
21:42:49,831 --> 21:42:54,871
learn about these structures these
29094
21:42:52,080 --> 21:42:57,191
structures are spatial functions or
29095
21:42:54,872 --> 21:43:00,479
methods in a class that are called by
29096
21:42:57,191 --> 21:43:03,360
the compiler to destroy your object and
29097
21:43:00,479 --> 21:43:06,080
these are going to be especially useful
29098
21:43:03,360 --> 21:43:07,831
if you are for example allocating memory
29099
21:43:07,831 --> 21:43:13,191
let's look at the simple example here we
29100
21:43:10,232 --> 21:43:15,440
have a class called dog it has two
29101
21:43:13,191 --> 21:43:18,319
sections the public section and the
29102
21:43:15,440 --> 21:43:20,080
private section in the public section we
29103
21:43:18,320 --> 21:43:22,000
have two constructors a default
29104
21:43:20,080 --> 21:43:24,639
constructor that doesn't take any
29105
21:43:22,000 --> 21:43:26,479
parameter and a constructor that takes
29106
21:43:26,479 --> 21:43:31,679
the parameters are going to be used to
29107
21:43:29,039 --> 21:43:33,360
initialize our member variables and they
29108
21:43:31,679 --> 21:43:35,919
are passed by a value here for
29109
21:43:33,360 --> 21:43:38,320
simplicity and they are going to be used
29110
21:43:35,919 --> 21:43:41,440
to initialize these member variables
29111
21:43:38,320 --> 21:43:43,360
doug name dog breed and dog age
29112
21:43:41,440 --> 21:43:46,400
the special thing about this class is
29113
21:43:43,360 --> 21:43:49,119
that it has a destructor and you declare
29114
21:43:49,119 --> 21:43:53,831
syntax here he puts a tilde character in
29115
21:43:51,831 --> 21:43:56,639
front you say the name of the class and
29116
21:43:53,831 --> 21:43:59,119
then you put an empty parameter list it
29117
21:43:56,639 --> 21:44:01,919
is also possible to declare a destructor
29118
21:43:59,119 --> 21:44:04,399
and put in its entire body in the header
29119
21:44:01,919 --> 21:44:05,919
and this is the syntax to do this
29120
21:44:04,399 --> 21:44:08,551
inside the body you're going to do
29121
21:44:05,919 --> 21:44:11,360
whatever it is you need to destroy your
29122
21:44:08,551 --> 21:44:12,959
object for example if the class here is
29123
21:44:12,960 --> 21:44:17,920
constructor the destructor is the best
29124
21:44:15,759 --> 21:44:20,319
place to release that and this is an
29125
21:44:17,919 --> 21:44:23,191
example of how you can do that here is a
29126
21:44:20,320 --> 21:44:26,400
more direct example of how we allocate
29127
21:44:23,191 --> 21:44:28,319
for dynamic memory in the constructor
29128
21:44:26,399 --> 21:44:30,639
and release that memory in the
29129
21:44:28,320 --> 21:44:33,760
destructor we have our three variables
29130
21:44:30,639 --> 21:44:36,720
but we have chosen to allocate
29131
21:44:33,759 --> 21:44:39,679
our dog edge variable on the heap using
29132
21:44:36,720 --> 21:44:41,831
dynamic memory allocation and after we
29133
21:44:39,679 --> 21:44:44,551
dynamically allocate a piece of memory
29134
21:44:41,831 --> 21:44:46,399
to store our age variable we're going to
29135
21:44:44,551 --> 21:44:49,279
set that to 0 because we are in a
29136
21:44:46,399 --> 21:44:52,479
constructor if we are using the three
29137
21:44:49,279 --> 21:44:55,759
parameter constructor here we might use
29138
21:44:52,479 --> 21:44:58,159
the past parameter to initialize our age
29139
21:44:55,759 --> 21:45:00,080
variable but the important thing here is
29140
21:45:00,080 --> 21:45:07,600
dynamically educated memory on the hip
29141
21:45:03,191 --> 21:45:10,159
here and when our object dies we need to
29142
21:45:07,600 --> 21:45:12,800
remember to release that memory and the
29143
21:45:10,160 --> 21:45:14,800
destructor is the best place to release
29144
21:45:12,800 --> 21:45:17,919
that memory as you see here we say
29145
21:45:14,800 --> 21:45:20,080
delete dark age when our object dies and
29146
21:45:17,919 --> 21:45:22,399
the compiler is going to call this
29147
21:45:20,080 --> 21:45:23,440
function when it's about to kill the
29148
21:45:23,440 --> 21:45:29,191
so you might ask when are destructors
29149
21:45:27,119 --> 21:45:31,919
really called we are going to start by
29150
21:45:29,191 --> 21:45:34,551
looking at obvious cases here for
29151
21:45:31,919 --> 21:45:36,000
example when a local stack object goes
29152
21:45:36,000 --> 21:45:40,000
the destructor is going to be called
29153
21:45:37,759 --> 21:45:42,231
because that object is going to be wiped
29154
21:45:40,000 --> 21:45:43,191
out from memory so this is an obvious
29155
21:45:43,191 --> 21:45:48,551
in which the compiler will need to call
29156
21:45:45,279 --> 21:45:51,191
a destructor also when a hip object is
29157
21:45:48,551 --> 21:45:53,360
released from memory using delete the
29158
21:45:51,191 --> 21:45:55,512
destructor is also going to be called
29159
21:45:53,360 --> 21:45:57,831
but there are some indirect ways in
29160
21:45:55,512 --> 21:45:59,919
which the structures are also called for
29161
21:45:57,831 --> 21:46:01,759
example when an object is passed by a
29162
21:46:01,759 --> 21:46:07,599
this is going to call the destructor to
29163
21:46:04,720 --> 21:46:10,232
kill the object when the object goes out
29164
21:46:07,600 --> 21:46:12,000
of scope in the function because when an
29165
21:46:10,232 --> 21:46:14,160
object is passed by value we're going to
29166
21:46:12,000 --> 21:46:17,191
have a copy in the local scope of the
29167
21:46:14,160 --> 21:46:19,120
function and when the function exits
29168
21:46:17,191 --> 21:46:20,551
that local copy is going to be killed
29169
21:46:19,119 --> 21:46:23,119
and we're going to see an example of
29170
21:46:20,551 --> 21:46:25,360
that another case where you might have
29171
21:46:23,119 --> 21:46:27,831
the the structure called is when a local
29172
21:46:25,360 --> 21:46:30,080
object is returned from a function
29173
21:46:27,831 --> 21:46:32,720
another copy is going to be created to
29174
21:46:30,080 --> 21:46:34,960
be used outside the function and the
29175
21:46:32,720 --> 21:46:37,360
copy inside the function is going to be
29176
21:46:34,960 --> 21:46:40,480
killed but this is not guaranteed as
29177
21:46:37,360 --> 21:46:43,191
some compiler may optimize your return
29178
21:46:40,479 --> 21:46:44,639
value and use some kind of reference so
29179
21:46:43,191 --> 21:46:47,440
you're not guaranteed to see this
29180
21:46:44,639 --> 21:46:49,360
behavior but it is possible to see it
29181
21:46:47,440 --> 21:46:52,000
now that you have an idea about
29182
21:46:49,360 --> 21:46:54,160
destructors it's time we headed over to
29183
21:46:52,000 --> 21:46:56,800
visual studio code and play with us a
29184
21:46:54,160 --> 21:46:58,960
little more okay here we are in our
29185
21:46:56,800 --> 21:47:00,960
working folder the current project is
29186
21:46:58,960 --> 21:47:02,872
the structures we're going to grab our
29187
21:47:00,960 --> 21:47:05,192
template files pretty quick and we're
29188
21:47:02,872 --> 21:47:07,512
going to put them in place and after
29189
21:47:05,191 --> 21:47:09,512
that we're going to open our folder in
29190
21:47:07,512 --> 21:47:12,320
visual studio code by dragging and
29191
21:47:09,512 --> 21:47:15,440
dropping here this is going to open our
29192
21:47:12,320 --> 21:47:18,232
folder and we will see our main cpp file
29193
21:47:15,440 --> 21:47:20,551
here we can open it and i clean up and
29194
21:47:18,232 --> 21:47:22,960
remove what we don't need we have an
29195
21:47:20,551 --> 21:47:24,872
unneeded breakpoint here we can remove
29196
21:47:22,960 --> 21:47:26,720
that and we're going to clean up the
29197
21:47:24,872 --> 21:47:29,680
main function the first thing we want to
29198
21:47:26,720 --> 21:47:32,320
do is to put in our dog class i am going
29199
21:47:29,679 --> 21:47:34,079
to just put this in here because i don't
29200
21:47:32,320 --> 21:47:36,160
want you to watch me type all this
29201
21:47:34,080 --> 21:47:38,320
that's just going to waste your time we
29202
21:47:36,160 --> 21:47:40,800
have two sections in the dog class we
29203
21:47:38,320 --> 21:47:43,440
have a public section which is going to
29204
21:47:40,800 --> 21:47:45,040
now contain our constructors and we have
29205
21:47:43,440 --> 21:47:47,360
a private section which is going to
29206
21:47:45,039 --> 21:47:49,759
contain three member variables we have
29207
21:47:47,360 --> 21:47:52,080
two strengths one for the name and the
29208
21:47:49,759 --> 21:47:54,319
other for the breed of our dog and we
29209
21:47:52,080 --> 21:47:56,232
have another one which is an end pointer
29210
21:47:54,320 --> 21:47:59,040
which is going to store the edge of the
29211
21:47:56,232 --> 21:48:00,800
dog and you see that this is initialized
29212
21:47:59,039 --> 21:48:03,511
to no pointer one thing you should
29213
21:48:00,800 --> 21:48:06,232
notice is that for our parameter taken
29214
21:48:03,512 --> 21:48:09,191
constructor we are passing the string
29215
21:48:06,232 --> 21:48:12,639
information here using string views to
29216
21:48:09,191 --> 21:48:14,319
avoid copies with the std string view
29217
21:48:12,639 --> 21:48:16,319
type you already know this because we
29218
21:48:14,320 --> 21:48:18,552
learned about this but for this to work
29219
21:48:16,320 --> 21:48:20,872
we will need to include a string view so
29220
21:48:18,551 --> 21:48:23,440
let's do that and now we have our class
29221
21:48:20,872 --> 21:48:26,320
and we can use it however we want
29222
21:48:23,440 --> 21:48:29,191
so but before we do we need to put in
29223
21:48:26,320 --> 21:48:31,192
the implementations for these functions
29224
21:48:29,191 --> 21:48:33,599
one way we can do that is do that
29225
21:48:31,191 --> 21:48:35,919
directly in the function here but i want
29226
21:48:33,600 --> 21:48:38,400
you to see that you can also do that
29227
21:48:35,919 --> 21:48:40,160
directly outside the class here i don't
29228
21:48:38,399 --> 21:48:42,079
think i have shown you this but it is
29229
21:48:40,160 --> 21:48:44,872
possible to do that so we're going to
29230
21:48:42,080 --> 21:48:47,831
grab the prototype for our constructor
29231
21:48:44,872 --> 21:48:49,919
and say the scope resolution operator
29232
21:48:47,831 --> 21:48:52,479
and we're going to just paste in what we
29233
21:48:49,919 --> 21:48:54,551
have copied which is the prototype here
29234
21:48:52,479 --> 21:48:56,231
and we're going to go inside put in our
29235
21:48:54,551 --> 21:48:59,039
body and in the body we're going to
29236
21:48:56,232 --> 21:49:01,040
initialize these three guys
29237
21:48:59,039 --> 21:49:03,679
so the name is going to be initialized
29238
21:49:01,039 --> 21:49:06,719
to nem param and the bridge is going to
29239
21:49:03,679 --> 21:49:09,439
be initialized to breed the param we can
29240
21:49:06,720 --> 21:49:12,551
do that and the age is going to be
29241
21:49:09,440 --> 21:49:14,479
dynamically allocated from the hip you
29242
21:49:12,551 --> 21:49:17,440
see that it is a pointer so we're going
29243
21:49:14,479 --> 21:49:20,720
to say ph equals new and because we're
29244
21:49:17,440 --> 21:49:23,440
going to allocate dynamic space to store
29245
21:49:20,720 --> 21:49:26,399
an end and we're going to put data in
29246
21:49:23,440 --> 21:49:28,160
using our good old dereference operator
29247
21:49:28,160 --> 21:49:33,360
equals whatever ph parameter they passed
29248
21:49:31,600 --> 21:49:35,192
and i think we should say edge here
29249
21:49:33,360 --> 21:49:37,600
because it's not a pointer so we're
29250
21:49:35,191 --> 21:49:40,551
going to say age i think this is going
29251
21:49:37,600 --> 21:49:42,080
to do better age param this is probably
29252
21:49:40,551 --> 21:49:45,039
going to be better and we're going to
29253
21:49:42,080 --> 21:49:48,160
say age param okay so now we have our
29254
21:49:45,039 --> 21:49:50,551
constructor n and it's going to allocate
29255
21:49:48,160 --> 21:49:53,680
memory from the heap and we're going to
29256
21:49:50,551 --> 21:49:56,319
put data in that new memory location
29257
21:49:53,679 --> 21:49:58,551
that has just been allocated to our
29258
21:49:56,320 --> 21:50:00,160
class here so this is our class and we
29259
21:49:58,551 --> 21:50:02,800
can go in the main function and really
29260
21:50:00,160 --> 21:50:05,040
use it however we want for example we
29261
21:50:02,800 --> 21:50:07,360
can set up a dog object so we're going
29262
21:50:05,039 --> 21:50:09,360
to say my dog and we're going to give it
29263
21:50:07,360 --> 21:50:12,320
a name the name is going to be fluffy
29264
21:50:09,360 --> 21:50:14,232
and we're going to put the breed in and
29265
21:50:12,320 --> 21:50:16,232
it's going to just be a shepherd and
29266
21:50:14,232 --> 21:50:18,720
we're going to put in the age which is
29267
21:50:16,232 --> 21:50:20,800
going to be for example a 2. let's say
29268
21:50:20,800 --> 21:50:25,120
this is valid c plus plus code it's
29269
21:50:22,872 --> 21:50:27,832
going to be setting up an object of our
29270
21:50:25,119 --> 21:50:29,759
class here and we can world to see that
29271
21:50:27,831 --> 21:50:32,479
this program is going to world without a
29272
21:50:29,759 --> 21:50:34,000
problem so both is good but if we run
29273
21:50:32,479 --> 21:50:36,720
the program we're not going to see
29274
21:50:34,000 --> 21:50:38,551
anything but we don't really need to see
29275
21:50:36,720 --> 21:50:40,872
our constructor here called because we
29276
21:50:38,551 --> 21:50:43,191
already know about constructors what we
29277
21:50:40,872 --> 21:50:45,919
want to learn about are these structures
29278
21:50:43,191 --> 21:50:48,551
and these are spatial methods that are
29279
21:50:45,919 --> 21:50:51,119
called by the compiler when your object
29280
21:50:48,551 --> 21:50:54,080
dies let's set up a destructor and see
29281
21:50:51,119 --> 21:50:56,479
it called when our dog objects die the
29282
21:50:54,080 --> 21:50:58,400
syntax to do that is to use the tilde
29283
21:50:56,479 --> 21:51:00,080
character here you're going to say the
29284
21:50:58,399 --> 21:51:02,319
name of the class you're going to put an
29285
21:51:00,080 --> 21:51:04,720
empty parameter list and if you want you
29286
21:51:02,320 --> 21:51:07,040
can put a body and do whatever you want
29287
21:51:04,720 --> 21:51:10,232
to do in the body of your destructor
29288
21:51:07,039 --> 21:51:13,119
here but again we're going to move the
29289
21:51:10,232 --> 21:51:15,919
entire definition of the destructor to
29290
21:51:13,119 --> 21:51:17,599
the outside so let's go down and save
29291
21:51:15,919 --> 21:51:19,279
that we're going to say the scope
29292
21:51:17,600 --> 21:51:21,920
resolution operator we're going to say
29293
21:51:19,279 --> 21:51:24,720
dog and we're going to put in our body
29294
21:51:21,919 --> 21:51:27,919
and the first thing we want to do in our
29295
21:51:24,720 --> 21:51:31,279
destructor is to release this memory
29296
21:51:27,919 --> 21:51:33,440
that was dynamically allocated for us if
29297
21:51:31,279 --> 21:51:35,831
we don't release it when this dark
29298
21:51:33,440 --> 21:51:37,832
object dies we're going to link memory
29299
21:51:35,831 --> 21:51:39,679
and that's really bad so let's do that
29300
21:51:37,831 --> 21:51:42,871
directly in the destructor we can say
29301
21:51:39,679 --> 21:51:45,439
delete and say ph this is going to
29302
21:51:42,872 --> 21:51:48,080
release the memory that was allocated in
29303
21:51:45,440 --> 21:51:51,119
the constructor here and we have access
29304
21:51:48,080 --> 21:51:54,320
to this ph variable because the
29305
21:51:51,119 --> 21:51:56,639
destructor is part of our class
29306
21:51:54,320 --> 21:51:58,640
any member function of your class is
29307
21:51:56,639 --> 21:52:00,960
going to have access to any member
29308
21:51:58,639 --> 21:52:02,080
variable even if it happens to be
29309
21:52:02,080 --> 21:52:07,600
okay so we forgot our tilde character
29310
21:52:05,039 --> 21:52:10,079
let's put that in here and this is going
29311
21:52:07,600 --> 21:52:12,480
to be valid c plus plus code but to
29312
21:52:10,080 --> 21:52:14,800
really see things happening here let's
29313
21:52:12,479 --> 21:52:17,279
put in an sddc out statement we're going
29314
21:52:14,800 --> 21:52:19,040
to say doug destructor called 4 and
29315
21:52:17,279 --> 21:52:21,039
we're going to say the name of the dog
29316
21:52:19,039 --> 21:52:23,191
let's say name and we're going to say
29317
21:52:21,039 --> 21:52:26,159
the same thing in the constructor we're
29318
21:52:23,191 --> 21:52:29,279
going to say hddcl and say dog
29319
21:52:26,160 --> 21:52:31,360
constructor cold for and we're going to
29320
21:52:29,279 --> 21:52:33,679
say the dog name going to use our member
29321
21:52:31,360 --> 21:52:36,479
variable and now we have our thing in
29322
21:52:33,679 --> 21:52:39,119
place we have the destructor declared in
29323
21:52:36,479 --> 21:52:41,191
the class definition and this is the
29324
21:52:39,119 --> 21:52:43,191
syntax again this is what we really want
29325
21:52:41,191 --> 21:52:45,440
to learn about in this lecture we have
29326
21:52:43,191 --> 21:52:48,479
the tilde character we have the class
29327
21:52:45,440 --> 21:52:50,800
name and we put an empty parameter list
29328
21:52:48,479 --> 21:52:53,759
let me tell you that it is not possible
29329
21:52:50,800 --> 21:52:54,872
to pass parameters to your destructor if
29330
21:52:53,759 --> 21:52:57,360
you do that you're going to get a
29331
21:52:54,872 --> 21:53:00,872
compiler error the structures will
29332
21:52:57,360 --> 21:53:03,512
always have no parameters in c plus plus
29333
21:53:00,872 --> 21:53:05,760
here we have the definition of our
29334
21:53:03,512 --> 21:53:07,760
destructor and it is going to release
29335
21:53:05,759 --> 21:53:10,479
whatever memory we have dynamically
29336
21:53:07,759 --> 21:53:12,399
allocated from the constructor here if
29337
21:53:12,399 --> 21:53:16,551
we're going to see our constructor
29338
21:53:14,000 --> 21:53:19,512
called as a result of this line here
29339
21:53:16,551 --> 21:53:20,959
because we are constructing a dog object
29340
21:53:19,512 --> 21:53:22,872
and we're going to see the destructor
29341
21:53:20,960 --> 21:53:24,000
called when the main function is about
29342
21:53:24,000 --> 21:53:28,320
let's put an stdc out state to mention
29343
21:53:26,160 --> 21:53:31,040
the main function here and say done just
29344
21:53:28,320 --> 21:53:32,720
to prove that we have hit the end of our
29345
21:53:31,039 --> 21:53:35,279
main function here i think this is
29346
21:53:32,720 --> 21:53:37,919
useful and we're going to build so let's
29347
21:53:35,279 --> 21:53:39,440
do that we're going to build with gcc
29348
21:53:37,919 --> 21:53:42,080
you're going to see that the world is
29349
21:53:39,440 --> 21:53:44,872
good so we can clear and run or program
29350
21:53:42,080 --> 21:53:46,720
let's hit enter here and clear and run
29351
21:53:44,872 --> 21:53:49,192
rooster you're going to see that the
29352
21:53:46,720 --> 21:53:52,000
constructor was called we are going to
29353
21:53:49,191 --> 21:53:54,871
say done when the main function is about
29354
21:53:52,000 --> 21:53:57,831
to end but before the main function ends
29355
21:53:54,872 --> 21:53:59,919
we're going to destroy any stack data
29356
21:53:57,831 --> 21:54:02,720
that we have in the main function and
29357
21:53:59,919 --> 21:54:05,039
our dog object is on the stats so it's
29358
21:54:02,720 --> 21:54:07,600
going to be destroyed as part of that
29359
21:54:05,039 --> 21:54:09,511
process and the destructor for dog is
29360
21:54:07,600 --> 21:54:11,512
going to be called and we're going to
29361
21:54:09,512 --> 21:54:13,760
release our memory and we're going to
29362
21:54:11,512 --> 21:54:15,119
say that dog destructor was called for
29363
21:54:15,119 --> 21:54:21,440
we have assigned to our dog here so this
29364
21:54:18,320 --> 21:54:23,512
is how destructors are called when your
29365
21:54:23,512 --> 21:54:29,832
and we didn't put in the correct name
29366
21:54:26,960 --> 21:54:31,600
we said fluffy let's say fluffy because
29367
21:54:29,831 --> 21:54:33,679
that's what i wanted and now you see
29368
21:54:31,600 --> 21:54:35,920
that our destructor is really being
29369
21:54:33,679 --> 21:54:38,231
called and releasing memory however we
29370
21:54:35,919 --> 21:54:40,872
want but we can also go a little further
29371
21:54:38,232 --> 21:54:42,872
and show you another example of a case
29372
21:54:40,872 --> 21:54:45,360
where the structures are called and
29373
21:54:42,872 --> 21:54:47,760
we're going to look at a function that
29374
21:54:45,360 --> 21:54:49,600
sets up a local object of a dog we're
29375
21:54:47,759 --> 21:54:51,919
going to see the dog constructed and
29376
21:54:49,600 --> 21:54:54,552
we're going to see it destroyed when the
29377
21:54:51,919 --> 21:54:56,551
function is about to end let's do that
29378
21:54:54,551 --> 21:54:58,551
we're going to say void some funk and
29379
21:54:56,551 --> 21:55:00,720
it's going to be just some function to
29380
21:54:58,551 --> 21:55:04,159
play with us we're going to
29381
21:55:00,720 --> 21:55:05,191
move our dog declaration in some funk
29382
21:55:05,191 --> 21:55:08,720
and this is really it we're going to
29383
21:55:08,720 --> 21:55:12,160
and when we call it we're going to
29384
21:55:10,080 --> 21:55:14,400
construct the object here when the
29385
21:55:12,160 --> 21:55:15,919
function is about to end the compiler is
29386
21:55:14,399 --> 21:55:18,159
going to call the destructor because
29387
21:55:15,919 --> 21:55:19,599
it's going to destroy this object here
29388
21:55:18,160 --> 21:55:22,552
and we're going to see the destructor
29389
21:55:19,600 --> 21:55:24,480
called by that point the some funk
29390
21:55:22,551 --> 21:55:26,399
function is going to be popped off the
29391
21:55:24,479 --> 21:55:27,919
top of the stack we're going to hit the
29392
21:55:26,399 --> 21:55:30,799
main function here and we're going to
29393
21:55:27,919 --> 21:55:32,872
say done and the program is going to end
29394
21:55:30,800 --> 21:55:34,720
let's call some funky name here so we're
29395
21:55:32,872 --> 21:55:37,440
going to say some funk and we're going
29396
21:55:34,720 --> 21:55:39,831
to world to really see this happening so
29397
21:55:37,440 --> 21:55:41,919
we have worked successfully we can clear
29398
21:55:39,831 --> 21:55:44,000
clear properly and run rooster we're
29399
21:55:41,919 --> 21:55:46,399
going to see constructor called for
29400
21:55:44,000 --> 21:55:48,720
fluffy the structure called for fluffy
29401
21:55:46,399 --> 21:55:51,439
and you see done we have hit the main
29402
21:55:48,720 --> 21:55:54,000
function and really finished executing
29403
21:55:51,440 --> 21:55:56,080
our program here we can even see this
29404
21:55:54,000 --> 21:55:59,191
through the debugger we're going to set
29405
21:55:56,080 --> 21:56:01,360
up three break points one in the main
29406
21:55:59,191 --> 21:56:03,191
function here before we call the some
29407
21:56:01,360 --> 21:56:06,232
funk function we're going to set up
29408
21:56:03,191 --> 21:56:08,319
another one in our destructor before we
29409
21:56:06,232 --> 21:56:11,040
print the message here and we're going
29410
21:56:08,320 --> 21:56:13,360
to put another one in the constructor
29411
21:56:11,039 --> 21:56:16,479
when we are about to print this message
29412
21:56:13,360 --> 21:56:19,279
here on line 20. after we set up these
29413
21:56:16,479 --> 21:56:22,479
break points we kind of kill the
29414
21:56:19,279 --> 21:56:24,800
terminal here and minimize a little bit
29415
21:56:22,479 --> 21:56:27,440
let's kill these things here so that we
29416
21:56:24,800 --> 21:56:30,479
have a clean ah we have a lot of windows
29417
21:56:27,440 --> 21:56:34,160
here okay we have our editor here
29418
21:56:30,479 --> 21:56:37,119
and now if we go to the tab here that
29419
21:56:34,160 --> 21:56:39,440
says start or run we're going to be able
29420
21:56:37,119 --> 21:56:42,080
to click the green button here to start
29421
21:56:39,440 --> 21:56:44,320
our debugging session we are going to
29422
21:56:42,080 --> 21:56:46,400
have a terminal here so let's bring that
29423
21:56:44,320 --> 21:56:49,760
to the side so that we can see things
29424
21:56:46,399 --> 21:56:52,159
printed out nicely let's do like this
29425
21:56:49,759 --> 21:56:54,639
and now we have hit the break point in
29426
21:56:52,160 --> 21:56:56,800
the main function we can step into
29427
21:56:54,639 --> 21:56:59,759
the sum func function and we're going to
29428
21:56:56,800 --> 21:57:01,440
do that using the step into button here
29429
21:56:59,759 --> 21:57:03,511
let's click that we're going to jump
29430
21:57:03,512 --> 21:57:09,512
now we have the option to step into but
29431
21:57:06,160 --> 21:57:12,552
this is going to jump us into the logic
29432
21:57:09,512 --> 21:57:15,040
of transforming the string literal here
29433
21:57:12,551 --> 21:57:16,959
into a string view because if you see
29434
21:57:15,039 --> 21:57:19,191
the constructor is going to take string
29435
21:57:16,960 --> 21:57:20,400
view parameters we can actually see this
29436
21:57:20,399 --> 21:57:24,871
and hit the step into button you see
29437
21:57:22,232 --> 21:57:27,512
that we are in the string view class and
29438
21:57:24,872 --> 21:57:30,872
we don't really want this so let's step
29439
21:57:27,512 --> 21:57:32,960
out and we're going to step over this
29440
21:57:30,872 --> 21:57:35,040
so that we can hit the next breakpoint
29441
21:57:32,960 --> 21:57:38,400
and you see the next breakpoint is in
29442
21:57:35,039 --> 21:57:39,759
our constructor and this proves that the
29443
21:57:39,759 --> 21:57:45,039
constructor here to build our object
29444
21:57:42,800 --> 21:57:47,600
if we step over this we're going to
29445
21:57:45,039 --> 21:57:50,000
print the message from the constructor
29446
21:57:47,600 --> 21:57:51,120
and if we keep going we're going to get
29447
21:57:51,119 --> 21:57:55,679
our constructor and you see where this
29448
21:57:54,000 --> 21:57:58,479
is going to go this is going to go in
29449
21:57:55,679 --> 21:58:01,511
the destructor because before we leave
29450
21:57:58,479 --> 21:58:03,599
the some func function our dot objects
29451
21:58:01,512 --> 21:58:05,832
is going to be destroyed so we're going
29452
21:58:03,600 --> 21:58:08,800
to release our memory and we're going to
29453
21:58:05,831 --> 21:58:12,000
branch the message from our constructor
29454
21:58:08,800 --> 21:58:14,080
and if we hit next and a step out of
29455
21:58:12,000 --> 21:58:16,399
this i think we can do that because this
29456
21:58:14,080 --> 21:58:19,919
is logic we don't want we're going to
29457
21:58:16,399 --> 21:58:22,000
try and step over this and now if we hit
29458
21:58:19,919 --> 21:58:24,080
next we're going to come back in some
29459
21:58:22,000 --> 21:58:26,320
funk and some funk is already going to
29460
21:58:24,080 --> 21:58:27,831
be finished and if we hit next we're
29461
21:58:26,320 --> 21:58:30,320
going to come back in main and we're
29462
21:58:27,831 --> 21:58:32,720
going to print done and the program is
29463
21:58:30,320 --> 21:58:34,080
basically going to be done hopefully you
29464
21:58:34,080 --> 21:58:39,360
the compiler is going to call our
29465
21:58:36,551 --> 21:58:41,512
destructor after it leaves some funk
29466
21:58:39,360 --> 21:58:44,320
here because it's going to be destroying
29467
21:58:41,512 --> 21:58:46,720
the local object that we have inside
29468
21:58:44,320 --> 21:58:48,640
some funk here so this is one case where
29469
21:58:46,720 --> 21:58:51,512
the destructor is going to be called by
29470
21:58:48,639 --> 21:58:54,720
the compiler and it is if you have a
29471
21:58:51,512 --> 21:58:57,279
local object that needs to be destroyed
29472
21:58:54,720 --> 21:59:00,232
when function scope finishes another
29473
21:58:57,279 --> 21:59:02,000
case where the destructor may be called
29474
21:59:04,399 --> 21:59:09,511
parameter by value so let's change some
29475
21:59:07,512 --> 21:59:11,512
function here and make it take something
29476
21:59:09,512 --> 21:59:14,479
by value so we're going to pass a dog
29477
21:59:11,512 --> 21:59:16,479
inside and we're going to say dog param
29478
21:59:14,479 --> 21:59:18,959
this is going to do okay now that we
29479
21:59:16,479 --> 21:59:21,039
have changed some func here we can
29480
21:59:18,960 --> 21:59:22,960
really do all kinds of crazy things with
29481
21:59:21,039 --> 21:59:26,000
it for example we can set up our dog
29482
21:59:22,960 --> 21:59:29,440
object inside our main function here so
29483
21:59:26,000 --> 21:59:31,600
let's do that we can say dog and dog the
29484
21:59:29,440 --> 21:59:32,872
variable name is going to be dog we can
29485
21:59:32,872 --> 21:59:37,440
a name which is going to be fluffy it's
29486
21:59:35,191 --> 21:59:39,599
going to have a breed of shepherd and we
29487
21:59:37,440 --> 21:59:42,080
can give it the age of 2 like we have
29488
21:59:39,600 --> 21:59:45,279
been doing all along we can call our
29489
21:59:42,080 --> 21:59:47,191
function with the dog object here but be
29490
21:59:45,279 --> 21:59:49,360
careful about what is going to happen
29491
21:59:47,191 --> 21:59:51,679
here when we do something like this
29492
21:59:49,360 --> 21:59:53,600
we're going to be passing by value and
29493
21:59:51,679 --> 21:59:56,719
the compiler is going to see that it
29494
21:59:56,720 --> 22:00:03,119
now we haven't really told our class
29495
21:59:59,679 --> 22:00:05,359
here how to copy dog objects and we do
29496
22:00:03,119 --> 22:00:07,679
that through constructors we call copy
29497
22:00:05,360 --> 22:00:09,512
constructors we haven't really learned
29498
22:00:07,679 --> 22:00:12,159
about yet but what the compiler is going
29499
22:00:09,512 --> 22:00:14,720
to do by default is copy these things
29500
22:00:12,160 --> 22:00:16,872
member by member so it's going to set up
29501
22:00:14,720 --> 22:00:20,000
a doug copy object which is going to be
29502
22:00:16,872 --> 22:00:22,232
initialized with empty strings and a
29503
22:00:20,000 --> 22:00:25,119
null pointer here and then it's going to
29504
22:00:25,119 --> 22:00:29,599
that we have here it's going to take the
29505
22:00:27,191 --> 22:00:31,919
name and copy that in the name member
29506
22:00:29,600 --> 22:00:34,480
variable of our dark copy it's going to
29507
22:00:31,919 --> 22:00:36,551
take the breed and copy that n in the
29508
22:00:34,479 --> 22:00:38,959
second member variable here and it's
29509
22:00:36,551 --> 22:00:41,119
going to take the age from our dog and
29510
22:00:38,960 --> 22:00:42,960
copy that in the problem is going to
29511
22:00:41,119 --> 22:00:45,599
come to this pointer here it's going to
29512
22:00:42,960 --> 22:00:47,920
copy the address and it's not going to
29513
22:00:45,600 --> 22:00:50,080
copy what it's pointed to and this is
29514
22:00:47,919 --> 22:00:51,679
going to be a recipe for a disaster i
29515
22:00:50,080 --> 22:00:54,080
don't really want to go through this
29516
22:00:51,679 --> 22:00:56,159
right now but if we try to run this
29517
22:00:54,080 --> 22:00:58,960
program it's not going to work like we
29518
22:00:56,160 --> 22:01:01,192
expect for example if we pass fluffy
29519
22:01:01,191 --> 22:01:06,720
things that we don't expect so let's try
29520
22:01:03,679 --> 22:01:09,679
to build we're going to build with gcc
29521
22:01:06,720 --> 22:01:11,919
and the bolt is good so what we expect
29522
22:01:09,679 --> 22:01:14,159
is to have the constructor of fluffy
29523
22:01:11,919 --> 22:01:17,360
here called and we're going to copy the
29524
22:01:14,160 --> 22:01:20,000
dot object for use in some funk here and
29525
22:01:17,360 --> 22:01:21,831
to set up this copy it's not this
29526
22:01:20,000 --> 22:01:22,872
constructor here that is going to be
29527
22:01:22,872 --> 22:01:26,551
so it's not our constructor here which
29528
22:01:24,960 --> 22:01:27,600
is going to be called so we're not going
29529
22:01:27,600 --> 22:01:32,720
this called for the copy that we set up
29530
22:01:30,320 --> 22:01:35,512
inside some funk another thing is
29531
22:01:32,720 --> 22:01:37,831
because now these two dog objects are
29532
22:01:35,512 --> 22:01:41,440
pointing to the same thing because what
29533
22:01:37,831 --> 22:01:44,159
we just copied is the address as we see
29534
22:01:41,440 --> 22:01:46,000
in our member variable here the two dog
29535
22:01:44,160 --> 22:01:48,400
objects are going to be pointing to the
29536
22:01:46,000 --> 22:01:50,551
same thing in memory and when we hit the
29537
22:01:48,399 --> 22:01:52,639
destructor we're going to call delete
29538
22:01:50,551 --> 22:01:55,039
twice and this is going to be a recipe
29539
22:01:52,639 --> 22:01:57,191
for disaster our application could
29540
22:01:55,039 --> 22:02:00,000
really crash you already know that
29541
22:01:57,191 --> 22:02:02,080
deleting a pointer twice is really bad
29542
22:02:00,000 --> 22:02:04,000
we shouldn't do this and we are doing
29543
22:02:02,080 --> 22:02:06,400
this here because we are copying i
29544
22:02:04,000 --> 22:02:07,440
realize this is a slightly confusing
29545
22:02:07,440 --> 22:02:11,919
but what i want you to know is that if
29546
22:02:09,600 --> 22:02:12,720
you pass a class object by value like
29547
22:02:12,720 --> 22:02:18,160
the copy you have inside is going to
29548
22:02:15,360 --> 22:02:20,639
cause for the destructor to be called
29549
22:02:18,160 --> 22:02:22,320
when the function exits because the copy
29550
22:02:20,639 --> 22:02:24,639
is going to be scoped inside the
29551
22:02:22,320 --> 22:02:26,640
function here so let's take out this
29552
22:02:24,639 --> 22:02:28,720
example because it really is confusing
29553
22:02:26,639 --> 22:02:30,720
but i hope you know that and i am going
29554
22:02:28,720 --> 22:02:32,960
to show you that another case where you
29555
22:02:30,720 --> 22:02:37,191
might see the destructor called is when
29556
22:02:32,960 --> 22:02:39,680
you call the destructor explicitly using
29557
22:02:37,191 --> 22:02:41,919
the delete operator on your object so we
29558
22:02:39,679 --> 22:02:44,079
can set up some func again let's do that
29559
22:02:41,919 --> 22:02:45,679
some funk and we're going to repurpose
29560
22:02:44,080 --> 22:02:48,960
it and inside we're going to set up a
29561
22:02:45,679 --> 22:02:51,511
dag object so let's grab this and reuse
29562
22:02:48,960 --> 22:02:53,832
that in our function here and we're
29563
22:02:51,512 --> 22:02:56,800
going to say dog pointer so let's say
29564
22:02:53,831 --> 22:02:59,511
dog pointer we're going to say p dog p
29565
22:02:56,800 --> 22:03:02,400
underscore dog it's going to be equals
29566
22:02:59,512 --> 22:03:04,720
to new dog and we're going to pass in
29567
22:03:02,399 --> 22:03:07,039
what we need to initialize our dog
29568
22:03:04,720 --> 22:03:09,040
object with this is going to create a
29569
22:03:07,039 --> 22:03:11,759
dark object on the hip and it is going
29570
22:03:09,039 --> 22:03:14,159
to be pointed to by p dog here
29571
22:03:11,759 --> 22:03:17,119
now i want you to see that if we don't
29572
22:03:14,160 --> 22:03:20,000
explicitly release the memory that we
29573
22:03:17,119 --> 22:03:22,319
allocate through the new operator we're
29574
22:03:20,000 --> 22:03:24,960
going to leak memory so we created an
29575
22:03:22,320 --> 22:03:27,440
object on the hip here but we're not
29576
22:03:24,960 --> 22:03:29,280
deleting that in some funk when some
29577
22:03:27,440 --> 22:03:31,600
funk exits we're going to lose this
29578
22:03:29,279 --> 22:03:34,160
pointer this variable because it is on
29579
22:03:31,600 --> 22:03:36,232
the stack itself and we won't have any
29580
22:03:34,160 --> 22:03:38,320
way to release this memory let's call
29581
22:03:36,232 --> 22:03:40,000
some funk here and really show you this
29582
22:03:38,320 --> 22:03:42,480
so we're going to call some funk and
29583
22:03:40,000 --> 22:03:44,872
we're going to build let's use gcc for
29584
22:03:42,479 --> 22:03:47,279
that the build is good we can bring this
29585
22:03:44,872 --> 22:03:48,960
up a little bit and clear and run
29586
22:03:47,279 --> 22:03:51,279
rooster we're going to see that the
29587
22:03:48,960 --> 22:03:54,000
constructor for fluffy was called
29588
22:03:51,279 --> 22:03:55,679
because of this new operator but we
29589
22:03:54,000 --> 22:03:57,191
didn't see the destructor called and
29590
22:03:57,191 --> 22:04:02,080
so for the destructor to be called we
29591
22:03:59,440 --> 22:04:04,720
need to explicitly release the memory in
29592
22:04:02,080 --> 22:04:07,512
this function here and we do that by
29593
22:04:04,720 --> 22:04:09,919
using the delete keyword and saying the
29594
22:04:07,512 --> 22:04:12,232
pointer that is pointing to the memory
29595
22:04:09,919 --> 22:04:14,319
that we want to release if we do this
29596
22:04:12,232 --> 22:04:16,960
this is going to cause for the the
29597
22:04:14,320 --> 22:04:18,720
structure of doubt to be called and if
29598
22:04:16,960 --> 22:04:20,480
we run we're going to see our destructor
29599
22:04:18,720 --> 22:04:23,119
called let's do that we're going to use
29600
22:04:20,479 --> 22:04:25,119
gcc the bolt is good you can clear and
29601
22:04:23,119 --> 22:04:27,440
run rooster now you see that the
29602
22:04:25,119 --> 22:04:30,639
constructor is called full fluffy and we
29603
22:04:27,440 --> 22:04:32,551
have the destructor cold this is really
29604
22:04:30,639 --> 22:04:35,191
all i wanted to share with you in this
29605
22:04:32,551 --> 22:04:37,679
lecture i apologize if you found it
29606
22:04:35,191 --> 22:04:40,551
confusing but if you have any problem i
29607
22:04:37,679 --> 22:04:42,871
am always available please do ask and i
29608
22:04:40,551 --> 22:04:45,599
will do the best i can to help you out
29609
22:04:42,872 --> 22:04:47,600
so the destructor is a special method
29610
22:04:45,600 --> 22:04:50,080
which is going to be called when your
29611
22:04:47,600 --> 22:04:52,320
object dies it is going to be called
29612
22:04:50,080 --> 22:04:54,479
when an object is passed by a value to a
29613
22:04:52,320 --> 22:04:56,400
function we have seen an example that
29614
22:04:54,479 --> 22:04:58,479
it's going to be called when a local
29615
22:04:56,399 --> 22:05:00,871
object is returned from a function by
29616
22:04:58,479 --> 22:05:02,872
value but this is going to be compiler
29617
22:05:00,872 --> 22:05:05,512
dependent because some compilers are
29618
22:05:02,872 --> 22:05:08,080
going to optimize this out and make it
29619
22:05:05,512 --> 22:05:10,160
look like when you returned by reference
29620
22:05:08,080 --> 22:05:13,360
so i don't want to go into this because
29621
22:05:10,160 --> 22:05:15,279
this is subject to compiler optimization
29622
22:05:13,360 --> 22:05:17,680
but other cases where you're going to
29623
22:05:15,279 --> 22:05:20,720
have your destructor called is when a
29624
22:05:17,679 --> 22:05:23,511
local stack object goes out of scope and
29625
22:05:23,512 --> 22:05:27,680
through the delete key world this is
29626
22:05:25,919 --> 22:05:30,000
really all i had to share in this
29627
22:05:27,679 --> 22:05:32,000
lecture i hope you found it interesting
29628
22:05:30,000 --> 22:05:33,679
we are going to stop here in this one
29629
22:05:32,000 --> 22:05:36,479
and the next one we're going to see the
29630
22:05:33,679 --> 22:05:38,639
order in which constructors and these
29631
22:05:36,479 --> 22:05:40,800
structures are called and you really
29632
22:05:44,720 --> 22:05:50,000
and this lecture i wanted to raise your
29633
22:05:47,360 --> 22:05:52,479
awareness on the order in which
29634
22:05:50,000 --> 22:05:54,872
constructors and the structures are
29635
22:05:52,479 --> 22:05:57,599
called suppose we have our class which
29636
22:05:54,872 --> 22:05:59,832
is dug here and we have the constructor
29637
22:05:57,600 --> 22:06:02,320
which is doing its thing in the body
29638
22:05:59,831 --> 22:06:04,399
here and we have the destructor which is
29639
22:06:02,320 --> 22:06:07,120
releasing our memory and printing
29640
22:06:04,399 --> 22:06:08,799
something out so suppose we have created
29641
22:06:08,800 --> 22:06:13,279
of this class here and they have
29642
22:06:10,872 --> 22:06:15,512
different names and they have the same
29643
22:06:13,279 --> 22:06:16,399
breed and different edges as you see
29644
22:06:16,399 --> 22:06:21,679
and if we run this code in main
29645
22:06:19,360 --> 22:06:24,551
what do you think will see printed from
29646
22:06:21,679 --> 22:06:26,871
the constructors and the destructors if
29647
22:06:24,551 --> 22:06:28,872
you asked me and i was learning about c
29648
22:06:26,872 --> 22:06:30,551
plus plus i would say that the
29649
22:06:28,872 --> 22:06:33,440
constructors are going to be called in
29650
22:06:30,551 --> 22:06:35,360
order dog one dog two dog three dog four
29651
22:06:33,440 --> 22:06:37,760
they are going to be constructed in this
29652
22:06:35,360 --> 22:06:40,399
order and the destructors would be
29653
22:06:37,759 --> 22:06:42,720
called in the same order but this is not
29654
22:06:40,399 --> 22:06:45,599
true the destructors are going to be
29655
22:06:42,720 --> 22:06:47,119
called in the reverse order as you see
29656
22:06:47,119 --> 22:06:52,551
so we're going to call this constructor
29657
22:06:48,720 --> 22:06:55,191
for doug d1 delegate2w3 doge4 which is
29658
22:06:52,551 --> 22:06:57,279
exactly what i expected but you're going
29659
22:06:55,191 --> 22:07:00,399
to see that the destructors are going to
29660
22:06:57,279 --> 22:07:02,959
be called in reverse order so the object
29661
22:07:02,960 --> 22:07:07,680
is going to be destroyed first as you
29662
22:07:05,512 --> 22:07:09,600
see here and the object that was
29663
22:07:07,679 --> 22:07:10,799
constructed first is going to be
29664
22:07:10,800 --> 22:07:16,551
last and the compiler follows this order
29665
22:07:14,232 --> 22:07:19,600
to make it easy for it to do things we
29666
22:07:16,551 --> 22:07:21,191
can't really get into those details but
29667
22:07:19,600 --> 22:07:23,120
for now we're going to head over to
29668
22:07:21,191 --> 22:07:25,679
visual studio code and play with us a
29669
22:07:23,119 --> 22:07:28,159
little more okay here we are in our
29670
22:07:25,679 --> 22:07:30,959
working folder the current project is
29671
22:07:28,160 --> 22:07:32,872
order of constructor and destructor
29672
22:07:30,960 --> 22:07:35,280
calls here we're going to grab our
29673
22:07:32,872 --> 22:07:37,832
template project pretty quick
29674
22:07:35,279 --> 22:07:39,831
and we're going to put them in place the
29675
22:07:37,831 --> 22:07:41,919
files i mean and we're going to open
29676
22:07:39,831 --> 22:07:44,319
this in visual studio code like we have
29677
22:07:41,919 --> 22:07:47,440
been doing all along this is going to
29678
22:07:44,320 --> 22:07:50,872
open up our folder we can close the left
29679
22:07:47,440 --> 22:07:53,119
sidebar here and let's clean up our main
29680
22:07:50,872 --> 22:07:55,919
function we are going to bring in the
29681
22:07:53,119 --> 22:07:58,080
class for dog from the last lecture this
29682
22:07:58,080 --> 22:08:02,720
no change and we're going to include the
29683
22:08:00,639 --> 22:08:04,960
string review library for this to work
29684
22:08:02,720 --> 22:08:06,960
so we're going to include string view
29685
22:08:04,960 --> 22:08:09,120
here and once we do this we're going to
29686
22:08:06,960 --> 22:08:10,552
head over in the main function and set
29687
22:08:10,551 --> 22:08:15,599
objects of the dog class here but before
29688
22:08:13,440 --> 22:08:18,872
we go there notice that we have a few
29689
22:08:15,600 --> 22:08:21,360
htdc out statements in our constructor
29690
22:08:18,872 --> 22:08:23,680
and destructor and we want to see the
29691
22:08:21,360 --> 22:08:26,479
order in which they are called so we're
29692
22:08:23,679 --> 22:08:28,719
going to set up four objects of our dog
29693
22:08:26,479 --> 22:08:32,080
we're going to say dog dog one and we're
29694
22:08:28,720 --> 22:08:34,720
going to say the name to be won and it's
29695
22:08:32,080 --> 22:08:37,279
going to be a shepherd and it's going to
29696
22:08:34,720 --> 22:08:39,512
be for example 2 years old why not we
29697
22:08:37,279 --> 22:08:41,831
should say dog here and we are going to
29698
22:08:39,512 --> 22:08:44,000
copy these four times here and we're
29699
22:08:44,000 --> 22:08:48,551
the other is going to be dog 3 and this
29700
22:08:48,551 --> 22:08:52,000
and i'm going to say the same thing here
29701
22:08:54,399 --> 22:08:58,319
the names are what is really important
29702
22:08:56,639 --> 22:09:00,319
because we're going to see them printed
29703
22:08:58,320 --> 22:09:03,280
out here but if you want you can change
29704
22:09:00,320 --> 22:09:05,680
the ages let's make this a three let's
29705
22:09:03,279 --> 22:09:07,919
make this a five let's make this a one
29706
22:09:05,679 --> 22:09:10,639
why not for dougie for and now we're
29707
22:09:07,919 --> 22:09:12,080
going to run our program if we run it
29708
22:09:10,639 --> 22:09:14,960
we're going to see the constructors
29709
22:09:12,080 --> 22:09:18,000
called in the order doggy one doggie 2
29710
22:09:14,960 --> 22:09:20,232
w3 dog e4 and the destructors are going
29711
22:09:18,000 --> 22:09:21,440
to be called in the reverse order
29712
22:09:21,440 --> 22:09:26,160
all the way to doggy one let's boil and
29713
22:09:23,831 --> 22:09:28,639
show you that this is actually the case
29714
22:09:26,160 --> 22:09:31,600
so the build is good we can bring up a
29715
22:09:28,639 --> 22:09:34,000
terminal and really run this let's clear
29716
22:09:31,600 --> 22:09:36,400
and run rooster you're going to see that
29717
22:09:34,000 --> 22:09:38,720
dog constructor called for a doki one
29718
22:09:36,399 --> 22:09:41,759
all the way to dog e4 and now we have
29719
22:09:38,720 --> 22:09:44,639
the dagger destructor called from doge4
29720
22:09:41,759 --> 22:09:47,119
all the way to doge one and the compiler
29721
22:09:44,639 --> 22:09:49,831
is going to enforce this order for
29722
22:09:47,119 --> 22:09:52,479
calling constructors and destructors
29723
22:09:49,831 --> 22:09:55,511
because it makes it easy for it to
29724
22:09:52,479 --> 22:09:58,159
manage the memory of objects for example
29725
22:09:55,512 --> 22:10:00,800
if duck one has been around for a long
29726
22:09:58,160 --> 22:10:03,040
time and it has because it's going to be
29727
22:10:06,080 --> 22:10:11,759
after dog four here there might be other
29728
22:10:09,119 --> 22:10:15,360
objects that depend on dog one so that's
29729
22:10:11,759 --> 22:10:18,319
why the object that was created the last
29730
22:10:15,360 --> 22:10:21,191
is deleted first because chances for
29731
22:10:18,320 --> 22:10:23,680
other objects to depend on that last
29732
22:10:21,191 --> 22:10:26,159
object are really slim and you can
29733
22:10:23,679 --> 22:10:29,279
delete it without any problem but the
29734
22:10:26,160 --> 22:10:31,192
object that was created first might have
29735
22:10:29,279 --> 22:10:34,720
other dependencies and you're going to
29736
22:10:31,191 --> 22:10:36,799
be deleting dependent object first
29737
22:10:34,720 --> 22:10:39,191
before you delete that object i think
29738
22:10:36,800 --> 22:10:41,512
this is the logic the compiler follows
29739
22:10:39,191 --> 22:10:43,599
to really enforce this order here and
29740
22:10:41,512 --> 22:10:46,320
you need to be aware of that and make
29741
22:10:43,600 --> 22:10:49,192
sure that at any time in your c-plus
29742
22:10:46,320 --> 22:10:51,680
plus application this is working to your
29743
22:10:49,191 --> 22:10:53,440
advantage this is really all i had to
29744
22:10:51,679 --> 22:10:55,919
share in this lecture i hope you found
29745
22:10:53,440 --> 22:10:57,680
it interesting we are going to stop here
29746
22:10:55,919 --> 22:11:00,639
in this one and the next one we're going
29747
22:10:57,679 --> 22:11:03,439
to learn about the this pointer go ahead
29748
22:11:00,639 --> 22:11:04,872
and finish up here and meet me there
29749
22:11:03,440 --> 22:11:07,919
in this lecture we're going to learn
29750
22:11:04,872 --> 22:11:11,040
about the this pointer and this is a
29751
22:11:07,919 --> 22:11:14,160
special pointer that is maintained by c
29752
22:11:11,039 --> 22:11:17,191
plus plus to really help you manipulate
29753
22:11:14,160 --> 22:11:20,320
the current object and it is the current
29754
22:11:17,191 --> 22:11:23,512
object for which a given method is being
29755
22:11:20,320 --> 22:11:26,160
executed here is a simple example with
29756
22:11:23,512 --> 22:11:28,551
our dog class and we're going to show
29757
22:11:26,160 --> 22:11:30,000
some usefulness for the this pointer the
29758
22:11:28,551 --> 22:11:32,479
first thing we're going to look at is
29759
22:11:30,000 --> 22:11:35,600
the syntax for example here we might
29760
22:11:32,479 --> 22:11:38,231
need to print the address in memory
29761
22:11:35,600 --> 22:11:40,552
where the object was created and do that
29762
22:11:38,232 --> 22:11:42,320
from the inside of the function and to
29763
22:11:40,551 --> 22:11:44,639
do that we use the this pointer for
29764
22:11:42,320 --> 22:11:46,720
example we can put out a message and we
29765
22:11:44,639 --> 22:11:49,360
can do that through a statement like we
29766
22:11:46,720 --> 22:11:52,479
have here we are printing dog dog name
29767
22:11:49,360 --> 22:11:55,039
constructed at a given memory address
29768
22:11:52,479 --> 22:11:58,231
and we use the this keyword to get the
29769
22:11:55,039 --> 22:12:00,959
address of the character object for
29770
22:11:58,232 --> 22:12:03,360
which a specific method or function is
29771
22:12:00,960 --> 22:12:06,160
being called in this case it was the
29772
22:12:03,360 --> 22:12:08,160
constructor of the dot object here we
29773
22:12:06,160 --> 22:12:10,552
can also do the same thing for the other
29774
22:12:08,160 --> 22:12:13,760
constructor and you see we are using the
29775
22:12:10,551 --> 22:12:16,479
this pointer this is one of the uses you
29776
22:12:13,759 --> 22:12:18,959
have for the this pointer again the this
29777
22:12:16,479 --> 22:12:21,679
pointer is a special pointer that is
29778
22:12:18,960 --> 22:12:23,440
maintained by the c plus plus system and
29779
22:12:21,679 --> 22:12:26,639
it is going to be pointing to the
29780
22:12:23,440 --> 22:12:29,600
current object that is being manipulated
29781
22:12:26,639 --> 22:12:31,600
by the z plus plus run time and it's
29782
22:12:29,600 --> 22:12:35,120
going to be manipulated through a
29783
22:12:31,600 --> 22:12:37,279
special function of the class object
29784
22:12:35,119 --> 22:12:40,639
that is being called this is the meaning
29785
22:12:37,279 --> 22:12:43,919
here here is another use case for the
29786
22:12:40,639 --> 22:12:47,119
this pointer it may be used to resolve
29787
22:12:43,919 --> 22:12:49,360
conflicts when you have a parameter and
29788
22:12:47,119 --> 22:12:51,191
a member variable that are named the
29789
22:12:49,360 --> 22:12:54,232
same way for example here we are calling
29790
22:12:51,191 --> 22:12:56,871
the set name function it has a parameter
29791
22:12:54,232 --> 22:12:59,680
with a name doug name and it has a
29792
22:12:56,872 --> 22:13:02,160
member variable called dog name so if
29793
22:12:59,679 --> 22:13:04,159
you do a statement like we have on top
29794
22:13:02,160 --> 22:13:06,160
here the compiler is going to be
29795
22:13:04,160 --> 22:13:09,040
confused they're going to say dog name
29796
22:13:06,160 --> 22:13:11,512
equals dog name and it won't really know
29797
22:13:09,039 --> 22:13:14,639
which dog name you are referring to we
29798
22:13:11,512 --> 22:13:18,400
can resolve this conflict by saying
29799
22:13:14,639 --> 22:13:20,639
this and say pointer access notation
29800
22:13:18,399 --> 22:13:22,639
and say dog name and this thing here is
29801
22:13:20,639 --> 22:13:24,319
going to be the member variable and
29802
22:13:22,639 --> 22:13:27,191
we're going to be assigning to the
29803
22:13:24,320 --> 22:13:29,832
member variable from the parameter this
29804
22:13:27,191 --> 22:13:32,720
is the meaning here and we can use the
29805
22:13:29,831 --> 22:13:34,959
desperator to resolve such conflicts
29806
22:13:32,720 --> 22:13:37,680
another use we have for use pointer is
29807
22:13:34,960 --> 22:13:39,832
if we want to set up chained calls for
29808
22:13:37,679 --> 22:13:42,719
example using pointers and we might need
29809
22:13:39,831 --> 22:13:45,360
to do something like this so we have a
29810
22:13:42,720 --> 22:13:48,320
dog pointer set up on top here and we
29811
22:13:45,360 --> 22:13:50,232
can do something with our new object for
29812
22:13:48,320 --> 22:13:53,512
example we can call a function called
29813
22:13:50,232 --> 22:13:55,512
printful on a dog object after we print
29814
22:13:53,512 --> 22:13:57,760
the information we're going to set some
29815
22:13:55,512 --> 22:14:00,160
information on the doc and you see we
29816
22:13:57,759 --> 22:14:02,639
are setting all of the information
29817
22:14:00,160 --> 22:14:05,120
through one statement the way we achieve
29818
22:14:02,639 --> 22:14:08,000
this our setters are going to be
29819
22:14:05,119 --> 22:14:10,319
returning a pointer to the current
29820
22:14:08,000 --> 22:14:13,119
object and we're going to be grabbing
29821
22:14:13,119 --> 22:14:17,440
on it directly because it's a pointer
29822
22:14:15,119 --> 22:14:19,679
and we are going to be using the pointer
29823
22:14:17,440 --> 22:14:21,760
access notation so we're going to call
29824
22:14:19,679 --> 22:14:23,679
set name set name is going to return a
29825
22:14:21,759 --> 22:14:26,319
pointer we're going to use that pointer
29826
22:14:23,679 --> 22:14:28,000
to say to the breed and set the breed is
29827
22:14:26,320 --> 22:14:30,720
going to return a pointer we're going to
29828
22:14:28,000 --> 22:14:33,600
use that pointer to set the age and
29829
22:14:30,720 --> 22:14:35,440
after this entire line all the
29830
22:14:33,600 --> 22:14:37,920
information is going to change about our
29831
22:14:35,440 --> 22:14:39,919
dog and we can see that here and after
29832
22:14:37,919 --> 22:14:41,759
we do whatever we want with our dog
29833
22:14:39,919 --> 22:14:43,831
object we're going to release it from
29834
22:14:41,759 --> 22:14:46,871
memory so this is another thing you can
29835
22:14:43,831 --> 22:14:49,279
achieve using the this pointer and this
29836
22:14:46,872 --> 22:14:51,680
is how you can set up these setters it
29837
22:14:49,279 --> 22:14:53,759
is nothing complicated we have set name
29838
22:14:51,679 --> 22:14:56,639
it's going to return the dot pointer and
29839
22:14:53,759 --> 22:14:58,959
we're going to return this okay and this
29840
22:14:56,639 --> 22:15:02,232
is going to be a pointer or the memory
29841
22:14:58,960 --> 22:15:04,800
address of the current object of the dog
29842
22:15:02,232 --> 22:15:07,360
class we have the same setup for seti
29843
22:15:04,800 --> 22:15:10,160
dog breed we return the dog pointer and
29844
22:15:07,360 --> 22:15:13,191
we return this the same setup for set
29845
22:15:10,160 --> 22:15:14,160
doug age we return a dog pointer and we
29846
22:15:14,160 --> 22:15:19,832
this we can do the same thing using
29847
22:15:16,639 --> 22:15:22,399
references but our setup is going to be
29848
22:15:19,831 --> 22:15:25,279
somewhat a little bit different
29849
22:15:22,399 --> 22:15:27,831
we have our dog object here and we're
29850
22:15:25,279 --> 22:15:29,759
going to do our change call here so
29851
22:15:27,831 --> 22:15:30,959
we're going to say set name through the
29852
22:15:30,960 --> 22:15:35,360
because we have a dot pointer here but
29853
22:15:33,360 --> 22:15:38,479
after that we're going to return a
29854
22:15:35,360 --> 22:15:39,919
reference from the functions here so set
29855
22:15:38,479 --> 22:15:41,679
name is going to return a reference
29856
22:15:39,919 --> 22:15:43,440
we're going to go through that reference
29857
22:15:43,440 --> 22:15:47,600
set dog breed is going to return a
29858
22:15:45,679 --> 22:15:50,719
reference and we are going to go through
29859
22:15:47,600 --> 22:15:52,800
that reference to set the dog age and if
29860
22:15:50,720 --> 22:15:55,040
we print the information now we're going
29861
22:15:52,800 --> 22:15:57,832
to see that we have new information in
29862
22:15:55,039 --> 22:16:00,231
our dog object and after we are done
29863
22:15:57,831 --> 22:16:03,119
with our dog object we have to remember
29864
22:16:00,232 --> 22:16:06,400
to release it from memory because it was
29865
22:16:03,119 --> 22:16:09,039
allocated dynamically from the heap here
29866
22:16:06,399 --> 22:16:11,279
is how you can set this up it really is
29867
22:16:09,039 --> 22:16:13,759
nothing complicated we just have our
29868
22:16:11,279 --> 22:16:16,399
setters and we are going to return a
29869
22:16:13,759 --> 22:16:18,479
reference but before we return through
29870
22:16:16,399 --> 22:16:21,511
the desperator we will need to
29871
22:16:18,479 --> 22:16:24,231
dereference the displayer and get to the
29872
22:16:21,512 --> 22:16:26,551
actual thing that is being pointed to
29873
22:16:24,232 --> 22:16:28,800
that's why we have this star operator
29874
22:16:26,551 --> 22:16:30,080
here and for the other setters we're
29875
22:16:28,800 --> 22:16:31,832
going to do the same thing we're going
29876
22:16:30,080 --> 22:16:34,872
to return a reference we're going to
29877
22:16:31,831 --> 22:16:36,799
return a dereferenced version of this
29878
22:16:34,872 --> 22:16:38,551
we're going to return a dog reference
29879
22:16:36,800 --> 22:16:41,360
for set dog age and we're going to
29880
22:16:38,551 --> 22:16:42,959
return a dereferenced this pointer
29881
22:16:41,360 --> 22:16:46,080
because this is the reference we are
29882
22:16:42,960 --> 22:16:48,480
returning here so this is what the this
29883
22:16:46,080 --> 22:16:50,479
pointer is about now we're going to head
29884
22:16:48,479 --> 22:16:53,119
over to visual studio code and play with
29885
22:16:50,479 --> 22:16:55,599
us a little more okay here we are in our
29886
22:16:53,119 --> 22:16:58,231
working folder the current project is
29887
22:16:55,600 --> 22:17:00,320
the displayer we're going to grab our
29888
22:16:58,232 --> 22:17:02,480
template files and we're going to put
29889
22:17:00,320 --> 22:17:04,720
them in place and then we're going to
29890
22:17:02,479 --> 22:17:06,959
open this in visual studio code by
29891
22:17:04,720 --> 22:17:08,800
dragging and dropping here this is going
29892
22:17:06,960 --> 22:17:10,720
to open our folder we're going to open
29893
22:17:08,800 --> 22:17:13,040
the main cpp file and we're going to
29894
22:17:13,039 --> 22:17:18,231
so that we have some more space to work
29895
22:17:15,279 --> 22:17:20,080
with i am going to put in a version of
29896
22:17:20,080 --> 22:17:25,680
it is pretty limited right now it just
29897
22:17:23,279 --> 22:17:27,512
has a destructor and a constructor and a
29898
22:17:25,679 --> 22:17:29,359
constructor and we have our member
29899
22:17:27,512 --> 22:17:31,279
variables and we're going to
29900
22:17:29,360 --> 22:17:33,680
tune this a little bit so that we can
29901
22:17:31,279 --> 22:17:36,872
work with us however we want the first
29902
22:17:33,679 --> 22:17:40,000
thing we want to do is to print the
29903
22:17:36,872 --> 22:17:42,800
addresses of dug objects that we
29904
22:17:40,000 --> 22:17:45,119
construct and destruct here and we're
29905
22:17:42,800 --> 22:17:48,720
going to do that in our constructor so
29906
22:17:45,119 --> 22:17:51,279
let's go to our hd dc out statement here
29907
22:17:48,720 --> 22:17:53,360
and we're going to say add to mean the
29908
22:17:51,279 --> 22:17:55,831
memory address where the object was
29909
22:17:53,360 --> 22:17:59,119
constructed and we're going to say this
29910
22:17:55,831 --> 22:18:02,080
so when we do this this is going to be
29911
22:17:59,119 --> 22:18:05,039
the address in memory of the current
29912
22:18:02,080 --> 22:18:07,440
object that is being constructed
29913
22:18:05,039 --> 22:18:10,159
by our constructor here and we're going
29914
22:18:07,440 --> 22:18:12,232
to say the same thing in our destructor
29915
22:18:10,160 --> 22:18:14,552
we're going to say at and we're going to
29916
22:18:12,232 --> 22:18:17,760
say the memory address where the current
29917
22:18:14,551 --> 22:18:19,512
object is being destroyed from so after
29918
22:18:19,512 --> 22:18:24,479
if we go in the main function and for
29919
22:18:22,232 --> 22:18:26,720
example set up a doug object we're going
29920
22:18:24,479 --> 22:18:27,831
to say dark we're going to say dog one
29921
22:18:26,720 --> 22:18:30,080
and we're going to give it the
29922
22:18:27,831 --> 22:18:32,080
information we're going to give it the
29923
22:18:30,080 --> 22:18:33,680
name which is going to be fluffy we're
29924
22:18:32,080 --> 22:18:35,279
going to give it the breed which is
29925
22:18:33,679 --> 22:18:37,359
going to be a shepherd and we're going
29926
22:18:35,279 --> 22:18:39,191
to give it the age of two like we have
29927
22:18:37,360 --> 22:18:40,720
been doing all along when we do
29928
22:18:39,191 --> 22:18:42,319
something like this this is going to
29929
22:18:40,720 --> 22:18:45,360
call the constructor because we are
29930
22:18:42,320 --> 22:18:47,360
trying to set up an object and before
29931
22:18:45,360 --> 22:18:49,360
the main function ends we're going to
29932
22:18:47,360 --> 22:18:51,600
call the destructor and we're going to
29933
22:18:49,360 --> 22:18:53,191
see things happening here let's say done
29934
22:18:51,600 --> 22:18:55,600
so that we know that the code is
29935
22:18:53,191 --> 22:18:58,000
actually running i'm going to say sddc
29936
22:18:55,600 --> 22:18:58,872
out done here okay we have the setup
29937
22:18:58,872 --> 22:19:04,080
we can uh build and run the application
29938
22:19:01,512 --> 22:19:06,479
we're going to use gcc to build and the
29939
22:19:04,080 --> 22:19:09,512
build is good we can bring up a terminal
29940
22:19:06,479 --> 22:19:11,599
to try and run the application and now
29941
22:19:09,512 --> 22:19:14,720
if we run rooster we're going to see
29942
22:19:11,600 --> 22:19:17,440
that dog constructor called for a fluffy
29943
22:19:14,720 --> 22:19:20,000
at this memory location and the current
29944
22:19:17,440 --> 22:19:21,919
object is this object here which is
29945
22:19:20,000 --> 22:19:23,919
being constructed and we're going to
29946
22:19:21,919 --> 22:19:26,000
have access to its memory through the
29947
22:19:23,919 --> 22:19:29,440
this pointer hopefully you can see how
29948
22:19:26,000 --> 22:19:31,679
powerful this is if we didn't have the
29949
22:19:29,440 --> 22:19:32,872
this pointer the only way to get the
29950
22:19:32,872 --> 22:19:38,479
this object would be to grab the address
29951
22:19:35,831 --> 22:19:41,279
from the main function or from wherever
29952
22:19:38,479 --> 22:19:44,231
we are setting up our object here but we
29953
22:19:41,279 --> 22:19:46,639
have access to this address from the
29954
22:19:44,232 --> 22:19:48,872
inside of the functions for the class
29955
22:19:46,639 --> 22:19:51,759
and this is really cool so we can
29956
22:19:48,872 --> 22:19:53,360
manipulate these addresses if we need to
29957
22:19:51,759 --> 22:19:55,831
and we're going to show you another use
29958
22:19:53,360 --> 22:19:59,039
for this so suppose we need to set up
29959
22:19:55,831 --> 22:20:01,360
setters for our class here so we need a
29960
22:19:59,039 --> 22:20:03,599
setter to set the name the breed and to
29961
22:20:01,360 --> 22:20:05,279
set the age here so let's set up our
29962
22:20:03,600 --> 22:20:07,600
setters we're going to say setters and
29963
22:20:07,600 --> 22:20:12,720
name or let's be explicit set dog name
29964
22:20:10,960 --> 22:20:15,512
that's going to be better and we're
29965
22:20:12,720 --> 22:20:18,320
going to pass a string view we're going
29966
22:20:15,512 --> 22:20:20,080
to say stds friend of you and we're
29967
22:20:18,320 --> 22:20:22,720
going to say name program and we're
29968
22:20:20,080 --> 22:20:25,191
going to put the bodies in our class
29969
22:20:22,720 --> 22:20:28,639
here but i would encourage you to be
29970
22:20:25,191 --> 22:20:31,119
consistent if you are doing this in real
29971
22:20:28,639 --> 22:20:33,279
code we are learning here and we are
29972
22:20:31,119 --> 22:20:35,512
taking some shortcuts so that we can do
29973
22:20:33,279 --> 22:20:38,160
things simply but what we want to see
29974
22:20:35,512 --> 22:20:40,872
now is what happens if we have a
29975
22:20:38,160 --> 22:20:44,080
parameter named the same as a member
29976
22:20:44,080 --> 22:20:48,400
this name to the member variable called
29977
22:20:46,080 --> 22:20:49,831
the name so if you have a case like this
29978
22:20:48,399 --> 22:20:52,159
you're really going to be in trouble
29979
22:20:49,831 --> 22:20:53,831
because if you say name equals name
29980
22:20:53,831 --> 22:20:57,679
we should get a compiler error or a
29981
22:20:55,759 --> 22:20:59,439
squiggly line because the compiler is
29982
22:20:59,440 --> 22:21:03,360
which name are you using here is it the
29983
22:21:01,440 --> 22:21:05,760
memorial is it the parameter it's not
29984
22:21:03,360 --> 22:21:07,600
going to know and let's try to build and
29985
22:21:05,759 --> 22:21:09,279
see what we get we're going to use the
29986
22:21:09,279 --> 22:21:15,831
and surprisingly gcc is taking this
29987
22:21:13,119 --> 22:21:17,831
and it's probably knowing that we have a
29988
22:21:15,831 --> 22:21:19,679
member variable named name and it's
29989
22:21:17,831 --> 22:21:22,959
going to assign the parameter to that
29990
22:21:19,679 --> 22:21:25,831
member variable so behind the scenes gcc
29991
22:21:22,960 --> 22:21:29,280
is going to change this to this it's
29992
22:21:25,831 --> 22:21:31,119
going to use this name equals name
29993
22:21:29,279 --> 22:21:34,080
this is the syntax we want which is
29994
22:21:31,119 --> 22:21:36,551
really not confusing but what we have on
29995
22:21:34,080 --> 22:21:38,551
top here is going to be confusing and
29996
22:21:36,551 --> 22:21:40,959
some compilers are not even going to
29997
22:21:38,551 --> 22:21:43,039
take this let's leave this in and
29998
22:21:40,960 --> 22:21:45,192
actually build it in with us i want to
29999
22:21:43,039 --> 22:21:48,079
see that this actually works so we're
30000
22:21:45,191 --> 22:21:50,871
going to weld successfully and if we go
30001
22:21:50,872 --> 22:21:55,832
dog one set dog name let's say pumbaa
30002
22:21:54,000 --> 22:21:57,679
let's see what happens if we do
30003
22:21:55,831 --> 22:22:00,159
something like this we're going to try
30004
22:21:57,679 --> 22:22:02,231
and build again and gcc is going to take
30005
22:22:00,160 --> 22:22:03,832
this and this is really cool so let's
30006
22:22:02,232 --> 22:22:06,720
put in a function which is going to
30007
22:22:03,831 --> 22:22:08,871
print information about our dog we can
30008
22:22:06,720 --> 22:22:11,119
do that down here and it's going to
30009
22:22:08,872 --> 22:22:13,512
return nothing it's going to be called
30010
22:22:11,119 --> 22:22:15,512
print info and it's going to basically
30011
22:22:13,512 --> 22:22:17,600
print the name of the breed and the age
30012
22:22:15,512 --> 22:22:19,600
so it's going to say sddc out we're
30013
22:22:17,600 --> 22:22:21,120
going to say the address where the dot
30014
22:22:21,119 --> 22:22:25,512
i think that's more meaningful we're
30015
22:22:23,279 --> 22:22:26,399
going to say this and then we're going
30016
22:22:26,399 --> 22:22:32,399
put a parenthesis and say the name i
30017
22:22:28,551 --> 22:22:34,800
think we can put a an angle bracket here
30018
22:22:32,399 --> 22:22:38,799
and say name and we're going to say the
30019
22:22:34,800 --> 22:22:41,120
dog name we can go down and say the age
30020
22:22:38,800 --> 22:22:43,440
or the breed and say the age and we're
30021
22:22:41,119 --> 22:22:44,959
going to dereference the age member
30022
22:22:43,440 --> 22:22:47,919
variable because it's a pointer we're
30023
22:22:44,960 --> 22:22:50,160
going to say the reference ph here and i
30024
22:22:47,919 --> 22:22:53,440
think this is going to be it now we can
30025
22:22:50,160 --> 22:22:56,480
put a new line character std e ndm and
30026
22:22:53,440 --> 22:22:58,639
if we go down now and say printable
30027
22:22:56,479 --> 22:22:59,759
before we set the name we're going to
30028
22:23:01,119 --> 22:23:05,599
printful we're going to print the
30029
22:23:02,872 --> 22:23:07,680
information about this dog and after we
30030
22:23:05,600 --> 22:23:10,160
set the dog name we're going to go down
30031
22:23:07,679 --> 22:23:12,000
and also say dog one principle you can
30032
22:23:10,160 --> 22:23:14,080
play with these things and i really
30033
22:23:12,000 --> 22:23:16,639
encourage you to do so so we're going to
30034
22:23:14,080 --> 22:23:19,191
build this we're going to use gcc so the
30035
22:23:16,639 --> 22:23:20,872
world is good we can clear and run
30036
22:23:19,191 --> 22:23:23,039
rooster this is going to say the
30037
22:23:20,872 --> 22:23:24,551
constructor was called for fluffy at the
30038
22:23:24,551 --> 22:23:28,800
we're going to say the dog we're going
30039
22:23:27,119 --> 22:23:31,919
to print the information and we're going
30040
22:23:28,800 --> 22:23:34,080
to say it's a dog object at this address
30041
22:23:31,919 --> 22:23:35,919
the name is fluffy and we're going to
30042
22:23:34,080 --> 22:23:37,919
print the dog for the second time you're
30043
22:23:35,919 --> 22:23:40,319
going to see that the name is still
30044
22:23:37,919 --> 22:23:41,360
fluffy and we have a problem here why is
30045
22:23:41,360 --> 22:23:48,232
why is our object not being modified
30046
22:23:44,720 --> 22:23:50,639
let's go up and see our set dog name
30047
22:23:48,232 --> 22:23:53,040
function here so we're going to
30048
22:23:50,639 --> 22:23:55,360
remove this and we're going to use the
30049
22:23:53,039 --> 22:23:58,231
this pointer and we're going to
30050
22:23:55,360 --> 22:24:00,639
weld again and let's clear now and run
30051
22:23:58,232 --> 22:24:03,680
rooster and now you see that the changes
30052
22:24:00,639 --> 22:24:06,872
are actually making sense so what is
30053
22:24:03,679 --> 22:24:09,599
happening with the assignment here the
30054
22:24:06,872 --> 22:24:11,832
compiler is assigning the value of the
30055
22:24:09,600 --> 22:24:14,080
variable to the variable itself and this
30056
22:24:11,831 --> 22:24:16,399
is really doing nothing and it is not
30057
22:24:14,080 --> 22:24:18,400
what you expect i was fooled a little
30058
22:24:16,399 --> 22:24:20,799
bit by the compiler because this was
30059
22:24:18,399 --> 22:24:23,511
compiling but it's not going to do what
30060
22:24:20,800 --> 22:24:26,160
you want when you call set doug name you
30061
22:24:23,512 --> 22:24:28,800
probably want to take this name and
30062
22:24:26,160 --> 22:24:31,120
assign that to the member variable name
30063
22:24:28,800 --> 22:24:33,360
of this class but this is not what it's
30064
22:24:31,119 --> 22:24:34,799
going to do let's build again and really
30065
22:24:34,800 --> 22:24:39,192
so it is a really good advice to
30066
22:24:37,279 --> 22:24:41,191
practice and really try things out
30067
22:24:39,191 --> 22:24:43,119
yourself we're going to run a rooster
30068
22:24:41,191 --> 22:24:45,831
you're going to see that after we set
30069
22:24:43,119 --> 22:24:47,679
the dog name here to pumbaa and we try
30070
22:24:45,831 --> 22:24:49,599
to print the information the information
30071
22:24:47,679 --> 22:24:51,679
is not going to be end the name is not
30072
22:24:49,600 --> 22:24:54,000
going to be pumbaa for the second call
30073
22:24:51,679 --> 22:24:56,079
here and what this is really doing is
30074
22:24:54,000 --> 22:24:58,232
doing nothing here this does nothing and
30075
22:24:56,080 --> 22:24:59,600
you really need to know this if you want
30076
22:24:59,600 --> 22:25:03,120
your remember variable you will have to
30077
22:25:01,512 --> 22:25:04,400
go through the this pointer and this is
30078
22:25:04,399 --> 22:25:10,159
take the name member variable of
30079
22:25:07,360 --> 22:25:12,800
the current object and assign the value
30080
22:25:10,160 --> 22:25:15,040
in name the name parameter to that and
30081
22:25:12,800 --> 22:25:17,440
that's going to set your name to
30082
22:25:15,039 --> 22:25:20,159
whatever new name you passed when you
30083
22:25:17,440 --> 22:25:22,160
called the set dog name function here so
30084
22:25:20,160 --> 22:25:23,919
hopefully you really understand this now
30085
22:25:22,160 --> 22:25:26,639
if we both are going to see that the
30086
22:25:23,919 --> 22:25:29,119
pumbaa name has been applied let's boil
30087
22:25:26,639 --> 22:25:31,279
again so we're going to clear and run
30088
22:25:29,119 --> 22:25:33,759
rooster and we're going to see now that
30089
22:25:31,279 --> 22:25:35,360
the name is pumbaa and there is some
30090
22:25:35,360 --> 22:25:40,800
constructors we don't have a space
30091
22:25:37,759 --> 22:25:43,039
before at here and it is really annoying
30092
22:25:40,800 --> 22:25:45,279
to look at here so let's build again and
30093
22:25:43,039 --> 22:25:47,360
fix this we are going to use gcc the
30094
22:25:45,279 --> 22:25:50,551
world is good we can clear and run
30095
22:25:47,360 --> 22:25:52,639
rooster and now we have what we want so
30096
22:25:50,551 --> 22:25:55,831
this is the second use case you might
30097
22:25:52,639 --> 22:25:58,479
have for this pointer through setters
30098
22:25:55,831 --> 22:26:01,759
let's use the parameter that is named
30099
22:25:58,479 --> 22:26:03,191
the same as your member variables so
30100
22:26:01,759 --> 22:26:05,039
we're going to set up all the other
30101
22:26:03,191 --> 22:26:07,599
setters we're going to set up a setter
30102
22:26:05,039 --> 22:26:10,479
for the breed we're going to say std
30103
22:26:07,600 --> 22:26:12,800
strength view and it's going to be breed
30104
22:26:10,479 --> 22:26:14,399
we can do that because now we have tools
30105
22:26:12,800 --> 22:26:17,120
to really do this properly we're going
30106
22:26:14,399 --> 22:26:20,000
to say this breed and we're going to say
30107
22:26:17,119 --> 22:26:22,319
equals read this is going to do and we
30108
22:26:20,000 --> 22:26:24,232
can set the age and we're going to say
30109
22:26:24,232 --> 22:26:28,720
dog age and we're going to pass in a
30110
22:26:26,080 --> 22:26:31,040
value and we're going to go inside what
30111
22:26:28,720 --> 22:26:32,639
is it called it's called ph i don't
30112
22:26:31,039 --> 22:26:35,759
think it makes sense to call the
30113
22:26:32,639 --> 22:26:37,759
parameter ph because it's not a pointer
30114
22:26:35,759 --> 22:26:39,439
so we're going to go inside and just the
30115
22:26:37,759 --> 22:26:40,959
reference of a pointer so we're going to
30116
22:26:40,960 --> 22:26:46,720
and we're going to say this so we're
30117
22:26:43,360 --> 22:26:49,512
going to go inside and say this ph
30118
22:26:46,720 --> 22:26:51,919
equals h i think this is going to work
30119
22:26:49,512 --> 22:26:53,600
and we need to reference this pointer
30120
22:26:51,919 --> 22:26:55,679
because what we have as a member
30121
22:26:53,600 --> 22:26:57,920
variable is the pointer so we need to go
30122
22:26:55,679 --> 22:26:59,759
through the ugly syntax you see here and
30123
22:26:57,919 --> 22:27:01,360
this is going to set our age so we can
30124
22:26:59,759 --> 22:27:03,439
go through this and really change the
30125
22:27:01,360 --> 22:27:06,800
information so we're going to change the
30126
22:27:03,440 --> 22:27:08,960
breed here set dog breed let's go down
30127
22:27:06,800 --> 22:27:11,440
and choose that and we're going to say
30128
22:27:08,960 --> 22:27:13,440
wirefox terrier and we're going to go
30129
22:27:11,440 --> 22:27:16,720
down and set the age we're going to say
30130
22:27:13,440 --> 22:27:19,680
guilt 1 set dog age and we're going to
30131
22:27:16,720 --> 22:27:22,160
say for why not so we change the
30132
22:27:19,679 --> 22:27:24,079
information of our dog through our
30133
22:27:22,160 --> 22:27:25,600
setters here and we're going to print
30134
22:27:25,600 --> 22:27:30,000
let's build again we're going to use gcc
30135
22:27:27,831 --> 22:27:32,399
for that the build is good we can clear
30136
22:27:30,000 --> 22:27:34,479
and run rooster this is going to give us
30137
22:27:32,399 --> 22:27:37,191
new information for the second print
30138
22:27:34,479 --> 22:27:39,440
here so name is going to be pumba breed
30139
22:27:37,191 --> 22:27:41,039
is going to be wirefox terrier and age
30140
22:27:39,440 --> 22:27:43,919
is going to be four and we have the
30141
22:27:41,039 --> 22:27:46,479
information for our dog object here okay
30142
22:27:43,919 --> 22:27:48,959
now we have this and we want to see how
30143
22:27:48,960 --> 22:27:53,832
using the this pointer and in this case
30144
22:27:51,512 --> 22:27:56,639
we will be using pointers let's change
30145
22:27:53,831 --> 22:27:58,799
our setters to return dog pointers we
30146
22:27:56,639 --> 22:28:00,399
can do that and we're going to go down
30147
22:27:58,800 --> 22:28:02,160
to say to dog breed we're going to
30148
22:28:02,160 --> 22:28:07,360
and we're going to go to set dog age and
30149
22:28:04,872 --> 22:28:09,512
we're going to return a dog pointer now
30150
22:28:07,360 --> 22:28:11,119
after we do this we will need to return
30151
22:28:09,512 --> 22:28:14,400
these pointers and we're going to go
30152
22:28:11,119 --> 22:28:16,479
inside and say return this remember this
30153
22:28:14,399 --> 22:28:19,191
contains the memory of the current
30154
22:28:16,479 --> 22:28:21,831
object so we can return this and fit
30155
22:28:19,191 --> 22:28:23,831
that to a returned pointer so we can go
30156
22:28:21,831 --> 22:28:25,439
down in all the other functions and
30157
22:28:23,831 --> 22:28:28,159
really save this we're going to say
30158
22:28:25,440 --> 22:28:30,160
return thus we return the memory address
30159
22:28:30,160 --> 22:28:34,720
through the setters that we are doing
30160
22:28:32,551 --> 22:28:38,000
here we're going to return this
30161
22:28:34,720 --> 22:28:40,000
and after we do this we can change the
30162
22:28:38,000 --> 22:28:42,720
setting we are doing here to b1
30163
22:28:40,000 --> 22:28:44,399
statement and we can comment this out i
30164
22:28:42,720 --> 22:28:47,360
think we can do that and what we're
30165
22:28:44,399 --> 22:28:48,319
going to say is dope one and we're going
30166
22:28:48,320 --> 22:28:53,192
set dog name and we're going to pass in
30167
22:28:50,720 --> 22:28:55,759
pumbaa but this is going to return a
30168
22:28:53,191 --> 22:28:58,231
pointer now set dog name is returning a
30169
22:28:55,759 --> 22:29:00,399
pointer to the current object and you
30170
22:28:58,232 --> 22:29:02,639
can see that here this is what we are
30171
22:29:00,399 --> 22:29:05,039
returning so we can go through this
30172
22:29:02,639 --> 22:29:08,000
pointer and call some other functions
30173
22:29:05,039 --> 22:29:10,231
for example we can say set dot breed
30174
22:29:08,000 --> 22:29:11,831
directly and the visual studio code is
30175
22:29:10,232 --> 22:29:14,000
going to figure out that what we are
30176
22:29:11,831 --> 22:29:16,959
returning is a pointer and it's going to
30177
22:29:14,000 --> 22:29:19,440
change our access notation here to a
30178
22:29:16,960 --> 22:29:22,000
pointer axis notation and we're going to
30179
22:29:19,440 --> 22:29:24,232
use this in one single statement so
30180
22:29:22,000 --> 22:29:26,160
we're going to put in our breed and
30181
22:29:24,232 --> 22:29:28,480
we're going to call the function to set
30182
22:29:26,160 --> 22:29:30,320
the age okay you see that it uses
30183
22:29:28,479 --> 22:29:32,000
pointer access notation and this is
30184
22:29:30,320 --> 22:29:33,920
really cool so we're going to put in our
30185
22:29:32,000 --> 22:29:36,160
four and you're going to see that this
30186
22:29:33,919 --> 22:29:38,319
actually works and this is really cool
30187
22:29:36,160 --> 22:29:41,600
if you don't want to do thanks in three
30188
22:29:38,320 --> 22:29:44,080
steps you can give your users the option
30189
22:29:41,600 --> 22:29:46,160
to do things in one step using returned
30190
22:29:44,080 --> 22:29:48,320
pointers like this and this is really
30191
22:29:46,160 --> 22:29:51,440
cool i use this all the time for my
30192
22:29:48,320 --> 22:29:54,160
classes that i design in my applications
30193
22:29:51,440 --> 22:29:55,919
so if we're both we're going to see that
30194
22:29:54,160 --> 22:29:58,480
the world is good and we're going to
30195
22:29:55,919 --> 22:30:01,512
clear and run rooster we're going to see
30196
22:29:58,479 --> 22:30:04,319
that the information is n name is pumbaa
30197
22:30:01,512 --> 22:30:06,800
breed is waterfox terrier and the age is
30198
22:30:04,320 --> 22:30:09,920
for and we were able to do all these
30199
22:30:06,800 --> 22:30:12,872
changes in one go so we can even change
30200
22:30:09,919 --> 22:30:15,191
this to use references here we are using
30201
22:30:12,872 --> 22:30:17,440
pointers so let's say that we are using
30202
22:30:15,191 --> 22:30:20,551
pointers but we can also use references
30203
22:30:17,440 --> 22:30:22,720
let's go on top here and say that this
30204
22:30:20,551 --> 22:30:24,800
is using pointers and we're going to
30205
22:30:22,720 --> 22:30:26,720
comment this out but before we do we're
30206
22:30:24,800 --> 22:30:28,479
going to copy all this because we're
30207
22:30:29,919 --> 22:30:34,080
comment all this out and we're going to
30208
22:30:31,600 --> 22:30:36,080
go down and say change calls using
30209
22:30:34,080 --> 22:30:38,232
references and we're going to go down
30210
22:30:36,080 --> 22:30:41,119
and put in our code and we're going to
30211
22:30:38,232 --> 22:30:43,512
change our setters to return references
30212
22:30:41,119 --> 22:30:45,599
instead of pointers we can do that so
30213
22:30:43,512 --> 22:30:48,080
we're going to change the star here to
30214
22:30:45,600 --> 22:30:50,232
an ampersand symbol here and this is
30215
22:30:48,080 --> 22:30:52,320
going to do the magic so we have a dog
30216
22:30:50,232 --> 22:30:54,480
reference returned from all these
30217
22:30:52,320 --> 22:30:56,640
functions so because we are no longer
30218
22:30:54,479 --> 22:30:58,551
returning a pointer returning this
30219
22:30:56,639 --> 22:31:00,872
directly is going to give us a compiler
30220
22:30:58,551 --> 22:31:03,360
error we need to dereference this
30221
22:31:00,872 --> 22:31:05,760
pointer and get to what what is pointed
30222
22:31:03,360 --> 22:31:08,160
to now the compiler will know that we
30223
22:31:05,759 --> 22:31:10,479
are returning a reference to the current
30224
22:31:08,160 --> 22:31:13,360
object and this is the syntax we can use
30225
22:31:10,479 --> 22:31:16,231
to do this let's go down and dereference
30226
22:31:13,360 --> 22:31:17,759
all the returned pointers and if we go
30227
22:31:16,232 --> 22:31:20,320
down we're going to see that this is
30228
22:31:17,759 --> 22:31:23,119
good already and we can go down and set
30229
22:31:20,320 --> 22:31:25,192
up our chained call using references and
30230
22:31:23,119 --> 22:31:27,759
we're going to go down and say dog one
30231
22:31:25,191 --> 22:31:29,759
we're going to set dog name and we're
30232
22:31:29,759 --> 22:31:33,119
what we have been doing all along now
30233
22:31:31,512 --> 22:31:36,320
we're going to use the dot access
30234
22:31:33,119 --> 22:31:38,871
notation because what we are returning
30235
22:31:36,320 --> 22:31:40,720
is a reference and you're going to see
30236
22:31:38,872 --> 22:31:43,832
that visual studio code is going to pick
30237
22:31:40,720 --> 22:31:46,960
this up the breed is going to be wirefox
30238
22:31:43,831 --> 22:31:49,439
and we're going to say set dog age and
30239
22:31:46,960 --> 22:31:51,512
we're going to pass in our four and
30240
22:31:49,440 --> 22:31:53,600
you're going to see that this is valid c
30241
22:31:51,512 --> 22:31:55,191
plus syntax and if we print the
30242
22:31:53,600 --> 22:31:58,639
information we're going to have new
30243
22:31:55,191 --> 22:32:00,959
information applied to our dog object
30244
22:31:58,639 --> 22:32:02,720
here we can weld and see that this is
30245
22:32:00,960 --> 22:32:05,440
actually working you see the world is
30246
22:32:02,720 --> 22:32:07,279
good we can clear and run rooster and
30247
22:32:05,440 --> 22:32:10,960
we're going to see that information has
30248
22:32:07,279 --> 22:32:12,399
been applied to our dog object so these
30249
22:32:12,399 --> 22:32:16,551
showing some of the usefulness for the
30250
22:32:14,720 --> 22:32:18,960
this pointer we have seen that we can
30251
22:32:16,551 --> 22:32:21,759
use the this pointer to print the memory
30252
22:32:18,960 --> 22:32:24,552
address of the current object if we go
30253
22:32:21,759 --> 22:32:26,871
down and look at our constructor and the
30254
22:32:24,551 --> 22:32:29,512
destructor we are printing the address
30255
22:32:26,872 --> 22:32:31,360
of the current object in our debug
30256
22:32:29,512 --> 22:32:33,440
statement here and this is really cool
30257
22:32:31,360 --> 22:32:35,919
we can use the this pointer to resolve
30258
22:32:33,440 --> 22:32:38,232
conflicts in our setters for example we
30259
22:32:35,919 --> 22:32:40,720
can use a parameter that has the same
30260
22:32:38,232 --> 22:32:43,192
name as the member variable and it's not
30261
22:32:40,720 --> 22:32:45,600
going to be really confusing and lead to
30262
22:32:43,191 --> 22:32:48,319
bad results it's going to change the
30263
22:32:45,600 --> 22:32:50,080
actual member variable and change it to
30264
22:32:48,320 --> 22:32:52,320
whatever you pass as the parameter and
30265
22:32:50,080 --> 22:32:55,040
this is really cool we can also use the
30266
22:32:52,320 --> 22:32:56,872
this pointer to set up change calls for
30267
22:32:55,039 --> 22:32:58,799
our function and we have seen that we
30268
22:32:56,872 --> 22:33:00,872
can do that either through returning
30269
22:32:58,800 --> 22:33:03,760
pointers like we are doing here and
30270
22:33:00,872 --> 22:33:06,720
using the this pointer as a return
30271
22:33:03,759 --> 22:33:09,511
object for our function here or we can
30272
22:33:06,720 --> 22:33:11,440
use returned pointers to do this and if
30273
22:33:09,512 --> 22:33:14,320
we do that we're going to be able to
30274
22:33:11,440 --> 22:33:17,279
call our functions in one go like we are
30275
22:33:14,320 --> 22:33:20,232
doing here using pointers or do the same
30276
22:33:17,279 --> 22:33:22,872
thing using references like we are doing
30277
22:33:20,232 --> 22:33:24,480
here this is really all we set out to do
30278
22:33:22,872 --> 22:33:26,720
in this lecture i hope you found it
30279
22:33:24,479 --> 22:33:28,399
interesting we are going to stop here in
30280
22:33:26,720 --> 22:33:31,040
this one the next one we're going to
30281
22:33:28,399 --> 22:33:33,279
learn about struct go ahead and finish
30282
22:33:31,039 --> 22:33:35,191
up here and meet me there in this
30283
22:33:33,279 --> 22:33:37,360
lecture we're going to learn about the
30284
22:33:35,191 --> 22:33:40,159
struct keyword and this is another
30285
22:33:37,360 --> 22:33:42,639
syntax you can use to create classes in
30286
22:33:40,160 --> 22:33:44,552
your c plus plus program we have seen
30287
22:33:42,639 --> 22:33:47,360
that we can already use the class
30288
22:33:44,551 --> 22:33:49,279
keyword to create our classes i have to
30289
22:33:47,360 --> 22:33:51,919
break it to you that we can also use
30290
22:33:49,279 --> 22:33:54,232
struct to do the same so the syntax here
30291
22:33:51,919 --> 22:33:56,080
is going to create a class called cat
30292
22:33:54,232 --> 22:33:58,320
and it's going to have a member variable
30293
22:33:56,080 --> 22:34:01,600
called string name the difference
30294
22:33:58,320 --> 22:34:04,720
between struct and class is that for
30295
22:34:01,600 --> 22:34:07,192
classes members are going to be private
30296
22:34:04,720 --> 22:34:09,680
by default and when you do something
30297
22:34:07,191 --> 22:34:11,679
like this and create class objects you
30298
22:34:09,679 --> 22:34:13,679
want to be able to access the name here
30299
22:34:11,679 --> 22:34:15,511
directly for example from the main
30300
22:34:13,679 --> 22:34:17,919
function if you do that you're going to
30301
22:34:15,512 --> 22:34:21,040
get a compiler error because class
30302
22:34:17,919 --> 22:34:23,599
members are private by default but if
30303
22:34:21,039 --> 22:34:26,000
you use struct members are going to be
30304
22:34:23,600 --> 22:34:28,872
public by default and you will have
30305
22:34:26,000 --> 22:34:31,119
direct access from the outside this is
30306
22:34:28,872 --> 22:34:33,279
the only difference between class and
30307
22:34:31,119 --> 22:34:35,440
struct otherwise you can use them
30308
22:34:33,279 --> 22:34:37,360
interchangeably and they are going to do
30309
22:34:35,440 --> 22:34:39,512
the same things we have been seeing for
30310
22:34:37,360 --> 22:34:41,512
classes they really are the same things
30311
22:34:39,512 --> 22:34:43,512
the only difference is that classes are
30312
22:34:41,512 --> 22:34:46,639
going to have private member variables
30313
22:34:43,512 --> 22:34:49,512
by default and struct will have public
30314
22:34:46,639 --> 22:34:51,831
member variables by default but we can
30315
22:34:49,512 --> 22:34:54,800
change this defaults by putting in our
30316
22:34:51,831 --> 22:34:57,191
own public and private sections inside
30317
22:34:54,800 --> 22:34:59,440
our class so for example here you see
30318
22:34:57,191 --> 22:35:01,599
that we have changed our dog class to
30319
22:34:59,440 --> 22:35:04,160
have a public member variable through
30320
22:35:01,600 --> 22:35:06,160
the public keyword here and we can do
30321
22:35:04,160 --> 22:35:08,232
the same for cat for example we can put
30322
22:35:06,160 --> 22:35:10,232
in a public section and a private
30323
22:35:08,232 --> 22:35:12,800
section and it's going to behave like
30324
22:35:10,232 --> 22:35:15,360
classes we have been welding so far
30325
22:35:12,800 --> 22:35:19,120
one common use we have for struct is
30326
22:35:15,360 --> 22:35:21,759
when we have to set up classes that only
30327
22:35:19,119 --> 22:35:24,231
have public member variables for example
30328
22:35:21,759 --> 22:35:26,959
you can need to set up a point
30329
22:35:24,232 --> 22:35:28,720
model in your c plus plus program and
30330
22:35:26,960 --> 22:35:30,800
you can set up a class like this you can
30331
22:35:28,720 --> 22:35:32,720
say struct point you're going to put in
30332
22:35:30,800 --> 22:35:34,720
the member variables and they are going
30333
22:35:32,720 --> 22:35:36,720
to be directly accessible from the
30334
22:35:34,720 --> 22:35:39,600
outside and this is something you will
30335
22:35:36,720 --> 22:35:41,680
see a lot out there so this is really
30336
22:35:39,600 --> 22:35:43,680
all about struct we're going to head
30337
22:35:41,679 --> 22:35:46,479
over to visual studio code and play with
30338
22:35:43,679 --> 22:35:48,799
us a little more okay here we are in our
30339
22:35:46,479 --> 22:35:51,360
working folder the current project is
30340
22:35:48,800 --> 22:35:53,192
struct we're going to grab our template
30341
22:35:51,360 --> 22:35:56,479
files and we're going to put them in
30342
22:35:53,191 --> 22:35:58,551
place struct that's all project here
30343
22:35:56,479 --> 22:36:00,159
and we're going to open this in visual
30344
22:36:00,160 --> 22:36:04,232
let's grab extract and drag and drop on
30345
22:36:02,232 --> 22:36:07,192
top of visual studio code here this is
30346
22:36:04,232 --> 22:36:09,919
going to open our folder we can now open
30347
22:36:07,191 --> 22:36:11,679
the main cpp file and clean things up a
30348
22:36:09,919 --> 22:36:13,919
little bit okay so we're going to set up
30349
22:36:11,679 --> 22:36:16,479
a simple class called dog we're going to
30350
22:36:13,919 --> 22:36:18,800
say class dog and inside we're going to
30351
22:36:16,479 --> 22:36:21,191
have a member variable called name it's
30352
22:36:18,800 --> 22:36:23,680
going to be an std strand let's say dog
30353
22:36:21,191 --> 22:36:25,679
name or m name to mean that it is a
30354
22:36:23,679 --> 22:36:28,399
member variable this is a syntax you
30355
22:36:25,679 --> 22:36:30,551
will see a lot in c plus plus out there
30356
22:36:28,399 --> 22:36:33,279
so let's use this from now on we're
30357
22:36:30,551 --> 22:36:36,080
going to say m name and we're going to
30358
22:36:33,279 --> 22:36:38,319
have another class let's put our
30359
22:36:36,080 --> 22:36:40,551
semicolon we're going to use struct to
30360
22:36:38,320 --> 22:36:43,040
set up another one and it's going to be
30361
22:36:40,551 --> 22:36:44,959
called dog let's call this cat and we
30362
22:36:43,039 --> 22:36:46,799
are going to go inside and set up our
30363
22:36:44,960 --> 22:36:48,960
member variable we're going to say std
30364
22:36:46,800 --> 22:36:51,680
strength m name and it's not going to
30365
22:36:48,960 --> 22:36:54,639
have anything m so if we create objects
30366
22:36:51,679 --> 22:36:56,871
of these classes and try to access them
30367
22:36:54,639 --> 22:36:59,039
we're going to see the fundamental
30368
22:36:56,872 --> 22:37:00,720
difference between structure and dog
30369
22:36:59,039 --> 22:37:03,039
let's create a dog and we're going to
30370
22:37:00,720 --> 22:37:05,191
say dog one and we're going to create a
30371
22:37:03,039 --> 22:37:08,871
cat and we're going to say cat one and
30372
22:37:05,191 --> 22:37:10,871
if we do dog 1 and try to access the m
30373
22:37:10,872 --> 22:37:15,120
maybe set it to something else let's say
30374
22:37:13,191 --> 22:37:18,319
fluffy we're going to have a compiler
30375
22:37:15,119 --> 22:37:20,479
error because members of a class are
30376
22:37:18,320 --> 22:37:21,600
private by default and we can't really
30377
22:37:21,600 --> 22:37:25,600
so we are trying to access something
30378
22:37:23,440 --> 22:37:27,440
that is private from the outside we're
30379
22:37:25,600 --> 22:37:29,680
going to get a compiler error okay so we
30380
22:37:27,440 --> 22:37:31,919
have a squiggly line here but if we try
30381
22:37:29,679 --> 22:37:34,319
to do the same for a cat it's going to
30382
22:37:31,919 --> 22:37:37,759
go through because cat is destruct and
30383
22:37:34,320 --> 22:37:39,440
members of structs are public by default
30384
22:37:37,759 --> 22:37:41,919
let's do that and really show you this
30385
22:37:39,440 --> 22:37:44,160
we're going to say cat1 and we're going
30386
22:37:41,919 --> 22:37:47,440
to say m name and we're going to give it
30387
22:37:44,160 --> 22:37:49,600
a name and let's say johnny i am making
30388
22:37:47,440 --> 22:37:51,760
this up i don't know if there is any cat
30389
22:37:49,600 --> 22:37:53,279
named johnny but we're going to use this
30390
22:37:51,759 --> 22:37:55,599
and you're going to see that we don't
30391
22:37:53,279 --> 22:37:58,080
have any squiggly line we're going to
30392
22:37:55,600 --> 22:37:59,920
build and see if gcc is going to take
30393
22:37:58,080 --> 22:38:02,720
this it's going to take it the world is
30394
22:37:59,919 --> 22:38:04,800
good we can bring up a terminal and run
30395
22:38:02,720 --> 22:38:06,551
the program and we're not going to see
30396
22:38:04,800 --> 22:38:09,120
anything because we're not printing
30397
22:38:06,551 --> 22:38:11,831
anything from the main function here but
30398
22:38:09,119 --> 22:38:15,039
if we want we can print this name of our
30399
22:38:11,831 --> 22:38:17,599
cat we're going to say sddc out and say
30400
22:38:15,039 --> 22:38:20,479
cat one name and if we build we're going
30401
22:38:17,600 --> 22:38:23,512
to see that so the both should be good
30402
22:38:20,479 --> 22:38:25,440
it is good we can clear and run rooster
30403
22:38:23,512 --> 22:38:27,191
and we have johnny printed out and this
30404
22:38:25,440 --> 22:38:29,919
is the name of volca and this is really
30405
22:38:27,191 --> 22:38:32,000
the difference between class and strut
30406
22:38:29,919 --> 22:38:34,479
members of classes are going to be
30407
22:38:32,000 --> 22:38:36,872
private by default members of struct are
30408
22:38:34,479 --> 22:38:38,872
going to be public by default but we can
30409
22:38:36,872 --> 22:38:41,360
change these defaults for example let's
30410
22:38:38,872 --> 22:38:42,800
make everything public we can do that no
30411
22:38:42,800 --> 22:38:48,800
and we can move this a little bit to the
30412
22:38:45,679 --> 22:38:51,599
right so that things are aligned nicely
30413
22:38:48,800 --> 22:38:54,800
and we can do the same for struct okay
30414
22:38:51,600 --> 22:38:56,872
so let's align this now if we do this we
30415
22:38:54,800 --> 22:38:58,800
will be able to go in the main function
30416
22:38:56,872 --> 22:39:00,479
and say dog name and change that and
30417
22:38:58,800 --> 22:39:03,832
we're going to be able to see that if we
30418
22:39:00,479 --> 22:39:08,000
print that out so let's go down and say
30419
22:39:03,831 --> 22:39:09,360
stdc out and say dog1 name and print
30420
22:39:09,360 --> 22:39:13,512
and if we build now we're going to see
30421
22:39:11,119 --> 22:39:15,440
the name of our dog printed out okay
30422
22:39:13,512 --> 22:39:18,320
well this is good we can bring this up
30423
22:39:15,440 --> 22:39:20,232
and clear a little bit and run rooster
30424
22:39:18,320 --> 22:39:22,960
we're going to see fluffy our dog name
30425
22:39:20,232 --> 22:39:25,832
and johnny our cat name so this is
30426
22:39:22,960 --> 22:39:27,760
really all about classes and struct they
30427
22:39:25,831 --> 22:39:29,511
are the same things but the only
30428
22:39:27,759 --> 22:39:31,831
difference is the defaults that come
30429
22:39:29,512 --> 22:39:34,800
with these things but the common use we
30430
22:39:31,831 --> 22:39:37,831
have for struct is when we want to set
30431
22:39:34,800 --> 22:39:40,320
up a class that only has direct member
30432
22:39:37,831 --> 22:39:43,039
variables and we don't intend to put
30433
22:39:40,320 --> 22:39:45,280
methods into that class a good example
30434
22:39:43,039 --> 22:39:47,759
of this is the struct off point so
30435
22:39:45,279 --> 22:39:50,080
suppose we want to model points in our c
30436
22:39:47,759 --> 22:39:52,231
plus plus program so we can do something
30437
22:39:50,080 --> 22:39:55,040
like this and a point is going to have
30438
22:39:52,232 --> 22:39:57,832
two coordinates x and y we're going to
30439
22:39:55,039 --> 22:39:59,919
say double y and from this point on we
30440
22:39:57,831 --> 22:40:02,319
will be able to create point objects and
30441
22:39:59,919 --> 22:40:04,800
print them out however we want so for
30442
22:40:02,320 --> 22:40:07,600
example we can go down and say point
30443
22:40:04,800 --> 22:40:11,040
point one and from this point we can go
30444
22:40:07,600 --> 22:40:13,360
in and say 0.1 and say x and assign a
30445
22:40:11,039 --> 22:40:17,039
value to x let's put in a 10 and we're
30446
22:40:13,360 --> 22:40:18,720
going to go down and say point 1 y and
30447
22:40:17,039 --> 22:40:19,479
we're going to give it a value let's put
30448
22:40:19,479 --> 22:40:24,231
55.5 why not and we can do whatever we
30449
22:40:22,232 --> 22:40:25,760
want with this point for example we can
30450
22:40:24,232 --> 22:40:28,232
set up a function which is going to
30451
22:40:25,759 --> 22:40:30,720
print a point we can do that let's say
30452
22:40:28,232 --> 22:40:33,192
void print point and we're going to pass
30453
22:40:30,720 --> 22:40:35,040
the point by value or we can even use
30454
22:40:33,191 --> 22:40:37,599
references because this is going to be
30455
22:40:35,039 --> 22:40:39,279
an object const point reference i think
30456
22:40:37,600 --> 22:40:41,760
this is going to do and we're going to
30457
22:40:39,279 --> 22:40:43,039
go inside and print the information
30458
22:40:43,039 --> 22:40:48,231
hddc out point and we're going to put
30459
22:40:45,600 --> 22:40:51,760
the coordinates on we're going to say x
30460
22:40:48,232 --> 22:40:54,480
is going to be point x and y is going to
30461
22:40:51,759 --> 22:40:57,119
be point y why not and we're going to
30462
22:40:54,479 --> 22:40:59,440
put in our closing square bracket and
30463
22:40:59,440 --> 22:41:04,551
to put a new line character after our
30464
22:41:02,080 --> 22:41:07,680
print here now we can go down and say
30465
22:41:04,551 --> 22:41:10,080
print point and pass on point one
30466
22:41:07,679 --> 22:41:11,759
and if we do that we're going to build
30467
22:41:10,080 --> 22:41:14,479
and we're going to do that through gcc
30468
22:41:11,759 --> 22:41:16,799
you see the both is good now if we print
30469
22:41:14,479 --> 22:41:19,479
we should see the information about our
30470
22:41:26,639 --> 22:41:30,160
we can go down and change the
30471
22:41:28,399 --> 22:41:33,439
information about our point for example
30472
22:41:30,160 --> 22:41:35,720
we can copy this and go down and change
30473
22:41:39,872 --> 22:41:44,551
2.7 why not and if we print the
30474
22:41:42,800 --> 22:41:46,479
information about our point we're going
30475
22:41:44,551 --> 22:41:48,479
to see that we have new information and
30476
22:41:46,479 --> 22:41:50,000
we're going to print point one and
30477
22:41:48,479 --> 22:41:52,319
therefore world we're going to see the
30478
22:41:50,000 --> 22:41:55,119
new information so the build is good we
30479
22:41:52,320 --> 22:41:57,120
can clear and run rooster now you see
30480
22:41:55,119 --> 22:41:59,119
new information in our point so this is
30481
22:41:57,119 --> 22:42:01,191
really the difference between class and
30482
22:41:59,119 --> 22:42:03,919
struct the only difference is going to
30483
22:42:01,191 --> 22:42:07,039
be in the defaults and struct is mostly
30484
22:42:03,919 --> 22:42:09,919
useful if you want to set up classes
30485
22:42:07,039 --> 22:42:12,231
that only have public member variables
30486
22:42:09,919 --> 22:42:14,959
and you don't really want to use
30487
22:42:12,232 --> 22:42:17,279
functions or methods in that class and
30488
22:42:14,960 --> 22:42:19,360
we have an example of that here and if
30489
22:42:17,279 --> 22:42:21,119
you have a case like that you will use
30490
22:42:19,360 --> 22:42:24,160
struct your code is going to be much
30491
22:42:21,119 --> 22:42:26,479
easier to read and understand from the
30492
22:42:24,160 --> 22:42:29,040
perspective of other c plus plus
30493
22:42:26,479 --> 22:42:30,639
developers we are going to stop here in
30494
22:42:29,039 --> 22:42:34,000
this lecture and the last one we're
30495
22:42:30,639 --> 22:42:36,399
going to learn about the size of objects
30496
22:42:34,000 --> 22:42:37,440
go ahead and finish up here and meet me
30497
22:42:37,440 --> 22:42:42,551
in this lecture we're going to learn
30498
22:42:38,872 --> 22:42:43,919
about sizes of class objects and try to
30499
22:42:43,919 --> 22:42:49,440
what are we going to see if we try to
30500
22:42:46,551 --> 22:42:51,919
print the size of our class here called
30501
22:42:49,440 --> 22:42:54,639
wrapper inside we have two member
30502
22:42:51,919 --> 22:42:56,479
variables which are of and type
30503
22:42:54,639 --> 22:43:00,000
and we have a member variable which is
30504
22:42:56,479 --> 22:43:01,360
of std string type what do you think
30505
22:43:01,360 --> 22:43:05,831
when we print the size of this wrapper
30506
22:43:05,831 --> 22:43:11,119
try to think about it so what c plus
30507
22:43:08,160 --> 22:43:13,760
plus does it's going to only account for
30508
22:43:11,119 --> 22:43:15,759
the size of your member variables so
30509
22:43:13,759 --> 22:43:17,511
it's going to add to the sizes of these
30510
22:43:15,759 --> 22:43:19,599
guys in memory so we know an end is
30511
22:43:17,512 --> 22:43:21,440
going to take four bytes in memory so
30512
22:43:19,600 --> 22:43:23,760
we're going to have eight bytes for
30513
22:43:21,440 --> 22:43:26,160
these two ants and we're going to have
30514
22:43:23,759 --> 22:43:28,479
an unspecified amount of memory for a
30515
22:43:26,160 --> 22:43:32,000
strength because a strength is
30516
22:43:28,479 --> 22:43:35,440
internally implemented as a class and it
30517
22:43:32,000 --> 22:43:37,512
stores its data as cost car pointers so
30518
22:43:37,512 --> 22:43:43,919
and the size of an object doesn't really
30519
22:43:41,440 --> 22:43:46,400
account for thanks you are referring to
30520
22:43:43,919 --> 22:43:48,800
using pointers it may count to the size
30521
22:43:46,399 --> 22:43:51,511
of the pointer itself but it's not going
30522
22:43:48,800 --> 22:43:53,279
to count what is pointed to and in the
30523
22:43:51,512 --> 22:43:54,639
case of string for example we really
30524
22:43:54,639 --> 22:43:58,872
the range of things that we are pointing
30525
22:43:57,039 --> 22:44:01,831
to so we're not going to have correct
30526
22:43:58,872 --> 22:44:04,400
information with hdd string here but in
30527
22:44:01,831 --> 22:44:07,360
general the size of an object is going
30528
22:44:04,399 --> 22:44:09,511
to be the sum of the sizes of its member
30529
22:44:07,360 --> 22:44:11,831
variables the functions are not going to
30530
22:44:09,512 --> 22:44:14,160
be counted then the functions are just
30531
22:44:11,831 --> 22:44:16,080
helper functions that live somewhere in
30532
22:44:14,160 --> 22:44:19,120
memory but they're not going to be
30533
22:44:16,080 --> 22:44:21,360
accounted for in the size of your object
30534
22:44:19,119 --> 22:44:23,831
another reason you might think functions
30535
22:44:21,360 --> 22:44:26,232
are not accounted for in the size of the
30536
22:44:23,831 --> 22:44:29,039
object is that really functions are
30537
22:44:26,232 --> 22:44:31,680
affiliated with the class itself
30538
22:44:29,039 --> 22:44:33,759
functions are not affiliated with class
30539
22:44:31,679 --> 22:44:35,359
objects the class is going to be the
30540
22:44:33,759 --> 22:44:38,000
blueprint from which we're going to
30541
22:44:35,360 --> 22:44:39,919
generate thousands of objects if we want
30542
22:44:38,000 --> 22:44:42,639
but the functions or the methods are
30543
22:44:39,919 --> 22:44:45,119
going to be associated to the blueprint
30544
22:44:42,639 --> 22:44:47,679
itself so it really wouldn't make sense
30545
22:44:45,119 --> 22:44:51,119
to associate the size of those functions
30546
22:44:47,679 --> 22:44:53,439
in memory to class objects now that you
30547
22:44:51,119 --> 22:44:54,959
have this idea let's head over to visual
30548
22:44:53,440 --> 22:44:57,512
studio code and play with this a little
30549
22:44:54,960 --> 22:44:59,512
more okay we have saved that the size is
30550
22:44:57,512 --> 22:45:01,919
mostly going to be the sum of the sizes
30551
22:44:59,512 --> 22:45:04,720
for the member variables but this is not
30552
22:45:01,919 --> 22:45:05,759
always correct because of a phenomenon
30553
22:45:07,919 --> 22:45:13,119
binary alignment is a thing most
30554
22:45:10,399 --> 22:45:16,000
compilers do when they have member
30555
22:45:13,119 --> 22:45:18,551
variables of different types and member
30556
22:45:16,000 --> 22:45:20,720
variables that have the size of four
30557
22:45:18,551 --> 22:45:23,599
bytes in memory are going to be stored
30558
22:45:20,720 --> 22:45:26,479
at memory locations that are multiples
30559
22:45:23,600 --> 22:45:29,760
of four and because of this phenomenon
30560
22:45:26,479 --> 22:45:32,000
we might have gaps between our memory if
30561
22:45:29,759 --> 22:45:34,639
we have variables for example that are
30562
22:45:32,000 --> 22:45:36,800
of two bytes in memory and four bytes in
30563
22:45:34,639 --> 22:45:39,679
memory and we're going to have gaps
30564
22:45:36,800 --> 22:45:42,232
inside and the size of the object is
30565
22:45:39,679 --> 22:45:44,799
going to be slightly off the sum we
30566
22:45:42,232 --> 22:45:46,960
might do for the sizes of our object i
30567
22:45:44,800 --> 22:45:48,960
realize this may be confusing we're
30568
22:45:46,960 --> 22:45:50,720
going to head over to visual studio code
30569
22:45:48,960 --> 22:45:53,360
and we're going to see a few examples
30570
22:45:50,720 --> 22:45:56,000
okay here we are in our working folder
30571
22:45:53,360 --> 22:45:58,720
the current project is size of class
30572
22:45:56,000 --> 22:46:01,119
objects we're going to grab our template
30573
22:45:58,720 --> 22:46:03,831
files pretty quick and we're going to
30574
22:46:01,119 --> 22:46:06,479
put them in place and we're going to
30575
22:46:03,831 --> 22:46:08,479
open our project in visual studio code
30576
22:46:06,479 --> 22:46:11,360
by dragging and dropping here we have
30577
22:46:08,479 --> 22:46:12,639
our main cpp file we can close the left
30578
22:46:12,639 --> 22:46:16,551
and we can clean the main function here
30579
22:46:15,039 --> 22:46:19,360
we're going to set up a simple class
30580
22:46:16,551 --> 22:46:22,080
let's call this dog why not we have been
30581
22:46:19,360 --> 22:46:24,320
using dove so let's use this again
30582
22:46:22,080 --> 22:46:26,479
we're going to put our closing semicolon
30583
22:46:24,320 --> 22:46:29,192
we're going to put a public section and
30584
22:46:26,479 --> 22:46:30,959
it's going to just contain a constructor
30585
22:46:29,191 --> 22:46:32,871
and we're going to say dog and we're
30586
22:46:30,960 --> 22:46:35,680
going to use the default and we're going
30587
22:46:32,872 --> 22:46:38,551
to put in a private section and
30588
22:46:35,679 --> 22:46:39,599
in here we're going to put in a size t
30589
22:46:39,600 --> 22:46:45,192
this is the leg count of the dog why not
30590
22:46:42,551 --> 22:46:48,319
let's say we are modeling this okay so
30591
22:46:45,191 --> 22:46:50,551
now we have our dog class in place we
30592
22:46:48,320 --> 22:46:52,080
can create objects of this dog class
30593
22:46:52,080 --> 22:46:57,759
dog one and if we do this we are
30594
22:46:54,551 --> 22:46:59,279
interested in knowing the size of our
30595
22:46:59,279 --> 22:47:06,160
so we are going to say stdc out size of
30596
22:47:03,119 --> 22:47:08,000
dog and save that and uh fingers crossed
30597
22:47:06,160 --> 22:47:10,400
we're going to see the size of our dog
30598
22:47:08,000 --> 22:47:12,639
object here and try to guess what we're
30599
22:47:10,399 --> 22:47:15,511
going to get in the slides we have seen
30600
22:47:12,639 --> 22:47:17,831
that the size is mostly going to be
30601
22:47:15,512 --> 22:47:18,960
the sum of the size of the member
30602
22:47:18,960 --> 22:47:24,000
and let's print the size of size t here
30603
22:47:21,600 --> 22:47:25,832
because size d is our only member
30604
22:47:24,000 --> 22:47:28,479
variable so i think it's going to be
30605
22:47:25,831 --> 22:47:30,231
helpful to see its size printed out
30606
22:47:28,479 --> 22:47:32,319
so we're going to have some context if
30607
22:47:30,232 --> 22:47:34,872
we do that we're going to say size of
30608
22:47:34,872 --> 22:47:38,872
save that and we're going to build this
30609
22:47:36,800 --> 22:47:41,120
program let's do that we're going to
30610
22:47:38,872 --> 22:47:42,232
pass this through gcc you see the both
30611
22:47:42,232 --> 22:47:47,040
and we're going to bring up a terminal
30612
22:47:44,232 --> 22:47:50,160
and run this see what happens okay we
30613
22:47:47,039 --> 22:47:53,439
see size of size t is eight and the size
30614
22:47:50,160 --> 22:47:56,552
of our dark object is eight and this is
30615
22:47:53,440 --> 22:47:59,360
really cool because we see that the size
30616
22:47:56,551 --> 22:48:00,959
of our class object is really the size
30617
22:48:00,960 --> 22:48:05,192
member variables that we have in here
30618
22:48:03,191 --> 22:48:07,191
let's set up another member variable and
30619
22:48:05,191 --> 22:48:10,080
really show you this so we're going to
30620
22:48:07,191 --> 22:48:11,919
have arm account okay so we are just
30621
22:48:11,919 --> 22:48:17,119
i don't aim for this class here to make
30622
22:48:14,639 --> 22:48:20,000
some sense practically we just want to
30623
22:48:17,119 --> 22:48:23,279
see how the member variables affect the
30624
22:48:20,000 --> 22:48:25,600
size of our class object now we have two
30625
22:48:23,279 --> 22:48:27,759
member variables and we're going to try
30626
22:48:25,600 --> 22:48:30,160
and world we're going to use gcc to do
30627
22:48:27,759 --> 22:48:31,279
that and we're going to clear and run
30628
22:48:31,279 --> 22:48:34,872
now you see that size of doug is 16 and
30629
22:48:34,872 --> 22:48:40,639
proven that the size of an object is
30630
22:48:37,919 --> 22:48:42,959
only accounting for the sizes of the
30631
22:48:40,639 --> 22:48:45,600
member variables it's not going to count
30632
22:48:42,960 --> 22:48:48,320
the functions that we have here so if
30633
22:48:45,600 --> 22:48:50,400
for example we had a function that says
30634
22:48:48,320 --> 22:48:52,800
printful and we have another one that
30635
22:48:50,399 --> 22:48:55,360
says do something this is not going to
30636
22:48:52,800 --> 22:48:58,720
change the size of our object because
30637
22:48:55,360 --> 22:49:01,191
functions aren't accounted for in the
30638
22:49:01,191 --> 22:49:06,551
so let's build and really show you this
30639
22:49:04,399 --> 22:49:08,639
the world is good we can clear and run
30640
22:49:06,551 --> 22:49:11,919
rooster we see that we have the same
30641
22:49:08,639 --> 22:49:14,872
sizes the size of dog is 16 the size of
30642
22:49:11,919 --> 22:49:16,872
size t is eight we can even use object
30643
22:49:14,872 --> 22:49:19,440
names here for example we are using the
30644
22:49:16,872 --> 22:49:20,479
class itself but we can use dog one here
30645
22:49:19,440 --> 22:49:23,040
and we're going to get the same
30646
22:49:20,479 --> 22:49:25,759
information let's both and we're going
30647
22:49:25,759 --> 22:49:30,799
and you see that we have the same size
30648
22:49:28,160 --> 22:49:32,400
so if we change this thing to put in a
30649
22:49:30,800 --> 22:49:35,832
pointer we're going to see something
30650
22:49:32,399 --> 22:49:38,479
else let's put in an end pointer
30651
22:49:35,831 --> 22:49:40,871
and let's say ph like we have been doing
30652
22:49:38,479 --> 22:49:43,279
all along and see what we get and we
30653
22:49:40,872 --> 22:49:45,680
know that the size of a pointer on my
30654
22:49:43,279 --> 22:49:48,551
system let's print that out so that we
30655
22:49:45,679 --> 22:49:51,759
have no doubt let's for example say size
30656
22:49:48,551 --> 22:49:54,399
of end pointer is going to be size of
30657
22:49:51,759 --> 22:49:55,279
end pointer okay let's build we're going
30658
22:49:55,279 --> 22:50:00,399
pass this through gcc and the both is
30659
22:49:58,000 --> 22:50:02,479
going to be good we can clear and run
30660
22:50:00,399 --> 22:50:05,439
rooster we're going to see that we have
30661
22:50:02,479 --> 22:50:07,360
24 because we have two member variables
30662
22:50:05,440 --> 22:50:10,800
that are going to be eight bytes in
30663
22:50:07,360 --> 22:50:13,039
memory of size t they are of type size t
30664
22:50:10,800 --> 22:50:15,919
and we have a pointer which is going to
30665
22:50:13,039 --> 22:50:18,551
have a size of h in memory but we don't
30666
22:50:15,919 --> 22:50:20,399
care what this pointer is pointing to
30667
22:50:18,551 --> 22:50:22,479
if for example this pointer is pointing
30668
22:50:22,479 --> 22:50:26,479
we don't care we're just going to
30669
22:50:24,160 --> 22:50:29,600
account for the end pointer here and
30670
22:50:26,479 --> 22:50:32,231
this is really phenomenal because if for
30671
22:50:29,600 --> 22:50:33,279
example we tried to set up an sdd string
30672
22:50:33,279 --> 22:50:39,191
and by now you should know that std
30673
22:50:35,831 --> 22:50:41,759
strand itself is implemented as a class
30674
22:50:39,191 --> 22:50:44,080
in c plus plus so it's really a class
30675
22:50:41,759 --> 22:50:45,679
and we can print its size so let's set
30676
22:50:44,080 --> 22:50:48,551
up a string object here we're going to
30677
22:50:45,679 --> 22:50:50,799
say std strung and we're going to say
30678
22:50:48,551 --> 22:50:52,800
name and we're going to initialize this
30679
22:50:50,800 --> 22:50:55,192
with hello world okay we're going to see
30680
22:50:52,800 --> 22:50:57,120
something really strange here so if we
30681
22:50:55,191 --> 22:51:00,231
print the size of name here we're going
30682
22:50:57,119 --> 22:51:02,319
to say size of name and we're going to
30683
22:51:00,232 --> 22:51:03,760
print that let's see what we get we're
30684
22:51:05,600 --> 22:51:10,400
see the block is good and can clear and
30685
22:51:08,639 --> 22:51:12,872
run roaster we're going to see that size
30686
22:51:12,872 --> 22:51:18,080
let's change the text inside our string
30687
22:51:16,399 --> 22:51:20,159
and see that we change accordingly
30688
22:51:18,080 --> 22:51:23,919
because this can really be confusing
30689
22:51:20,160 --> 22:51:26,000
let's say i am the king of the universe
30690
22:51:23,919 --> 22:51:28,232
why not and we're going to build again
30691
22:51:26,000 --> 22:51:30,551
let's see what we get fingers crossed
30692
22:51:28,232 --> 22:51:32,720
this is going to blow your mind you see
30693
22:51:30,551 --> 22:51:35,360
we have the same size for name even if
30694
22:51:32,720 --> 22:51:38,000
we are changing the text in here so what
30695
22:51:35,360 --> 22:51:41,440
is really happening the strength is
30696
22:51:38,000 --> 22:51:42,399
storing our text here as cost card
30697
22:51:42,399 --> 22:51:47,679
and what we have is a pointer inside and
30698
22:51:47,679 --> 22:51:52,799
is a member variable which is a pointer
30699
22:51:50,399 --> 22:51:55,599
like we have here so what we will be
30700
22:51:52,800 --> 22:51:57,760
accounting for in the strength class is
30701
22:51:55,600 --> 22:52:00,232
the size of the pointer but it's not the
30702
22:51:57,759 --> 22:52:03,279
size of what is pointed to okay so the
30703
22:52:00,232 --> 22:52:06,000
car pointer may be pointing to thousands
30704
22:52:03,279 --> 22:52:08,160
of characters in memory but as long as
30705
22:52:06,000 --> 22:52:10,232
the compiler is concerned it's just
30706
22:52:08,160 --> 22:52:12,232
going to use the pointer member variable
30707
22:52:10,232 --> 22:52:14,080
and it's going to account for it in the
30708
22:52:12,232 --> 22:52:15,512
size of your object hopefully you can
30709
22:52:15,512 --> 22:52:19,440
the size of our string objects is going
30710
22:52:19,440 --> 22:52:24,400
regardless of how large is this strand
30711
22:52:22,232 --> 22:52:26,320
this is really something you need to
30712
22:52:24,399 --> 22:52:28,551
understand otherwise this is going to
30713
22:52:26,320 --> 22:52:30,960
throw you off as you design your c plus
30714
22:52:28,551 --> 22:52:33,679
plus applications and this is really all
30715
22:52:30,960 --> 22:52:35,512
i had to share in this lecture the size
30716
22:52:33,679 --> 22:52:37,511
of your object is mostly going to be
30717
22:52:37,512 --> 22:52:41,919
member variables you have and the size
30718
22:52:39,679 --> 22:52:44,719
is going to be the sum of the sizes of
30719
22:52:41,919 --> 22:52:46,959
your member variables i would like to
30720
22:52:44,720 --> 22:52:48,479
welcome you in this new chapter where
30721
22:52:46,960 --> 22:52:51,280
we're going to be learning about
30722
22:52:48,479 --> 22:52:54,000
inheritance and inheritance is a feature
30723
22:52:54,000 --> 22:52:59,440
to allow us to build classes in terms of
30724
22:52:59,440 --> 22:53:04,080
and what i mean here is that we can
30725
22:53:01,191 --> 22:53:06,871
build complete hierarchies of classes
30726
22:53:04,080 --> 22:53:09,759
that depend on other classes for example
30727
22:53:06,872 --> 22:53:12,639
if we think of a person as a type we can
30728
22:53:09,759 --> 22:53:15,191
have different types of persons we can
30729
22:53:12,639 --> 22:53:18,232
have a doctor a doctor is a person we
30730
22:53:15,191 --> 22:53:20,720
can have a physician a physician is a
30731
22:53:18,232 --> 22:53:23,120
person we can have an engineer an
30732
22:53:20,720 --> 22:53:25,919
engineer as a person we can have really
30733
22:53:23,119 --> 22:53:28,639
all kinds of persons and we can capture
30734
22:53:25,919 --> 22:53:31,191
these kinds of relationships in c plus
30735
22:53:28,639 --> 22:53:34,160
plus using inheritance for example here
30736
22:53:31,191 --> 22:53:36,551
we have an inheritance hierarchy we can
30737
22:53:34,160 --> 22:53:38,400
set up a person type in our c plus
30738
22:53:36,551 --> 22:53:42,231
program and put in whatever member
30739
22:53:38,399 --> 22:53:44,399
variables we need to define a person for
30740
22:53:42,232 --> 22:53:46,800
whatever purposes we are building our c
30741
22:53:44,399 --> 22:53:49,191
plus plus application for once we have
30742
22:53:46,800 --> 22:53:51,512
this type we can build other types that
30743
22:53:49,191 --> 22:53:54,000
depend on this person for example we can
30744
22:53:51,512 --> 22:53:57,040
build an engineer type which is really
30745
22:53:54,000 --> 22:53:59,191
going to embody the person type inside
30746
22:53:57,039 --> 22:54:02,639
so what we will be doing is really
30747
22:53:59,191 --> 22:54:05,119
setting up a layer of a person type and
30748
22:54:02,639 --> 22:54:08,080
in our engineer type which is going to
30749
22:54:05,119 --> 22:54:10,720
depend on person we will boil the novel
30750
22:54:08,080 --> 22:54:13,360
layer on top of that and really reuse
30751
22:54:10,720 --> 22:54:15,759
that person type without having to
30752
22:54:13,360 --> 22:54:17,512
rebuild this from scratch hopefully you
30753
22:54:15,759 --> 22:54:20,000
can see that this is going to improve
30754
22:54:17,512 --> 22:54:22,080
code reuse we can also reuse this
30755
22:54:20,000 --> 22:54:23,831
engineer type and well the other types
30756
22:54:22,080 --> 22:54:26,320
on top of it for example we can have a
30757
22:54:23,831 --> 22:54:28,399
civil engineer we can have an electrical
30758
22:54:26,320 --> 22:54:31,120
engineer we can have all kinds of crazy
30759
22:54:28,399 --> 22:54:32,159
engineers modeled in our c plus plus
30760
22:54:32,160 --> 22:54:36,552
using the inheritance and this is going
30761
22:54:33,831 --> 22:54:39,039
to be really cool so this is what we are
30762
22:54:36,551 --> 22:54:41,360
going to be exploring in this chapter
30763
22:54:39,039 --> 22:54:44,551
looking at the facilities that c plus
30764
22:54:41,360 --> 22:54:46,720
plus provides to capture these kinds of
30765
22:54:44,551 --> 22:54:49,679
relationships in our c plus plus
30766
22:54:46,720 --> 22:54:51,759
programs please note that inheritance is
30767
22:54:49,679 --> 22:54:54,479
a really big feature and it is a
30768
22:54:51,759 --> 22:54:57,439
defining feature of object oriented
30769
22:54:54,479 --> 22:55:00,319
programming c plus plus object oriented
30770
22:54:57,440 --> 22:55:03,360
programming is a paradigm or a way of
30771
22:55:00,320 --> 22:55:05,920
thinking about programming that uses
30772
22:55:03,360 --> 22:55:08,232
objects and the most basic defining
30773
22:55:05,919 --> 22:55:10,872
feature of object oriented programming
30774
22:55:08,232 --> 22:55:13,040
in c plus plus is classes that we have
30775
22:55:10,872 --> 22:55:15,760
learned about using classes we can
30776
22:55:13,039 --> 22:55:17,831
define things for example we can set up
30777
22:55:15,759 --> 22:55:20,000
a car we can set up a house we can set
30778
22:55:17,831 --> 22:55:22,080
up a spaceship we can do all kinds of
30779
22:55:20,000 --> 22:55:24,551
crazy things with classes and ziplocs
30780
22:55:22,080 --> 22:55:27,360
plus inheritance is going to build on
30781
22:55:24,551 --> 22:55:30,000
top of classes and allow us to build
30782
22:55:27,360 --> 22:55:31,759
classes that depend on each other and
30783
22:55:31,759 --> 22:55:36,159
hierarchies that are going to make our
30784
22:55:34,000 --> 22:55:39,039
design much easier to look at and
30785
22:55:36,160 --> 22:55:41,512
understand and work with okay so this is
30786
22:55:39,039 --> 22:55:43,439
what we are up against in this chapter
30787
22:55:41,512 --> 22:55:46,872
learning about inheritance and really
30788
22:55:43,440 --> 22:55:49,680
exposing you to as much as possible to
30789
22:55:46,872 --> 22:55:52,080
let you use inheritance in an easier way
30790
22:55:49,679 --> 22:55:54,079
in your c plus class programs we are
30791
22:55:52,080 --> 22:55:56,960
going to start in the next lecture and
30792
22:55:54,080 --> 22:55:59,119
try out inheritance for the first time
30793
22:55:56,960 --> 22:56:01,440
go ahead and finish up here and meet me
30794
22:55:59,119 --> 22:56:04,399
there in this lecture we're going to try
30795
22:56:01,440 --> 22:56:05,680
out inheritance for the first time in
30796
22:56:05,679 --> 22:56:11,279
but before we do that let's remind
30797
22:56:07,600 --> 22:56:13,512
ourselves of what inheritance really is
30798
22:56:11,279 --> 22:56:14,479
inheritance is a feature we have in c
30799
22:56:14,479 --> 22:56:20,720
to be able to build new classes in terms
30800
22:56:17,679 --> 22:56:23,039
of the classes we have predefined
30801
22:56:20,720 --> 22:56:25,360
and the new classes are going to be
30802
22:56:23,039 --> 22:56:28,399
stealing features from the already
30803
22:56:25,360 --> 22:56:31,119
pre-existing classes if i can say it
30804
22:56:28,399 --> 22:56:33,511
like that and the more classes we build
30805
22:56:31,119 --> 22:56:36,231
in terms of others we're going to end up
30806
22:56:33,512 --> 22:56:38,232
with what we call an inheritance tree
30807
22:56:36,232 --> 22:56:40,639
which is basically going to go from the
30808
22:56:38,232 --> 22:56:43,360
top to the bottom with the most
30809
22:56:40,639 --> 22:56:45,759
fundamental class on top and the derived
30810
22:56:43,360 --> 22:56:48,000
class at the bottom here we have a
30811
22:56:45,759 --> 22:56:49,511
simple example for example we can have a
30812
22:56:51,600 --> 22:56:56,960
defining the basic features of a person
30813
22:56:54,800 --> 22:57:00,400
but based on that personal class we
30814
22:56:56,960 --> 22:57:03,512
might want to derive other classes that
30815
22:57:00,399 --> 22:57:05,279
build on top of this person class for
30816
22:57:03,512 --> 22:57:07,760
example we might want to define an
30817
22:57:05,279 --> 22:57:10,399
engineer and a doctor and we know that
30818
22:57:07,759 --> 22:57:12,959
an engineer is also a person so they are
30819
22:57:10,399 --> 22:57:15,511
going to inherit some features from the
30820
22:57:12,960 --> 22:57:18,232
person class the same goes for the
30821
22:57:15,512 --> 22:57:21,040
doctor class it is going to inherit
30822
22:57:18,232 --> 22:57:23,600
some features from person but all these
30823
22:57:21,039 --> 22:57:26,159
derived classes are also going to add
30824
22:57:23,600 --> 22:57:28,639
their own features to the person class
30825
22:57:26,160 --> 22:57:30,720
siplus plus allows us to build these
30826
22:57:30,720 --> 22:57:36,232
here is another simple example we have a
30827
22:57:33,831 --> 22:57:39,279
vehicle class to the top of our
30828
22:57:36,232 --> 22:57:42,000
inheritance hierarchy and below this
30829
22:57:39,279 --> 22:57:44,319
class we might derive a track class
30830
22:57:42,000 --> 22:57:46,399
which is also a vehicle we might have a
30831
22:57:44,320 --> 22:57:49,280
minivan we might have a truck we might
30832
22:57:46,399 --> 22:57:52,000
have a pickup truck we may really do all
30833
22:57:49,279 --> 22:57:54,551
kinds of crazy vehicles which are going
30834
22:57:52,000 --> 22:57:57,191
to inherit the basic features from the
30835
22:57:54,551 --> 22:57:58,800
vehicle class and add their own
30836
22:57:58,800 --> 22:58:04,320
on top of the vehicle class so this is
30837
22:58:00,872 --> 22:58:06,800
the basic idea behind inheritance in c
30838
22:58:04,320 --> 22:58:09,040
plus plus so the examples we're going to
30839
22:58:09,039 --> 22:58:12,719
so here is a simple example of what
30840
22:58:11,191 --> 22:58:14,551
we're going to do in this lecture we're
30841
22:58:12,720 --> 22:58:17,040
going to set up a person class which is
30842
22:58:17,039 --> 22:58:21,439
it is going to be defining two member
30843
22:58:18,960 --> 22:58:23,512
variables which are going to be of std
30844
22:58:21,440 --> 22:58:25,832
string type we're going to have a last
30845
22:58:23,512 --> 22:58:27,191
name for the person and the first name
30846
22:58:27,191 --> 22:58:32,871
we are going to derive from this class
30847
22:58:32,872 --> 22:58:37,192
the player class is going to inherit
30848
22:58:35,039 --> 22:58:39,679
these features from the person class so
30849
22:58:37,191 --> 22:58:42,551
it is going to have a last name and a
30850
22:58:39,679 --> 22:58:45,359
first name built into it but that's
30851
22:58:42,551 --> 22:58:48,080
going to be our base or our starting
30852
22:58:45,360 --> 22:58:50,160
point we are going to add to this base
30853
22:58:48,080 --> 22:58:52,872
and add another member variable from
30854
22:58:50,160 --> 22:58:56,232
player and we're going to be having the
30855
22:58:52,872 --> 22:58:58,639
player class which is really a person
30856
22:58:56,232 --> 22:59:01,600
but it is going to add things to person
30857
22:58:58,639 --> 22:59:02,551
to customize on what we can do with a
30858
22:59:02,551 --> 22:59:08,159
that we wouldn't originally be able to
30859
22:59:05,119 --> 22:59:10,639
do or have with a person class this is
30860
22:59:08,160 --> 22:59:12,720
the basic idea okay now that we know
30861
22:59:10,639 --> 22:59:14,479
this we're going to set up our personal
30862
22:59:12,720 --> 22:59:16,960
class which is going to be our base
30863
22:59:14,479 --> 22:59:19,440
class it is going to have our two member
30864
22:59:16,960 --> 22:59:20,639
variables first the name and last name
30865
22:59:19,440 --> 22:59:22,551
we're going to have a bunch of
30866
22:59:20,639 --> 22:59:25,191
constructors and we're going to have a
30867
22:59:22,551 --> 22:59:27,599
stream output operator to be able to
30868
22:59:25,191 --> 22:59:30,399
print this on the console and see our
30869
22:59:27,600 --> 22:59:33,040
information here nothing special but now
30870
22:59:30,399 --> 22:59:36,079
that this class is done we can build
30871
22:59:33,039 --> 22:59:38,231
other classes on top of this class so
30872
22:59:36,080 --> 22:59:40,000
what we can do for example we can derive
30873
22:59:40,000 --> 22:59:45,679
so the syntax is what you see here we
30874
22:59:41,919 --> 22:59:47,831
say class player we say column column
30875
22:59:47,831 --> 22:59:53,191
and specify the class that we are
30876
22:59:50,160 --> 22:59:55,832
inheriting from so the parent class for
30877
22:59:53,191 --> 22:59:58,399
this class is going to be person or in
30878
22:59:55,831 --> 23:00:00,551
other words we're going to be deriving
30879
22:59:58,399 --> 23:00:03,599
from the person class and we're going to
30880
23:00:00,551 --> 23:00:05,679
be doing that publicly okay for now i
30881
23:00:03,600 --> 23:00:07,600
don't want you to worry too much about
30882
23:00:05,679 --> 23:00:10,399
this public keyword we're going to be
30883
23:00:07,600 --> 23:00:12,960
learning this in steps just know that
30884
23:00:10,399 --> 23:00:14,639
this is the syntax you use to derive
30885
23:00:14,639 --> 23:00:19,279
now the moment we do this the player
30886
23:00:17,119 --> 23:00:22,639
class is going to have the person
30887
23:00:19,279 --> 23:00:25,360
information embedded inside but we will
30888
23:00:22,639 --> 23:00:27,279
also have the ability to customize or
30889
23:00:27,279 --> 23:00:31,600
at the level of the player class this is
30890
23:00:29,919 --> 23:00:34,800
what we do we have a private member
30891
23:00:31,600 --> 23:00:36,960
variable and it is going to specify the
30892
23:00:34,800 --> 23:00:39,512
game at the player place we're going to
30893
23:00:36,960 --> 23:00:42,720
have our own set of constructors we can
30894
23:00:39,512 --> 23:00:46,720
really build player objects but they are
30895
23:00:42,720 --> 23:00:49,360
going to have a person part inside that
30896
23:00:46,720 --> 23:00:51,040
is going to store information about this
30897
23:00:51,039 --> 23:00:54,719
you notice we don't have a member
30898
23:00:52,960 --> 23:00:56,400
variable here for the first name we
30899
23:00:54,720 --> 23:00:58,639
don't have a member variable here for
30900
23:00:56,399 --> 23:01:01,191
the last name but that information is
30901
23:00:58,639 --> 23:01:03,759
going to be baked into this player
30902
23:01:01,191 --> 23:01:07,440
object and this is really how
30903
23:01:03,759 --> 23:01:08,959
inheritance helps us out we can derive
30904
23:01:08,960 --> 23:01:14,160
and build on top of them without having
30905
23:01:11,831 --> 23:01:16,720
to redo the fundamental work to build
30906
23:01:14,160 --> 23:01:19,512
our base classes we can just build on
30907
23:01:16,720 --> 23:01:22,232
top of them and really do things faster
30908
23:01:19,512 --> 23:01:24,080
and more efficiently okay so here are a
30909
23:01:22,232 --> 23:01:27,120
few things you need to know about the
30910
23:01:24,080 --> 23:01:29,831
public inheritance that we just did and
30911
23:01:27,119 --> 23:01:32,639
we are saying public inheritance because
30912
23:01:32,639 --> 23:01:37,679
public person this is doing public
30913
23:01:35,512 --> 23:01:40,639
inheritance and we're going to see what
30914
23:01:37,679 --> 23:01:43,599
this gives us so with public inheritance
30915
23:01:40,639 --> 23:01:46,720
derived classes can access and use
30916
23:01:43,600 --> 23:01:49,600
public members of the base class
30917
23:01:46,720 --> 23:01:52,000
but the derived class can't directly
30918
23:01:49,600 --> 23:01:54,800
access private members from the base
30919
23:01:52,000 --> 23:01:58,551
class i want you to let this sync end
30920
23:01:54,800 --> 23:02:01,360
what this means from the player class we
30921
23:01:58,551 --> 23:02:04,231
can't directly access the private member
30922
23:02:01,360 --> 23:02:07,039
variables we had in person remember our
30923
23:02:04,232 --> 23:02:10,639
first name and last name are private to
30924
23:02:07,039 --> 23:02:13,919
person and we can't directly access them
30925
23:02:10,639 --> 23:02:17,512
in any deriving class that is doing
30926
23:02:13,919 --> 23:02:19,831
public inheritance okay so in our player
30927
23:02:17,512 --> 23:02:21,512
class if we try to access the first name
30928
23:02:19,831 --> 23:02:23,360
and the last name we're going to have
30929
23:02:21,512 --> 23:02:25,760
compiler errors because we can't
30930
23:02:23,360 --> 23:02:27,919
directly access them but not to worry
30931
23:02:25,759 --> 23:02:31,191
here we can still go through
30932
23:02:27,919 --> 23:02:32,399
the public getters that we have in the
30933
23:02:32,399 --> 23:02:37,039
to access the private member variables
30934
23:02:34,960 --> 23:02:39,280
from the base class and that's what
30935
23:02:37,039 --> 23:02:41,511
we're going to do in this lecture here
30936
23:02:39,279 --> 23:02:43,360
because we don't have access to more
30937
23:02:41,512 --> 23:02:46,232
powerful tools we're going to learn
30938
23:02:43,360 --> 23:02:48,960
about in the next few lectures the same
30939
23:02:46,232 --> 23:02:50,552
is also going to apply to friends of the
30940
23:02:50,551 --> 23:02:55,759
they are going to have access to private
30941
23:02:52,800 --> 23:02:57,919
members of the derived class but they
30942
23:02:57,919 --> 23:03:04,479
the private members of the base class if
30943
23:03:00,960 --> 23:03:05,832
you try to access the private parts of a
30944
23:03:05,831 --> 23:03:10,639
from a friend of the derived class
30945
23:03:08,639 --> 23:03:11,679
you're going to have a bunch of compiler
30946
23:03:11,679 --> 23:03:15,511
okay now that you know this we're going
30947
23:03:13,279 --> 23:03:17,279
to head over to visual studio code and
30948
23:03:15,512 --> 23:03:18,872
play with this a little more and really
30949
23:03:18,872 --> 23:03:24,080
here we are in our working folder the
30950
23:03:21,440 --> 23:03:26,551
current project is first try on
30951
23:03:24,080 --> 23:03:28,720
inheritance we're going to grab our
30952
23:03:26,551 --> 23:03:30,080
template files and put them in place
30953
23:03:30,080 --> 23:03:34,080
and we are going to open this in visual
30954
23:03:32,000 --> 23:03:36,872
studio code pretty quick by dragging and
30955
23:03:34,080 --> 23:03:38,960
dropping here let's do that properly and
30956
23:03:36,872 --> 23:03:41,360
we're going to have our main cpp file we
30957
23:03:38,960 --> 23:03:43,760
can clean this up a little bit and we're
30958
23:03:41,360 --> 23:03:46,399
going to add our classes the first class
30959
23:03:43,759 --> 23:03:48,479
we're going to add is the person class
30960
23:03:46,399 --> 23:03:52,079
so we are going to create its header
30961
23:03:48,479 --> 23:03:54,551
file and let's do the cpp file i am
30962
23:03:52,080 --> 23:03:56,872
going to grab the code i have lying on
30963
23:03:54,551 --> 23:03:59,512
my drive for the header here i am going
30964
23:03:56,872 --> 23:04:01,120
to put the class in we are including the
30965
23:03:59,512 --> 23:04:03,440
classes we're going to need we need
30966
23:04:01,119 --> 23:04:05,831
string and io stream here because we're
30967
23:04:03,440 --> 23:04:08,000
going to be outputting thanks through
30968
23:04:08,000 --> 23:04:12,399
and down here we have our two member
30969
23:04:10,000 --> 23:04:15,360
variables we have first name and last
30970
23:04:12,399 --> 23:04:17,191
name they are of std string type and we
30971
23:04:15,360 --> 23:04:19,919
have a bunch of constructors here a
30972
23:04:17,191 --> 23:04:22,959
default constructor and one that takes
30973
23:04:19,919 --> 23:04:26,000
two parameters we are taking them by
30974
23:04:22,960 --> 23:04:28,232
copy here this is bad we should at least
30975
23:04:26,000 --> 23:04:29,512
pass them by reference here let's
30976
23:04:31,440 --> 23:04:36,160
and we're going to make the second one a
30977
23:04:33,360 --> 23:04:38,232
reference as well let's do this and we
30978
23:04:36,160 --> 23:04:40,960
have a destructor which is going to do
30979
23:04:38,232 --> 23:04:43,760
nothing because we really aren't doing
30980
23:04:40,960 --> 23:04:46,080
any dynamic memory allocation here we're
30981
23:04:43,759 --> 23:04:47,759
going to head over to the cpp file and
30982
23:04:46,080 --> 23:04:50,160
put in the code for that we're going to
30983
23:04:47,759 --> 23:04:51,831
include the person and we're going to do
30984
23:04:51,831 --> 23:04:56,231
implementations i should say and we're
30985
23:04:54,320 --> 23:04:59,280
going to pass our parameters by
30986
23:04:56,232 --> 23:05:01,440
reference again let's do this and our
30987
23:04:59,279 --> 23:05:05,119
constructor should be done now we have a
30988
23:05:01,440 --> 23:05:08,232
person class that we can use to derive
30989
23:05:05,119 --> 23:05:11,191
other classes and use this class as a
30990
23:05:08,232 --> 23:05:14,480
foundation to build other classes to
30991
23:05:11,191 --> 23:05:16,799
visualize this again our class person is
30992
23:05:14,479 --> 23:05:18,319
going to be the base class for our
30993
23:05:18,320 --> 23:05:22,080
so if we build a player class it's going
30994
23:05:22,080 --> 23:05:27,119
a person part of it which is going to be
30995
23:05:25,191 --> 23:05:29,679
the foundation on top of which we're
30996
23:05:27,119 --> 23:05:31,759
going to build notice that in player we
30997
23:05:29,679 --> 23:05:34,079
don't need to set up last name and first
30998
23:05:31,759 --> 23:05:36,871
name they are going to come from our
30999
23:05:34,080 --> 23:05:39,440
personal part of player all we need to
31000
23:05:36,872 --> 23:05:42,400
do in player is set up the game member
31001
23:05:39,440 --> 23:05:44,960
variable to make him a full player who
31002
23:05:42,399 --> 23:05:47,360
can have the game they happen to be
31003
23:05:44,960 --> 23:05:48,960
playing this is the idea here okay so
31004
23:05:47,360 --> 23:05:50,800
now that we know this we're going to put
31005
23:05:48,960 --> 23:05:54,000
in our player class we're going to
31006
23:05:50,800 --> 23:05:56,720
create the files for it let's do player
31007
23:05:54,000 --> 23:05:58,800
dot h we're going to put this in and
31008
23:05:58,800 --> 23:06:03,600
that cpp we're going to put him and
31009
23:06:01,512 --> 23:06:07,119
we are going to hop over to the header
31010
23:06:03,600 --> 23:06:09,279
file and put in our code the class is
31011
23:06:07,119 --> 23:06:11,599
going to be player and it is going to be
31012
23:06:09,279 --> 23:06:14,959
inheriting from person this is the
31013
23:06:11,600 --> 23:06:17,040
syntax again we say colon colon we say
31014
23:06:14,960 --> 23:06:19,120
the kind of inheritance we want to do in
31015
23:06:17,039 --> 23:06:21,039
this case it is public and then we say
31016
23:06:19,119 --> 23:06:24,231
the class that we are going to be
31017
23:06:21,039 --> 23:06:26,399
inheriting from from this point on the
31018
23:06:24,232 --> 23:06:28,232
player class is going to have a person
31019
23:06:26,399 --> 23:06:30,479
part of it and we are going to prove
31020
23:06:28,232 --> 23:06:32,720
this in a minute when we run this code
31021
23:06:30,479 --> 23:06:35,599
here notice that we can build player
31022
23:06:32,720 --> 23:06:38,000
objects by just passing in the game
31023
23:06:35,600 --> 23:06:40,960
parameter here which is going to be used
31024
23:06:38,000 --> 23:06:43,119
to initialize our member variable let's
31025
23:06:40,960 --> 23:06:44,872
also make it a reference because this is
31026
23:06:43,119 --> 23:06:47,831
good practice it is going to avoid
31027
23:06:44,872 --> 23:06:50,080
copies you can even use string views but
31028
23:06:47,831 --> 23:06:52,551
that's going to be your choice
31029
23:06:50,080 --> 23:06:55,680
we are going to hop over to the cpp file
31030
23:06:52,551 --> 23:06:58,080
and put in our implementation
31031
23:06:55,679 --> 23:07:00,399
and this is going to complete our setup
31032
23:06:58,080 --> 23:07:03,680
for the player class which is going to
31033
23:07:00,399 --> 23:07:06,799
be inheriting from our person class here
31034
23:07:03,679 --> 23:07:09,919
we can actually head over to the main
31035
23:07:06,800 --> 23:07:11,760
cpp file and include the player class
31036
23:07:09,919 --> 23:07:14,160
let's do this we're going to say player
31037
23:07:11,759 --> 23:07:16,959
and we can create player objects let's
31038
23:07:14,160 --> 23:07:18,720
look at the code again for a player we
31039
23:07:16,960 --> 23:07:21,680
have a constructor which is going to
31040
23:07:18,720 --> 23:07:24,720
take a string parameter we can use this
31041
23:07:21,679 --> 23:07:26,551
to create a player and specify the game
31042
23:07:27,279 --> 23:07:33,440
for now we don't have enough tools to
31043
23:07:30,800 --> 23:07:36,320
put in the data that would initialize
31044
23:07:33,440 --> 23:07:38,479
the member variables in the base class
31045
23:07:36,320 --> 23:07:39,920
which is person here if we go back to
31046
23:07:38,479 --> 23:07:42,159
person we're going to see that we have
31047
23:07:39,919 --> 23:07:44,800
the first name and the last name
31048
23:07:44,800 --> 23:07:49,760
these member variables are going to be
31049
23:07:46,720 --> 23:07:52,720
inherited because a player is inheriting
31050
23:07:49,759 --> 23:07:55,919
from a person this is the syntax to do
31051
23:07:52,720 --> 23:07:58,872
that but even if the player class has a
31052
23:07:55,919 --> 23:08:02,479
person part inside of it we can't really
31053
23:07:58,872 --> 23:08:05,600
access private members from person
31054
23:08:02,479 --> 23:08:08,399
from a player object we're going to see
31055
23:08:05,600 --> 23:08:11,040
a few ways we can get around this and
31056
23:08:08,399 --> 23:08:13,831
one of those is to go public methods
31057
23:08:11,039 --> 23:08:16,000
from the person class to access
31058
23:08:13,831 --> 23:08:17,599
private parts of the person class this
31059
23:08:16,000 --> 23:08:20,872
is going to give us access to these
31060
23:08:17,600 --> 23:08:23,279
member variables if you go down in our
31061
23:08:20,872 --> 23:08:26,000
stream output operator you're going to
31062
23:08:23,279 --> 23:08:28,479
see that we are using these getters here
31063
23:08:26,000 --> 23:08:31,279
the parameter is a player objects that
31064
23:08:28,479 --> 23:08:33,679
we want to print out but to get access
31065
23:08:31,279 --> 23:08:36,319
to the names we are getting the first
31066
23:08:33,679 --> 23:08:39,039
name and the last name through our
31067
23:08:36,320 --> 23:08:41,600
getters here before we really explore
31068
23:08:39,039 --> 23:08:44,079
this any further i think it is a good
31069
23:08:41,600 --> 23:08:46,480
idea to go in the main cpp file and
31070
23:08:44,080 --> 23:08:48,400
create a player object so we're going to
31071
23:08:46,479 --> 23:08:50,959
do that we're going to say p1 and we're
31072
23:08:48,399 --> 23:08:54,231
going to specify that they play
31073
23:08:50,960 --> 23:08:56,080
basketball why not okay so we have our
31074
23:08:56,080 --> 23:09:00,479
and we can really do all we want with
31075
23:08:58,000 --> 23:09:03,039
that for example we can print the
31076
23:09:00,479 --> 23:09:05,599
information about this player object if
31077
23:09:03,039 --> 23:09:07,679
you remember in player we have a stream
31078
23:09:05,600 --> 23:09:09,600
output operator which is going to print
31079
23:09:09,600 --> 23:09:16,000
and here we have a problem because this
31080
23:09:12,720 --> 23:09:18,232
guy is taking the data by reference
31081
23:09:16,000 --> 23:09:20,551
and this is not a reference this is a
31082
23:09:18,232 --> 23:09:21,512
temporary object that we are passing
31083
23:09:21,512 --> 23:09:27,600
so we could go back and change this to
31084
23:09:24,551 --> 23:09:29,599
take a string view parameter
31085
23:09:27,600 --> 23:09:32,480
let's go back and do that we're going to
31086
23:09:29,600 --> 23:09:34,232
include a string view here in player and
31087
23:09:32,479 --> 23:09:37,759
we're going to change our parameter to
31088
23:09:34,232 --> 23:09:40,720
be std string view by value and we're
31089
23:09:37,759 --> 23:09:43,360
going to do that in the cpp file let's
31090
23:09:40,720 --> 23:09:46,720
do that we're going to say std string
31091
23:09:43,360 --> 23:09:48,399
view and this should take care of our
31092
23:09:46,720 --> 23:09:50,720
problem here you see that the problem
31093
23:09:48,399 --> 23:09:53,599
goes away now that we have this guy we
31094
23:09:50,720 --> 23:09:56,399
can print it out we can say sddc out
31095
23:09:53,600 --> 23:09:58,552
player and i put the information out
31096
23:09:56,399 --> 23:10:01,191
okay so now that we have this we cannot
31097
23:09:58,551 --> 23:10:02,872
try and build our program we're going to
31098
23:10:02,872 --> 23:10:07,279
our favorite compiler and you're going
31099
23:10:05,119 --> 23:10:10,399
to see that we have a problem undefined
31100
23:10:07,279 --> 23:10:12,399
reference to player destructor let's go
31101
23:10:10,399 --> 23:10:15,679
back in the header and see that we have
31102
23:10:12,399 --> 23:10:18,959
a destructor but we probably didn't put
31103
23:10:15,679 --> 23:10:22,000
a destructor in the cpp file so let's do
31104
23:10:18,960 --> 23:10:24,160
that or because we're not doing any
31105
23:10:22,000 --> 23:10:27,039
dynamic memory allocation we can even
31106
23:10:24,160 --> 23:10:28,720
completely take out this destructor and
31107
23:10:27,039 --> 23:10:31,039
we're just going to use the one the
31108
23:10:28,720 --> 23:10:32,080
compiler generates for us this is going
31109
23:10:32,080 --> 23:10:37,512
much easier to handle in our code so we
31110
23:10:34,479 --> 23:10:40,872
can build again with gcc okay the world
31111
23:10:37,512 --> 23:10:43,119
is good we can run this program
31112
23:10:40,872 --> 23:10:44,800
and let's see if we have a powershell
31113
23:10:43,119 --> 23:10:47,599
window we don't we're going to bring up
31114
23:10:44,800 --> 23:10:49,360
a new one and we're going to run rooster
31115
23:10:47,600 --> 23:10:52,639
we should see information about our
31116
23:10:49,360 --> 23:10:55,279
player so player the game is basketball
31117
23:10:52,639 --> 23:10:58,232
the names are mysterious person because
31118
23:10:55,279 --> 23:11:00,551
that's the default data we inherit from
31119
23:10:58,232 --> 23:11:02,232
a person if you go back to person you're
31120
23:11:02,232 --> 23:11:08,160
the default data in first name is
31121
23:11:05,279 --> 23:11:11,279
mysterious the default data in last name
31122
23:11:08,160 --> 23:11:12,639
is person and it is what we see printed
31123
23:11:12,639 --> 23:11:18,720
in our powershell window when we print
31124
23:11:15,191 --> 23:11:20,399
information about our player object
31125
23:11:18,720 --> 23:11:23,191
another thing i want you to see is that
31126
23:11:23,191 --> 23:11:28,551
that any player object is going to have
31127
23:11:28,551 --> 23:11:34,159
backed in and that's going to be storing
31128
23:11:31,279 --> 23:11:36,720
the information that is modeled into our
31129
23:11:34,160 --> 23:11:39,832
person class and we can use a debugger
31130
23:11:36,720 --> 23:11:43,512
to do that for this to work i am going
31131
23:11:39,831 --> 23:11:45,679
to put a break point here on line 8
31132
23:11:43,512 --> 23:11:48,080
which is printing things out
31133
23:11:45,679 --> 23:11:50,799
this break point is going to be hit
31134
23:11:48,080 --> 23:11:53,919
after our object is set up and we can
31135
23:11:50,800 --> 23:11:55,192
really see the data inside this guy here
31136
23:11:53,919 --> 23:11:57,679
so what we're going to do we're going to
31137
23:11:57,679 --> 23:12:01,679
and we're going to use g plus plus we're
31138
23:11:59,919 --> 23:12:04,160
going to use the debugging tools that
31139
23:12:01,679 --> 23:12:05,511
come with gcc because this is our
31140
23:12:04,160 --> 23:12:06,872
favorite we're going to hit the green
31141
23:12:06,872 --> 23:12:12,000
this is going to start our debugging
31142
23:12:09,191 --> 23:12:14,000
session a binary is going to be built
31143
23:12:12,000 --> 23:12:16,160
and it is going to be plugged into our
31144
23:12:14,000 --> 23:12:17,360
debugger and we're going to hit a break
31145
23:12:17,360 --> 23:12:22,232
now if you look on the left here you're
31146
23:12:19,191 --> 23:12:24,000
going to see a title that says locals
31147
23:12:22,232 --> 23:12:27,040
we're going to expand this and we're
31148
23:12:24,000 --> 23:12:29,919
going to see that the p1 object actually
31149
23:12:27,039 --> 23:12:32,000
has a person part of it and you see that
31150
23:12:29,919 --> 23:12:34,639
visual studio code is being helpful here
31151
23:12:32,000 --> 23:12:36,320
it is saying that this is the base class
31152
23:12:34,639 --> 23:12:38,319
and if we expand we're going to see that
31153
23:12:36,320 --> 23:12:41,360
we have our member variables we have
31154
23:12:38,320 --> 23:12:43,680
first name and last name and this is a
31155
23:12:41,360 --> 23:12:46,639
player object that we are looking at
31156
23:12:43,679 --> 23:12:49,599
don't forget that and on top of our
31157
23:12:46,639 --> 23:12:51,919
person part we also have our own member
31158
23:12:49,600 --> 23:12:53,760
variable which is the game that we play
31159
23:12:51,919 --> 23:12:55,119
and it is right here hopefully this
31160
23:12:55,119 --> 23:13:02,231
that any derived class object is going
31161
23:12:58,479 --> 23:13:04,399
to have a base part embedded into it and
31162
23:13:02,232 --> 23:13:06,552
that's going to be the foundation on top
31163
23:13:04,399 --> 23:13:08,799
of which the derived class is going to
31164
23:13:06,551 --> 23:13:11,191
be building its own tank this is the
31165
23:13:08,800 --> 23:13:13,512
basic idea here okay now that you've
31166
23:13:11,191 --> 23:13:14,639
seen this we're going to kill our debug
31167
23:13:14,639 --> 23:13:19,679
and we're going to see some of the
31168
23:13:17,600 --> 23:13:21,760
things you need to be careful about when
31169
23:13:19,679 --> 23:13:23,679
doing public inheritance like we are
31170
23:13:21,759 --> 23:13:26,319
doing here the first thing i want you to
31171
23:13:23,679 --> 23:13:27,919
see is that you don't have access to
31172
23:13:27,919 --> 23:13:31,759
of the base class if you go back to
31173
23:13:31,759 --> 23:13:36,231
let's kill this so that you're not
31174
23:13:33,759 --> 23:13:38,231
confused if we go back to our personal
31175
23:13:36,232 --> 23:13:41,040
class we're going to see that our first
31176
23:13:38,232 --> 23:13:44,400
name and last name are private
31177
23:13:41,039 --> 23:13:45,439
so they want to be accessible to any
31178
23:13:45,440 --> 23:13:50,800
that does public inheritance like we are
31179
23:13:48,639 --> 23:13:53,279
doing here they are just going to be
31180
23:13:50,800 --> 23:13:56,800
private they are going to be part of the
31181
23:13:53,279 --> 23:13:59,360
class but the derived class would have
31182
23:13:56,800 --> 23:14:02,551
access to them this is the idea here and
31183
23:13:59,360 --> 23:14:05,440
if we go in our output stream operator
31184
23:14:02,551 --> 23:14:08,159
and comment out what we have here and
31185
23:14:05,440 --> 23:14:10,479
try to directly access these member
31186
23:14:08,160 --> 23:14:13,440
variables let's do that i am going to
31187
23:14:10,479 --> 23:14:16,720
copy the code here and put that on top
31188
23:14:13,440 --> 23:14:19,919
and we are not going to go through the
31189
23:14:16,720 --> 23:14:22,960
getter methods from the base class we
31190
23:14:19,919 --> 23:14:25,119
are going to try and access m first name
31191
23:14:22,960 --> 23:14:26,960
let's go back and look at the names for
31192
23:14:25,119 --> 23:14:29,191
the member variables it is first name
31193
23:14:26,960 --> 23:14:31,360
and last name let's use that we're going
31194
23:14:29,191 --> 23:14:34,319
to say first name you see that through
31195
23:14:31,360 --> 23:14:36,639
intellisense but trying to access that
31196
23:14:34,320 --> 23:14:38,400
is going to give us squiggly lines you
31197
23:14:36,639 --> 23:14:40,872
see that we have this in our
31198
23:14:38,399 --> 23:14:42,799
autocomplete but we have squiggly lines
31199
23:14:40,872 --> 23:14:45,680
we can't access these if we try to
31200
23:14:42,800 --> 23:14:48,160
compile our program let's do that again
31201
23:14:45,679 --> 23:14:50,231
we're going to use gcc and we are going
31202
23:14:48,160 --> 23:14:52,872
to get compiler errors and the compiler
31203
23:14:50,232 --> 23:14:55,120
errors are basically going to say
31204
23:14:52,872 --> 23:14:58,160
first name is private within this
31205
23:14:55,119 --> 23:15:02,000
context again the meaning is that
31206
23:14:58,160 --> 23:15:04,639
first name is private to the base class
31207
23:15:02,000 --> 23:15:07,440
and we have no business accessing that
31208
23:15:07,440 --> 23:15:12,000
the player class here this is the
31209
23:15:09,279 --> 23:15:14,479
meaning so we can't really access that
31210
23:15:12,000 --> 23:15:16,872
okay i realize this is a global function
31211
23:15:14,479 --> 23:15:19,440
but even if we try to do that from a
31212
23:15:16,872 --> 23:15:22,080
member function let's do that from
31213
23:15:19,440 --> 23:15:24,720
a constructor we're going to try and say
31214
23:15:22,080 --> 23:15:27,279
first name okay i realize the access we
31215
23:15:24,720 --> 23:15:29,440
are trying to do from the output stream
31216
23:15:27,279 --> 23:15:32,319
operator is really not a good example
31217
23:15:29,440 --> 23:15:35,119
because this is not a member function it
31218
23:15:32,320 --> 23:15:37,280
is a global freestanding function so we
31219
23:15:35,119 --> 23:15:38,959
can try and change the first name and
31220
23:15:37,279 --> 23:15:40,959
last name from the constructor for
31221
23:15:38,960 --> 23:15:42,960
example and we're going to see that this
31222
23:15:40,960 --> 23:15:45,680
is not going to work either so we can
31223
23:15:42,960 --> 23:15:48,400
take this out and we're going to
31224
23:15:45,679 --> 23:15:51,119
remove our block comma so we're going to
31225
23:15:48,399 --> 23:15:53,119
take out what we just did here
31226
23:15:51,119 --> 23:15:55,512
and we're going to uncomment our good
31227
23:15:53,119 --> 23:15:57,679
code here which is using getter member
31228
23:15:55,512 --> 23:15:59,680
functions from the base class and we're
31229
23:15:59,679 --> 23:16:05,279
the first name and last name from the
31230
23:16:01,919 --> 23:16:07,759
base class and change those into our
31231
23:16:05,279 --> 23:16:09,440
constructor of the derived class we're
31232
23:16:07,759 --> 23:16:12,000
going to try and change for example the
31233
23:16:09,440 --> 23:16:14,232
first name and make it john and we're
31234
23:16:12,000 --> 23:16:15,512
going to take the last name and change
31235
23:16:15,512 --> 23:16:20,800
snow let's do that and let's go back and
31236
23:16:18,000 --> 23:16:22,479
make sure we have the correct names
31237
23:16:20,800 --> 23:16:24,720
and you see that we have squiggly lines
31238
23:16:22,479 --> 23:16:27,360
we can't really do this because these
31239
23:16:24,720 --> 23:16:30,399
are private members of the base class
31240
23:16:27,360 --> 23:16:33,279
and we can't access them from a derived
31241
23:16:30,399 --> 23:16:35,279
class they are part of the player class
31242
23:16:33,279 --> 23:16:37,679
which is a derived class but we don't
31243
23:16:35,279 --> 23:16:40,080
have access to them we can't modify them
31244
23:16:37,679 --> 23:16:41,759
or do anything we can't read from them
31245
23:16:40,080 --> 23:16:43,919
we can't write from them this is the
31246
23:16:41,759 --> 23:16:46,231
message here if we try to build our
31247
23:16:43,919 --> 23:16:47,191
program we're going to use gcc to do
31248
23:16:47,191 --> 23:16:53,360
we are going to get compiler errors and
31249
23:16:49,512 --> 23:16:55,680
uh let's see the compiler error we get
31250
23:16:53,360 --> 23:16:58,800
again the error is that first name and
31251
23:16:55,679 --> 23:17:01,439
last name are private to the base class
31252
23:16:58,800 --> 23:17:03,680
and we have no business accessing them
31253
23:17:01,440 --> 23:17:06,160
from a derived class like we have here
31254
23:17:03,679 --> 23:17:07,191
so if you need any kind of access to a
31255
23:17:07,191 --> 23:17:11,512
member of the base class you will have
31256
23:17:11,512 --> 23:17:15,832
something that is public and a good
31257
23:17:13,512 --> 23:17:17,600
example is getter methods which are
31258
23:17:17,600 --> 23:17:22,480
change things so for example if we want
31259
23:17:20,080 --> 23:17:24,232
the ability to change the first name and
31260
23:17:22,479 --> 23:17:26,319
the last name we can set up a bunch of
31261
23:17:24,232 --> 23:17:28,800
setter methods let's do that we're going
31262
23:17:26,320 --> 23:17:29,832
to say setters and we're going to say
31263
23:17:30,872 --> 23:17:35,760
first name and we are going to pass an
31264
23:17:35,759 --> 23:17:41,119
let's do that we're going to say string
31265
23:17:41,119 --> 23:17:46,799
this is going to modify our class so we
31266
23:17:44,551 --> 23:17:48,399
are not going to mark this as a custom
31267
23:17:46,800 --> 23:17:49,680
member function and we're going to say
31268
23:17:53,831 --> 23:17:59,439
we are going to set up a setter for the
31269
23:17:56,872 --> 23:18:01,760
last name set and we're going to pass a
31270
23:17:59,440 --> 23:18:04,232
string view here and we're going to say
31271
23:18:01,759 --> 23:18:06,399
ln for the last name again this is not
31272
23:18:04,232 --> 23:18:09,279
going to be a cast member function so
31273
23:18:06,399 --> 23:18:13,279
we're going to say last name and we can
31274
23:18:09,279 --> 23:18:16,319
pass in ln as our new name here now that
31275
23:18:13,279 --> 23:18:18,959
we have these end we can take out
31276
23:18:16,320 --> 23:18:21,600
these things we have in the constructor
31277
23:18:18,960 --> 23:18:23,280
i think the job for this is done and
31278
23:18:21,600 --> 23:18:26,400
this is going to give you compiler
31279
23:18:23,279 --> 23:18:28,080
errors and we can go in our main cpp
31280
23:18:26,399 --> 23:18:31,439
file and change the names for this
31281
23:18:28,080 --> 23:18:32,320
person here for example we can say p1
31282
23:18:32,320 --> 23:18:37,440
first name we're going to pass john and
31283
23:18:35,600 --> 23:18:40,160
we can also set to the last name we're
31284
23:18:40,160 --> 23:18:44,960
last name and we're going to pass snow
31285
23:18:43,039 --> 23:18:46,799
and this is going to do if we build and
31286
23:18:44,960 --> 23:18:48,720
run this program we're going to see that
31287
23:18:46,800 --> 23:18:50,232
the world is going to be good this is
31288
23:18:50,232 --> 23:18:54,552
and if we run we should see the
31289
23:18:52,232 --> 23:18:57,512
information printed out we want to join
31290
23:18:54,551 --> 23:18:58,800
snow printed out and the game should be
31291
23:18:58,800 --> 23:19:04,320
let's clear and run rooster we're going
31292
23:19:01,440 --> 23:19:06,720
to see that the data is in here the name
31293
23:19:04,320 --> 23:19:09,600
the names are jon snow and we have our
31294
23:19:06,720 --> 23:19:12,160
game to be basketball here but notice
31295
23:19:09,600 --> 23:19:15,680
these are base methods and we are
31296
23:19:12,160 --> 23:19:18,480
calling them from a derived object and
31297
23:19:15,679 --> 23:19:20,719
this is living proof that the public
31298
23:19:18,479 --> 23:19:23,360
members from the base class are going to
31299
23:19:23,360 --> 23:19:29,039
from a derived class that does public
31300
23:19:26,960 --> 23:19:31,280
inheritance like we are doing here and
31301
23:19:29,039 --> 23:19:33,599
this is really the main message you can
31302
23:19:31,279 --> 23:19:36,319
inherit publicly and have access to
31303
23:19:33,600 --> 23:19:39,760
public stuff from the base class and use
31304
23:19:36,320 --> 23:19:42,080
them in your derived class but private
31305
23:19:39,759 --> 23:19:44,639
data is going to still be private to the
31306
23:19:42,080 --> 23:19:47,119
base class you can't use that in a
31307
23:19:44,639 --> 23:19:49,039
derived class this is the message here
31308
23:19:47,119 --> 23:19:52,000
and this is really all i wanted you to
31309
23:19:49,039 --> 23:19:54,159
see in this lecture the big thing is to
31310
23:19:52,000 --> 23:19:57,440
notice the syntax you use to do
31311
23:19:54,160 --> 23:19:59,832
inheritance and if you do this the
31312
23:19:57,440 --> 23:20:00,800
player class is going to be derived from
31313
23:20:00,800 --> 23:20:06,232
and it will have a person part
31314
23:20:03,919 --> 23:20:09,039
baked inside and we can build on that
31315
23:20:06,232 --> 23:20:11,440
foundation and for example put in our
31316
23:20:09,039 --> 23:20:12,959
own member variables and do all kinds of
31317
23:20:12,960 --> 23:20:17,680
public stuff from the base class are
31318
23:20:14,960 --> 23:20:20,160
going to be inherited and usable from a
31319
23:20:17,679 --> 23:20:22,639
derived class we just saw that by
31320
23:20:20,160 --> 23:20:25,360
setting up a bunch of setters that live
31321
23:20:22,639 --> 23:20:28,551
in the public scope of the base class
31322
23:20:25,360 --> 23:20:31,680
and they were usable from the outside
31323
23:20:28,551 --> 23:20:34,399
because they will be inherited as public
31324
23:20:31,679 --> 23:20:36,479
in a derived class so we can really call
31325
23:20:34,399 --> 23:20:38,720
these methods and use them from the
31326
23:20:36,479 --> 23:20:41,119
outside like we are doing here but
31327
23:20:38,720 --> 23:20:43,600
private data from the base class is not
31328
23:20:41,119 --> 23:20:46,231
going to be accessible and usable from a
31329
23:20:43,600 --> 23:20:48,320
derived class and we saw that by setting
31330
23:20:46,232 --> 23:20:50,000
up this piece of code in the constructor
31331
23:20:48,320 --> 23:20:52,480
of player this is going to give us a
31332
23:20:50,000 --> 23:20:55,279
compiler error saying that first name
31333
23:20:52,479 --> 23:20:57,759
and last name are private to the base
31334
23:20:55,279 --> 23:20:59,360
class we are going to stop here in this
31335
23:20:57,759 --> 23:21:01,439
lecture in the next one we're going to
31336
23:20:59,360 --> 23:21:04,551
learn about another kind of access
31337
23:21:01,440 --> 23:21:06,639
specifier we have in c plus plus and
31338
23:21:06,639 --> 23:21:10,319
so go ahead and finish up here and meet
31339
23:21:10,320 --> 23:21:15,920
in this lecture we're going to learn
31340
23:21:12,000 --> 23:21:18,720
about the protected access specifier you
31341
23:21:15,919 --> 23:21:20,639
can use in your c plus plus class
31342
23:21:18,720 --> 23:21:22,232
and we're going to be reusing the same
31343
23:21:20,639 --> 23:21:23,919
example from the last lecture we're
31344
23:21:22,232 --> 23:21:26,552
going to have a person class which is
31345
23:21:23,919 --> 23:21:28,872
going to act as our base class and we're
31346
23:21:26,551 --> 23:21:32,080
going to be deriving from this person
31347
23:21:28,872 --> 23:21:33,760
and creating a new class called player
31348
23:21:32,080 --> 23:21:35,919
the player class is going to have a
31349
23:21:35,919 --> 23:21:40,959
and we can use this as a foundation to
31350
23:21:38,551 --> 23:21:42,800
build other fans in player class for
31351
23:21:40,960 --> 23:21:45,120
example we can set up our own member
31352
23:21:42,800 --> 23:21:47,600
variables and do all kinds of crazy
31353
23:21:45,119 --> 23:21:49,831
things and this is the setup we used in
31354
23:21:47,600 --> 23:21:52,872
the last lecture we set up a person
31355
23:21:49,831 --> 23:21:55,191
class and our members were private as
31356
23:21:52,872 --> 23:21:56,320
you saw here but in the last lecture we
31357
23:21:56,320 --> 23:22:01,192
private member variables are not going
31358
23:21:58,320 --> 23:22:05,192
to be accessible and usable from derived
31359
23:22:01,191 --> 23:22:07,679
classes that do public inheritance and
31360
23:22:05,191 --> 23:22:10,231
sometimes we want members from the base
31361
23:22:07,679 --> 23:22:14,319
class to at least be accessible and
31362
23:22:10,232 --> 23:22:17,279
usable from a derived class but still be
31363
23:22:14,320 --> 23:22:20,160
inaccessible from the outside and we can
31364
23:22:17,279 --> 23:22:22,639
achieve this using the protected access
31365
23:22:20,160 --> 23:22:24,800
specifier so for example we can change
31366
23:22:22,639 --> 23:22:27,759
the access specifier of our member
31367
23:22:24,800 --> 23:22:30,320
variables from private to protected and
31368
23:22:27,759 --> 23:22:32,959
at the moment we do this we will be able
31369
23:22:30,320 --> 23:22:35,920
to access for example read from and
31370
23:22:32,960 --> 23:22:38,552
write into these member variables from
31371
23:22:35,919 --> 23:22:41,440
derived classes so for example we will
31372
23:22:38,551 --> 23:22:44,319
be able to modify these guys from a
31373
23:22:41,440 --> 23:22:46,232
constructor of the derived class and we
31374
23:22:44,320 --> 23:22:48,960
thought that that was impossible from
31375
23:22:46,232 --> 23:22:51,440
the last lecture but still we want to be
31376
23:22:48,960 --> 23:22:54,080
able to use these from the outside of
31377
23:22:51,440 --> 23:22:55,600
our derived class which is person here
31378
23:22:54,080 --> 23:22:57,919
so we're going to still do public
31379
23:22:55,600 --> 23:23:00,400
inheritance like from the last lecture
31380
23:22:57,919 --> 23:23:03,191
but now that our member variables in the
31381
23:23:00,399 --> 23:23:05,360
base class are protected we will have
31382
23:23:03,191 --> 23:23:07,831
the ability to do whatever we want with
31383
23:23:05,360 --> 23:23:10,720
them in the derived class and when we
31384
23:23:07,831 --> 23:23:13,279
say in the derived class we mean from
31385
23:23:10,720 --> 23:23:15,119
any method from the derived class for
31386
23:23:13,279 --> 23:23:18,319
example we can go in our constructor
31387
23:23:15,119 --> 23:23:20,639
here and then set data into the member
31388
23:23:18,320 --> 23:23:23,192
variables from the base class and that's
31389
23:23:20,639 --> 23:23:25,039
going to work as we're going to see
31390
23:23:23,191 --> 23:23:26,959
in a minute now that you know this we're
31391
23:23:25,039 --> 23:23:29,039
going to head over to visual studio code
31392
23:23:26,960 --> 23:23:31,440
and play with this a little more okay
31393
23:23:29,039 --> 23:23:34,079
again our member variables from the base
31394
23:23:31,440 --> 23:23:36,551
class are going to be protected
31395
23:23:34,080 --> 23:23:38,800
okay so we can really say that here
31396
23:23:36,551 --> 23:23:41,440
let's say protected and at the moment we
31397
23:23:38,800 --> 23:23:44,080
do this they are going to be accessible
31398
23:23:41,440 --> 23:23:46,232
and usable from a derived class so from
31399
23:23:44,080 --> 23:23:48,160
the derived class we will have the first
31400
23:23:48,160 --> 23:23:52,960
so from the derived class we will have
31401
23:23:50,320 --> 23:23:55,440
our members baked then we will have a
31402
23:23:52,960 --> 23:23:57,832
last name and the first name and because
31403
23:23:55,440 --> 23:24:00,551
they are protected in the base class and
31404
23:23:57,831 --> 23:24:02,799
we are doing public inheritance we will
31405
23:24:00,551 --> 23:24:04,720
be able for example to set data into
31406
23:24:02,800 --> 23:24:06,479
these member variables from a derived
31407
23:24:06,479 --> 23:24:10,551
really cool now that you know this we're
31408
23:24:08,479 --> 23:24:12,399
going to head over to visual studio code
31409
23:24:10,551 --> 23:24:15,599
and play with us a little more okay so
31410
23:24:12,399 --> 23:24:17,831
here we are in our here we are in our
31411
23:24:15,600 --> 23:24:20,160
working folder the current project is
31412
23:24:17,831 --> 23:24:22,319
protected members we're going to grab
31413
23:24:20,160 --> 23:24:24,720
the code from the last lecture and reuse
31414
23:24:22,320 --> 23:24:27,680
that because that's going to have our
31415
23:24:24,720 --> 23:24:30,551
inheritance hierarchy already set up we
31416
23:24:27,679 --> 23:24:33,119
will have our person and player class
31417
23:24:30,551 --> 23:24:35,759
and we can reuse them we will have our
31418
23:24:33,119 --> 23:24:38,959
person and player classes and we will
31419
23:24:35,759 --> 23:24:40,959
reuse them without needing to completely
31420
23:24:38,960 --> 23:24:43,832
set them up from scratch that's going to
31421
23:24:40,960 --> 23:24:45,832
save us a few seconds so we're going to
31422
23:24:45,831 --> 23:24:49,599
and we are going to open this little guy
31423
23:24:47,831 --> 23:24:51,511
in visual studio code by dragging and
31424
23:24:49,600 --> 23:24:53,760
dropping here and we will have our
31425
23:24:51,512 --> 23:24:56,320
person class which is going to be the
31426
23:24:53,759 --> 23:24:58,399
base class it's going to have our member
31427
23:24:56,320 --> 23:25:00,640
variables which are going to be private
31428
23:24:58,399 --> 23:25:02,399
from the last lecture we will have a
31429
23:25:00,639 --> 23:25:05,440
player class which is going to be
31430
23:25:02,399 --> 23:25:07,191
inherited publicly from the player
31431
23:25:05,440 --> 23:25:09,512
we will have a player class which is
31432
23:25:07,191 --> 23:25:12,080
going to be publicly inheriting from
31433
23:25:09,512 --> 23:25:14,320
person and we have our main cpp file
31434
23:25:12,080 --> 23:25:16,000
which is going to set up a player object
31435
23:25:14,320 --> 23:25:19,440
and try to use it and we're going to see
31436
23:25:16,000 --> 23:25:21,360
how this goes in this lecture so what we
31437
23:25:19,440 --> 23:25:24,639
want to do is to change the access
31438
23:25:21,360 --> 23:25:26,960
specifier in the base class and make
31439
23:25:24,639 --> 23:25:29,360
that protected we can do that we can say
31440
23:25:26,960 --> 23:25:32,080
protect it and this is going to change a
31441
23:25:29,360 --> 23:25:33,191
few things about this class what this is
31442
23:25:33,191 --> 23:25:38,479
if you do public inheritance from this
31443
23:25:35,759 --> 23:25:40,639
person class you will have the ability
31444
23:25:38,479 --> 23:25:43,679
to do whatever you want with these
31445
23:25:40,639 --> 23:25:45,759
member variables from a derived class
31446
23:25:43,679 --> 23:25:47,679
you will have the ability to write into
31447
23:25:45,759 --> 23:25:50,080
these member variables and change the
31448
23:25:47,679 --> 23:25:52,231
data that we have inside you will also
31449
23:25:50,080 --> 23:25:54,232
have the ability to read from them and
31450
23:25:52,232 --> 23:25:56,720
that's something we couldn't do from the
31451
23:25:54,232 --> 23:25:58,639
last lecture and this may come in handy
31452
23:25:56,720 --> 23:26:01,040
sometimes another thing you should know
31453
23:25:58,639 --> 23:26:03,600
is that these members are still not
31454
23:26:01,039 --> 23:26:06,719
going to be accessible from the outside
31455
23:26:03,600 --> 23:26:08,872
so from the standpoint of the main
31456
23:26:06,720 --> 23:26:11,600
function for example here they are going
31457
23:26:08,872 --> 23:26:13,600
to behave as if they are private because
31458
23:26:11,600 --> 23:26:16,872
they want to be accessible from the
31459
23:26:13,600 --> 23:26:20,480
outside they will only be accessible and
31460
23:26:16,872 --> 23:26:23,040
modifiable from derived classes
31461
23:26:20,479 --> 23:26:25,679
that do public inheritance this is
31462
23:26:23,039 --> 23:26:27,919
really important to understand now that
31463
23:26:25,679 --> 23:26:30,479
we have this we can really do all kinds
31464
23:26:27,919 --> 23:26:33,279
of crazy things for example we can go in
31465
23:26:30,479 --> 23:26:35,191
our constructor of player and comment
31466
23:26:33,279 --> 23:26:38,232
what wasn't working from the last
31467
23:26:35,191 --> 23:26:40,319
lecture and this is going to work now so
31468
23:26:38,232 --> 23:26:42,080
let's uncomment this and we're going to
31469
23:26:40,320 --> 23:26:45,120
see that the squiggly lines are going to
31470
23:26:42,080 --> 23:26:47,191
go away and if we build a player object
31471
23:26:45,119 --> 23:26:50,000
using this constructor we're going to
31472
23:26:47,191 --> 23:26:52,479
see that we're going to have jon snow in
31473
23:26:50,000 --> 23:26:54,399
even if we don't set using the setters
31474
23:26:52,479 --> 23:26:55,360
from the base class so we can take these
31475
23:26:55,360 --> 23:26:59,119
and if we print information about this
31476
23:26:57,360 --> 23:27:01,919
player we're going to see the game to be
31477
23:26:59,119 --> 23:27:05,759
basketball and the names are going to be
31478
23:27:01,919 --> 23:27:08,080
john snow because we are setting up this
31479
23:27:05,759 --> 23:27:10,639
in the constructor of player that's no
31480
23:27:08,080 --> 23:27:13,831
longer that's no longer going to be the
31481
23:27:10,639 --> 23:27:17,191
data we get from the constructor of a
31482
23:27:13,831 --> 23:27:20,479
person object which was here
31483
23:27:17,191 --> 23:27:22,720
in the base class let's try to build and
31484
23:27:20,479 --> 23:27:25,831
run this program so that you can really
31485
23:27:22,720 --> 23:27:28,399
see this i just used clan here but it is
31486
23:27:25,831 --> 23:27:31,511
also going to work no big deal here the
31487
23:27:28,399 --> 23:27:34,000
build is going to be good we can clear
31488
23:27:31,512 --> 23:27:36,080
and bring up a powershell window we can
31489
23:27:34,000 --> 23:27:37,759
use to run this program we're going to
31490
23:27:36,080 --> 23:27:40,000
say rooster and you're going to see that
31491
23:27:40,000 --> 23:27:44,639
having the information the game is going
31492
23:27:42,320 --> 23:27:48,080
to be basketball the names are going to
31493
23:27:44,639 --> 23:27:50,551
be jon snow and we are setting this data
31494
23:27:48,080 --> 23:27:53,360
from a derived class and we have the
31495
23:27:50,551 --> 23:27:56,720
ability to do this because these members
31496
23:27:53,360 --> 23:27:59,119
are now protected in the base class so
31497
23:27:56,720 --> 23:28:00,639
they are accessible and usable from a
31498
23:28:00,639 --> 23:28:06,080
now that we have this ability we can
31499
23:28:02,399 --> 23:28:08,399
really change how our class at least the
31500
23:28:06,080 --> 23:28:12,400
derived class works we're going to
31501
23:28:08,399 --> 23:28:14,399
change it to have two more parameters
31502
23:28:12,399 --> 23:28:17,360
and we're going to pass the first name
31503
23:28:14,399 --> 23:28:20,551
and the last name and pass this data
31504
23:28:17,360 --> 23:28:22,551
back into the base class by setting the
31505
23:28:20,551 --> 23:28:24,639
data in the body of the constructor this
31506
23:28:22,551 --> 23:28:26,959
is going to work so let's add our
31507
23:28:24,639 --> 23:28:28,080
parameters we're going to say std string
31508
23:28:30,160 --> 23:28:34,800
first name param and we're going to put
31509
23:28:32,800 --> 23:28:37,360
in another one which is going to also be
31510
23:28:34,800 --> 23:28:39,919
a string view parameter and it's going
31511
23:28:37,360 --> 23:28:42,000
to be last name param we can say that
31512
23:28:39,919 --> 23:28:44,551
and we're going to hop over in our
31513
23:28:42,000 --> 23:28:46,639
implementation let's grab what we just
31514
23:28:44,551 --> 23:28:50,759
added because we will need to put that
31515
23:28:46,639 --> 23:28:53,119
in our cpp file we are going to go in
31516
23:28:50,759 --> 23:28:55,599
player.cpp and we're going to add this
31517
23:28:53,119 --> 23:28:58,000
data we're going to put that here
31518
23:28:55,600 --> 23:29:00,639
we can close the left sidebar to have
31519
23:28:58,000 --> 23:29:03,279
some more breathing room and then we're
31520
23:29:03,279 --> 23:29:07,279
an initializer list here because this is
31521
23:29:05,360 --> 23:29:10,232
really going to be useless we are
31522
23:29:07,279 --> 23:29:11,279
changing data in the body anyway so what
31523
23:29:11,279 --> 23:29:15,679
is say game param or a game and we're
31524
23:29:15,679 --> 23:29:21,039
gamipuram i am really sorry i am not
31525
23:29:18,232 --> 23:29:23,832
following the same convention for the
31526
23:29:21,039 --> 23:29:26,319
naming of my member variables but we can
31527
23:29:23,831 --> 23:29:29,119
change this later so let's say first
31528
23:29:26,320 --> 23:29:31,360
name we are going to pass in first name
31529
23:29:29,119 --> 23:29:33,759
ram and for the last name we're going to
31530
23:29:31,360 --> 23:29:36,639
say last name param and that's going to
31531
23:29:33,759 --> 23:29:40,551
do now we have the ability to go in the
31532
23:29:36,639 --> 23:29:42,720
main cpp file and create player objects
31533
23:29:40,551 --> 23:29:45,119
and specify the first name and the last
31534
23:29:42,720 --> 23:29:47,191
name and this is going to be much more
31535
23:29:45,119 --> 23:29:50,479
flexible so let's go back to the
31536
23:29:47,191 --> 23:29:53,919
constructor and see the order of our
31537
23:29:50,479 --> 23:29:56,872
parameters game first name last name so
31538
23:29:53,919 --> 23:29:58,080
we can come here and say first name is
31539
23:29:58,080 --> 23:30:02,400
john and the last name is going to be
31540
23:30:00,232 --> 23:30:04,552
snow and if we build and run we're going
31541
23:30:02,399 --> 23:30:06,479
to see the information printed out here
31542
23:30:04,551 --> 23:30:08,479
and now we have the flexibility to be
31543
23:30:08,479 --> 23:30:13,679
in a constructor and this is going to
31544
23:30:10,639 --> 23:30:16,720
make the job of building our objects
31545
23:30:13,679 --> 23:30:19,359
much easier and we can forward this data
31546
23:30:16,720 --> 23:30:22,000
back into the base class using the
31547
23:30:19,360 --> 23:30:23,759
protected mechanism that we just learned
31548
23:30:22,000 --> 23:30:26,080
about in this lecture and this is really
31549
23:30:23,759 --> 23:30:28,799
cool so let's build we're going to pass
31550
23:30:26,080 --> 23:30:31,512
this through gcc and the world is going
31551
23:30:28,800 --> 23:30:33,279
to be good we can clear and run rooster
31552
23:30:31,512 --> 23:30:35,600
we're going to see that the data is
31553
23:30:33,279 --> 23:30:36,639
passed back to the base class this is
31554
23:30:36,639 --> 23:30:41,600
really well okay so this is really all i
31555
23:30:38,872 --> 23:30:44,080
wanted you to see in this lecture we can
31556
23:30:41,600 --> 23:30:45,680
set up protected member variables and
31557
23:30:44,080 --> 23:30:49,040
they are going to be accessible and
31558
23:30:45,679 --> 23:30:52,000
usable from any derived class that does
31559
23:30:49,039 --> 23:30:54,639
public inheritance but they want to be
31560
23:30:52,000 --> 23:30:58,232
accessible from the outside so if you
31561
23:30:54,639 --> 23:31:01,119
try and for example say p1 and say
31562
23:30:58,232 --> 23:31:02,872
first name and try to change that to
31563
23:31:01,119 --> 23:31:04,799
something else let's say daniel for
31564
23:31:02,872 --> 23:31:07,279
example you're going to have compiler
31565
23:31:04,800 --> 23:31:09,040
errors because this is not going to work
31566
23:31:07,279 --> 23:31:11,831
so let's try and build and show you the
31567
23:31:09,039 --> 23:31:14,399
compiler error okay so protected members
31568
23:31:11,831 --> 23:31:16,551
are not accessible from the outside
31569
23:31:14,399 --> 23:31:19,759
they will be just accessible from
31570
23:31:16,551 --> 23:31:22,639
derived classes or to be more specific
31571
23:31:19,759 --> 23:31:25,679
they are going to be accessible from
31572
23:31:22,639 --> 23:31:27,600
the members of the derived class and by
31573
23:31:25,679 --> 23:31:29,359
members i mean member functions because
31574
23:31:27,600 --> 23:31:32,080
that's where you will be accessing and
31575
23:31:29,360 --> 23:31:35,360
modifying stuff so let's go back to the
31576
23:31:32,080 --> 23:31:37,600
main cpp file and remove this
31577
23:31:35,360 --> 23:31:39,440
and this is really all i wanted to share
31578
23:31:37,600 --> 23:31:42,320
with you and i hope you found this
31579
23:31:39,440 --> 23:31:43,760
lecture interesting we are going to stop
31580
23:31:43,759 --> 23:31:48,799
and in the next one we're going to zoom
31581
23:31:45,600 --> 23:31:51,832
in on the syntax here we are using to
31582
23:31:48,800 --> 23:31:54,080
derive from other classes we just did
31583
23:31:51,831 --> 23:31:55,679
the public inheritance here but in the
31584
23:31:54,080 --> 23:31:59,040
next lecture we're going to see that it
31585
23:31:55,679 --> 23:32:01,119
is possible to actually do protected and
31586
23:31:59,039 --> 23:32:03,759
private inheritance and we're going to
31587
23:32:01,119 --> 23:32:06,000
see what this means in the next lecture
31588
23:32:03,759 --> 23:32:07,759
so go ahead and finish up here and meet
31589
23:32:06,000 --> 23:32:11,279
me there in this lecture we're going to
31590
23:32:07,759 --> 23:32:13,511
learn about base class access specifiers
31591
23:32:11,279 --> 23:32:15,919
and in case you didn't know we have been
31592
23:32:13,512 --> 23:32:18,720
using base class access specifiers in
31593
23:32:15,919 --> 23:32:21,191
this chapter all along and to really
31594
23:32:18,720 --> 23:32:23,680
understand this let's look at our player
31595
23:32:21,191 --> 23:32:27,119
class which is inheriting from person
31596
23:32:23,679 --> 23:32:29,759
and we are doing public inheritance the
31597
23:32:27,119 --> 23:32:32,551
public keyword here is a base class
31598
23:32:29,759 --> 23:32:33,759
access specifier and it is going to
31599
23:32:33,759 --> 23:32:40,551
how accessible our base class members
31600
23:32:37,512 --> 23:32:43,119
from a derived class and we have three
31601
23:32:40,551 --> 23:32:45,831
options okay so if we do public
31602
23:32:43,119 --> 23:32:47,679
inheritance like we see here in our
31603
23:32:47,679 --> 23:32:52,000
anything that is public in the base
31604
23:32:49,831 --> 23:32:54,799
class is also going to be public you see
31605
23:32:52,000 --> 23:32:55,759
m1 here is also public in the derived
31606
23:32:55,759 --> 23:33:00,479
anything that is protected is going to
31607
23:32:57,679 --> 23:33:02,959
stay protected and anything that is
31608
23:33:00,479 --> 23:33:06,639
private in the base class is also going
31609
23:33:02,960 --> 23:33:08,800
to stay private in the derived class
31610
23:33:06,639 --> 23:33:09,831
try and take a moment to look at this
31611
23:33:09,831 --> 23:33:16,319
the member access specifiers we have in
31612
23:33:13,039 --> 23:33:17,511
the base class are going to stay intact
31613
23:33:17,512 --> 23:33:22,720
public inheritance again anything that
31614
23:33:20,399 --> 23:33:25,360
is public in base is going to be public
31615
23:33:22,720 --> 23:33:27,831
and derived anything that is protected
31616
23:33:25,360 --> 23:33:30,960
in base is going to be protected and
31617
23:33:27,831 --> 23:33:32,639
derived and anything that is private in
31618
23:33:32,639 --> 23:33:39,119
private in derived this is one kind of
31619
23:33:36,000 --> 23:33:42,720
inheritance we can do in c plus plus but
31620
23:33:39,119 --> 23:33:44,871
we can also do protected inheritance and
31621
23:33:42,720 --> 23:33:47,360
the syntax to do that you just use the
31622
23:33:44,872 --> 23:33:49,760
protected keyword here you say class
31623
23:33:47,360 --> 23:33:52,872
player column column and specify that
31624
23:33:49,759 --> 23:33:55,360
you want to do protected inheritance and
31625
23:33:52,872 --> 23:33:58,320
then you specify the base class you want
31626
23:33:55,360 --> 23:34:00,232
to inherit from the moment you do this
31627
23:33:58,320 --> 23:34:02,640
anything that is public in the base
31628
23:34:00,232 --> 23:34:04,160
class is going to be protected in the
31629
23:34:04,160 --> 23:34:08,960
anything that is protected is going to
31630
23:34:06,000 --> 23:34:11,512
stay protected anything that is private
31631
23:34:11,512 --> 23:34:17,360
and in one way you can see that we can
31632
23:34:13,759 --> 23:34:18,959
use these base class access specifiers
31633
23:34:18,960 --> 23:34:24,800
the access specifier in derived class
31634
23:34:21,831 --> 23:34:26,871
but we can't make the access specifiers
31635
23:34:26,872 --> 23:34:31,600
more relaxed we can only make things
31636
23:34:28,960 --> 23:34:33,832
more constrained or more restricted for
31637
23:34:31,600 --> 23:34:36,720
example the m1 member variable was
31638
23:34:33,831 --> 23:34:40,159
public but now we have made it become
31639
23:34:36,720 --> 23:34:42,872
protected by using the protected base
31640
23:34:40,160 --> 23:34:45,360
access specifier here okay so now you
31641
23:34:42,872 --> 23:34:48,232
know that we can do public and protected
31642
23:34:45,360 --> 23:34:51,279
inheritance but it is also possible to
31643
23:34:48,232 --> 23:34:54,232
do private inheritance and you do that
31644
23:34:51,279 --> 23:34:56,639
by using a private base class access
31645
23:34:54,232 --> 23:34:58,400
specifier the moment you do this
31646
23:34:56,639 --> 23:35:00,551
anything that is public in the base
31647
23:34:58,399 --> 23:35:03,360
class is going to become private in the
31648
23:35:00,551 --> 23:35:05,119
derived class anything that is protected
31649
23:35:03,360 --> 23:35:07,831
in the base class is going to become
31650
23:35:05,119 --> 23:35:09,360
private in the derived class and
31651
23:35:07,831 --> 23:35:12,159
anything that is private is going to
31652
23:35:09,360 --> 23:35:13,680
stay private in the derived class and
31653
23:35:12,160 --> 23:35:16,720
again you see that this is going to
31654
23:35:13,679 --> 23:35:18,959
constrain thanks things that were public
31655
23:35:16,720 --> 23:35:21,360
are now private in derived and we can't
31656
23:35:18,960 --> 23:35:23,832
really do anything with them from any
31657
23:35:21,360 --> 23:35:26,399
other class that might derive from our
31658
23:35:23,831 --> 23:35:29,191
player class so this is the setup we
31659
23:35:26,399 --> 23:35:31,511
have okay to sum this up through the
31660
23:35:29,191 --> 23:35:35,599
base class access specifier we can
31661
23:35:31,512 --> 23:35:38,479
control how relaxed or constrained
31662
23:35:35,600 --> 23:35:40,320
is the access to base class members from
31663
23:35:38,479 --> 23:35:42,319
the derived class and this is really
31664
23:35:40,320 --> 23:35:44,800
important to understand if you want to
31665
23:35:42,320 --> 23:35:47,280
say as relaxed as they are in the base
31666
23:35:44,800 --> 23:35:49,192
class you can use public inheritance if
31667
23:35:47,279 --> 23:35:50,399
you want to constrain a little bit you
31668
23:35:50,399 --> 23:35:54,479
protected inheritance and things are
31669
23:35:52,320 --> 23:35:57,680
going to be inherited as protected
31670
23:35:54,479 --> 23:35:59,919
except for the private data in the base
31671
23:35:57,679 --> 23:36:02,079
class if you want things to be super
31672
23:35:59,919 --> 23:36:04,160
constrained you can use the private
31673
23:36:02,080 --> 23:36:06,160
inheritance that we just learned about
31674
23:36:04,160 --> 23:36:09,440
and everything in your derived class is
31675
23:36:06,160 --> 23:36:11,512
going to be private and you can use this
31676
23:36:09,440 --> 23:36:14,080
if it makes sense for the application
31677
23:36:11,512 --> 23:36:16,160
you are designing and you can use these
31678
23:36:14,080 --> 23:36:18,551
kinds of features if they make sense for
31679
23:36:16,160 --> 23:36:20,960
whatever application you are designing
31680
23:36:18,551 --> 23:36:23,119
with c plus plus one thing you should
31681
23:36:20,960 --> 23:36:26,320
know though is that regardless of the
31682
23:36:23,119 --> 23:36:29,191
base class access specifier we use
31683
23:36:26,320 --> 23:36:32,160
private members of the base class can
31684
23:36:29,191 --> 23:36:34,399
never be accessible from a derived class
31685
23:36:32,160 --> 23:36:37,120
so anything that is private is going to
31686
23:36:34,399 --> 23:36:39,360
stay private and you have no way to
31687
23:36:37,119 --> 23:36:40,959
relax things a little bit that's not
31688
23:36:39,360 --> 23:36:43,360
going to work you should really know
31689
23:36:40,960 --> 23:36:46,080
this now that you know these kinds of
31690
23:36:43,360 --> 23:36:47,680
inheritances we can do in ziplus plus
31691
23:36:46,080 --> 23:36:49,759
we're going to head over to the next
31692
23:36:47,679 --> 23:36:51,759
lecture and play with them a little more
31693
23:36:49,759 --> 23:36:54,159
in this lecture we're going to play with
31694
23:36:51,759 --> 23:36:56,159
the base class access specifiers we
31695
23:36:54,160 --> 23:36:58,160
learned about in the last lecture in
31696
23:36:56,160 --> 23:37:01,512
other words we're going to play with
31697
23:36:58,160 --> 23:37:03,760
public protected and private inheritance
31698
23:37:01,512 --> 23:37:05,680
in visual studio code so let's review a
31699
23:37:03,759 --> 23:37:07,679
little bit what we talked about in the
31700
23:37:05,679 --> 23:37:10,079
last lecture we say that we can have
31701
23:37:07,679 --> 23:37:12,959
public inheritance and the syntax to do
31702
23:37:10,080 --> 23:37:15,119
that is what you see here and at the
31703
23:37:12,960 --> 23:37:17,040
moment you do this what was public in
31704
23:37:15,119 --> 23:37:19,279
the basic class is going to be public in
31705
23:37:17,039 --> 23:37:21,599
the derived class what was protected is
31706
23:37:19,279 --> 23:37:24,319
going to stay protected what was private
31707
23:37:21,600 --> 23:37:26,639
is going to become private in the
31708
23:37:24,320 --> 23:37:28,480
derived class in other words public
31709
23:37:26,639 --> 23:37:31,360
inheritance is really not going to
31710
23:37:28,479 --> 23:37:33,119
change the accessibility of the member
31711
23:37:31,360 --> 23:37:35,831
variables we have in the base class
31712
23:37:33,119 --> 23:37:38,551
we're going to inherit the data as it
31713
23:37:35,831 --> 23:37:40,551
was with the same access level we had in
31714
23:37:38,551 --> 23:37:43,360
the base class this is a defining
31715
23:37:40,551 --> 23:37:45,679
feature of public inheritance in c plus
31716
23:37:43,360 --> 23:37:49,119
plus we can also do protected
31717
23:37:45,679 --> 23:37:52,639
inheritance and what this is going to do
31718
23:37:49,119 --> 23:37:55,919
is to make protected the highest access
31719
23:37:52,639 --> 23:37:57,919
level we can have in the derived class
31720
23:37:55,919 --> 23:37:59,919
so anything that was public in the base
31721
23:37:57,919 --> 23:38:01,679
class is going to become protected
31722
23:37:59,919 --> 23:38:03,919
anything that was protected is going to
31723
23:38:01,679 --> 23:38:05,919
stay protected because that's the
31724
23:38:05,919 --> 23:38:10,551
and anything that was private in the
31725
23:38:07,759 --> 23:38:13,279
base class is going to be private in the
31726
23:38:10,551 --> 23:38:15,279
derived class we say private in the
31727
23:38:13,279 --> 23:38:17,831
sense that it is going to be private to
31728
23:38:15,279 --> 23:38:21,600
the base class so you can't really use
31729
23:38:17,831 --> 23:38:22,799
m3 from the player class in this case if
31730
23:38:21,600 --> 23:38:25,680
you're trying to do that you're going to
31731
23:38:22,800 --> 23:38:28,551
get a compiler error okay we can also do
31732
23:38:25,679 --> 23:38:31,359
private inheritance and the syntax to do
31733
23:38:28,551 --> 23:38:33,440
that is what you see here and now
31734
23:38:31,360 --> 23:38:34,720
private is going to be the highest level
31735
23:38:34,720 --> 23:38:39,600
in the player class in terms of the
31736
23:38:37,119 --> 23:38:41,599
members that we get from the base class
31737
23:38:39,600 --> 23:38:43,600
so anything that was public is going to
31738
23:38:41,600 --> 23:38:45,760
become private anything that was
31739
23:38:43,600 --> 23:38:48,000
protected is going to become private
31740
23:38:45,759 --> 23:38:49,919
anything that was private to the base
31741
23:38:48,000 --> 23:38:52,639
class is going to stay private to the
31742
23:38:49,919 --> 23:38:53,759
base class this is what we mean here but
31743
23:38:53,759 --> 23:39:01,679
m1 and m2 just became public to the
31744
23:38:58,551 --> 23:39:04,800
player class if anybody else tries to
31745
23:39:01,679 --> 23:39:07,119
derive or inherit from a player these
31746
23:39:04,800 --> 23:39:10,400
things are not going to be accessible
31747
23:39:07,119 --> 23:39:13,039
and this is in some way the player class
31748
23:39:10,399 --> 23:39:15,679
being selfish it is saying i am going to
31749
23:39:13,039 --> 23:39:18,479
get everything i can from my parent
31750
23:39:15,679 --> 23:39:21,279
class or my base class but i am going to
31751
23:39:18,479 --> 23:39:23,360
make it all mine nobody else can take
31752
23:39:21,279 --> 23:39:24,399
this and this is the kind of setup we
31753
23:39:24,399 --> 23:39:28,959
with private inheritance okay so now
31754
23:39:27,039 --> 23:39:30,959
that we have this in mind we're going to
31755
23:39:28,960 --> 23:39:32,800
play with us in visual studio code we're
31756
23:39:30,960 --> 23:39:34,232
going to set up a bunch of classes we're
31757
23:39:32,800 --> 23:39:36,551
going to set up a personal class we're
31758
23:39:34,232 --> 23:39:38,639
going to be inheriting from we are going
31759
23:39:36,551 --> 23:39:41,360
to set up a nurse class which is going
31760
23:39:38,639 --> 23:39:43,440
to do protected inheritance and we're
31761
23:39:41,360 --> 23:39:45,919
going to set up an engineer class which
31762
23:39:43,440 --> 23:39:47,760
is going to do private inheritance and
31763
23:39:45,919 --> 23:39:50,319
we're going to really play with this and
31764
23:39:47,759 --> 23:39:52,720
see how this plays out in real c plus
31765
23:39:50,320 --> 23:39:54,960
plus code so let's do this here we are
31766
23:39:52,720 --> 23:39:58,960
in our working folder the current
31767
23:39:54,960 --> 23:40:00,720
project is base access specifier a demo
31768
23:39:58,960 --> 23:40:02,320
we're going to do a demo on this but
31769
23:40:00,720 --> 23:40:05,759
before we do that we're going to grab
31770
23:40:02,320 --> 23:40:07,680
our template files and put them in place
31771
23:40:05,759 --> 23:40:09,759
and we are going to open this little guy
31772
23:40:07,679 --> 23:40:11,919
in visual studio code by dragging and
31773
23:40:09,759 --> 23:40:13,679
dropping here this is going to give us a
31774
23:40:11,919 --> 23:40:16,080
good starting point we're going to have
31775
23:40:13,679 --> 23:40:18,000
our main cpp file we're going to clean
31776
23:40:16,080 --> 23:40:19,600
it up and we're going to set up our base
31777
23:40:18,000 --> 23:40:22,479
class which is going to be the person
31778
23:40:19,600 --> 23:40:24,720
class so let's put this in from scratch
31779
23:40:22,479 --> 23:40:26,872
we're going to add our files we're going
31780
23:40:24,720 --> 23:40:28,639
to say person page and we're going to
31781
23:40:28,639 --> 23:40:33,600
we are going to hop over in our header
31782
23:40:30,872 --> 23:40:35,919
file and put in our code nothing special
31783
23:40:33,600 --> 23:40:37,832
so far we have an include gourd we have
31784
23:40:35,919 --> 23:40:40,160
our person class it has a bunch of
31785
23:40:37,831 --> 23:40:42,959
member variables we have the full name
31786
23:40:40,160 --> 23:40:45,680
which is public we have the age which is
31787
23:40:42,960 --> 23:40:49,040
protected and we have the address which
31788
23:40:45,679 --> 23:40:51,279
is private to this class here this is
31789
23:40:49,039 --> 23:40:53,599
going to be our starting point
31790
23:40:51,279 --> 23:40:55,759
we also have a bunch of constructors we
31791
23:40:53,600 --> 23:40:57,920
have a default one we also have another
31792
23:40:55,759 --> 23:41:00,551
one which is going to take all the data
31793
23:40:57,919 --> 23:41:03,119
we can use the constructor person object
31794
23:41:00,551 --> 23:41:05,440
and here we are passing a cost string by
31795
23:41:03,119 --> 23:41:07,599
reference i think we can fix this and
31796
23:41:05,440 --> 23:41:10,232
pass a string view this is going to be
31797
23:41:07,600 --> 23:41:12,480
better let's say string view and we're
31798
23:41:10,232 --> 23:41:15,680
going to change the first parameter here
31799
23:41:12,479 --> 23:41:18,000
to be an std string view by value this
31800
23:41:15,679 --> 23:41:21,119
is going to be much better okay we have
31801
23:41:18,000 --> 23:41:24,080
our class we can hop over in the cpp
31802
23:41:21,119 --> 23:41:26,080
file and put in our implementation we
31803
23:41:24,080 --> 23:41:28,320
are going to change the constructor a
31804
23:41:26,080 --> 23:41:31,119
little bit and make sure we are taking
31805
23:41:28,320 --> 23:41:33,440
an std string view by value and if you
31806
23:41:31,119 --> 23:41:36,080
wanted to type all this code you can get
31807
23:41:33,440 --> 23:41:37,919
it from the resource section of this
31808
23:41:36,080 --> 23:41:40,000
lecture i am going to attach all the
31809
23:41:37,919 --> 23:41:42,232
source code and you can download and use
31810
23:41:40,000 --> 23:41:44,720
this however you want to really make
31811
23:41:42,232 --> 23:41:46,960
your learning experience as pleasant as
31812
23:41:44,720 --> 23:41:49,119
possible so we have our constructor here
31813
23:41:46,960 --> 23:41:50,960
it is going to forward the data into our
31814
23:41:49,119 --> 23:41:53,279
member variables the full name is going
31815
23:41:50,960 --> 23:41:54,800
to go into our full name member variable
31816
23:41:53,279 --> 23:41:56,399
we're going to grab the age and the
31817
23:41:54,800 --> 23:41:58,720
address and we're going to store all
31818
23:41:56,399 --> 23:42:00,399
this information we also have an output
31819
23:41:58,720 --> 23:42:02,872
stream operator which is going to be
31820
23:42:00,399 --> 23:42:04,871
printing all this information here it is
31821
23:42:02,872 --> 23:42:07,120
going to go through the getters because
31822
23:42:04,872 --> 23:42:10,000
we have a person object passed as a
31823
23:42:07,119 --> 23:42:12,399
parameter here and this is going to work
31824
23:42:10,000 --> 23:42:15,191
we can go in the main cpp file and
31825
23:42:12,399 --> 23:42:17,191
include our person class and create an
31826
23:42:15,191 --> 23:42:20,080
object of it we can do something like
31827
23:42:17,191 --> 23:42:22,959
person person one and we can pass the
31828
23:42:20,080 --> 23:42:25,759
data that our constructor expects we can
31829
23:42:22,960 --> 23:42:27,832
pass in the full name the age and the
31830
23:42:25,759 --> 23:42:30,799
address so let's do that we're going to
31831
23:42:27,831 --> 23:42:33,511
say the full name daniel gray why not
31832
23:42:30,800 --> 23:42:35,360
and the age is going to be 27 we can put
31833
23:42:33,512 --> 23:42:37,832
in whatever we want and we're going to
31834
23:42:35,360 --> 23:42:40,800
put in the address we're going to say
31835
23:42:37,831 --> 23:42:43,360
blue sky streak you can say two three
31836
23:42:40,800 --> 23:42:46,160
three for example and say the number of
31837
23:42:43,360 --> 23:42:48,960
the house to b56 why not this is a
31838
23:42:46,160 --> 23:42:52,320
possible address for a person so we can
31839
23:42:48,960 --> 23:42:54,552
say person one or we can use htdc out to
31840
23:42:52,320 --> 23:42:57,760
print this out because we have an output
31841
23:42:54,551 --> 23:42:59,360
stream operator for our person class we
31842
23:42:57,759 --> 23:43:02,159
can do this we're going to say person
31843
23:42:59,360 --> 23:43:04,000
one and we're going to put him out and
31844
23:43:02,160 --> 23:43:06,832
if we build and run this program we're
31845
23:43:04,000 --> 23:43:09,360
going to see that this is going to work
31846
23:43:06,831 --> 23:43:11,759
hopefully and we have a problem because
31847
23:43:09,360 --> 23:43:14,320
we don't have a semicolon at the end of
31848
23:43:11,759 --> 23:43:17,119
line 6 here let's fix that we're going
31849
23:43:14,320 --> 23:43:19,040
to run this task to build with gcc the
31850
23:43:17,119 --> 23:43:21,512
builder is going to be good we can bring
31851
23:43:21,512 --> 23:43:25,600
and we're going to use this to run our
31852
23:43:23,119 --> 23:43:27,831
program if we say rooster we're going to
31853
23:43:25,600 --> 23:43:30,480
see that we have the person printed down
31854
23:43:27,831 --> 23:43:35,119
the full name is daniel gray the age is
31855
23:43:30,479 --> 23:43:38,000
27 the address is blue sky street 233
31856
23:43:35,119 --> 23:43:40,399
and the number of the house is 56 so
31857
23:43:38,000 --> 23:43:42,720
this is a possible implementation for
31858
23:43:40,399 --> 23:43:44,871
the person class but we are really not
31859
23:43:42,720 --> 23:43:46,872
interested in setting up a prison class
31860
23:43:44,872 --> 23:43:49,680
and doing things with that we are
31861
23:43:46,872 --> 23:43:52,872
interested in inheriting from the person
31862
23:43:49,679 --> 23:43:55,759
class and learn about different kinds of
31863
23:43:52,872 --> 23:43:57,512
base class access specifiers we can do
31864
23:43:55,759 --> 23:44:00,479
so we're going to set up a player class
31865
23:43:57,512 --> 23:44:02,720
which is going to inherit publicly from
31866
23:44:00,479 --> 23:44:04,639
the person class let's do that we're
31867
23:44:02,720 --> 23:44:06,960
going to put in our player we're going
31868
23:44:04,639 --> 23:44:09,119
to put in the header file let's say
31869
23:44:06,960 --> 23:44:12,400
player not person and we're going to say
31870
23:44:09,119 --> 23:44:14,799
player.h we're going to put in a cpp
31871
23:44:12,399 --> 23:44:17,831
file we are going to hop over in the
31872
23:44:14,800 --> 23:44:20,400
header of player and put in our class
31873
23:44:17,831 --> 23:44:22,000
let's close the left sidebar here so
31874
23:44:20,399 --> 23:44:23,919
that you can really see everything we
31875
23:44:23,919 --> 23:44:28,800
we have the class player declared it is
31876
23:44:26,479 --> 23:44:29,759
going to do public inheritance from
31877
23:44:29,759 --> 23:44:34,639
and what this is going to do is that
31878
23:44:32,720 --> 23:44:37,512
anything that is public in person is
31879
23:44:34,639 --> 23:44:39,360
going to stay public in player anything
31880
23:44:37,512 --> 23:44:41,040
that is protected is going to stay
31881
23:44:43,512 --> 23:44:48,000
private is going to stay private so we
31882
23:44:46,000 --> 23:44:50,479
want to be able to access private data
31883
23:44:48,000 --> 23:44:52,080
from a person object for example we
31884
23:44:52,080 --> 23:44:57,191
the address member variable here because
31885
23:44:54,399 --> 23:44:58,871
it is private but we can use the full
31886
23:45:02,160 --> 23:45:07,600
let's make sure we have a cpp file and
31887
23:45:07,600 --> 23:45:12,800
so let's hop over to the cpp file and
31888
23:45:09,831 --> 23:45:15,191
put in a possible implementation we are
31889
23:45:12,800 --> 23:45:17,680
going to include the person and player
31890
23:45:15,191 --> 23:45:20,080
because we're going to be using these
31891
23:45:17,679 --> 23:45:22,719
and we are going to set up a constructor
31892
23:45:20,080 --> 23:45:25,600
which is not going to do anything for a
31893
23:45:22,720 --> 23:45:27,119
player we also have our output stream
31894
23:45:25,600 --> 23:45:29,920
operator which is going to print the
31895
23:45:27,119 --> 23:45:32,399
data it is going to be using the getters
31896
23:45:29,919 --> 23:45:33,831
we have in the base class and we have
31897
23:45:33,831 --> 23:45:38,479
because we are doing public inheritance
31898
23:45:36,479 --> 23:45:40,800
so they are going to be public and we
31899
23:45:38,479 --> 23:45:43,279
can call them from the outside like we
31900
23:45:40,800 --> 23:45:46,232
are doing here notice that this is an
31901
23:45:43,279 --> 23:45:48,551
outside player object and we are calling
31902
23:45:46,232 --> 23:45:50,400
our public members on it and this is
31903
23:45:48,551 --> 23:45:52,000
going to work we also have a destructor
31904
23:45:50,399 --> 23:45:54,551
and which is really not going to do
31905
23:45:52,000 --> 23:45:57,119
anything but we're going to keep it in
31906
23:45:54,551 --> 23:45:59,759
here because it's not going to hurt so
31907
23:45:59,759 --> 23:46:04,871
is to see if we can access thanks from
31908
23:46:02,479 --> 23:46:07,191
the base class the first thing we have
31909
23:46:07,191 --> 23:46:12,871
full name and i think we can actually
31910
23:46:09,679 --> 23:46:15,831
copy these blanks or we cannot just use
31911
23:46:12,872 --> 23:46:18,320
them m full name mh and m address we're
31912
23:46:15,831 --> 23:46:21,511
going to try and use them in the derived
31913
23:46:18,320 --> 23:46:24,000
class so let's try and say m full name
31914
23:46:21,512 --> 23:46:24,720
and change the full name for example to
31915
23:46:24,720 --> 23:46:28,720
daniel gray or jon snow and we're going
31916
23:46:30,639 --> 23:46:36,160
55 why not and we're going to try and
31917
23:46:33,360 --> 23:46:38,551
access the address let's see what we
31918
23:46:36,160 --> 23:46:40,960
called our address member variable it is
31919
23:46:38,551 --> 23:46:43,599
m address we can grab that and use that
31920
23:46:40,960 --> 23:46:45,760
in our class if we try to access that
31921
23:46:43,600 --> 23:46:47,440
we're going to get a compiler error
31922
23:46:47,440 --> 23:46:52,400
private to the base class you notice
31923
23:46:50,080 --> 23:46:54,400
that if we even try to put some junk
31924
23:46:52,399 --> 23:46:57,511
data we're going to have a squiggly line
31925
23:46:54,399 --> 23:46:59,360
because this is not accessible here and
31926
23:46:57,512 --> 23:47:01,760
visual studio code is going to say that
31927
23:47:01,759 --> 23:47:06,959
because it is private to the base class
31928
23:47:04,320 --> 23:47:10,160
so we can access m full name because it
31929
23:47:06,960 --> 23:47:13,680
was inherited as public so this is going
31930
23:47:10,160 --> 23:47:17,120
to be okay we can use age because it was
31931
23:47:13,679 --> 23:47:19,679
inherited as protected we can use it in
31932
23:47:17,119 --> 23:47:22,319
a derived class but we can't use the
31933
23:47:19,679 --> 23:47:24,871
address because it was inherited as
31934
23:47:22,320 --> 23:47:27,120
private and it is private to the base
31935
23:47:24,872 --> 23:47:28,800
class so this is not going to work even
31936
23:47:27,119 --> 23:47:30,639
if we try to call biola code we're going
31937
23:47:28,800 --> 23:47:32,479
to get a compiler error let's try to do
31938
23:47:30,639 --> 23:47:35,191
that so that you can really see for
31939
23:47:32,479 --> 23:47:39,191
yourself okay so we have a compiler
31940
23:47:35,191 --> 23:47:41,119
error and this was declared in the base
31941
23:47:39,191 --> 23:47:43,599
class as private this is what the
31942
23:47:41,119 --> 23:47:46,799
compiler error is saying so we shouldn't
31943
23:47:43,600 --> 23:47:48,480
really be doing this the derived class
31944
23:47:48,479 --> 23:47:53,831
modifying a private member of the base
31945
23:47:51,919 --> 23:47:55,440
class this is the message here so we're
31946
23:47:53,831 --> 23:47:56,959
going to comment this out and say that
31947
23:47:55,440 --> 23:47:59,760
this is going to give you a compiler
31948
23:47:56,960 --> 23:48:02,552
error but we are also going to create a
31949
23:47:59,759 --> 23:48:05,279
player object and try to access these
31950
23:48:02,551 --> 23:48:07,279
guys and see how accesses from the
31951
23:48:05,279 --> 23:48:09,440
outside so we're going to go in the main
31952
23:48:07,279 --> 23:48:12,080
cpp file and we're going to include
31953
23:48:09,440 --> 23:48:14,720
player dot h and we're going to create a
31954
23:48:12,080 --> 23:48:17,600
player object we can put in a separator
31955
23:48:14,720 --> 23:48:19,360
and say a bunch of dashes here this is
31956
23:48:17,600 --> 23:48:21,600
going to do i think this is going to
31957
23:48:19,360 --> 23:48:24,479
work and we're going to create a player
31958
23:48:21,600 --> 23:48:27,040
object we can say player and player and
31959
23:48:24,479 --> 23:48:29,039
not put any parenthesis here this is
31960
23:48:27,039 --> 23:48:33,039
going to call the default constructor
31961
23:48:29,039 --> 23:48:35,119
that we have in our player class and we
31962
23:48:33,039 --> 23:48:37,191
can try to use this but before we do
31963
23:48:35,119 --> 23:48:39,759
let's try and build and see that this is
31964
23:48:37,191 --> 23:48:42,319
going to build just fine we're going to
31965
23:48:39,759 --> 23:48:44,080
work with gcc let's do that we're going
31966
23:48:42,320 --> 23:48:47,192
to see that the world is good we can try
31967
23:48:44,080 --> 23:48:50,720
and access stuff from this player object
31968
23:48:47,191 --> 23:48:52,479
we can say player and say m full name
31969
23:48:50,720 --> 23:48:54,160
you see that this is accessible we can
31970
23:48:54,160 --> 23:49:01,192
to samwell jackson we can do that but if
31971
23:48:58,160 --> 23:49:03,279
we try and say player mh we're going to
31972
23:49:01,191 --> 23:49:06,479
see that this is not accessible here
31973
23:49:03,279 --> 23:49:07,919
because this was inherited as protected
31974
23:49:06,479 --> 23:49:11,279
if we go back to person we're going to
31975
23:49:07,919 --> 23:49:14,080
see that the age is protected so it will
31976
23:49:11,279 --> 23:49:18,080
be accessible in derived classes just
31977
23:49:14,080 --> 23:49:20,960
like we did in our play method of the
31978
23:49:18,080 --> 23:49:24,000
player class but we can't access the age
31979
23:49:20,960 --> 23:49:25,280
from the outside of a player object
31980
23:49:24,000 --> 23:49:27,279
because that's not going to be
31981
23:49:25,279 --> 23:49:30,872
accessible from the outside this is a
31982
23:49:27,279 --> 23:49:32,800
defining feature of the protected access
31983
23:49:30,872 --> 23:49:34,320
level so this is not going to work even
31984
23:49:32,800 --> 23:49:38,232
if we try to build we're going to get a
31985
23:49:34,320 --> 23:49:41,760
compiler error along the lines of this
31986
23:49:38,232 --> 23:49:43,600
is not accessible in this context and it
31987
23:49:41,759 --> 23:49:46,000
was declared in the base class so we
31988
23:49:43,600 --> 23:49:47,920
can't really access it from the outside
31989
23:49:46,000 --> 23:49:50,160
this is the compiler error here so we're
31990
23:49:47,919 --> 23:49:51,679
going to comment this out and say that
31991
23:49:50,160 --> 23:49:53,600
this is going to give you a compiler
31992
23:49:51,679 --> 23:49:55,759
error okay so i hope you know that you
31993
23:49:53,600 --> 23:49:59,040
can't even have a chance accessing a
31994
23:49:55,759 --> 23:50:02,080
private member of a base class from a
31995
23:49:59,039 --> 23:50:05,279
derived object in the main function like
31996
23:50:02,080 --> 23:50:08,080
we do here so if we try and do player
31997
23:50:05,279 --> 23:50:09,919
and say m address this is not going to
31998
23:50:08,080 --> 23:50:12,080
work okay so if we try to change this
31999
23:50:09,919 --> 23:50:13,360
for example to some junk data this is
32000
23:50:12,080 --> 23:50:16,872
not going to work we're going to get a
32001
23:50:13,360 --> 23:50:19,279
compiler error because this was declared
32002
23:50:16,872 --> 23:50:20,872
private in the base class and it is
32003
23:50:19,279 --> 23:50:23,191
private to the base class you can't
32004
23:50:20,872 --> 23:50:25,192
really access it from the outside you
32005
23:50:23,191 --> 23:50:28,000
can't even access it from a derived
32006
23:50:25,191 --> 23:50:29,831
class so let alone access this on the
32007
23:50:28,000 --> 23:50:31,279
outside in the main function so this is
32008
23:50:29,831 --> 23:50:33,360
not going to work it is going to give
32009
23:50:31,279 --> 23:50:35,191
you a compiler error but we're going to
32010
23:50:33,360 --> 23:50:37,919
weld and show you the compiler error
32011
23:50:35,191 --> 23:50:40,479
because we are learning here so we're
32012
23:50:37,919 --> 23:50:43,679
going to get a compiler error that says
32013
23:50:40,479 --> 23:50:45,759
m address is private within the context
32014
23:50:43,679 --> 23:50:47,831
where we are trying to use it so we
32015
23:50:45,759 --> 23:50:50,000
can't really use it from the outside
32016
23:50:47,831 --> 23:50:52,551
here again this is going to give us a
32017
23:50:50,000 --> 23:50:55,039
compiler error let's say that here and
32018
23:50:52,551 --> 23:50:57,599
this is really what i wanted you to
32019
23:50:55,039 --> 23:50:59,511
learn about public inheritance anything
32020
23:50:57,600 --> 23:51:02,320
that is public in the base class is
32021
23:50:59,512 --> 23:51:04,160
going to be public in the derived class
32022
23:51:02,320 --> 23:51:06,872
anything that is protected is going to
32023
23:51:04,160 --> 23:51:10,000
stay protected and what that means it
32024
23:51:06,872 --> 23:51:12,639
will be usable in the derived class but
32025
23:51:10,000 --> 23:51:14,232
you can't use that from the outside and
32026
23:51:12,639 --> 23:51:16,319
anything that is private in the base
32027
23:51:14,232 --> 23:51:18,639
class is going to stay private so you
32028
23:51:16,320 --> 23:51:20,872
can't use that from the derived class
32029
23:51:18,639 --> 23:51:22,639
and you can't even use that from the
32030
23:51:20,872 --> 23:51:25,279
outside like we are doing in the main
32031
23:51:22,639 --> 23:51:27,600
function here this is not going to work
32032
23:51:25,279 --> 23:51:29,279
okay so now that we have this in place
32033
23:51:27,600 --> 23:51:30,960
we're going to set up another class that
32034
23:51:30,960 --> 23:51:35,360
protected inheritance and that's going
32035
23:51:33,039 --> 23:51:38,079
to be our nurse class so we're going to
32036
23:51:35,360 --> 23:51:40,800
put this in let's put in a nurse header
32037
23:51:38,080 --> 23:51:44,080
file this is going to be nurse.h we're
32038
23:51:40,800 --> 23:51:45,919
also going to put in nurse.cpp okay so
32039
23:51:44,080 --> 23:51:48,800
we're going to head over in the header
32040
23:51:45,919 --> 23:51:51,039
file and put in the code for our nurse
32041
23:51:48,800 --> 23:51:53,279
class we're going to say cluster nurse
32042
23:51:51,039 --> 23:51:55,831
and say protected to mean that we want
32043
23:51:53,279 --> 23:51:57,440
to do protected inheritance and what
32044
23:51:55,831 --> 23:52:00,399
this is going to do anything that is
32045
23:51:57,440 --> 23:52:03,279
public in the base class is going to be
32046
23:52:00,399 --> 23:52:05,119
protected in the derived class which is
32047
23:52:03,279 --> 23:52:07,360
our nurse class anything that is
32048
23:52:05,119 --> 23:52:09,191
protected is going to stay protected
32049
23:52:07,360 --> 23:52:10,800
anything that is private is going to
32050
23:52:10,800 --> 23:52:15,279
to the base class this is what we mean
32051
23:52:12,960 --> 23:52:18,160
here okay now that we have this end we
32052
23:52:15,279 --> 23:52:20,639
can put in the implementation for our
32053
23:52:18,160 --> 23:52:22,800
nurse class and we're going to have a
32054
23:52:20,639 --> 23:52:24,800
constructor and we're going to have our
32055
23:52:22,800 --> 23:52:26,720
output stream operator and we're going
32056
23:52:24,800 --> 23:52:28,720
to have a destructor which is really not
32057
23:52:26,720 --> 23:52:31,919
going to do anything because we don't
32058
23:52:28,720 --> 23:52:33,191
have any dynamic memory allocation in
32059
23:52:33,191 --> 23:52:38,551
we are going to try and build this code
32060
23:52:35,759 --> 23:52:41,191
to see that it is going to work we have
32061
23:52:38,551 --> 23:52:44,159
a squiggly line in the main cpp file but
32062
23:52:41,191 --> 23:52:46,639
it was because of the line 15 here and
32063
23:52:44,160 --> 23:52:49,192
it has been commented down let's see if
32064
23:52:46,639 --> 23:52:51,119
we can build this program okay you see
32065
23:52:49,191 --> 23:52:52,720
that the world is going to be good and
32066
23:52:54,320 --> 23:52:59,760
thanks from our output stream operator
32067
23:52:56,960 --> 23:53:03,280
you see we have an earth operand we are
32068
23:52:59,759 --> 23:53:05,279
able to call this gateful name and get
32069
23:53:05,279 --> 23:53:09,919
because they are now protected in the
32070
23:53:07,679 --> 23:53:11,511
nurse class but we are able to call them
32071
23:53:11,512 --> 23:53:18,080
because this operator is a friend of our
32072
23:53:15,512 --> 23:53:20,160
nurse class here i want you to say this
32073
23:53:18,080 --> 23:53:23,191
some of you are going to ask
32074
23:53:20,160 --> 23:53:25,760
aren't we using an object and calling a
32075
23:53:23,191 --> 23:53:28,399
method using the dot operator this
32076
23:53:25,759 --> 23:53:31,599
qualifies as calling thanks from the
32077
23:53:28,399 --> 23:53:34,639
outside and yes that's true but this
32078
23:53:31,600 --> 23:53:38,000
method is really like a member function
32079
23:53:34,639 --> 23:53:40,639
in that it has access to private and
32080
23:53:38,000 --> 23:53:43,191
protected data from our nurse class and
32081
23:53:40,639 --> 23:53:45,360
the reason is it is a friend of the
32082
23:53:43,191 --> 23:53:46,479
nurse class here that's why we are able
32083
23:53:46,479 --> 23:53:51,119
something like this but what i really
32084
23:53:48,639 --> 23:53:54,319
want you to see now that that doubt is
32085
23:53:51,119 --> 23:53:56,720
cleared is the kind of access we have to
32086
23:53:54,320 --> 23:53:59,440
thanks from the base class we will still
32087
23:53:56,720 --> 23:54:02,479
be able to use m full name here because
32088
23:53:59,440 --> 23:54:05,680
it was inherited as protected so we can
32089
23:54:02,479 --> 23:54:08,639
use it from a derived class we can say m
32090
23:54:05,679 --> 23:54:10,319
full name jon snow this is going to work
32091
23:54:10,320 --> 23:54:15,360
inherited as protected now it is
32092
23:54:12,960 --> 23:54:17,512
protected in the eyes of the nurse class
32093
23:54:15,360 --> 23:54:19,680
this is what we mean here so this is
32094
23:54:17,512 --> 23:54:23,680
okay this is going to work we can get
32095
23:54:19,679 --> 23:54:25,831
the age we can use that and we can say
32096
23:54:25,831 --> 23:54:30,399
23 for example this is going to work
32097
23:54:27,919 --> 23:54:33,119
because this is protected but we can't
32098
23:54:30,399 --> 23:54:34,720
use the address if we do that we want to
32099
23:54:33,119 --> 23:54:37,360
be able to change it we will get a
32100
23:54:37,360 --> 23:54:41,191
this is private to the base class this
32101
23:54:39,440 --> 23:54:42,960
is the same thing we saw in the last
32102
23:54:41,191 --> 23:54:45,039
lecture this is going to give us a
32103
23:54:42,960 --> 23:54:48,232
compiler error if we try to build this
32104
23:54:45,039 --> 23:54:50,319
program let's try and build it to really
32105
23:54:48,232 --> 23:54:53,440
prove this the body is going to be good
32106
23:54:50,320 --> 23:54:55,512
without line 17 here but if we
32107
23:54:53,440 --> 23:54:58,000
uncommented and trying to build the
32108
23:54:55,512 --> 23:55:00,080
program let's do that we are going to
32109
23:54:58,000 --> 23:55:03,191
get a compiler error and the compiler
32110
23:55:00,080 --> 23:55:05,600
error is going to say let's go up and
32111
23:55:03,191 --> 23:55:06,799
see if we can get this message it's
32112
23:55:06,800 --> 23:55:12,400
m address is private within this context
32113
23:55:10,000 --> 23:55:15,119
where we are trying to use it and that's
32114
23:55:12,399 --> 23:55:16,959
line 17 of the nurse class if we go
32115
23:55:15,119 --> 23:55:18,799
there we're going to find the offending
32116
23:55:16,960 --> 23:55:20,552
line here so we're going to comment this
32117
23:55:18,800 --> 23:55:22,320
out and say that this is going to give
32118
23:55:20,551 --> 23:55:24,639
us a compiler error okay so you
32119
23:55:22,320 --> 23:55:26,960
shouldn't do this now that we know
32120
23:55:24,639 --> 23:55:28,232
things from the inside let's see how
32121
23:55:28,232 --> 23:55:34,400
on the outside we are going to hop over
32122
23:55:31,191 --> 23:55:36,959
to the main cpp file and include our
32123
23:55:34,399 --> 23:55:39,399
nurse class and we're going to create a
32124
23:55:36,960 --> 23:55:42,160
nurse object we can go down and say
32125
23:55:39,399 --> 23:55:44,399
stdcl and we're going to put in our
32126
23:55:42,160 --> 23:55:46,160
dashes and we're going to create a nurse
32127
23:55:44,399 --> 23:55:48,720
object i think we have a default
32128
23:55:46,160 --> 23:55:51,600
constructor for a nurse we're going to
32129
23:55:48,720 --> 23:55:53,919
say nurse 1 and we're going to basically
32130
23:55:51,600 --> 23:55:56,800
try and do the same things we did for
32131
23:55:53,919 --> 23:55:59,119
the player object from the outside if we
32132
23:55:56,800 --> 23:56:01,360
try to access the full name now it's not
32133
23:55:59,119 --> 23:56:02,639
going to be accessible because it was
32134
23:56:02,639 --> 23:56:08,720
with protected access level so if we do
32135
23:56:06,080 --> 23:56:11,119
nurse and say m full name you're going
32136
23:56:08,720 --> 23:56:13,191
to see that autocomplete is not here
32137
23:56:11,119 --> 23:56:16,479
this is a good sign that this is not
32138
23:56:13,191 --> 23:56:18,639
accessible from this place if we say
32139
23:56:16,479 --> 23:56:20,479
davy jones we're going to get a compiler
32140
23:56:18,639 --> 23:56:23,440
error and if we try to build we're going
32141
23:56:20,479 --> 23:56:25,440
to get a descriptive compiler error at
32142
23:56:23,440 --> 23:56:28,800
least i hope so let's build we're going
32143
23:56:25,440 --> 23:56:30,479
to see that with world with errors and
32144
23:56:28,800 --> 23:56:33,192
if we go up we're going to have our
32145
23:56:30,479 --> 23:56:36,319
error nurse was not declared in this
32146
23:56:33,191 --> 23:56:38,639
scope did you mean nurse one yes we met
32147
23:56:36,320 --> 23:56:41,680
nurse one sorry for that we're going to
32148
23:56:38,639 --> 23:56:43,512
build again thank you gcc for pointing
32149
23:56:41,679 --> 23:56:46,479
this out we are going to get another
32150
23:56:43,512 --> 23:56:48,160
kind of error and if we look at our
32151
23:56:46,479 --> 23:56:50,639
error here we're going to see that m
32152
23:56:48,160 --> 23:56:54,000
full name is inaccessible within this
32153
23:56:50,639 --> 23:56:57,512
context because it is a protected member
32154
23:56:54,000 --> 23:57:00,399
of the nurse class now it was inherited
32155
23:56:57,512 --> 23:57:02,872
as protected and we can't access it from
32156
23:57:00,399 --> 23:57:05,439
the outside we can access that from the
32157
23:57:02,872 --> 23:57:07,360
inside because it is protected but if we
32158
23:57:05,440 --> 23:57:09,360
try to access it from the outside we're
32159
23:57:07,360 --> 23:57:11,279
going to get a compiler error and this
32160
23:57:11,279 --> 23:57:16,872
of protected inheritance even things
32161
23:57:14,551 --> 23:57:19,440
that were public in the base class are
32162
23:57:16,872 --> 23:57:21,600
going to become protected in the derived
32163
23:57:19,440 --> 23:57:23,040
class so this is the message here and
32164
23:57:21,600 --> 23:57:25,680
this is going to give us a compiler
32165
23:57:23,039 --> 23:57:28,319
error okay so if we also try to access
32166
23:57:28,320 --> 23:57:32,552
h this is also going to give us a
32167
23:57:30,479 --> 23:57:35,119
compiler arrow let's try to put in an
32168
23:57:32,551 --> 23:57:36,639
edge here let's put in 51. you're going
32169
23:57:35,119 --> 23:57:38,080
to see that we're going to get the same
32170
23:57:38,080 --> 23:57:43,360
let's really try these things out and
32171
23:57:40,320 --> 23:57:45,040
learn about every possible way we can
32172
23:57:45,039 --> 23:57:49,599
if we look at the error we're going to
32173
23:57:47,119 --> 23:57:52,639
see that image is protected within this
32174
23:57:49,600 --> 23:57:54,960
context so we can't really access it so
32175
23:57:52,639 --> 23:57:57,360
this is the compiler error we get and i
32176
23:57:54,960 --> 23:57:59,040
hope you know that if you try and access
32177
23:57:57,360 --> 23:58:01,440
the address you're also going to get a
32178
23:57:59,039 --> 23:58:04,231
compiler error because that's private to
32179
23:58:01,440 --> 23:58:07,119
the base class so we can't even use that
32180
23:58:04,232 --> 23:58:08,872
from a derived class like nurse here
32181
23:58:07,119 --> 23:58:10,871
that's not going to work let's say that
32182
23:58:08,872 --> 23:58:13,040
here we have a compiler error and we're
32183
23:58:10,872 --> 23:58:16,000
going to set up another class which is
32184
23:58:13,039 --> 23:58:18,079
going to inherit privately and see how
32185
23:58:16,000 --> 23:58:19,919
that works out the class is going to be
32186
23:58:18,080 --> 23:58:22,720
engineer we're going to see that the
32187
23:58:19,919 --> 23:58:24,800
error here goes away so let's create our
32188
23:58:22,720 --> 23:58:27,639
engineer class we're going to put in a
32189
23:58:24,800 --> 23:58:31,760
header file that's going to be our
32190
23:58:27,639 --> 23:58:34,479
engineer.h we are also going to put in
32191
23:58:31,759 --> 23:58:37,119
cpp okay so we're going to hop over to
32192
23:58:34,479 --> 23:58:39,512
our header file and put in our engineer
32193
23:58:37,119 --> 23:58:42,231
class we're going to say engineer and
32194
23:58:39,512 --> 23:58:44,400
say that we want to inherit privately
32195
23:58:42,232 --> 23:58:46,480
from the person class this is the syntax
32196
23:58:44,399 --> 23:58:49,511
here and this is going to do private
32197
23:58:46,479 --> 23:58:51,119
inheritance and what this means is that
32198
23:58:49,512 --> 23:58:54,080
anything that is public is going to
32199
23:58:51,119 --> 23:58:56,159
become private to this class anything
32200
23:58:54,080 --> 23:58:58,400
that is protected in the base class is
32201
23:58:56,160 --> 23:59:00,480
going to become private to this class
32202
23:58:58,399 --> 23:59:03,279
and anything that was private in the
32203
23:59:00,479 --> 23:59:06,551
base class is going to stay private we
32204
23:59:03,279 --> 23:59:09,512
won't have access to that whatsoever in
32205
23:59:06,551 --> 23:59:12,080
the derived class directly we are going
32206
23:59:09,512 --> 23:59:15,119
to hop over to the cpp file and put in
32207
23:59:12,080 --> 23:59:17,360
our implementations we're going to have
32208
23:59:15,119 --> 23:59:19,512
a default constructor for engineer which
32209
23:59:17,360 --> 23:59:21,512
is not going to be taking any parameter
32210
23:59:19,512 --> 23:59:24,000
we're going to have our output stream
32211
23:59:21,512 --> 23:59:26,320
operator which is going to still work
32212
23:59:24,000 --> 23:59:29,360
because it is a friend of the engineer
32213
23:59:26,320 --> 23:59:32,480
class so all these things that were
32214
23:59:29,360 --> 23:59:35,600
inherited to be private are going to be
32215
23:59:32,479 --> 23:59:37,831
private to the engineer class and any
32216
23:59:35,600 --> 23:59:40,160
friend of the engineer class will have
32217
23:59:37,831 --> 23:59:42,871
access to that that's why we are able to
32218
23:59:40,160 --> 23:59:45,440
call get full name get age and get
32219
23:59:42,872 --> 23:59:47,832
address here and get these things to
32220
23:59:45,440 --> 23:59:50,872
work okay now that this is out of the
32221
23:59:47,831 --> 23:59:52,231
way we can try and access our thanks
32222
23:59:50,872 --> 23:59:55,279
we're going to try and do the same
32223
23:59:52,232 --> 23:59:57,279
things we did in our nurse header we're
32224
23:59:55,279 --> 23:59:58,800
going to copy the code because we are
32225
23:59:57,279 --> 24:00:00,872
trying to access the same member
32226
23:59:58,800 --> 24:00:03,832
variables and we're going to see how
32227
24:00:00,872 --> 24:00:06,479
this fairs in our engineer class this is
32228
24:00:03,831 --> 24:00:08,551
going to save us a few seconds
32229
24:00:06,479 --> 24:00:10,720
if we try to access the full name this
32230
24:00:08,551 --> 24:00:13,279
is going to work because it is private
32231
24:00:10,720 --> 24:00:15,040
to this class if we try to access the
32232
24:00:13,279 --> 24:00:17,119
edge this is going to work because all
32233
24:00:17,119 --> 24:00:22,720
to this class here but if we try to
32234
24:00:20,160 --> 24:00:25,192
access the address this is going to give
32235
24:00:22,720 --> 24:00:27,680
us a compiler error because address is
32236
24:00:25,191 --> 24:00:29,279
private to the base class if we go back
32237
24:00:27,679 --> 24:00:30,639
to person we're going to see that this
32238
24:00:30,639 --> 24:00:35,600
and if you try to inherit from this
32239
24:00:33,119 --> 24:00:38,479
class in any way you're not going to be
32240
24:00:35,600 --> 24:00:40,480
able to change this access level this
32241
24:00:38,479 --> 24:00:43,440
member variable is always going to stay
32242
24:00:40,479 --> 24:00:46,159
private to the base class and no derived
32243
24:00:43,440 --> 24:00:48,479
class will be able to modify or read
32244
24:00:46,160 --> 24:00:50,720
from this in any way so this is the
32245
24:00:48,479 --> 24:00:52,639
setup we have here if we try to build
32246
24:00:50,720 --> 24:00:54,800
we're going to get a compiler error
32247
24:00:52,639 --> 24:00:56,720
let's first take this out and show you
32248
24:00:56,720 --> 24:01:02,000
just fine without this line here
32249
24:00:59,831 --> 24:01:04,639
and i am going to build again and show
32250
24:01:02,000 --> 24:01:06,551
you that if we bring that in we're going
32251
24:01:04,639 --> 24:01:08,960
to get a compiler error so the build is
32252
24:01:06,551 --> 24:01:12,080
good we can go back in our engineer
32253
24:01:08,960 --> 24:01:14,639
class and bring in the offending line we
32254
24:01:12,080 --> 24:01:17,040
can uncomment this and if we want we're
32255
24:01:14,639 --> 24:01:19,759
going to get a compiler error let's make
32256
24:01:17,039 --> 24:01:22,079
sure you see the compiler error here so
32257
24:01:19,759 --> 24:01:23,919
the world was finished with errors and
32258
24:01:22,080 --> 24:01:26,160
if we go up we're going to see that we
32259
24:01:23,919 --> 24:01:28,959
have an error here and the error is
32260
24:01:26,160 --> 24:01:31,600
going to say m address is private within
32261
24:01:28,960 --> 24:01:34,639
this context and the context is what we
32262
24:01:34,639 --> 24:01:38,960
engineer class so we can go there and
32263
24:01:36,800 --> 24:01:40,639
find the offending line and we're going
32264
24:01:38,960 --> 24:01:43,120
to comment this out and this is going to
32265
24:01:40,639 --> 24:01:45,759
give us a compiler error now you know
32266
24:01:43,119 --> 24:01:48,479
this but this is how things are going to
32267
24:01:45,759 --> 24:01:51,511
work from the inside but we also need to
32268
24:01:48,479 --> 24:01:54,479
look at how things fare from the outside
32269
24:01:51,512 --> 24:01:57,279
let's go back in our main cpp file we
32270
24:01:54,479 --> 24:01:59,360
are going to include our engineer class
32271
24:01:57,279 --> 24:02:02,319
and we are going to create an engineer
32272
24:01:59,360 --> 24:02:05,039
object we can go down and say sddc out
32273
24:02:02,320 --> 24:02:08,160
and put in a bunch of dashes to separate
32274
24:02:05,039 --> 24:02:10,871
on thanks and we can create a
32275
24:02:08,160 --> 24:02:14,160
engineer object and that's going to be
32276
24:02:10,872 --> 24:02:15,832
engineer one and if we try to access the
32277
24:02:14,160 --> 24:02:18,160
full name that's not going to work
32278
24:02:20,720 --> 24:02:26,479
if we say engineer one and try to say m
32279
24:02:23,759 --> 24:02:28,871
full name and try to change the name in
32280
24:02:28,872 --> 24:02:34,479
olivier godson i am making this up i
32281
24:02:31,831 --> 24:02:36,479
don't know if this name exists but the
32282
24:02:34,479 --> 24:02:38,551
point is that this is not going to work
32283
24:02:36,479 --> 24:02:41,440
it is going to give you a compiler error
32284
24:02:38,551 --> 24:02:44,720
because m full name is now private to
32285
24:02:41,440 --> 24:02:47,119
the engineer class it was inherited to
32286
24:02:44,720 --> 24:02:48,479
be private to the engineer class and if
32287
24:02:47,119 --> 24:02:51,360
you try to do this you're going to get a
32288
24:02:48,479 --> 24:02:53,759
compiler error let's try and work with
32289
24:02:51,360 --> 24:02:55,759
gcc to really show you this and the
32290
24:02:53,759 --> 24:02:57,439
world is going to be finished with
32291
24:02:55,759 --> 24:02:58,959
errors and if we go up we're going to
32292
24:02:58,960 --> 24:03:04,800
full name is inaccessible from within
32293
24:03:01,440 --> 24:03:09,279
this context and the offending line is
32294
24:03:04,800 --> 24:03:11,440
at line 27 of the main cpp file if we go
32295
24:03:09,279 --> 24:03:12,872
there we're going to find our line and
32296
24:03:11,440 --> 24:03:15,360
we're going to say that this is going to
32297
24:03:12,872 --> 24:03:19,279
give us a compiler error so let's say
32298
24:03:15,360 --> 24:03:21,759
that and we can't even access the age
32299
24:03:19,279 --> 24:03:24,232
and the address member variables the age
32300
24:03:21,759 --> 24:03:27,679
is also going to be private to engineer
32301
24:03:24,232 --> 24:03:28,720
but the address is private to the base
32302
24:03:28,720 --> 24:03:32,639
so that's not going to work either so we
32303
24:03:30,960 --> 24:03:35,760
can't really access that from the
32304
24:03:32,639 --> 24:03:38,080
outside because it is now private to the
32305
24:03:35,759 --> 24:03:40,080
engineer class so let's go down and
32306
24:03:38,080 --> 24:03:43,919
really show you that we're going to go
32307
24:03:40,080 --> 24:03:45,680
down and say engineer one and say mh if
32308
24:03:43,919 --> 24:03:47,512
we try to do that that's not going to
32309
24:03:45,679 --> 24:03:49,279
work that's going to give us a compiler
32310
24:03:47,512 --> 24:03:51,919
error and if we try to build we're going
32311
24:03:49,279 --> 24:03:54,399
to get a compiler error along the same
32312
24:03:51,919 --> 24:03:56,319
lines as what we just got here
32313
24:03:54,399 --> 24:03:58,231
the book is going to finish with errors
32314
24:03:56,320 --> 24:04:00,800
and if we look at our error we're going
32315
24:03:58,232 --> 24:04:04,720
to see that mh is protected within this
32316
24:04:00,800 --> 24:04:07,360
context so we can't use it at line 28 of
32317
24:04:04,720 --> 24:04:09,512
the main cpp file this is going to give
32318
24:04:07,360 --> 24:04:12,160
us a compiler error let's do that we're
32319
24:04:09,512 --> 24:04:15,440
going to say that here and if we try and
32320
24:04:12,160 --> 24:04:17,600
access the m address member variable
32321
24:04:15,440 --> 24:04:21,040
that's not also going to work because
32322
24:04:17,600 --> 24:04:23,192
this is even more restricted for access
32323
24:04:21,039 --> 24:04:25,191
it is private to the base class so we
32324
24:04:23,191 --> 24:04:27,440
can't access it from a derived class
32325
24:04:25,191 --> 24:04:29,191
directly we can't even access that from
32326
24:04:27,440 --> 24:04:31,919
the outside so you should really know
32327
24:04:29,191 --> 24:04:33,919
this so if we put in some junk data here
32328
24:04:31,919 --> 24:04:36,872
and try to build this is going to give
32329
24:04:33,919 --> 24:04:40,319
us a compiler error that says that this
32330
24:04:36,872 --> 24:04:43,279
is not accessible from the main cpp file
32331
24:04:40,320 --> 24:04:45,360
like we are trying to do on line 29 here
32332
24:04:43,279 --> 24:04:47,279
so we're going to get an error and the
32333
24:04:45,360 --> 24:04:50,000
error is going to say m address is
32334
24:04:47,279 --> 24:04:53,679
private within this context and the
32335
24:04:50,000 --> 24:04:55,279
offending line is at 29 of the main cpp
32336
24:04:53,679 --> 24:04:56,719
file we're going to take this out and
32337
24:04:55,279 --> 24:04:58,639
we're going to say that this is going to
32338
24:04:56,720 --> 24:05:01,119
give us a compiler error this is really
32339
24:04:58,639 --> 24:05:03,360
all i wanted you to see in this lecture
32340
24:05:01,119 --> 24:05:05,831
and before we wrap this up let's try and
32341
24:05:03,360 --> 24:05:08,720
build again and make the error go away
32342
24:05:05,831 --> 24:05:11,119
because i don't like to leave you with
32343
24:05:08,720 --> 24:05:13,759
code that has compiler errors and the
32344
24:05:11,119 --> 24:05:16,231
book is good and this is really all i
32345
24:05:13,759 --> 24:05:19,039
wanted you to see in this lecture that
32346
24:05:16,232 --> 24:05:21,440
you can do all kinds of inheritances in
32347
24:05:19,039 --> 24:05:23,191
your c plus plus code you can do public
32348
24:05:21,440 --> 24:05:25,191
inheritance you can do protected
32349
24:05:23,191 --> 24:05:27,360
inheritance you can do private
32350
24:05:25,191 --> 24:05:29,831
inheritance and we had a chance to look
32351
24:05:27,360 --> 24:05:32,639
at all these scenarios in this lecture
32352
24:05:29,831 --> 24:05:35,439
here the message is the same as we saw
32353
24:05:32,639 --> 24:05:37,831
in the last lecture if you do public
32354
24:05:35,440 --> 24:05:40,551
inheritance anything that is public in
32355
24:05:37,831 --> 24:05:42,551
the base class is going to stay public
32356
24:05:40,551 --> 24:05:44,720
in the derived class anything that is
32357
24:05:42,551 --> 24:05:46,319
protected is going to stay protected
32358
24:05:44,720 --> 24:05:49,040
anything that is private is going to
32359
24:05:46,320 --> 24:05:52,080
stay private and this is really
32360
24:05:49,039 --> 24:05:54,159
misleading in a way the private data
32361
24:05:52,080 --> 24:05:56,800
from the base class is not going to be
32362
24:05:54,160 --> 24:06:00,800
private to the derived class it's going
32363
24:05:56,800 --> 24:06:03,360
to stay private to the base class so if
32364
24:06:00,800 --> 24:06:04,639
you try to use this in any way from the
32365
24:06:03,360 --> 24:06:07,039
derived class you're going to get
32366
24:06:04,639 --> 24:06:10,160
compiler errors because you can't access
32367
24:06:07,039 --> 24:06:12,719
that even if it is part of you player
32368
24:06:10,160 --> 24:06:15,192
has a person part of it but it can't
32369
24:06:12,720 --> 24:06:17,279
access private members from the base
32370
24:06:15,191 --> 24:06:19,512
class you should really know this we
32371
24:06:17,279 --> 24:06:21,039
have seen that we can also do protected
32372
24:06:19,512 --> 24:06:23,279
inheritance and that's going to
32373
24:06:23,279 --> 24:06:28,232
the highest level of access to be
32374
24:06:25,679 --> 24:06:30,551
protected so anything that is public is
32375
24:06:28,232 --> 24:06:33,120
going to be stripped down to protected
32376
24:06:30,551 --> 24:06:35,440
access anything that is protected is
32377
24:06:33,119 --> 24:06:38,080
going to stay protected anything that is
32378
24:06:35,440 --> 24:06:40,639
private is going to be private to the
32379
24:06:38,080 --> 24:06:42,639
base class you should really make this
32380
24:06:40,639 --> 24:06:45,039
super clear we can also do private
32381
24:06:42,639 --> 24:06:47,919
inheritance as we saw and this is going
32382
24:06:45,039 --> 24:06:50,479
to strip down the highest level access
32383
24:06:47,919 --> 24:06:52,959
to be private so anything that is public
32384
24:06:50,479 --> 24:06:54,872
is going to be constrained to be private
32385
24:06:52,960 --> 24:06:57,832
anything that is protected is going to
32386
24:06:54,872 --> 24:07:00,400
be inherited as protected to the player
32387
24:06:57,831 --> 24:07:03,119
class but anything that was private in
32388
24:07:00,399 --> 24:07:05,679
the base class is going to stay private
32389
24:07:03,119 --> 24:07:07,919
to the base class even the player class
32390
24:07:05,679 --> 24:07:10,639
won't have access to this member
32391
24:07:07,919 --> 24:07:12,872
directly if we really need access to
32392
24:07:10,639 --> 24:07:15,039
private data from the base class we
32393
24:07:12,872 --> 24:07:17,512
might go through public getters or
32394
24:07:15,039 --> 24:07:20,319
anything we get from the base class but
32395
24:07:17,512 --> 24:07:22,400
we can't access m3 directly and use it
32396
24:07:20,320 --> 24:07:24,640
from the derived class that's going to
32397
24:07:22,399 --> 24:07:26,799
give us a compiler error this is really
32398
24:07:24,639 --> 24:07:29,191
all i wanted you to see in this lecture
32399
24:07:26,800 --> 24:07:31,279
and i hope you find this interesting we
32400
24:07:29,191 --> 24:07:32,871
are going to stop here in this lecture
32401
24:07:31,279 --> 24:07:36,160
in the next one we're going to try and
32402
24:07:32,872 --> 24:07:38,160
zoom in on private inheritance and show
32403
24:07:36,160 --> 24:07:39,440
you some things you really need to be
32404
24:07:39,440 --> 24:07:42,479
so go ahead and finish up here and meet
32405
24:07:42,479 --> 24:07:47,119
in this lecture we're going to zoom in
32406
24:07:44,399 --> 24:07:49,039
on private inheritance and we're going
32407
24:07:47,119 --> 24:07:52,399
to see that the class that does a
32408
24:07:49,039 --> 24:07:54,551
private inheritance is really selfish
32409
24:07:52,399 --> 24:07:56,551
here is a simple structure we will be
32410
24:07:54,551 --> 24:07:58,720
using in this lecture here we will set
32411
24:07:56,551 --> 24:08:01,512
up a person class which is going to act
32412
24:07:58,720 --> 24:08:04,080
as our base class we are going to
32413
24:08:01,512 --> 24:08:06,400
inherit from this class privately and
32414
24:08:06,399 --> 24:08:12,000
and what this is going to do it's going
32415
24:08:08,399 --> 24:08:15,039
to take everything from the class person
32416
24:08:12,000 --> 24:08:17,919
and make it private to the engineer
32417
24:08:15,039 --> 24:08:20,231
class so the m1 member variable which
32418
24:08:17,919 --> 24:08:22,959
was public in the base class is going to
32419
24:08:20,232 --> 24:08:25,919
be private to the engineer class this is
32420
24:08:22,960 --> 24:08:28,080
what we have here the m2 member variable
32421
24:08:25,919 --> 24:08:31,191
which was protected is going to become a
32422
24:08:28,080 --> 24:08:32,080
private in engineer that's what we have
32423
24:08:32,080 --> 24:08:37,600
and the m3 member variable which was
32424
24:08:34,399 --> 24:08:40,871
private to person class is going to stay
32425
24:08:37,600 --> 24:08:43,120
private to person in the eyes of
32426
24:08:40,872 --> 24:08:45,279
engineer this is the situation we have
32427
24:08:43,119 --> 24:08:48,231
here so the problem is going to really
32428
24:08:45,279 --> 24:08:52,800
show up when somebody else tries to
32429
24:08:48,232 --> 24:08:55,832
inherit from engineer because m1 and m2
32430
24:08:52,800 --> 24:08:59,512
are now private to engineer they will be
32431
24:08:55,831 --> 24:09:03,119
inherited but still inaccessible to the
32432
24:08:59,512 --> 24:09:07,191
civil engineer class here m1 and m2 will
32433
24:09:03,119 --> 24:09:10,319
be private to the engineer class but m3
32434
24:09:07,191 --> 24:09:12,871
will be private to the base class which
32435
24:09:10,320 --> 24:09:15,512
is person so hopefully you can see the
32436
24:09:12,872 --> 24:09:16,551
message that if a member variable is
32437
24:09:16,551 --> 24:09:21,039
it can't be inherited in any way it
32438
24:09:19,119 --> 24:09:23,679
doesn't matter which kind of inheritance
32439
24:09:21,039 --> 24:09:28,399
you do so starting from engineer which
32440
24:09:23,679 --> 24:09:31,039
has made m1 and m2 private to itself
32441
24:09:28,399 --> 24:09:34,720
it's no longer possible to forward these
32442
24:09:31,039 --> 24:09:36,551
guys down in the inheritance hierarchy
32443
24:09:34,720 --> 24:09:38,399
another way to look at this is to see
32444
24:09:36,551 --> 24:09:41,440
that the engineer class is really
32445
24:09:38,399 --> 24:09:43,759
selfish it is saying i am going to take
32446
24:09:41,440 --> 24:09:46,232
everything i can get from my parent
32447
24:09:46,232 --> 24:09:51,120
inheriting privately but nobody else
32448
24:09:49,191 --> 24:09:52,959
will be able to take things from me
32449
24:09:51,119 --> 24:09:55,831
because i'm going to make them private
32450
24:09:52,960 --> 24:09:58,320
to myself so even if civil engineer is
32451
24:09:58,320 --> 24:10:03,600
that's not going to give him any access
32452
24:10:00,800 --> 24:10:06,160
to these member variables which are now
32453
24:10:03,600 --> 24:10:08,960
private to the engineer class hopefully
32454
24:10:06,160 --> 24:10:12,000
you can really see this and private
32455
24:10:08,960 --> 24:10:14,960
inheritance is going to really constrain
32456
24:10:12,000 --> 24:10:17,279
what you can forward down to other
32457
24:10:14,960 --> 24:10:19,832
classes that are going to be inheriting
32458
24:10:17,279 --> 24:10:22,720
from you this is the message i am trying
32459
24:10:19,831 --> 24:10:25,191
to convey here okay so here is the same
32460
24:10:22,720 --> 24:10:27,360
example in code we have our person class
32461
24:10:25,191 --> 24:10:29,440
it's going to have our member variables
32462
24:10:27,360 --> 24:10:31,600
we're going to have the full name the
32463
24:10:29,440 --> 24:10:35,040
age and the address they are going to
32464
24:10:31,600 --> 24:10:37,600
have public protected and private access
32465
24:10:35,039 --> 24:10:40,159
we are going to inherit from person and
32466
24:10:37,600 --> 24:10:42,800
create our engineer class we are going
32467
24:10:40,160 --> 24:10:45,279
to privately inherit from person and
32468
24:10:42,800 --> 24:10:48,960
this is going to take everything we get
32469
24:10:45,279 --> 24:10:51,512
from person and make it private to the
32470
24:10:48,960 --> 24:10:52,800
engineer class and one exception is
32471
24:10:52,800 --> 24:10:57,600
what was already private to the base
32472
24:10:55,440 --> 24:11:00,080
class which is our person class here
32473
24:10:57,600 --> 24:11:03,040
this is going to still stay private to
32474
24:11:00,080 --> 24:11:05,919
the person class regardless of what kind
32475
24:11:03,039 --> 24:11:08,000
of inheritance you do from person but
32476
24:11:05,919 --> 24:11:10,639
any other thing if we have any member
32477
24:11:08,000 --> 24:11:12,872
variable which are public or protected
32478
24:11:10,639 --> 24:11:15,831
or even if we have some member functions
32479
24:11:12,872 --> 24:11:18,479
which are public or protected everything
32480
24:11:15,831 --> 24:11:20,959
is going to be private to the engineer
32481
24:11:18,479 --> 24:11:24,399
class because we have done private
32482
24:11:20,960 --> 24:11:27,360
inheritance here so if we inherit from
32483
24:11:24,399 --> 24:11:30,479
engineer and do any kind of inheritance
32484
24:11:27,360 --> 24:11:32,479
we are going to do the most relaxed kind
32485
24:11:30,479 --> 24:11:35,119
of inheritance which is going to keep
32486
24:11:32,479 --> 24:11:37,599
the kind of access we had in the base
32487
24:11:35,119 --> 24:11:40,159
class but this is not going to improve
32488
24:11:37,600 --> 24:11:43,680
anything everything is going to stay
32489
24:11:40,160 --> 24:11:45,440
private to the engineer class and the
32490
24:11:43,679 --> 24:11:48,399
civil engineer is really not going to
32491
24:11:45,440 --> 24:11:50,720
have any access to any member variable
32492
24:11:48,399 --> 24:11:53,039
or member function that is inherited
32493
24:11:50,720 --> 24:11:54,720
from the engineer class and we are going
32494
24:11:53,039 --> 24:11:56,959
to see this in a minute when we hit
32495
24:11:56,960 --> 24:12:01,920
so again if a class is doing private
32496
24:11:59,679 --> 24:12:04,231
inheritance it's really another way to
32497
24:12:01,919 --> 24:12:07,039
say this class is selfish it's going to
32498
24:12:04,232 --> 24:12:09,279
take everything it can from the parent
32499
24:12:07,039 --> 24:12:12,319
class but it's not going to forward
32500
24:12:09,279 --> 24:12:14,720
nothing to downstream inheritance
32501
24:12:12,320 --> 24:12:17,760
classes and this is the setup i really
32502
24:12:14,720 --> 24:12:20,160
want you to understand here and only do
32503
24:12:17,759 --> 24:12:22,479
private inheritance when you want this
32504
24:12:20,160 --> 24:12:23,832
kind of behavior now that you know this
32505
24:12:22,479 --> 24:12:25,679
we're going to head over to visual
32506
24:12:23,831 --> 24:12:26,551
studio code and play with us a little
32507
24:12:26,551 --> 24:12:32,319
here we are in our working folder the
32508
24:12:29,279 --> 24:12:34,551
current project is closing in on private
32509
24:12:32,320 --> 24:12:37,680
inheritance we're going to zoom in on
32510
24:12:34,551 --> 24:12:40,080
this and really understand the effects
32511
24:12:37,679 --> 24:12:42,000
of doing private inheritance we're going
32512
24:12:40,080 --> 24:12:43,759
to grab the code from the previous
32513
24:12:42,000 --> 24:12:45,191
lecture and we're going to grab the
32514
24:12:46,399 --> 24:12:51,439
the person class these are going to be
32515
24:12:49,039 --> 24:12:54,231
our starting point here make sure you
32516
24:12:51,440 --> 24:12:56,639
grab the dot vs code folder if you are
32517
24:12:54,232 --> 24:12:58,639
using vs code with this course that's
32518
24:12:56,639 --> 24:13:01,600
going to give you the basic settings we
32519
24:12:58,639 --> 24:13:04,479
need to do our c plus plus program i am
32520
24:13:01,600 --> 24:13:07,832
going to copy these guys down and put
32521
24:13:04,479 --> 24:13:10,479
these in our current project and again
32522
24:13:07,831 --> 24:13:13,360
make sure you have the main cpp file the
32523
24:13:10,479 --> 24:13:15,512
person class and the engineer class and
32524
24:13:13,360 --> 24:13:17,119
these are going to be our starting point
32525
24:13:15,512 --> 24:13:19,191
so we're going to open this little guy
32526
24:13:17,119 --> 24:13:22,231
in visual studio code by dragging and
32527
24:13:19,191 --> 24:13:25,039
dropping here we're going to look at our
32528
24:13:22,232 --> 24:13:28,320
main cpp program we are not going to
32529
24:13:25,039 --> 24:13:29,759
include nurse because we don't have this
32530
24:13:29,759 --> 24:13:35,039
and we can really take out everything we
32531
24:13:32,479 --> 24:13:37,599
have in the main function we're going to
32532
24:13:35,039 --> 24:13:40,079
be adding our own thing here we also
32533
24:13:37,600 --> 24:13:42,320
don't need the player class here we're
32534
24:13:40,080 --> 24:13:45,040
just going to be using person and
32535
24:13:42,320 --> 24:13:46,960
engineer let's look at the person class
32536
24:13:45,039 --> 24:13:48,799
it is going to have the member variables
32537
24:13:48,800 --> 24:13:53,120
we are going to have a public member
32538
24:13:50,720 --> 24:13:55,831
variable the full name a protected
32539
24:13:53,119 --> 24:13:58,479
member variable mh and a private member
32540
24:13:55,831 --> 24:14:01,511
variable m address here we are going to
32541
24:13:58,479 --> 24:14:04,639
create an engineer class which is going
32542
24:14:01,512 --> 24:14:06,479
to privately inherit from person
32543
24:14:04,639 --> 24:14:09,191
so it is going to make everything
32544
24:14:06,479 --> 24:14:12,720
private to itself the engineer class is
32545
24:14:09,191 --> 24:14:15,679
going to have a person part in at but
32546
24:14:12,720 --> 24:14:17,831
the member variables we get from the
32547
24:14:15,679 --> 24:14:22,000
person class are going to be stripped
32548
24:14:17,831 --> 24:14:24,399
down to private access level except for
32549
24:14:22,000 --> 24:14:26,639
the member variables which are already
32550
24:14:24,399 --> 24:14:29,191
private in the base class and that
32551
24:14:26,639 --> 24:14:31,360
happens to be the address so it doesn't
32552
24:14:29,191 --> 24:14:33,599
matter which kind of inheritance you do
32553
24:14:31,360 --> 24:14:36,160
the m address member variable is going
32554
24:14:33,600 --> 24:14:38,552
to still be not accessible to
32555
24:14:36,160 --> 24:14:41,600
inheritance classes this is going to
32556
24:14:38,551 --> 24:14:44,479
still be private to the base class which
32557
24:14:41,600 --> 24:14:46,639
is the person class here so the
32558
24:14:44,479 --> 24:14:50,080
full name is going to be stripped down
32559
24:14:46,639 --> 24:14:52,160
to private access level in engineer the
32560
24:14:50,080 --> 24:14:54,960
edge is also going to be stripped down
32561
24:14:52,160 --> 24:14:58,639
to private access and these are going to
32562
24:14:54,960 --> 24:15:01,192
be private now to the engineer class and
32563
24:14:58,639 --> 24:15:03,831
any class that tries to inherit from
32564
24:15:01,191 --> 24:15:06,720
engineer is not going to have access to
32565
24:15:03,831 --> 24:15:08,551
these guys so if we do any kind of
32566
24:15:06,720 --> 24:15:10,551
inheritance from engineer we want to
32567
24:15:08,551 --> 24:15:12,800
have access to full name we want to have
32568
24:15:10,551 --> 24:15:16,000
access to mh because these are going to
32569
24:15:12,800 --> 24:15:18,160
be private to this class here this is
32570
24:15:16,000 --> 24:15:20,320
the setup we want to understand in this
32571
24:15:18,160 --> 24:15:22,000
lecture so what we're going to do we're
32572
24:15:20,320 --> 24:15:25,120
going to set up a new class which is
32573
24:15:22,000 --> 24:15:28,000
going to inherit from our engineer class
32574
24:15:25,119 --> 24:15:29,759
and it is going to do public inheritance
32575
24:15:28,000 --> 24:15:31,679
and we're going to see how this works
32576
24:15:29,759 --> 24:15:33,439
we're going to create a civil engineer
32577
24:15:31,679 --> 24:15:35,511
class which is going to inherit from
32578
24:15:33,440 --> 24:15:37,680
engineer so let's do this we're going to
32579
24:15:35,512 --> 24:15:40,000
create a header file for our civil
32580
24:15:37,679 --> 24:15:41,919
engineer class and we're going to create
32581
24:15:41,919 --> 24:15:46,479
we are going to head over in our header
32582
24:15:44,399 --> 24:15:49,439
file and put in the class it's not going
32583
24:15:46,479 --> 24:15:51,440
to be anything sophisticated we're just
32584
24:15:49,440 --> 24:15:53,440
going to have in our include guard we're
32585
24:15:51,440 --> 24:15:55,600
going to create a civil engineer class
32586
24:15:53,440 --> 24:15:58,232
which is going to publicly inherit from
32587
24:15:55,600 --> 24:16:01,192
engineer but remember everything was
32588
24:15:58,232 --> 24:16:03,832
made private to the engineer class so
32589
24:16:01,191 --> 24:16:05,759
even if we're doing public inheritance
32590
24:16:03,831 --> 24:16:08,080
the full name member variable is going
32591
24:16:05,759 --> 24:16:10,080
to be private to engineer the age is
32592
24:16:08,080 --> 24:16:12,479
going to be private to engineer and
32593
24:16:10,080 --> 24:16:14,872
engineer won't have any access to these
32594
24:16:12,479 --> 24:16:17,360
guys but before we really play with that
32595
24:16:14,872 --> 24:16:19,040
we're going to put in our implementation
32596
24:16:19,039 --> 24:16:24,079
so let's put in the code here we're
32597
24:16:21,279 --> 24:16:26,232
going to put in the implementation and
32598
24:16:24,080 --> 24:16:29,191
we're going to have our constructor in
32599
24:16:26,232 --> 24:16:32,480
place but notice what happens on our
32600
24:16:29,191 --> 24:16:35,512
output stream operator the output stream
32601
24:16:32,479 --> 24:16:38,159
operator is a friend of the civil
32602
24:16:35,512 --> 24:16:40,639
engineer class so it should have access
32603
24:16:38,160 --> 24:16:43,120
to anything we have in our civil
32604
24:16:40,639 --> 24:16:44,399
engineer class but notice what is
32605
24:16:44,399 --> 24:16:49,919
the get full name method is not working
32606
24:16:49,919 --> 24:16:54,800
private to the upstream class which
32607
24:16:54,800 --> 24:16:59,512
our engineer class and we can't really
32608
24:16:57,191 --> 24:17:02,720
access them even if we know that they
32609
24:16:59,512 --> 24:17:04,960
are really part of the interface of the
32610
24:17:02,720 --> 24:17:08,232
person class we have them as public
32611
24:17:04,960 --> 24:17:11,440
members of the person class but when the
32612
24:17:08,232 --> 24:17:14,552
engineer class did private inheritance
32613
24:17:11,440 --> 24:17:17,919
it made everything that is not private
32614
24:17:14,551 --> 24:17:20,319
to person private to itself so these
32615
24:17:17,919 --> 24:17:23,360
gators are going to be private to
32616
24:17:20,320 --> 24:17:25,760
engineer when the engineer does private
32617
24:17:23,360 --> 24:17:27,759
inheritance the member variables which
32618
24:17:25,759 --> 24:17:30,231
are public and protected all these
32619
24:17:27,759 --> 24:17:32,959
things are going to be stripped down to
32620
24:17:30,232 --> 24:17:35,832
private access level so they are going
32621
24:17:32,960 --> 24:17:37,832
to be private to engineer and any kind
32622
24:17:35,831 --> 24:17:39,919
of inheritance you're going to do is not
32623
24:17:37,831 --> 24:17:42,720
going to change that they are going to
32624
24:17:39,919 --> 24:17:45,512
be inherited as private to the engineer
32625
24:17:42,720 --> 24:17:48,720
class that's why we can't even call them
32626
24:17:45,512 --> 24:17:51,600
from a function which is a friend of our
32627
24:17:48,720 --> 24:17:53,279
civil engineer class and we know that if
32628
24:17:51,600 --> 24:17:55,680
you mark something as a friend it's
32629
24:17:53,279 --> 24:17:58,551
really going to have access to anything
32630
24:17:55,679 --> 24:18:01,599
you have including private members but
32631
24:17:58,551 --> 24:18:03,679
we can't call any of the members from
32632
24:18:01,600 --> 24:18:06,000
the engineer class because everything is
32633
24:18:03,679 --> 24:18:08,000
now private to the engineer class this
32634
24:18:06,000 --> 24:18:10,000
is what i want you to see if you do
32635
24:18:08,000 --> 24:18:11,831
private inheritance this is going to
32636
24:18:11,831 --> 24:18:16,959
anything from the upstream class and
32637
24:18:14,479 --> 24:18:18,872
make that private to the class that is
32638
24:18:16,960 --> 24:18:22,000
doing private inheritance this is the
32639
24:18:18,872 --> 24:18:24,320
message here and again if you go in any
32640
24:18:22,000 --> 24:18:27,279
method of the civil engineer class and
32641
24:18:24,320 --> 24:18:29,360
try to do any kind of access for example
32642
24:18:29,360 --> 24:18:34,000
method is not going to board well we're
32643
24:18:32,080 --> 24:18:37,440
going to see that this is inaccessible
32644
24:18:34,000 --> 24:18:39,600
here if we try to access m full name
32645
24:18:37,440 --> 24:18:41,680
for example change this to be something
32646
24:18:41,679 --> 24:18:46,079
gray this is not going to work if you
32647
24:18:46,080 --> 24:18:50,639
and change it to 45 for example this is
32648
24:18:48,551 --> 24:18:52,872
not going to work we already know that
32649
24:18:50,639 --> 24:18:54,479
the address is private to person so we
32650
24:18:52,872 --> 24:18:58,160
shouldn't really try to access it
32651
24:18:54,479 --> 24:19:00,959
because it is inaccessible regardless of
32652
24:18:58,160 --> 24:19:03,192
any kind of inheritance you do but the
32653
24:19:00,960 --> 24:19:06,080
members that were public from person
32654
24:19:03,191 --> 24:19:09,440
can't be accessed from any class that is
32655
24:19:06,080 --> 24:19:11,279
inheriting from person even if we know
32656
24:19:09,440 --> 24:19:13,760
that these things are public or
32657
24:19:11,279 --> 24:19:15,919
protected in the person class
32658
24:19:13,759 --> 24:19:18,720
and this is really what i want you to
32659
24:19:15,919 --> 24:19:20,319
see if we try and build our program
32660
24:19:18,720 --> 24:19:22,872
we're going to get a bunch of compiler
32661
24:19:20,320 --> 24:19:23,760
errors saying that we can't access these
32662
24:19:23,759 --> 24:19:29,119
from our civil engineer class we are
32663
24:19:26,960 --> 24:19:31,040
going to use the gcc compiler here
32664
24:19:29,119 --> 24:19:33,279
because it is our favorite and we're
32665
24:19:31,039 --> 24:19:35,831
going to see our compiler errors here
32666
24:19:33,279 --> 24:19:39,360
okay so we're going to get a bunch of
32667
24:19:35,831 --> 24:19:41,279
errors let's go up and see all of them
32668
24:19:39,360 --> 24:19:44,831
we're going to get an error saying that
32669
24:19:41,279 --> 24:19:48,800
getfullname is inaccessible within the
32670
24:19:44,831 --> 24:19:51,759
context of the c4 engineer header class
32671
24:19:48,800 --> 24:19:54,960
at line 13 we are calling this method
32672
24:19:51,759 --> 24:19:57,679
that's not going to work we have another
32673
24:19:54,960 --> 24:20:01,040
error here saying that the getfullname
32674
24:19:57,679 --> 24:20:03,191
method is not accessible from line 13 of
32675
24:20:03,191 --> 24:20:07,831
okay it is really the same error but if
32676
24:20:05,600 --> 24:20:10,800
we go down we see that we get a bunch of
32677
24:20:07,831 --> 24:20:13,831
other errors we have m full name which
32678
24:20:10,800 --> 24:20:16,232
is not accessible we have m edge which
32679
24:20:13,831 --> 24:20:18,871
is not accessible we can't really do
32680
24:20:16,232 --> 24:20:20,872
these kinds of things from the civil
32681
24:20:18,872 --> 24:20:23,512
engineer class because all these are
32682
24:20:20,872 --> 24:20:26,960
going to become private to the upstream
32683
24:20:23,512 --> 24:20:29,119
class that did private inheritance so
32684
24:20:29,119 --> 24:20:34,871
show you that even if we can't access
32685
24:20:32,000 --> 24:20:36,551
these guys they are still part of our
32686
24:20:34,872 --> 24:20:39,279
civil engineer class and we're going to
32687
24:20:36,551 --> 24:20:41,831
use a debugger to do that i am going to
32688
24:20:39,279 --> 24:20:44,160
take out these things or i can comment
32689
24:20:41,831 --> 24:20:46,159
them out and say that they are going to
32690
24:20:44,160 --> 24:20:48,160
give you compiler errors i think this is
32691
24:20:46,160 --> 24:20:49,760
going to be more descriptive so let's
32692
24:20:49,759 --> 24:20:54,399
and access to the edge is also going to
32693
24:20:52,000 --> 24:20:56,872
give you a compiler error and we're
32694
24:20:54,399 --> 24:20:59,119
going to go down and show you that we're
32695
24:20:56,872 --> 24:21:01,760
also going to have the same problem in
32696
24:20:59,119 --> 24:21:04,231
our output stream operator so if you
32697
24:21:01,759 --> 24:21:07,360
really want your output stream operator
32698
24:21:04,232 --> 24:21:09,192
to work here what you can do is put some
32699
24:21:09,191 --> 24:21:15,119
in the engineer class and make it give
32700
24:21:12,080 --> 24:21:18,232
you access to the members that were
32701
24:21:15,119 --> 24:21:20,399
eclipsed to private access in this class
32702
24:21:18,232 --> 24:21:22,160
here for example you can return the full
32703
24:21:20,399 --> 24:21:24,399
name you see that we can access that
32704
24:21:22,160 --> 24:21:27,040
here you can return the age but you
32705
24:21:24,399 --> 24:21:29,511
still don't have access to the m address
32706
24:21:27,039 --> 24:21:32,000
member variable because this is private
32707
24:21:29,512 --> 24:21:34,232
to the person class but i really don't
32708
24:21:32,000 --> 24:21:35,831
even want to do this because doing this
32709
24:21:35,831 --> 24:21:41,599
is sign of bad design in the first place
32710
24:21:39,039 --> 24:21:44,000
so if you need to do those kinds of
32711
24:21:41,600 --> 24:21:46,872
getters and forward them down to
32712
24:21:44,000 --> 24:21:49,600
inheritance classes why not change the
32713
24:21:46,872 --> 24:21:52,080
design in the first place and not to do
32714
24:21:49,600 --> 24:21:54,480
private inheritance here for example if
32715
24:21:52,080 --> 24:21:57,600
you change this inheritance to protected
32716
24:21:54,479 --> 24:22:00,959
or public these members are going to be
32717
24:21:57,600 --> 24:22:04,080
directly automatically forwarded down to
32718
24:22:00,960 --> 24:22:06,960
any inheritance class so just know that
32719
24:22:04,080 --> 24:22:09,279
you can put in public getters that are
32720
24:22:06,960 --> 24:22:11,680
going to give access to the full name
32721
24:22:09,279 --> 24:22:14,639
and age but you still want to be able to
32722
24:22:14,639 --> 24:22:19,831
from the inheritance class because this
32723
24:22:17,119 --> 24:22:22,080
is the design you achieve by marking
32724
24:22:19,831 --> 24:22:24,159
something as private in the base class
32725
24:22:22,080 --> 24:22:26,551
if you want the address to be forwarded
32726
24:22:24,160 --> 24:22:28,872
down you might change the access level
32727
24:22:26,551 --> 24:22:31,440
we have here and maybe make it protected
32728
24:22:28,872 --> 24:22:33,919
or public so this is the ideas i really
32729
24:22:31,440 --> 24:22:36,551
want you to grasp i am going to comment
32730
24:22:33,919 --> 24:22:38,160
out the offending code here because i
32731
24:22:36,551 --> 24:22:41,039
want you to be able to build this
32732
24:22:38,160 --> 24:22:43,832
program and see that even if we can't
32733
24:22:41,039 --> 24:22:46,799
access this get full name and get
32734
24:22:43,831 --> 24:22:49,831
address members from inheriting classes
32735
24:22:46,800 --> 24:22:52,400
they are still part of our interface we
32736
24:22:49,831 --> 24:22:55,039
just can't have access to them because
32737
24:22:52,399 --> 24:22:57,759
of the choices we have made in upstream
32738
24:22:55,039 --> 24:23:00,551
classes so what i am going to do i am
32739
24:22:57,759 --> 24:23:03,831
going to go in my main cpp file and i am
32740
24:23:00,551 --> 24:23:06,720
going to create an engineer object
32741
24:23:03,831 --> 24:23:09,279
i will also include civil engineer here
32742
24:23:06,720 --> 24:23:12,000
let's do that and i am going to create
32743
24:23:09,279 --> 24:23:14,720
an engineer object and i am going to
32744
24:23:12,000 --> 24:23:18,639
create a civil engineer object
32745
24:23:14,720 --> 24:23:20,639
and i am going to just say done here and
32746
24:23:18,639 --> 24:23:23,039
i am going to put the break point on
32747
24:23:20,639 --> 24:23:24,232
line 12. we are going to use a debugger
32748
24:23:24,232 --> 24:23:29,360
that engineer objects and the civil
32749
24:23:29,360 --> 24:23:34,639
still have a person part of them we just
32750
24:23:32,232 --> 24:23:37,832
can't access the interface that was
32751
24:23:34,639 --> 24:23:41,279
eclipsed by the engineer class so we are
32752
24:23:37,831 --> 24:23:43,119
going to hit the run tab here
32753
24:23:43,119 --> 24:23:47,759
start our debugging session by clicking
32754
24:23:47,759 --> 24:23:52,231
we are going to build our program and if
32755
24:23:50,232 --> 24:23:55,120
the build is good we're going to plug
32756
24:23:52,232 --> 24:23:57,512
the binary that was generated into our
32757
24:23:55,119 --> 24:24:00,080
debugger and we are going to hit our
32758
24:23:57,512 --> 24:24:02,551
break point in a minute once we hit our
32759
24:24:00,080 --> 24:24:04,400
break point we are going to look at the
32760
24:24:02,551 --> 24:24:06,399
local variables we have in the main
32761
24:24:04,399 --> 24:24:09,039
function we're going to see them on the
32762
24:24:06,399 --> 24:24:12,231
left here if we expand we're going to
32763
24:24:09,039 --> 24:24:14,639
see that we have an engineer one object
32764
24:24:12,232 --> 24:24:17,192
and we have a civil engineer one object
32765
24:24:14,639 --> 24:24:19,512
if we look at our engineer we're going
32766
24:24:17,191 --> 24:24:22,959
to see that we have a person part of
32767
24:24:19,512 --> 24:24:25,040
this which is our base class and if we
32768
24:24:22,960 --> 24:24:29,440
look at civil engineer it's also going
32769
24:24:25,039 --> 24:24:32,479
to have a base of engineer so any civil
32770
24:24:29,440 --> 24:24:34,872
engineer is also going to be an engineer
32771
24:24:32,479 --> 24:24:38,551
but the engineer part of the civil
32772
24:24:34,872 --> 24:24:40,720
engineer also has a person part of that
32773
24:24:38,551 --> 24:24:42,551
you should really see this information
32774
24:24:40,720 --> 24:24:45,191
and the main message i want to convey
32775
24:24:42,551 --> 24:24:48,159
here is that all these objects have a
32776
24:24:45,191 --> 24:24:51,599
person part of them we just can't access
32777
24:24:48,160 --> 24:24:54,552
that part in objects of our inheritance
32778
24:24:51,600 --> 24:24:57,279
classes because of the design decisions
32779
24:24:54,551 --> 24:24:59,599
we have made let's close this off now
32780
24:24:57,279 --> 24:25:01,919
that you have seen this and again
32781
24:25:01,919 --> 24:25:05,759
inheritance hierarchy the base class is
32782
24:25:05,759 --> 24:25:08,479
and it's going to have these member
32783
24:25:08,479 --> 24:25:13,191
but if we do private inheritance from
32784
24:25:10,960 --> 24:25:16,480
the person class anything that is not
32785
24:25:13,191 --> 24:25:19,512
public is going to be eclipsed down to
32786
24:25:16,479 --> 24:25:21,679
private level access so any other class
32787
24:25:19,512 --> 24:25:24,160
that is going to inherit from our
32788
24:25:21,679 --> 24:25:26,551
engineer class now is not going to have
32789
24:25:24,160 --> 24:25:29,040
direct access to these members because
32790
24:25:26,551 --> 24:25:31,831
they are going to become private to this
32791
24:25:29,039 --> 24:25:33,679
class here and that's the experience we
32792
24:25:33,679 --> 24:25:38,479
use any of this methods and members we
32793
24:25:38,479 --> 24:25:41,759
this is not going to work because they
32794
24:25:41,759 --> 24:25:46,080
private to the engineer class this is
32795
24:25:43,600 --> 24:25:47,440
the message here so the get full name
32796
24:25:47,440 --> 24:25:52,872
methods are not going to work if we try
32797
24:25:50,232 --> 24:25:55,040
to use the contract count member which
32798
24:25:52,872 --> 24:25:57,440
comes from the engineer class that's not
32799
24:25:55,039 --> 24:25:59,119
also going to work if we look in our
32800
24:25:57,440 --> 24:26:00,551
header and try to use any of these
32801
24:25:59,119 --> 24:26:02,799
members we're going to get compiler
32802
24:26:00,551 --> 24:26:05,440
errors because all these guys are now
32803
24:26:02,800 --> 24:26:07,512
private to the engineer class this is
32804
24:26:05,440 --> 24:26:10,080
really all i wanted to share in this
32805
24:26:07,512 --> 24:26:12,320
lecture let's head over to the cpp file
32806
24:26:10,080 --> 24:26:14,479
and comment this out again because i
32807
24:26:12,320 --> 24:26:16,640
don't want to leave you with these
32808
24:26:14,479 --> 24:26:19,279
compiler errors i hope you found this
32809
24:26:19,279 --> 24:26:23,360
we are going to stop here in this one in
32810
24:26:21,679 --> 24:26:26,551
the next one we're going to see that we
32811
24:26:23,360 --> 24:26:27,759
can actually resurrect some members back
32812
24:26:27,759 --> 24:26:32,720
if they were eclipsed by the kind of
32813
24:26:30,160 --> 24:26:33,760
inheritance we did from an upstream
32814
24:26:33,759 --> 24:26:37,439
go ahead and finish up here and meet me
32815
24:26:37,440 --> 24:26:42,160
in this lecture we're going to explore
32816
24:26:39,440 --> 24:26:44,960
how we can resurrect members back in
32817
24:26:42,160 --> 24:26:47,919
scope so what do we mean here suppose we
32818
24:26:44,960 --> 24:26:50,320
have our trusty inheritance tree here we
32819
24:26:47,919 --> 24:26:52,479
have a base class person the engineer
32820
24:26:50,320 --> 24:26:54,480
class is going to do private inheritance
32821
24:26:52,479 --> 24:26:55,440
and it's going to really be selfish and
32822
24:26:55,440 --> 24:27:00,639
i am going to take everything i can from
32823
24:26:57,600 --> 24:27:04,320
the upstream person class but i am going
32824
24:27:00,639 --> 24:27:06,960
to make everything my own and nobody
32825
24:27:04,320 --> 24:27:10,232
inherited from me will have access to
32826
24:27:06,960 --> 24:27:12,552
these guys for example m1 and m2 are
32827
24:27:10,232 --> 24:27:13,512
going to be private to the engineer
32828
24:27:13,512 --> 24:27:19,040
starting here when the engineer class
32829
24:27:16,320 --> 24:27:21,440
does private inheritance so any other
32830
24:27:19,039 --> 24:27:23,360
class for example civil engineer which
32831
24:27:23,360 --> 24:27:27,440
the engineer class in any way won't have
32832
24:27:27,440 --> 24:27:34,000
to the m1 and m2 member variables so
32833
24:27:31,279 --> 24:27:36,872
suppose for some reason that we have
32834
24:27:34,000 --> 24:27:40,000
this kind of setup here but again we
32835
24:27:36,872 --> 24:27:42,551
want some members to be accessible to
32836
24:27:42,551 --> 24:27:47,279
suppose for example we want the m1
32837
24:27:45,119 --> 24:27:50,159
member variable to still be accessible
32838
24:27:47,279 --> 24:27:52,639
to downstream classes while we have done
32839
24:27:50,160 --> 24:27:55,040
private inheritance c plus plus is
32840
24:27:52,639 --> 24:27:57,600
really weird in a way it is going to
32841
24:27:55,039 --> 24:28:00,000
work hard to really prevent you to do
32842
24:27:57,600 --> 24:28:01,832
thanks and that gives you a back door
32843
24:28:01,831 --> 24:28:06,399
allow the same thing you were trying to
32844
24:28:04,160 --> 24:28:08,872
avoid in the same place it is the same
32845
24:28:06,399 --> 24:28:11,831
kind of logic we have here it allows you
32846
24:28:08,872 --> 24:28:15,120
to use private inheritance to prevent
32847
24:28:11,831 --> 24:28:18,080
downstream classes to access to anything
32848
24:28:15,119 --> 24:28:20,159
you get from upstream classes but then
32849
24:28:18,080 --> 24:28:23,279
again it allows you to change that and
32850
24:28:20,160 --> 24:28:25,279
relax the access to downstream classes
32851
24:28:23,279 --> 24:28:29,279
for example we can change the access of
32852
24:28:25,279 --> 24:28:32,800
m1 and m2 make it more relaxed make it
32853
24:28:29,279 --> 24:28:35,119
public or protected if we wanted that so
32854
24:28:32,800 --> 24:28:36,872
let's take a look at some code because i
32855
24:28:35,119 --> 24:28:39,360
know that these things can really be
32856
24:28:36,872 --> 24:28:41,040
confusing okay we are going to start
32857
24:28:39,360 --> 24:28:43,512
from a person class which is going to
32858
24:28:41,039 --> 24:28:45,191
have a bunch of member variables we will
32859
24:28:43,512 --> 24:28:46,720
also have a bunch of getters that are
32860
24:28:45,191 --> 24:28:49,279
going to return all these member
32861
24:28:46,720 --> 24:28:52,872
variables and we are going to do private
32862
24:28:49,279 --> 24:28:56,080
inheritance from person in an engineer
32863
24:28:52,872 --> 24:28:58,800
class this is going to strip down access
32864
24:28:56,080 --> 24:28:59,680
to the members we get from person
32865
24:28:59,679 --> 24:29:04,551
private level access for example they
32866
24:29:02,399 --> 24:29:06,799
get full name member function the gate
32867
24:29:04,551 --> 24:29:09,831
age the gate address member functions
32868
24:29:09,831 --> 24:29:15,191
engineer class now but for some reason
32869
24:29:12,800 --> 24:29:18,720
you might want to resurrect them
32870
24:29:15,191 --> 24:29:21,599
to a more relaxed access level and you
32871
24:29:18,720 --> 24:29:23,360
do that using the using keyword so the
32872
24:29:21,600 --> 24:29:24,960
first thing you need to do is to choose
32873
24:29:23,360 --> 24:29:27,119
the section in which you're going to be
32874
24:29:24,960 --> 24:29:29,192
putting these using statements for
32875
24:29:27,119 --> 24:29:31,119
example because we put them in a
32876
24:29:31,119 --> 24:29:35,599
all these guys are going to be
32877
24:29:32,639 --> 24:29:38,399
resurrected with a nexus level of
32878
24:29:35,600 --> 24:29:40,552
protected if we put them in a public
32879
24:29:38,399 --> 24:29:43,759
section they are going to be resurrected
32880
24:29:40,551 --> 24:29:46,231
with a public access level and they are
32881
24:29:43,759 --> 24:29:48,799
going to be accessible from inheriting
32882
24:29:46,232 --> 24:29:51,040
classes one thing you should know is
32883
24:29:51,039 --> 24:29:56,959
something that is already private to an
32884
24:29:54,399 --> 24:29:58,871
upstream class for example we know that
32885
24:29:56,960 --> 24:30:01,440
our m address member variable was
32886
24:29:58,872 --> 24:30:04,232
private to the person class so we can't
32887
24:30:01,440 --> 24:30:06,080
really resurrect that in an inheritance
32888
24:30:04,232 --> 24:30:08,320
class if we do that we're going to get a
32889
24:30:06,080 --> 24:30:09,831
compiler error and hopefully this is
32890
24:30:08,320 --> 24:30:12,080
going to drive the point home that
32891
24:30:09,831 --> 24:30:14,551
private inheritance is really really
32892
24:30:12,080 --> 24:30:17,512
serious and that it's going to strip
32893
24:30:14,551 --> 24:30:20,639
down access to private level access in
32894
24:30:17,512 --> 24:30:23,040
an inheritance class and any downstream
32895
24:30:20,639 --> 24:30:26,232
inheritance class will never be able to
32896
24:30:23,039 --> 24:30:29,599
resurrect those member variables to a
32897
24:30:26,232 --> 24:30:32,320
more relaxed access level so because
32898
24:30:29,600 --> 24:30:35,279
everything here is inherited as private
32899
24:30:32,320 --> 24:30:37,192
by default any downstream inheriting
32900
24:30:35,279 --> 24:30:39,512
class will never be able to resurrect
32901
24:30:37,191 --> 24:30:42,000
these guys for example to public or
32902
24:30:39,512 --> 24:30:44,160
protected scope this is the message here
32903
24:30:42,000 --> 24:30:46,320
and you can use this kind of design if
32904
24:30:44,160 --> 24:30:48,000
you want that but personally i don't
32905
24:30:46,320 --> 24:30:50,160
like to do this because it's going to
32906
24:30:50,160 --> 24:30:55,512
hard to read and understand if you want
32907
24:30:52,960 --> 24:30:58,160
these guys to be public or protected why
32908
24:30:55,512 --> 24:31:00,232
not make them public or protected in the
32909
24:30:58,160 --> 24:31:03,040
first place and really not use private
32910
24:31:00,232 --> 24:31:05,360
inheritance that's going to be much more
32911
24:31:03,039 --> 24:31:07,831
direct to see and understand and your
32912
24:31:05,360 --> 24:31:10,232
code is going to be easier to work with
32913
24:31:07,831 --> 24:31:12,959
for you in the future or for some other
32914
24:31:10,232 --> 24:31:14,720
developers that will get to work on your
32915
24:31:12,960 --> 24:31:16,800
code in the future so this is the
32916
24:31:14,720 --> 24:31:18,800
message here you can use this feature to
32917
24:31:18,800 --> 24:31:24,872
to a relaxed access level and now that
32918
24:31:22,479 --> 24:31:27,039
you have an idea about this we're going
32919
24:31:24,872 --> 24:31:28,720
to head over to visual studio code and
32920
24:31:28,720 --> 24:31:33,831
here we are in our working folder the
32921
24:31:31,191 --> 24:31:36,159
current project is resurrecting members
32922
24:31:33,831 --> 24:31:38,399
back in context we are going to
32923
24:31:36,160 --> 24:31:40,320
completely reuse the code from the last
32924
24:31:38,399 --> 24:31:42,079
lecture because it's going to give us a
32925
24:31:40,320 --> 24:31:44,800
good starting point we can copy
32926
24:31:42,080 --> 24:31:47,831
everything except for the binary here we
32927
24:31:44,800 --> 24:31:50,232
don't need that in our current project
32928
24:31:47,831 --> 24:31:51,919
we're going to put in our starter code
32929
24:31:50,232 --> 24:31:54,160
and we're going to open this little guy
32930
24:31:51,919 --> 24:31:56,399
in visual studio code so we're going to
32931
24:31:54,160 --> 24:31:58,400
have our code we're going to have our
32932
24:31:56,399 --> 24:32:00,551
main function and we're going to have
32933
24:31:58,399 --> 24:32:02,231
all these objects created here i'm
32934
24:32:00,551 --> 24:32:04,720
really not sure if we're going to need
32935
24:32:02,232 --> 24:32:06,400
this yet so let's take this out and
32936
24:32:04,720 --> 24:32:08,639
we're going to look at our personal
32937
24:32:06,399 --> 24:32:11,119
class it is going to have our members
32938
24:32:08,639 --> 24:32:13,191
here and we are going to have a bunch of
32939
24:32:11,119 --> 24:32:15,119
getters which are going to be returning
32940
24:32:13,191 --> 24:32:16,871
these member variables and we have a
32941
24:32:15,119 --> 24:32:19,360
constructor here which is really going
32942
24:32:16,872 --> 24:32:21,832
to build a person object nothing
32943
24:32:19,360 --> 24:32:23,680
complicated here we have an engineer
32944
24:32:21,831 --> 24:32:26,551
class which is going to privately
32945
24:32:23,679 --> 24:32:29,439
inherit from person and we know that
32946
24:32:26,551 --> 24:32:32,639
this is going to eclipse everything that
32947
24:32:29,440 --> 24:32:35,360
is not private in the person class to
32948
24:32:32,639 --> 24:32:37,440
private level access so everything is
32949
24:32:35,360 --> 24:32:40,160
going to be private to the engineer
32950
24:32:37,440 --> 24:32:43,040
class now but sometimes we don't want to
32951
24:32:40,160 --> 24:32:45,360
do that for example if we go down in our
32952
24:32:46,960 --> 24:32:51,360
the get full name and the getage methods
32953
24:32:49,679 --> 24:32:53,679
are going to be private to the app
32954
24:32:51,360 --> 24:32:56,551
stream engineer class and that's going
32955
24:32:53,679 --> 24:32:58,719
to break the code for our output stream
32956
24:32:56,551 --> 24:33:00,800
operator and it's not going to work
32957
24:32:58,720 --> 24:33:03,440
because we want to have access to get
32958
24:33:00,800 --> 24:33:05,832
full name and get age and that's also
32959
24:33:03,440 --> 24:33:08,320
going to kill access we had on the get
32960
24:33:05,831 --> 24:33:11,360
address method which would give us
32961
24:33:08,320 --> 24:33:14,080
access to the address member that we
32962
24:33:11,360 --> 24:33:16,232
have in our person class let's make sure
32963
24:33:16,232 --> 24:33:20,400
i am confused here we have a lot of
32964
24:33:23,039 --> 24:33:27,279
it is down here so we have the get
32965
24:33:25,119 --> 24:33:29,679
address method which is going to return
32966
24:33:27,279 --> 24:33:32,639
the address we want to have access to
32967
24:33:29,679 --> 24:33:35,279
that in our civil engineer class to be
32968
24:33:32,639 --> 24:33:37,759
able to print all this information if we
32969
24:33:35,279 --> 24:33:40,872
also want to print the contract count we
32970
24:33:37,759 --> 24:33:43,039
can go in our engineer class and put in
32971
24:33:40,872 --> 24:33:45,192
a method which is going to return that
32972
24:33:45,191 --> 24:33:49,759
and say get contract count and this is
32973
24:33:47,919 --> 24:33:51,759
going to be a const member function
32974
24:33:49,759 --> 24:33:53,919
because it's not going to be modifying
32975
24:33:51,759 --> 24:33:55,759
our object we're just going to return a
32976
24:33:53,919 --> 24:33:58,399
value we're going to return the contract
32977
24:33:55,759 --> 24:34:01,919
count and we can go in our civil
32978
24:33:58,399 --> 24:34:03,279
engineer implementation file and change
32979
24:34:04,551 --> 24:34:08,959
get contract account we can do that okay
32980
24:34:06,960 --> 24:34:11,120
we have this method now we want this to
32981
24:34:08,960 --> 24:34:13,512
work this is going to work because we
32982
24:34:11,119 --> 24:34:15,919
are doing public inheritance from the
32983
24:34:13,512 --> 24:34:18,160
civil engineer class but we want this to
32984
24:34:15,919 --> 24:34:20,639
work we want to get full name get age
32985
24:34:18,160 --> 24:34:23,760
and get address to work here and we can
32986
24:34:20,639 --> 24:34:26,872
use the using feature to resurrect these
32987
24:34:23,759 --> 24:34:29,679
members to an access level which will
32988
24:34:26,872 --> 24:34:32,320
allow our civil engineer class to pick
32989
24:34:29,679 --> 24:34:35,039
them up so we can go in our engineer
32990
24:34:32,320 --> 24:34:36,960
class and set up for example a public or
32991
24:34:35,039 --> 24:34:39,119
protected scope we're going to use
32992
24:34:36,960 --> 24:34:40,960
protected because we want these to only
32993
24:34:40,960 --> 24:34:44,800
inherited classes for example so we're
32994
24:34:42,960 --> 24:34:46,872
going to say protected and we're going
32995
24:34:44,800 --> 24:34:48,551
to say using this is the syntax we're
32996
24:34:46,872 --> 24:34:50,639
going to say person and we're going to
32997
24:34:48,551 --> 24:34:53,831
say get full name we're going to say
32998
24:34:50,639 --> 24:34:55,831
using person get age going to choose
32999
24:34:53,831 --> 24:34:59,039
this and we are going to say using
33000
24:34:55,831 --> 24:35:01,439
person and say get address i think we
33001
24:34:59,039 --> 24:35:03,360
have that method here the moment we do
33002
24:35:01,440 --> 24:35:04,872
this we're going to go in our civil
33003
24:35:03,360 --> 24:35:07,759
engineer class you're going to see that
33004
24:35:04,872 --> 24:35:11,680
it is going to work now because what we
33005
24:35:07,759 --> 24:35:14,551
just did is resurrect these members to
33006
24:35:11,679 --> 24:35:17,279
have protected access level in the
33007
24:35:14,551 --> 24:35:18,959
engineer class so the inheritance
33008
24:35:17,279 --> 24:35:21,919
classes are going to look at this and
33009
24:35:18,960 --> 24:35:24,160
see that they have a protected access
33010
24:35:21,919 --> 24:35:26,551
level in the engineer class and they are
33011
24:35:24,160 --> 24:35:28,320
going to be forwarded down to any
33012
24:35:26,551 --> 24:35:30,000
inheritance class we could also change
33013
24:35:28,320 --> 24:35:32,232
this to public this is also going to
33014
24:35:30,000 --> 24:35:35,119
work they are going to be inherited as
33015
24:35:32,232 --> 24:35:37,279
public and hopefully you can see that
33016
24:35:35,119 --> 24:35:39,759
any member that you resurrect it's going
33017
24:35:37,279 --> 24:35:42,872
to take the excess level of the section
33018
24:35:39,759 --> 24:35:45,511
where you resurrect it if we resurrect
33019
24:35:42,872 --> 24:35:47,919
them in a public scope they are going to
33020
24:35:45,512 --> 24:35:50,232
be resurrected with a public access
33021
24:35:47,919 --> 24:35:52,800
level if we resurrect them in a
33022
24:35:50,232 --> 24:35:54,800
protected scope they are going to be
33023
24:35:54,800 --> 24:36:00,080
protected access level and this is the
33024
24:35:56,960 --> 24:36:03,440
message here now if you happen to have a
33025
24:36:00,080 --> 24:36:06,479
bunch of overloads in an upstream class
33026
24:36:03,440 --> 24:36:07,360
for example suppose we have a bunch of
33027
24:36:07,360 --> 24:36:13,831
functions in the person class we can go
33028
24:36:10,639 --> 24:36:15,191
in and put in let's do that we can go
33029
24:36:15,191 --> 24:36:20,799
double or ent let's say and that's going
33030
24:36:18,160 --> 24:36:22,000
to be much simpler we can say add and
33031
24:36:22,000 --> 24:36:26,320
a and say ent b and say ent c we're
33032
24:36:26,320 --> 24:36:31,040
three things that we are adding this is
33033
24:36:28,720 --> 24:36:33,279
going to be a const member function it's
33034
24:36:31,039 --> 24:36:36,159
not going to be modifying our members in
33035
24:36:33,279 --> 24:36:38,080
any way so we're going to return
33036
24:36:38,080 --> 24:36:42,960
plus c this is something we can return
33037
24:36:42,960 --> 24:36:47,120
and we're going to do an overload of the
33038
24:36:49,119 --> 24:36:54,399
the addition of two parameters so we're
33039
24:36:51,831 --> 24:36:57,511
going to only have a and b and i think
33040
24:36:54,399 --> 24:36:59,759
we can use a and b in the first
33041
24:36:57,512 --> 24:37:01,832
overload here that's going to be much
33042
24:36:59,759 --> 24:37:04,231
easier to follow so we have one that
33043
24:37:04,232 --> 24:37:08,232
and we have another one which is going
33044
24:37:05,600 --> 24:37:11,192
to add three parameters if we
33045
24:37:08,232 --> 24:37:14,160
privately inherit from person these guys
33046
24:37:11,191 --> 24:37:17,119
are going to be stripped down to private
33047
24:37:14,160 --> 24:37:19,919
level access in the engineer class and
33048
24:37:17,119 --> 24:37:22,639
they want to be accessible from in any
33049
24:37:19,919 --> 24:37:25,919
other downstream class so for example if
33050
24:37:22,639 --> 24:37:27,759
we head over in our civil engineer class
33051
24:37:27,759 --> 24:37:32,159
10 to two for example we're going to get
33052
24:37:30,399 --> 24:37:35,119
a compiler error because we don't have
33053
24:37:32,160 --> 24:37:38,639
access to this but we can also resurrect
33054
24:37:35,119 --> 24:37:40,399
these ad members in our engineer class
33055
24:37:38,639 --> 24:37:41,759
so let's go there and we're going to set
33056
24:37:41,759 --> 24:37:47,919
section in this class here and we're
33057
24:37:44,399 --> 24:37:50,399
going to say using person add this is
33058
24:37:47,919 --> 24:37:53,512
going to resurrect all the overloads
33059
24:37:50,399 --> 24:37:55,191
that we have in our upstream class and
33060
24:37:53,512 --> 24:37:57,512
this is going to be the case because we
33061
24:37:55,191 --> 24:37:58,399
resurrect only based on the name of the
33062
24:37:59,119 --> 24:38:05,440
the same name for a member function can
33063
24:38:02,000 --> 24:38:08,320
be shared by many overloads so if we do
33064
24:38:05,440 --> 24:38:10,000
this kind of resurrecting we are doing
33065
24:38:10,000 --> 24:38:14,720
member function from person we are going
33066
24:38:12,160 --> 24:38:17,360
to get all the overloads if we go in
33067
24:38:14,720 --> 24:38:19,119
civil engineer we will be able to use
33068
24:38:17,360 --> 24:38:21,680
the member function taking two
33069
24:38:19,119 --> 24:38:24,319
parameters we will also be able to use
33070
24:38:21,679 --> 24:38:26,479
the one that takes three parameters they
33071
24:38:24,320 --> 24:38:28,872
are all going to be resurrected here
33072
24:38:26,479 --> 24:38:30,319
this is the message i want to convey if
33073
24:38:28,872 --> 24:38:32,551
we do this you're going to see that this
33074
24:38:30,320 --> 24:38:35,920
is going to work and our code is going
33075
24:38:32,551 --> 24:38:37,512
to just world fine let's build and see
33076
24:38:35,919 --> 24:38:40,551
if the build is good actually we're
33077
24:38:37,512 --> 24:38:42,400
going to pass this through gcc the world
33078
24:38:40,551 --> 24:38:45,039
is going to be good so everything is
33079
24:38:42,399 --> 24:38:47,039
working just fine and the message i
33080
24:38:45,039 --> 24:38:49,360
really wanted to convey is that it is
33081
24:38:47,039 --> 24:38:53,119
possible to resurrect members
33082
24:38:49,360 --> 24:38:56,232
in a more resurrected access level if
33083
24:38:53,119 --> 24:39:00,159
you are inheriting using a really
33084
24:38:56,232 --> 24:39:02,720
constrained base class access specifier
33085
24:39:00,160 --> 24:39:03,680
for example we are inheriting using a
33086
24:39:03,679 --> 24:39:07,511
access specifier this is going to
33087
24:39:05,679 --> 24:39:10,079
eclipse everything we get from the
33088
24:39:07,512 --> 24:39:12,320
upstream class to private level but if
33089
24:39:10,080 --> 24:39:15,119
you think that's too much and you have a
33090
24:39:12,320 --> 24:39:18,080
few members that you would like to put
33091
24:39:15,119 --> 24:39:20,639
in a more relaxed access level you can
33092
24:39:18,080 --> 24:39:23,191
use this resurrecting feature and it is
33093
24:39:20,639 --> 24:39:25,440
going to make things accessible in
33094
24:39:23,191 --> 24:39:27,759
downstream classes if that's what you
33095
24:39:25,440 --> 24:39:29,360
want in your program and again i hope
33096
24:39:27,759 --> 24:39:31,831
this drives the point to home that
33097
24:39:29,360 --> 24:39:34,320
ziploc plus is going to sometimes work
33098
24:39:31,831 --> 24:39:36,871
really hard to prevent you from doing
33099
24:39:34,320 --> 24:39:39,120
one thing and then again give you a back
33100
24:39:36,872 --> 24:39:41,680
door you can go through to do that same
33101
24:39:39,119 --> 24:39:44,159
thing this is the same thing here we are
33102
24:39:41,679 --> 24:39:46,079
doing private inheritance but we aren't
33103
24:39:48,000 --> 24:39:54,080
relax the effects of private inheritance
33104
24:39:50,960 --> 24:39:56,639
by bringing things in a more relaxed
33105
24:39:54,080 --> 24:39:59,040
access level and you can use this if it
33106
24:39:56,639 --> 24:40:00,639
makes sense for your code again i don't
33107
24:39:59,039 --> 24:40:02,871
like this personally because it's going
33108
24:40:00,639 --> 24:40:04,720
to make code confusing if other
33109
24:40:02,872 --> 24:40:06,479
developers see that you are doing
33110
24:40:04,720 --> 24:40:08,479
private inheritance they are going to
33111
24:40:06,479 --> 24:40:10,159
expect everything from the app stream
33112
24:40:10,160 --> 24:40:14,080
to the class that is doing private
33113
24:40:11,919 --> 24:40:16,232
inheritance and if they see that they
33114
24:40:14,080 --> 24:40:18,960
can use this thanks that should be
33115
24:40:16,232 --> 24:40:20,800
private by default and downstream
33116
24:40:18,960 --> 24:40:23,360
classes this is really going to confuse
33117
24:40:20,800 --> 24:40:25,192
them and it is going to cost them more
33118
24:40:23,360 --> 24:40:27,440
minutes to look at your code to really
33119
24:40:25,191 --> 24:40:29,679
understand what is going on so if you
33120
24:40:27,440 --> 24:40:33,119
really want this dance to be accessible
33121
24:40:29,679 --> 24:40:35,599
in downstream classes why not do public
33122
24:40:33,119 --> 24:40:38,159
or protected inheritance in the first
33123
24:40:35,600 --> 24:40:40,552
place this is my argument here but it is
33124
24:40:38,160 --> 24:40:42,960
going to be your choice my job here is
33125
24:40:40,551 --> 24:40:45,039
to make you aware of the possibilities
33126
24:40:42,960 --> 24:40:47,440
that you have in the ziploc plus
33127
24:40:45,039 --> 24:40:49,439
programming language okay the last thing
33128
24:40:47,440 --> 24:40:51,680
i want you to see in this lecture is
33129
24:40:49,440 --> 24:40:54,080
that if there is something that was
33130
24:40:51,679 --> 24:40:56,319
already private in an app stream class
33131
24:40:54,080 --> 24:40:58,080
you can't resurrect that if you try to
33132
24:40:56,320 --> 24:41:00,000
do that you're going to get a compiler
33133
24:40:58,080 --> 24:41:02,320
error this is also going to drive the
33134
24:41:00,000 --> 24:41:04,720
point home that you can also resurrect
33135
24:41:02,320 --> 24:41:07,280
member variables so far what we have
33136
24:41:04,720 --> 24:41:09,919
only resurrected was all member
33137
24:41:07,279 --> 24:41:11,831
functions and we can also resurrect
33138
24:41:09,919 --> 24:41:15,279
member variables so we're going to try
33139
24:41:11,831 --> 24:41:17,759
and resurrect the m address member in
33140
24:41:15,279 --> 24:41:20,232
the engineer class and let's see how
33141
24:41:17,759 --> 24:41:22,319
this works out so let's go in our
33142
24:41:20,232 --> 24:41:25,279
engineer class we can go in our
33143
24:41:22,320 --> 24:41:27,192
protected section we can do this really
33144
24:41:25,279 --> 24:41:29,759
in any kind of section we're going to
33145
24:41:27,191 --> 24:41:32,319
say using and we're going to say person
33146
24:41:29,759 --> 24:41:34,399
and we're going to say m address you see
33147
24:41:32,320 --> 24:41:36,552
that this is not going to be
33148
24:41:34,399 --> 24:41:38,231
available in autocomplete this is going
33149
24:41:36,551 --> 24:41:40,159
to be a sign that this is going to give
33150
24:41:38,232 --> 24:41:41,680
us a compiler error and if we're trying
33151
24:41:40,160 --> 24:41:43,440
to do that we're going to see that we're
33152
24:41:41,679 --> 24:41:46,079
going to get a compiler error the
33153
24:41:43,440 --> 24:41:50,400
message here is that if something is
33154
24:41:46,080 --> 24:41:53,040
already private in a nap stream class
33155
24:41:50,399 --> 24:41:54,000
you can't resurrect it it is it claps
33156
24:41:55,119 --> 24:41:59,512
and hopefully this drives the point home
33157
24:41:57,039 --> 24:42:02,799
again that private inheritance is really
33158
24:41:59,512 --> 24:42:06,000
serious for example in our civil
33159
24:42:02,800 --> 24:42:08,400
engineer class we can't resurrect
33160
24:42:06,000 --> 24:42:11,039
something that was already eclipsed to
33161
24:42:08,399 --> 24:42:14,079
private level access by the engineer
33162
24:42:11,039 --> 24:42:16,551
class let's go in our personal class and
33163
24:42:14,080 --> 24:42:17,759
see if we have any other member function
33164
24:42:17,759 --> 24:42:21,919
play with we're going to put in a member
33165
24:42:19,759 --> 24:42:23,599
function that says do something we're
33166
24:42:23,600 --> 24:42:27,760
do something and it's going to be
33167
24:42:25,679 --> 24:42:29,439
constant it's just going to say hello we
33168
24:42:27,759 --> 24:42:30,639
can do something like this we are
33169
24:42:30,639 --> 24:42:36,000
and this method is going to be eclipsed
33170
24:42:32,960 --> 24:42:37,920
down to private level access because we
33171
24:42:36,000 --> 24:42:40,960
are doing private inheritance from
33172
24:42:37,919 --> 24:42:42,800
person let's go back in our engineer and
33173
24:42:40,960 --> 24:42:44,552
comment this out because it is going to
33174
24:42:42,800 --> 24:42:45,832
give you a compiler error if you build
33175
24:42:45,831 --> 24:42:49,759
a weird compiler error i think i should
33176
24:42:48,000 --> 24:42:51,919
really show you this because we are
33177
24:42:49,759 --> 24:42:53,919
learning here so we're going to try and
33178
24:42:51,919 --> 24:42:56,000
build our program anyway we're going to
33179
24:42:56,000 --> 24:42:59,360
and we're going to see the kind of
33180
24:42:59,360 --> 24:43:05,600
and we are going to see that there's no
33181
24:43:02,232 --> 24:43:09,040
member std this is a problem we just
33182
24:43:05,600 --> 24:43:12,720
introduced in our class here i think to
33183
24:43:09,039 --> 24:43:15,759
solve this problem we can just put our
33184
24:43:12,720 --> 24:43:18,160
definition in the cpp file we can do
33185
24:43:15,759 --> 24:43:20,439
that we're going to grab this and we're
33186
24:43:18,160 --> 24:43:23,120
going to put the definition in
33187
24:43:20,440 --> 24:43:25,512
person.cpp because we have io stream
33188
24:43:23,119 --> 24:43:28,159
included in there this is going to make
33189
24:43:25,512 --> 24:43:30,872
our code work much better let's do this
33190
24:43:28,160 --> 24:43:33,919
we're going to say void and say person
33191
24:43:30,872 --> 24:43:36,320
and we're going to say sddc out hello
33192
24:43:33,919 --> 24:43:38,319
this is going to fix our problem here
33193
24:43:36,320 --> 24:43:40,232
and the only problem we will have will
33194
24:43:40,232 --> 24:43:46,232
where we are trying to access things
33195
24:43:42,872 --> 24:43:48,960
that are now private to the base class
33196
24:43:46,232 --> 24:43:50,872
why do we have this weekly line here
33197
24:43:50,872 --> 24:43:55,760
and try to build really make sure that
33198
24:43:55,759 --> 24:44:02,399
and it was a visual studio code messing
33199
24:43:58,960 --> 24:44:03,680
with us so we're going to bring this in
33200
24:44:02,399 --> 24:44:06,639
and the world and we're going to see the
33201
24:44:03,679 --> 24:44:09,039
kind of compiler error we get here
33202
24:44:06,639 --> 24:44:10,639
this is what i am trying to make you see
33203
24:44:09,039 --> 24:44:13,511
you see the bullet is finished with
33204
24:44:10,639 --> 24:44:16,872
errors if we go back we're going to see
33205
24:44:13,512 --> 24:44:19,119
that string person m address is private
33206
24:44:16,872 --> 24:44:20,960
within this context we can't really
33207
24:44:19,119 --> 24:44:23,679
resurrect it if we do this we're going
33208
24:44:20,960 --> 24:44:26,080
to get this compiler error here this is
33209
24:44:23,679 --> 24:44:27,439
the message you shouldn't really try to
33210
24:44:27,440 --> 24:44:32,080
something that is already private to an
33211
24:44:30,232 --> 24:44:34,800
upstream class and that's what we are
33212
24:44:32,080 --> 24:44:37,040
doing here we are trying to resurrect a
33213
24:44:34,800 --> 24:44:39,192
member which is private to person and
33214
24:44:37,039 --> 24:44:41,439
this is not allowed in c plus plus if we
33215
24:44:39,191 --> 24:44:42,479
do that we're going to get a compiler
33216
24:44:42,479 --> 24:44:48,231
okay so but what i want you to see here
33217
24:44:44,399 --> 24:44:51,360
is that a public member which was in the
33218
24:44:48,232 --> 24:44:54,720
base class was also eclipsed down to
33219
24:44:51,360 --> 24:44:57,360
private level access in engineer so if
33220
24:44:57,360 --> 24:45:01,440
the do something method in our civil
33221
24:45:00,000 --> 24:45:03,831
engineer class we're going to get a
33222
24:45:01,440 --> 24:45:06,080
compiler error so let's try and do that
33223
24:45:03,831 --> 24:45:08,231
we're going to put a public section why
33224
24:45:08,232 --> 24:45:13,400
and we're going to go down and say using
33225
24:45:13,512 --> 24:45:17,680
and it say do something we have this
33226
24:45:15,759 --> 24:45:20,000
method here but if we do this we're
33227
24:45:17,679 --> 24:45:22,871
going to get a compiler error because
33228
24:45:20,000 --> 24:45:25,440
this method is now private to the
33229
24:45:22,872 --> 24:45:28,160
engineer class and why is it private to
33230
24:45:25,440 --> 24:45:30,551
engineer well engineer is doing private
33231
24:45:28,160 --> 24:45:33,279
inheritance that's going to accept
33232
24:45:30,551 --> 24:45:36,000
everything to private level access by
33233
24:45:33,279 --> 24:45:39,279
default so this member is private to
33234
24:45:36,000 --> 24:45:41,440
engineer we are inheriting from engineer
33235
24:45:41,440 --> 24:45:46,160
and this is going to be already private
33236
24:45:43,679 --> 24:45:49,439
to engineer and we can't resurrect this
33237
24:45:46,160 --> 24:45:51,680
back so if you eclipse something using
33238
24:45:49,440 --> 24:45:54,960
private inheritance you want to be able
33239
24:45:51,679 --> 24:45:58,000
to resurrect that to a more relaxed
33240
24:45:54,960 --> 24:45:59,832
access level in downstream classes this
33241
24:45:58,000 --> 24:46:01,831
is the message i am trying to convey
33242
24:45:59,831 --> 24:46:03,279
here so this is also going to give us a
33243
24:46:03,279 --> 24:46:07,191
and if we try to build our program we're
33244
24:46:05,279 --> 24:46:09,679
going to see that let's pass this
33245
24:46:07,191 --> 24:46:12,080
through gcc we are going to see that's
33246
24:46:09,679 --> 24:46:14,319
the world finished with errors and if we
33247
24:46:12,080 --> 24:46:17,191
go back we are going to get some kind of
33248
24:46:14,320 --> 24:46:20,720
error that says that do something is
33249
24:46:17,191 --> 24:46:22,799
private to some class it is inaccessible
33250
24:46:20,720 --> 24:46:25,440
within this context this is the message
33251
24:46:22,800 --> 24:46:28,479
we get from this particular compiler we
33252
24:46:25,440 --> 24:46:30,960
are using but the bottom line is that
33253
24:46:28,479 --> 24:46:33,119
you shouldn't really try to resurrect
33254
24:46:30,960 --> 24:46:34,960
something that is already private to an
33255
24:46:33,119 --> 24:46:37,119
upstream class and this is what we are
33256
24:46:34,960 --> 24:46:39,512
doing here you shouldn't really do that
33257
24:46:37,119 --> 24:46:41,039
let's comment this out and get a code to
33258
24:46:41,039 --> 24:46:45,831
so the web is good and we are all fine
33259
24:46:43,440 --> 24:46:47,440
here this is really all i had to share
33260
24:46:45,831 --> 24:46:50,000
in this lecture i hope you found it
33261
24:46:47,440 --> 24:46:51,760
interesting we are going to stop here in
33262
24:46:50,000 --> 24:46:55,191
this one the next one we're going to
33263
24:46:51,759 --> 24:46:56,551
explore how constructors work with
33264
24:46:56,551 --> 24:47:00,080
go ahead and finish up here and meet me
33265
24:47:00,080 --> 24:47:05,040
in this lecture we're going to zoom in
33266
24:47:01,919 --> 24:47:06,399
at how derived objects are built and
33267
24:47:05,039 --> 24:47:09,279
we're going to zoom in on the
33268
24:47:06,399 --> 24:47:12,479
constructors that we have been ignoring
33269
24:47:09,279 --> 24:47:14,720
on purpose so far so here we have the
33270
24:47:12,479 --> 24:47:17,039
inheritance hierarchy we will be using
33271
24:47:14,720 --> 24:47:19,191
it is what we are familiar with at this
33272
24:47:17,039 --> 24:47:20,871
point we have a personal class which is
33273
24:47:19,191 --> 24:47:23,119
going to be our base class we have an
33274
24:47:20,872 --> 24:47:25,600
engineer class which is now going to be
33275
24:47:23,119 --> 24:47:29,191
doing public inheritance because we have
33276
24:47:25,600 --> 24:47:31,760
seen enough of private inheritance our
33277
24:47:29,191 --> 24:47:32,799
engineer class is now going to be nice
33278
24:47:32,800 --> 24:47:38,320
i am inheriting from person but i also
33279
24:47:35,360 --> 24:47:40,720
want my downstream classes to have
33280
24:47:38,320 --> 24:47:42,720
access to the cool stuff i am getting
33281
24:47:42,720 --> 24:47:47,440
our engineer class is behaving now we
33282
24:47:45,512 --> 24:47:49,512
are also going to have a civil engineer
33283
24:47:47,440 --> 24:47:52,000
class which is going to publicly inherit
33284
24:47:49,512 --> 24:47:55,440
from engineer but what we want to focus
33285
24:47:52,000 --> 24:47:57,512
on here is what we get from base classes
33286
24:47:55,440 --> 24:48:00,320
so the engineer class is going to have a
33287
24:47:57,512 --> 24:48:03,191
person part of that but it is also going
33288
24:48:00,320 --> 24:48:06,480
to build on top of that and add an
33289
24:48:03,191 --> 24:48:09,759
engineer level and customize what kind
33290
24:48:06,479 --> 24:48:12,000
of person it is so if we inherit from
33291
24:48:09,759 --> 24:48:14,231
engineer and that weld our civil
33292
24:48:12,000 --> 24:48:16,551
engineer class the first link to be
33293
24:48:14,232 --> 24:48:19,040
built by c plus plus is the person part
33294
24:48:16,551 --> 24:48:21,279
of this it is going to build an engineer
33295
24:48:19,039 --> 24:48:24,079
level of this and then we are going to
33296
24:48:24,080 --> 24:48:30,080
to add the customizations that the civil
33297
24:48:30,080 --> 24:48:35,440
and a c plus plus is going to do this
33298
24:48:32,639 --> 24:48:37,831
using constructors by default we are
33299
24:48:35,440 --> 24:48:40,160
going to be using default constructors
33300
24:48:37,831 --> 24:48:42,479
if we don't specify a way for the
33301
24:48:40,160 --> 24:48:44,000
basical structure to be called c plus
33302
24:48:42,479 --> 24:48:47,512
plus is going to call the default
33303
24:48:44,000 --> 24:48:50,320
constructor to build your base objects
33304
24:48:47,512 --> 24:48:52,960
so if we set up something like this and
33305
24:48:50,320 --> 24:48:54,872
try to run a program we're going to get
33306
24:48:52,960 --> 24:48:56,639
output like this we're going to see that
33307
24:48:54,872 --> 24:48:58,960
the person default constructor is going
33308
24:48:56,639 --> 24:49:01,831
to be called first and notice that we
33309
24:48:58,960 --> 24:49:04,160
are building a civil engineer object so
33310
24:49:01,831 --> 24:49:06,479
the default constructor from the most
33311
24:49:04,160 --> 24:49:08,552
base class is going to be called then
33312
24:49:06,479 --> 24:49:11,191
we're going to be building an engineer
33313
24:49:08,551 --> 24:49:13,679
layer on top of the person stuff that we
33314
24:49:11,191 --> 24:49:17,119
get then we're going to build a civil
33315
24:49:13,679 --> 24:49:19,359
engineer layer on top of the engineer
33316
24:49:17,119 --> 24:49:21,279
stuff that we have already got and the
33317
24:49:19,360 --> 24:49:23,512
compiler is going to do this using the
33318
24:49:21,279 --> 24:49:25,119
default constructors by default so we're
33319
24:49:23,512 --> 24:49:27,191
going to call the default constructor
33320
24:49:25,119 --> 24:49:29,279
for person first we're going to call the
33321
24:49:27,191 --> 24:49:31,119
default constructor for engineer and
33322
24:49:29,279 --> 24:49:33,360
then we're going to call the default
33323
24:49:31,119 --> 24:49:36,159
constructor for civil engineer to
33324
24:49:33,360 --> 24:49:38,000
complete the construction of our object
33325
24:49:36,160 --> 24:49:40,080
the object will be complete at this
33326
24:49:38,000 --> 24:49:43,440
point and we will be able to use it
33327
24:49:40,080 --> 24:49:45,119
later on in our program here and
33328
24:49:43,440 --> 24:49:46,400
hopefully this is going to drive the
33329
24:49:46,399 --> 24:49:51,360
that you should really really always
33330
24:49:49,039 --> 24:49:54,319
provide to the photoconstructors for
33331
24:49:51,360 --> 24:49:56,960
your classes because the compiler may
33332
24:49:54,320 --> 24:50:00,080
call these default constructors in
33333
24:49:56,960 --> 24:50:03,600
unexpected ways especially if your class
33334
24:50:00,080 --> 24:50:05,759
is part of an inheritance hierarchy for
33335
24:50:03,600 --> 24:50:08,552
example if somebody tries to build the
33336
24:50:05,759 --> 24:50:11,439
civil engineer object and you don't have
33337
24:50:08,551 --> 24:50:13,191
a default constructor for a person the
33338
24:50:11,440 --> 24:50:14,872
compiler is going to try and code that
33339
24:50:13,191 --> 24:50:17,512
and it's not going to find that and it
33340
24:50:14,872 --> 24:50:20,320
is going to throw a compiler error as we
33341
24:50:17,512 --> 24:50:22,232
are about to see in a minute okay so the
33342
24:50:20,320 --> 24:50:24,400
message really in this lecture is that
33343
24:50:22,232 --> 24:50:27,120
the most base part of your class is
33344
24:50:24,399 --> 24:50:28,639
going to be bolt so for example for our
33345
24:50:27,119 --> 24:50:30,959
civil engineer class we're going to
33346
24:50:28,639 --> 24:50:33,039
build the prison port first then we're
33347
24:50:30,960 --> 24:50:34,639
going to build the engineer park and
33348
24:50:33,039 --> 24:50:36,871
then we're going to build the civil
33349
24:50:34,639 --> 24:50:39,679
engineer part of that and then we're
33350
24:50:36,872 --> 24:50:42,320
going to finish the construction of our
33351
24:50:39,679 --> 24:50:43,831
object this is the message here now that
33352
24:50:42,320 --> 24:50:45,760
you notice we're going to head over to
33353
24:50:43,831 --> 24:50:46,959
visual studio code and play with this a
33354
24:50:46,960 --> 24:50:52,400
here we are in our working folder the
33355
24:50:49,759 --> 24:50:55,191
current project is default argument
33356
24:50:52,399 --> 24:50:56,959
constructor with inheritance we are
33357
24:50:55,191 --> 24:50:58,639
going to reuse the code from the last
33358
24:50:56,960 --> 24:51:01,280
lecture because that's going to give us
33359
24:50:58,639 --> 24:51:03,279
the classes that we need to play
33360
24:51:01,279 --> 24:51:04,959
with what we want to do in this lecture
33361
24:51:03,279 --> 24:51:07,919
and that's playing with default
33362
24:51:04,960 --> 24:51:09,512
constructors let's put in our starter
33363
24:51:07,919 --> 24:51:12,160
code and we're going to open this little
33364
24:51:09,512 --> 24:51:13,919
guy in visual studio code let's do this
33365
24:51:12,160 --> 24:51:16,320
so we're going to have our classes we're
33366
24:51:13,919 --> 24:51:17,831
going to have the main function which we
33367
24:51:17,831 --> 24:51:23,039
and we are going to look at the person
33368
24:51:20,720 --> 24:51:25,759
class and make sure we have a default
33369
24:51:23,039 --> 24:51:28,000
constructor we are not going to default
33370
24:51:25,759 --> 24:51:32,479
it this time because we want to have a
33371
24:51:28,000 --> 24:51:34,160
body we can put our output statements in
33372
24:51:32,479 --> 24:51:36,319
so in this case we're going to go in the
33373
24:51:34,160 --> 24:51:38,080
cpp file and put in a default
33374
24:51:36,320 --> 24:51:41,512
constructor we're going to say person
33375
24:51:38,080 --> 24:51:43,191
and person and person here and this is
33376
24:51:41,512 --> 24:51:47,040
going to be our constructor we're going
33377
24:51:43,191 --> 24:51:48,720
to say stdcl defaults constructor for
33378
24:51:48,720 --> 24:51:53,680
okay so the personal class is done we
33379
24:51:51,119 --> 24:51:56,479
have a default constructor that works as
33380
24:51:53,679 --> 24:51:58,479
we want and we're going to go to our
33381
24:51:56,479 --> 24:52:01,119
engineer class and we're going to change
33382
24:51:58,479 --> 24:52:03,440
it to do public inheritance i think this
33383
24:52:01,119 --> 24:52:04,231
is going to be much easier to deal with
33384
24:52:04,232 --> 24:52:09,440
and we're going to remove all these
33385
24:52:06,960 --> 24:52:11,512
resurrection we were doing here from the
33386
24:52:09,440 --> 24:52:14,000
last lecture because this is no longer
33387
24:52:14,000 --> 24:52:18,960
and what we really want is to look at
33388
24:52:16,320 --> 24:52:21,120
our default constructor which is really
33389
24:52:18,960 --> 24:52:23,192
in here already let's look at the
33390
24:52:21,119 --> 24:52:26,319
implementation all we really need to do
33391
24:52:23,191 --> 24:52:27,759
is put in sddc out and say default
33392
24:52:31,039 --> 24:52:36,399
and we're going to hop over to the civil
33393
24:52:33,759 --> 24:52:38,959
engineer class and see if we have a
33394
24:52:36,399 --> 24:52:41,360
default constructor and we do have it
33395
24:52:38,960 --> 24:52:44,232
and we're going to go to the cpp file
33396
24:52:49,360 --> 24:52:54,720
so this is going to basically do what we
33397
24:52:52,000 --> 24:52:57,360
want and what we really want to see
33398
24:52:54,720 --> 24:52:59,680
is how or the order in which our
33399
24:52:57,360 --> 24:53:02,720
constructors are going to be called if
33400
24:52:59,679 --> 24:53:04,639
we build a civil engineer object as we
33401
24:53:02,720 --> 24:53:06,551
have seen here the person part is going
33402
24:53:04,639 --> 24:53:08,872
to be built first so this is going to
33403
24:53:06,551 --> 24:53:11,119
call the constructor from person and
33404
24:53:08,872 --> 24:53:13,600
because we are not doing any kind of
33405
24:53:11,119 --> 24:53:15,599
customization on which constructor is
33406
24:53:13,600 --> 24:53:17,440
going to be called the compiler is going
33407
24:53:15,600 --> 24:53:19,040
to call the default constructor by
33408
24:53:17,440 --> 24:53:21,191
default so we're going to build the
33409
24:53:19,039 --> 24:53:22,871
person port first and we're going to see
33410
24:53:21,191 --> 24:53:25,191
the default constructor for a person
33411
24:53:22,872 --> 24:53:27,760
called after that we're going to build
33412
24:53:27,759 --> 24:53:32,159
and this is going to call the default
33413
24:53:29,440 --> 24:53:34,639
constructor for engineer and after that
33414
24:53:32,160 --> 24:53:36,720
we're going to weld the civil engineer
33415
24:53:34,639 --> 24:53:39,512
part of us and that's going to call the
33416
24:53:36,720 --> 24:53:41,191
civil engineer default constructor this
33417
24:53:41,191 --> 24:53:47,119
if we build a civil engineer object so
33418
24:53:44,800 --> 24:53:49,040
we are going to hop over in the main cpp
33419
24:53:47,119 --> 24:53:51,831
file and actually build the civil
33420
24:53:49,039 --> 24:53:55,360
engineer object we're going to say civil
33421
24:53:51,831 --> 24:53:57,439
engineer and we're going to say ce1 we
33422
24:53:55,360 --> 24:54:00,232
can do that and we're going to see what
33423
24:53:57,440 --> 24:54:03,040
happens let's try and build this program
33424
24:54:00,232 --> 24:54:05,832
we're going to build that with gcc the
33425
24:54:03,039 --> 24:54:08,319
book is going to be good we could run it
33426
24:54:05,831 --> 24:54:10,000
let's bring up a powershell window we
33427
24:54:10,000 --> 24:54:14,639
we want to bring up a powershell window
33428
24:54:16,479 --> 24:54:20,000
and you're going to see that default
33429
24:54:17,831 --> 24:54:22,479
constructor for a person called the
33430
24:54:20,000 --> 24:54:24,800
first constructor for engineer called
33431
24:54:24,800 --> 24:54:30,080
engineer called this is what we want to
33432
24:54:27,759 --> 24:54:31,831
see and hopefully this proves that the
33433
24:54:30,080 --> 24:54:35,279
compiler is really going to build a
33434
24:54:31,831 --> 24:54:36,871
civil engineer object in parts the
33435
24:54:35,279 --> 24:54:38,959
compiler is going to see that it is a
33436
24:54:36,872 --> 24:54:41,680
derived object and it's going to see all
33437
24:54:38,960 --> 24:54:44,080
the classes that this is deriving from
33438
24:54:41,679 --> 24:54:46,399
so it is going to build the most base
33439
24:54:44,080 --> 24:54:48,720
part first after that it is going to
33440
24:54:46,399 --> 24:54:51,919
build other layers until it reaches the
33441
24:54:48,720 --> 24:54:55,040
level where we are at at this civil
33442
24:54:51,919 --> 24:54:57,512
engineer objects again if we put another
33443
24:54:55,039 --> 24:54:58,959
statement out here i'm going to say
33444
24:54:58,960 --> 24:55:04,400
and we're going to say sdd-endl
33445
24:55:01,919 --> 24:55:07,039
and i am doing this so that i just have
33446
24:55:04,399 --> 24:55:09,439
a point where i can put my breakpoint
33447
24:55:07,039 --> 24:55:12,159
some ides are not going to like it if
33448
24:55:09,440 --> 24:55:14,639
you put a breakpoint at an empty line so
33449
24:55:12,160 --> 24:55:16,552
that's why i am doing it here and i am
33450
24:55:14,639 --> 24:55:19,512
going to try and debug and really show
33451
24:55:16,551 --> 24:55:21,599
you that we have an engineer and a
33452
24:55:19,512 --> 24:55:23,512
person part in us i have shown you this
33453
24:55:21,600 --> 24:55:24,872
before but it doesn't really hurt to
33454
24:55:24,872 --> 24:55:30,232
because debugging is really cool it's
33455
24:55:27,679 --> 24:55:32,319
going to give you more information than
33456
24:55:32,320 --> 24:55:37,280
we're going to hit our break point here
33457
24:55:37,279 --> 24:55:42,160
locals we're going to have our civil
33458
24:55:39,279 --> 24:55:44,080
engineer object which is in scope now
33459
24:55:42,160 --> 24:55:47,512
and you see that we have an engineer
33460
24:55:44,080 --> 24:55:49,759
part of us and the engineer has a person
33461
24:55:47,512 --> 24:55:51,760
partner so what the compiler is really
33462
24:55:49,759 --> 24:55:54,720
going to do when it is building a civil
33463
24:55:51,759 --> 24:55:57,279
engineer object it is going to build the
33464
24:55:54,720 --> 24:55:59,512
most based part of us so it is going to
33465
24:55:57,279 --> 24:56:01,679
build a personal part after that it is
33466
24:55:59,512 --> 24:56:03,600
going to build an engineer layer on top
33467
24:56:01,679 --> 24:56:06,231
of that and then it is going to world
33468
24:56:03,600 --> 24:56:09,120
the servo engineer layer and that's what
33469
24:56:06,232 --> 24:56:11,512
we see in our output when we get to run
33470
24:56:09,119 --> 24:56:13,360
our program here if we go back we're
33471
24:56:11,512 --> 24:56:15,512
going to see that we still have our
33472
24:56:15,512 --> 24:56:19,279
let's bring up a terminal window we can
33473
24:56:17,759 --> 24:56:21,360
use to run this we're going to run
33474
24:56:19,279 --> 24:56:24,160
rooster and we're going to see the order
33475
24:56:21,360 --> 24:56:26,160
in which our constructors are called
33476
24:56:24,160 --> 24:56:28,480
this is really cool now that we have
33477
24:56:26,160 --> 24:56:30,400
just debugged this program you can take
33478
24:56:28,479 --> 24:56:32,959
out this hello line because it's really
33479
24:56:30,399 --> 24:56:35,360
useless and this is really what i wanted
33480
24:56:32,960 --> 24:56:38,639
you to see constructors are going to be
33481
24:56:35,360 --> 24:56:41,191
called in your inheritance hierarchy
33482
24:56:41,191 --> 24:56:45,679
going down to the most specialized one
33483
24:56:44,160 --> 24:56:47,680
so we're going to call the most best
33484
24:56:45,679 --> 24:56:49,919
constructor which is person and we're
33485
24:56:47,679 --> 24:56:52,479
going to keep going until we reach the
33486
24:56:49,919 --> 24:56:56,160
most specialized which is a civil
33487
24:56:52,479 --> 24:56:58,399
engineer here to build our object and
33488
24:56:56,160 --> 24:57:00,960
our object is really going to be build
33489
24:56:58,399 --> 24:57:03,191
up in layers this is the message i am
33490
24:57:00,960 --> 24:57:05,120
trying to convey here this is really all
33491
24:57:03,191 --> 24:57:07,512
i had to share in this lecture i hope
33492
24:57:05,119 --> 24:57:09,831
you found it interesting we are going to
33493
24:57:07,512 --> 24:57:11,832
stop here in this one the next one we're
33494
24:57:09,831 --> 24:57:15,279
going to see that we can actually
33495
24:57:11,831 --> 24:57:17,831
actively call a base class constructor
33496
24:57:15,279 --> 24:57:21,360
from our derived class and that's going
33497
24:57:17,831 --> 24:57:23,679
to add much more flexibility in how our
33498
24:57:21,360 --> 24:57:25,279
objects are built we are not going to
33499
24:57:23,679 --> 24:57:28,159
call the default constructor we're going
33500
24:57:25,279 --> 24:57:30,551
to be calling our own constructors and
33501
24:57:28,160 --> 24:57:34,320
have much more control on how our
33502
24:57:30,551 --> 24:57:36,551
derived objects are set up in the world
33503
24:57:34,320 --> 24:57:38,000
go ahead and finish up here and meet me
33504
24:57:38,000 --> 24:57:43,191
in this lecture we're going to see a way
33505
24:57:40,232 --> 24:57:44,552
we can instruct for custom constructors
33506
24:57:44,551 --> 24:57:49,039
when our derived objects are being built
33507
24:57:49,039 --> 24:57:54,639
in the last lecture we saw a figure like
33508
24:57:51,759 --> 24:57:57,119
this we had an inheritance hierarchy
33509
24:57:54,639 --> 24:57:59,831
that went from person to engineer and to
33510
24:57:57,119 --> 24:58:02,080
civil engineer and we saw that if we set
33511
24:57:59,831 --> 24:58:04,319
up a civil engineer object a personal
33512
24:58:02,080 --> 24:58:06,000
part is going to be built first an
33513
24:58:04,320 --> 24:58:08,000
engineer part is going to be built on
33514
24:58:06,000 --> 24:58:09,600
top of that and the civil engineer part
33515
24:58:09,600 --> 24:58:13,600
built and then we're going to have the
33516
24:58:11,191 --> 24:58:16,551
construction complete for our civil
33517
24:58:13,600 --> 24:58:18,872
engineer object but in the last lecture
33518
24:58:16,551 --> 24:58:21,279
we saw that this was calling the default
33519
24:58:18,872 --> 24:58:24,551
constructors and sometimes you don't
33520
24:58:21,279 --> 24:58:27,191
want this you want your objects built in
33521
24:58:24,551 --> 24:58:29,039
a specific way for example through a
33522
24:58:27,191 --> 24:58:30,959
bunch of parameters that you pass to
33523
24:58:29,039 --> 24:58:32,799
your constructor what if you want this
33524
24:58:30,960 --> 24:58:35,600
kind of setup this is what we are going
33525
24:58:32,800 --> 24:58:37,680
to learn about in this lecture and what
33526
24:58:35,600 --> 24:58:39,512
we want to end up with is something like
33527
24:58:37,679 --> 24:58:41,191
this we will be able to build a person
33528
24:58:39,512 --> 24:58:43,191
object by passing in a bunch of
33529
24:58:43,191 --> 24:58:47,679
the full name we can pass in the age i
33530
24:58:45,831 --> 24:58:50,231
think this is the age we can pass in an
33531
24:58:47,679 --> 24:58:52,079
address we can build an engineer object
33532
24:58:50,232 --> 24:58:54,480
by passing in this kind of information
33533
24:58:52,080 --> 24:58:56,800
we can pass in the name the age and the
33534
24:58:54,479 --> 24:58:59,759
address but we can also pass in the
33535
24:58:56,800 --> 24:59:02,639
contract count i think this is the new
33536
24:58:59,759 --> 24:59:04,871
member variable we had in our engineer
33537
24:59:02,639 --> 24:59:06,872
class but we're not going to stop there
33538
24:59:04,872 --> 24:59:08,872
we can also build the civil engineer
33539
24:59:06,872 --> 24:59:11,040
object and we can pass in the
33540
24:59:08,872 --> 24:59:13,279
information again a civil engineer is
33541
24:59:11,039 --> 24:59:15,119
also a person so we're going to be
33542
24:59:13,279 --> 24:59:16,872
passing the information that is going to
33543
24:59:15,119 --> 24:59:19,919
initialize the person part and that
33544
24:59:16,872 --> 24:59:22,720
happens to be the name the age and the
33545
24:59:19,919 --> 24:59:24,232
address but a civil engineer is also an
33546
24:59:22,720 --> 24:59:27,360
engineer so we're going to pass
33547
24:59:24,232 --> 24:59:28,960
information that portrays to the level
33548
24:59:27,360 --> 24:59:31,191
of an engineer and that's going to be
33549
24:59:28,960 --> 24:59:33,512
the contract count and we're going to
33550
24:59:31,191 --> 24:59:36,639
pass the information to initialize the
33551
24:59:33,512 --> 24:59:39,119
civil engineer part of this object and
33552
24:59:36,639 --> 24:59:41,119
that's going to be the road strength
33553
24:59:39,119 --> 24:59:42,639
and hopefully from this you can see that
33554
24:59:42,639 --> 24:59:47,440
to forward all this information to the
33555
24:59:44,960 --> 24:59:49,832
constructor where this information is
33556
24:59:47,440 --> 24:59:53,040
needed for example if we are building a
33557
24:59:49,831 --> 24:59:56,319
civil engineer object we want to forward
33558
24:59:53,039 --> 24:59:59,191
the name the age and the address to the
33559
24:59:56,320 --> 25:00:01,512
person part of us so we need to parse
33560
24:59:59,191 --> 25:00:06,231
this to our personal constructor in a
33561
25:00:01,512 --> 25:00:08,960
way we need to pass the 31 here to our
33562
25:00:06,232 --> 25:00:12,000
engineer constructor because this
33563
25:00:08,960 --> 25:00:14,720
information is going to be stored at our
33564
25:00:12,000 --> 25:00:18,000
engineer level and we need to store the
33565
25:00:14,720 --> 25:00:20,720
road strength information into the civil
33566
25:00:18,000 --> 25:00:23,039
engineer part of us because that's where
33567
25:00:20,720 --> 25:00:24,960
this member variable is declared
33568
25:00:23,039 --> 25:00:27,279
hopefully you can see the need to call
33569
25:00:24,960 --> 25:00:29,600
custom constructors which are not to
33570
25:00:27,279 --> 25:00:32,160
default these custom constructors are
33571
25:00:29,600 --> 25:00:35,279
going to allow us to forward information
33572
25:00:32,160 --> 25:00:37,919
when building our objects like we are
33573
25:00:35,279 --> 25:00:40,319
doing here in the main function so let's
33574
25:00:37,919 --> 25:00:42,232
see how we can do this some of you might
33575
25:00:40,320 --> 25:00:44,960
think uh-huh if i am building an
33576
25:00:42,232 --> 25:00:47,120
engineer object i can just grab the
33577
25:00:44,960 --> 25:00:49,600
information and pass that to my base
33578
25:00:47,119 --> 25:00:51,512
class and that is simple right so we can
33579
25:00:49,600 --> 25:00:54,480
grab all this information we can grab
33580
25:00:51,512 --> 25:00:57,191
the full name the age and the address
33581
25:00:54,479 --> 25:00:59,759
and pass that to our base class using
33582
25:00:57,191 --> 25:01:01,599
the syntaxes we have here if we are
33583
25:00:59,759 --> 25:01:03,599
doing public inheritance we're going to
33584
25:01:01,600 --> 25:01:06,400
have access to these guys anyway so we
33585
25:01:03,600 --> 25:01:09,279
can say full name equals full name mag
33586
25:01:06,399 --> 25:01:10,551
equals age and say m address equals
33587
25:01:11,919 --> 25:01:18,720
for the address is actually private to
33588
25:01:15,600 --> 25:01:21,120
the person class and we can't do
33589
25:01:18,720 --> 25:01:23,279
something like this if we try to access
33590
25:01:21,119 --> 25:01:25,679
the address member variable from the
33591
25:01:23,279 --> 25:01:27,600
base class and modify it we're going to
33592
25:01:25,679 --> 25:01:30,319
get a compiler error that says that the
33593
25:01:27,600 --> 25:01:33,279
address is actually private to the base
33594
25:01:30,320 --> 25:01:35,680
person class we can't do this so this is
33595
25:01:33,279 --> 25:01:38,479
not going to work okay some of you might
33596
25:01:35,679 --> 25:01:41,191
think uh-huh what if i try to use an
33597
25:01:38,479 --> 25:01:43,679
initializer list and do something like
33598
25:01:41,191 --> 25:01:46,479
this so i can say m full name and pass
33599
25:01:43,679 --> 25:01:49,039
in my information i can say mh and put
33600
25:01:46,479 --> 25:01:50,800
in my information i can say m address
33601
25:01:49,039 --> 25:01:52,231
and put in my information and then
33602
25:01:52,232 --> 25:01:57,279
the member variable that actually
33603
25:01:54,720 --> 25:02:00,000
belongs to the engineer class that we
33604
25:01:57,279 --> 25:02:01,679
are trying to build an object for here
33605
25:02:00,000 --> 25:02:04,320
and hopefully this is going to work
33606
25:02:01,679 --> 25:02:07,191
except the compiler is not also going to
33607
25:02:04,320 --> 25:02:10,400
accept this the reason is with
33608
25:02:07,191 --> 25:02:13,191
initializer lists you can't initialize a
33609
25:02:10,399 --> 25:02:15,439
member variable that doesn't belong to
33610
25:02:13,191 --> 25:02:17,831
the class that you are trying to build
33611
25:02:15,440 --> 25:02:20,800
an object for so for example here we are
33612
25:02:17,831 --> 25:02:23,439
trying to initialize m full name mh and
33613
25:02:20,800 --> 25:02:26,160
m address but these member variables
33614
25:02:23,440 --> 25:02:28,320
don't belong to the engineer class that
33615
25:02:26,160 --> 25:02:30,232
we are trying to build an object for so
33616
25:02:28,320 --> 25:02:32,552
we're going to get a compiler error here
33617
25:02:30,232 --> 25:02:34,480
this is not going to work it is not
33618
25:02:34,479 --> 25:02:40,159
to build or set up this member variables
33619
25:02:37,512 --> 25:02:42,160
so this is not going to work okay so
33620
25:02:40,160 --> 25:02:45,440
how are we supposed to forward
33621
25:02:42,160 --> 25:02:46,639
information from derived classes to base
33622
25:02:46,639 --> 25:02:51,512
not to worry here we can still use
33623
25:02:48,872 --> 25:02:54,232
initializer lists but we are going to
33624
25:02:51,512 --> 25:02:56,960
use constructors whose job is going to
33625
25:02:54,232 --> 25:02:59,360
be to initialize these member variables
33626
25:02:56,960 --> 25:03:01,280
so if we are building an engineer object
33627
25:02:59,360 --> 25:03:04,080
and we have information that really
33628
25:03:01,279 --> 25:03:05,919
belongs to the person part of us we're
33629
25:03:04,080 --> 25:03:08,720
going to call the person constructor to
33630
25:03:05,919 --> 25:03:10,639
actually use this information to build
33631
25:03:08,720 --> 25:03:13,119
the personal part of us and we're going
33632
25:03:10,639 --> 25:03:16,080
to be calling the person constructor in
33633
25:03:13,119 --> 25:03:18,479
our initializer list here and after we
33634
25:03:16,080 --> 25:03:20,800
do that we're going to initialize a
33635
25:03:18,479 --> 25:03:24,080
member variable that actually belongs to
33636
25:03:20,800 --> 25:03:25,919
us in our initializer list this is going
33637
25:03:24,080 --> 25:03:28,639
to forward information from derived
33638
25:03:25,919 --> 25:03:30,872
classes in this case the engineer is the
33639
25:03:28,639 --> 25:03:33,279
derived class and the information is
33640
25:03:30,872 --> 25:03:35,680
going to be forwarded to the person
33641
25:03:33,279 --> 25:03:37,600
constructor which is our base class this
33642
25:03:37,600 --> 25:03:41,192
okay now that you know this we're going
33643
25:03:39,119 --> 25:03:42,871
to head over to visual studio code and
33644
25:03:42,872 --> 25:03:47,680
here we are in our working folder the
33645
25:03:45,279 --> 25:03:50,319
current project is constructors with
33646
25:03:47,679 --> 25:03:52,159
inheritance we are going to grab the
33647
25:03:50,320 --> 25:03:54,480
code from the last lecture because
33648
25:03:52,160 --> 25:03:55,680
that's going to be our starting point
33649
25:03:59,831 --> 25:04:03,919
we are going to open this little guy in
33650
25:04:02,080 --> 25:04:06,320
visual studio code by dragging and
33651
25:04:03,919 --> 25:04:08,639
dropping here and this is going to give
33652
25:04:06,320 --> 25:04:11,040
us our starter code we're going to have
33653
25:04:08,639 --> 25:04:13,512
a person class an engineer class and a
33654
25:04:11,039 --> 25:04:15,511
civil engineer class and this is
33655
25:04:13,512 --> 25:04:18,639
basically going to set up the hierarchy
33656
25:04:15,512 --> 25:04:21,360
we have here and what we want to achieve
33657
25:04:18,639 --> 25:04:22,872
is to be able to call our own custom
33658
25:04:22,872 --> 25:04:27,512
when we build our object in layers
33659
25:04:25,512 --> 25:04:29,512
information is going to be coming from a
33660
25:04:29,512 --> 25:04:33,512
and we are going to initialize the
33661
25:04:31,600 --> 25:04:34,400
person part of us with relevant
33662
25:04:34,399 --> 25:04:38,639
we're going to initialize the engineer
33663
25:04:36,232 --> 25:04:40,480
part of us with relevant information and
33664
25:04:38,639 --> 25:04:42,960
we're going to initialize the civil
33665
25:04:40,479 --> 25:04:44,800
engineer part of us with relevant
33666
25:04:42,960 --> 25:04:47,760
information this is what we want to
33667
25:04:44,800 --> 25:04:50,160
achieve okay for that to work we need to
33668
25:04:47,759 --> 25:04:52,871
not call default constructors we want to
33669
25:04:50,160 --> 25:04:55,512
call actual constructors that are going
33670
25:04:52,872 --> 25:04:58,479
to grab the information and forward that
33671
25:04:55,512 --> 25:05:00,160
in our member variables for example in
33672
25:04:58,479 --> 25:05:01,919
person we have a constructor which is
33673
25:05:00,160 --> 25:05:03,192
going to take three pieces of
33674
25:05:03,191 --> 25:05:08,639
and it is going to pass this information
33675
25:05:05,600 --> 25:05:11,360
into our member variables we need to
33676
25:05:08,639 --> 25:05:14,831
apply a few changes here for example our
33677
25:05:11,360 --> 25:05:17,680
third parameter is passed as a cost
33678
25:05:14,831 --> 25:05:20,000
strength member type we are going to
33679
25:05:17,679 --> 25:05:22,319
change this to be std strength view
33680
25:05:20,000 --> 25:05:24,080
because this is going to save us
33681
25:05:24,080 --> 25:05:27,600
let's say string view here this is going
33682
25:05:27,600 --> 25:05:32,800
and this is going to forward information
33683
25:05:30,320 --> 25:05:36,640
in a way we want we're going to change
33684
25:05:32,800 --> 25:05:38,400
our third parameter to bhtd string view
33685
25:05:36,639 --> 25:05:41,360
let's say string view here we're going
33686
25:05:38,399 --> 25:05:44,551
to say std string view this is what we
33687
25:05:41,360 --> 25:05:46,960
have in our header we're going to be
33688
25:05:44,551 --> 25:05:48,551
having the same signature for our
33689
25:05:50,551 --> 25:05:57,440
we have m full name mh and we have m
33690
25:05:55,119 --> 25:05:59,679
address here let's try to build and see
33691
25:05:57,440 --> 25:06:02,400
if the error goes away sometimes visual
33692
25:05:59,679 --> 25:06:03,919
studio code is playing games on us
33693
25:06:02,399 --> 25:06:05,759
if we get a compiler error we're going
33694
25:06:03,919 --> 25:06:08,000
to try and fix that you see that it is
33695
25:06:05,759 --> 25:06:10,080
visual studio code playing with us the
33696
25:06:10,960 --> 25:06:15,440
we have our constructor for person it is
33697
25:06:13,191 --> 25:06:18,000
going to forward information using our
33698
25:06:15,440 --> 25:06:19,760
initializer list here we're going to
33699
25:06:19,759 --> 25:06:23,919
engineer class if we go there we're
33700
25:06:22,000 --> 25:06:26,000
going to see that we don't have any
33701
25:06:23,919 --> 25:06:29,279
constructor which is going to grab
33702
25:06:26,000 --> 25:06:31,919
information in any meaningful way and
33703
25:06:31,919 --> 25:06:37,039
so we are going to put in a constructor
33704
25:06:34,320 --> 25:06:40,400
that looks like the one we have in our
33705
25:06:37,039 --> 25:06:42,551
person class so we can just grab this i
33706
25:06:40,399 --> 25:06:44,231
like copy and pasting because that's
33707
25:06:44,232 --> 25:06:48,800
a few seconds so i am going to put my
33708
25:06:46,551 --> 25:06:50,551
constructor here only it is not going to
33709
25:06:48,800 --> 25:06:53,040
be called the person it is going to be
33710
25:06:50,551 --> 25:06:54,399
engineer and i am going to add a
33711
25:06:54,399 --> 25:06:59,599
member and this is going to be an
33712
25:06:56,551 --> 25:07:01,191
integer here to keep things simpler
33713
25:07:01,191 --> 25:07:06,551
implementation of this constructor in
33714
25:07:03,512 --> 25:07:08,160
our engineer class we can go down here
33715
25:07:06,551 --> 25:07:10,231
and put that in front of other
33716
25:07:08,160 --> 25:07:12,320
constructors let's look at the order we
33717
25:07:12,320 --> 25:07:17,600
header because i like to be consistent
33718
25:07:14,720 --> 25:07:19,680
the default constructor is first so
33719
25:07:17,600 --> 25:07:21,760
this constructor is going to be second
33720
25:07:19,679 --> 25:07:23,919
and we're going to say that it belongs
33721
25:07:23,919 --> 25:07:28,479
using a scope resolution operator here
33722
25:07:26,639 --> 25:07:30,232
and we are going to put in our
33723
25:07:30,232 --> 25:07:36,232
now what we want to do is to call
33724
25:07:33,831 --> 25:07:38,551
the constructor for person to initialize
33725
25:07:36,232 --> 25:07:40,000
a person part of us and then we're going
33726
25:07:38,551 --> 25:07:41,512
to grab the information from the
33727
25:07:40,000 --> 25:07:44,720
contract count and we're going to
33728
25:07:41,512 --> 25:07:45,919
forward that in our own member variable
33729
25:07:44,720 --> 25:07:47,360
the way we're going to achieve this
33730
25:07:45,919 --> 25:07:49,512
we're going to call the person
33731
25:07:47,360 --> 25:07:51,831
constructor and we're going to pass in
33732
25:07:49,512 --> 25:07:54,479
the full name we're going to pass the
33733
25:07:51,831 --> 25:07:56,871
age and we're going to pass the address
33734
25:07:54,479 --> 25:07:59,039
and then we're going to initialize our
33735
25:07:56,872 --> 25:08:00,872
own member variable which is contract
33736
25:08:00,872 --> 25:08:04,639
let's go to the header and look at that
33737
25:08:02,960 --> 25:08:06,232
we're going to see that our member
33738
25:08:04,639 --> 25:08:08,551
variable is contract count so we're
33739
25:08:06,232 --> 25:08:11,512
going to say contract count and we're
33740
25:08:08,551 --> 25:08:13,831
going to say contract count param we're
33741
25:08:11,512 --> 25:08:16,551
going to name this differently because
33742
25:08:13,831 --> 25:08:19,679
we don't want issues with naming here so
33743
25:08:16,551 --> 25:08:21,360
let's name our parameter here param
33744
25:08:19,679 --> 25:08:23,831
this is going to not confuse the
33745
25:08:21,360 --> 25:08:26,479
compiler and once we have this end we
33746
25:08:23,831 --> 25:08:28,080
can just put in the body which is going
33747
25:08:28,080 --> 25:08:32,800
initialization is now done in our
33748
25:08:32,800 --> 25:08:37,040
so if we do this we're going to see that
33749
25:08:34,960 --> 25:08:39,760
the compiler is going to be happy with
33750
25:08:37,039 --> 25:08:40,799
our thing here we're going to go down in
33751
25:08:43,279 --> 25:08:46,551
and we're going to grab the constructor
33752
25:08:45,039 --> 25:08:48,719
we have an engineer because we're going
33753
25:08:46,551 --> 25:08:51,191
to be using this as a starting point
33754
25:08:48,720 --> 25:08:52,800
we're going to copy it and go in our
33755
25:08:51,191 --> 25:08:54,080
civil engineer class we're going to see
33756
25:08:54,080 --> 25:08:58,831
constructor we're going to put this and
33757
25:08:56,639 --> 25:09:01,679
we're going to name this civil
33758
25:08:58,831 --> 25:09:03,831
engineer and we're going to add a
33759
25:09:03,831 --> 25:09:06,799
that we want to initialize so we're
33760
25:09:06,800 --> 25:09:10,639
std string view because we want to
33761
25:09:08,800 --> 25:09:13,600
forward string data we're going to say
33762
25:09:10,639 --> 25:09:16,960
std string view here and we're going to
33763
25:09:13,600 --> 25:09:18,800
say speciality and we are going to put
33764
25:09:18,800 --> 25:09:24,551
in our cpp file for a civil engineer
33765
25:09:22,479 --> 25:09:26,231
we're going to put this below our
33766
25:09:26,232 --> 25:09:31,512
let's grab this i lost the desk somehow
33767
25:09:31,512 --> 25:09:35,760
and we're going to paste down here
33768
25:09:34,000 --> 25:09:38,479
we're going to say that this constructor
33769
25:09:35,759 --> 25:09:40,831
belongs to the civil engineer class i'm
33770
25:09:38,479 --> 25:09:42,872
going to use our scope resolution
33771
25:09:40,831 --> 25:09:46,000
operator and after this we're going to
33772
25:09:42,872 --> 25:09:48,639
put our initializer list in civil
33773
25:09:46,000 --> 25:09:50,551
engineer we will call our engineer
33774
25:09:50,551 --> 25:09:56,000
and it is going to be taking four thanks
33775
25:09:53,512 --> 25:09:57,512
we're going to pass in the full name
33776
25:09:56,000 --> 25:09:59,600
we're going to pass in the age we're
33777
25:09:57,512 --> 25:10:01,832
going to pass in the address and we're
33778
25:09:59,600 --> 25:10:05,040
going to pass in the contract account
33779
25:10:01,831 --> 25:10:07,831
which we will get from our constructor
33780
25:10:05,039 --> 25:10:11,039
from civil engineer but we will also
33781
25:10:07,831 --> 25:10:12,639
initialize our specialty member
33782
25:10:11,039 --> 25:10:15,279
variables so we're going to say m
33783
25:10:12,639 --> 25:10:18,080
speciality and we're going to pass the
33784
25:10:18,080 --> 25:10:22,479
and this is going to initialize our then
33785
25:10:20,160 --> 25:10:24,720
we're going to put in an empty body and
33786
25:10:22,479 --> 25:10:28,959
our information is going to be properly
33787
25:10:24,720 --> 25:10:31,119
forwarded to our base classes so if we
33788
25:10:28,960 --> 25:10:32,960
build the civil engineer object proper
33789
25:10:31,119 --> 25:10:35,119
information is going to be forwarded to
33790
25:10:35,119 --> 25:10:40,639
and the proper information is going to
33791
25:10:37,039 --> 25:10:43,279
be forwarded to the person part of us
33792
25:10:40,639 --> 25:10:47,360
now that we have this in place we can
33793
25:10:43,279 --> 25:10:48,399
put in our htdc out statements to let us
33794
25:10:48,399 --> 25:10:53,439
which constructor was actually called to
33795
25:10:51,039 --> 25:10:56,319
build authen we're going to say that it
33796
25:10:53,440 --> 25:10:57,919
was our custom constructor that was
33797
25:10:56,320 --> 25:10:59,040
called let's say that here we're going
33798
25:10:59,039 --> 25:11:04,551
customer constructor called for civil
33799
25:11:01,279 --> 25:11:07,512
engineer we are going to go to our
33800
25:11:04,551 --> 25:11:11,039
engineer class and also say the same
33801
25:11:07,512 --> 25:11:13,512
thing let's go to this cpp file for that
33802
25:11:11,039 --> 25:11:15,360
and we're going to put in our htdc out
33803
25:11:13,512 --> 25:11:18,320
statement and we're going to say custom
33804
25:11:15,360 --> 25:11:21,600
constructor we can copy this to be
33805
25:11:18,320 --> 25:11:24,000
consistent with what we had in our
33806
25:11:21,600 --> 25:11:25,832
constructor default constructor i should
33807
25:11:24,000 --> 25:11:28,551
say and we're going to say custom
33808
25:11:25,831 --> 25:11:30,871
constructor called for our engineer
33809
25:11:28,551 --> 25:11:32,319
class we're going to go back to person
33810
25:11:30,872 --> 25:11:34,639
and we're going to go to the
33811
25:11:32,320 --> 25:11:36,720
implementation file and we're going to
33812
25:11:34,639 --> 25:11:38,720
copy the message from our default
33813
25:11:36,720 --> 25:11:41,680
constructor and we're going to put this
33814
25:11:38,720 --> 25:11:44,399
in and say that the custom constructor
33815
25:11:41,679 --> 25:11:46,871
was called for person here so now that
33816
25:11:44,399 --> 25:11:49,679
we have these guys in we can go to our
33817
25:11:46,872 --> 25:11:52,720
main cpp file and include the classes
33818
25:11:49,679 --> 25:11:55,119
they are included here we can try to
33819
25:11:52,720 --> 25:11:57,440
create a person object just like we saw
33820
25:11:55,119 --> 25:11:59,279
in the slides and we're going to try and
33821
25:11:57,440 --> 25:12:01,512
build this program and see which
33822
25:11:59,279 --> 25:12:03,039
constructor is called to set up this
33823
25:12:03,039 --> 25:12:08,719
this shouldn't be rocket science by now
33824
25:12:05,679 --> 25:12:10,551
we know that our custom constructor is
33825
25:12:08,720 --> 25:12:13,191
going to be called because we are
33826
25:12:10,551 --> 25:12:15,440
passing three parameters which should be
33827
25:12:13,191 --> 25:12:18,639
forwarded to our member variables
33828
25:12:15,440 --> 25:12:21,512
through this initializer last so let's
33829
25:12:18,639 --> 25:12:23,679
build with gcc and make sure this is
33830
25:12:21,512 --> 25:12:25,279
what we expect we're going to use our
33831
25:12:25,279 --> 25:12:30,551
the bolt is going to be good as you see
33832
25:12:27,440 --> 25:12:32,720
here and if we bring up our powershell
33833
25:12:30,551 --> 25:12:34,800
window and run rooster we're going to
33834
25:12:32,720 --> 25:12:37,600
see that our custom constructor is
33835
25:12:34,800 --> 25:12:40,080
called let's bring up the main cpp file
33836
25:12:37,600 --> 25:12:42,160
so that we can see our thing we are
33837
25:12:40,080 --> 25:12:44,400
passing this information here and we are
33838
25:12:42,160 --> 25:12:46,320
printing our person object and we're
33839
25:12:44,399 --> 25:12:49,759
going to see that the full name is jon
33840
25:12:46,320 --> 25:12:52,232
snow the age is 27 and the address is
33841
25:12:49,759 --> 25:12:54,639
winterfell called and all this gibberish
33842
25:12:52,232 --> 25:12:57,040
we have here our constructor is really
33843
25:12:54,639 --> 25:12:59,512
being called okay so this is working we
33844
25:12:57,039 --> 25:13:01,439
can also set up an engineer object and
33845
25:12:59,512 --> 25:13:04,720
see that the information is being
33846
25:13:01,440 --> 25:13:08,000
properly propagated to the person part
33847
25:13:04,720 --> 25:13:10,551
of our engineer object because engineer
33848
25:13:10,551 --> 25:13:15,039
we are passing the information for the
33849
25:13:12,479 --> 25:13:18,231
full name the age the address but we are
33850
25:13:15,039 --> 25:13:20,639
also passing in the contract count which
33851
25:13:18,232 --> 25:13:23,832
should be used to initialize the
33852
25:13:20,639 --> 25:13:26,720
engineer part of us so we are going to
33853
25:13:23,831 --> 25:13:28,231
run the task to build with gcc
33854
25:13:26,720 --> 25:13:31,040
the build is going to go through
33855
25:13:28,232 --> 25:13:33,192
successfully and we can bring up our
33856
25:13:31,039 --> 25:13:34,079
powershell window and run the program
33857
25:13:34,080 --> 25:13:38,320
we're going to see that we're going to
33858
25:13:36,000 --> 25:13:41,039
branch the information for person custom
33859
25:13:38,320 --> 25:13:43,600
constructor for person called but what
33860
25:13:41,039 --> 25:13:46,399
we really are interested in here
33861
25:13:43,600 --> 25:13:48,232
is seeing that the custom constructor
33862
25:13:48,232 --> 25:13:54,800
for building our engineer object and
33863
25:13:51,279 --> 25:13:57,119
then we call the engineer constructor
33864
25:13:54,800 --> 25:13:59,512
and again this falls in line with what
33865
25:13:57,119 --> 25:14:01,679
we saw in the last lecture the most
33866
25:13:59,512 --> 25:14:05,191
based constructor is called first and
33867
25:14:01,679 --> 25:14:07,191
then the must specialize constructor is
33868
25:14:05,191 --> 25:14:10,231
called last in this case we are just
33869
25:14:07,191 --> 25:14:13,599
setting up thanks in such a way that our
33870
25:14:10,232 --> 25:14:17,680
custom constructors are called and we do
33871
25:14:13,600 --> 25:14:21,440
that from our engineer class by calling
33872
25:14:17,679 --> 25:14:23,831
the base constructor explicitly
33873
25:14:21,440 --> 25:14:26,400
using the syntax that we have here in
33874
25:14:23,831 --> 25:14:28,639
our initializer list after we have the
33875
25:14:26,399 --> 25:14:31,511
base constructor called we are going to
33876
25:14:28,639 --> 25:14:33,191
initialize our own member variables and
33877
25:14:33,191 --> 25:14:37,759
and in this way the information for the
33878
25:14:35,600 --> 25:14:40,232
current class will be initialized
33879
25:14:37,759 --> 25:14:42,399
properly and this is what we see here i
33880
25:14:40,232 --> 25:14:44,480
think this is a little bit misleading
33881
25:14:42,399 --> 25:14:45,439
because we still have the information
33882
25:14:45,440 --> 25:14:50,872
the person objects that we bought
33883
25:14:47,911 --> 25:14:52,872
printed out here we can comment this out
33884
25:14:50,872 --> 25:14:55,279
and build again we're going to pass this
33885
25:14:52,872 --> 25:14:57,440
through gcc to build our program the
33886
25:14:55,279 --> 25:14:59,911
build is going to be good we can
33887
25:14:57,440 --> 25:15:01,512
clear and run rooster and we're going to
33888
25:14:59,911 --> 25:15:04,319
see that the custom constructor is
33889
25:15:01,512 --> 25:15:07,040
called for a person to set up the person
33890
25:15:04,320 --> 25:15:09,192
part of us and then another layer of
33891
25:15:07,039 --> 25:15:12,799
engineer is going to be set up in our
33892
25:15:09,191 --> 25:15:15,191
object to initialize the contract count
33893
25:15:12,800 --> 25:15:16,872
member variable part of us and we're
33894
25:15:15,191 --> 25:15:18,319
going to have the information here so if
33895
25:15:16,872 --> 25:15:20,232
we print the full name we're going to
33896
25:15:18,320 --> 25:15:22,552
get daniel gray the age is going to be
33897
25:15:20,232 --> 25:15:24,800
41. the address is going to be the
33898
25:15:22,551 --> 25:15:26,720
gibberish we expect here and the
33899
25:15:24,800 --> 25:15:29,279
contract count is going to be passed in
33900
25:15:26,720 --> 25:15:33,119
successfully and this is really cool we
33901
25:15:29,279 --> 25:15:36,160
can also comment this out and set up a
33902
25:15:33,119 --> 25:15:38,799
civil engineer object we can do that
33903
25:15:36,160 --> 25:15:40,552
okay so let's go down and put this in
33904
25:15:38,800 --> 25:15:43,192
place we're going to create a civil
33905
25:15:40,551 --> 25:15:45,831
engineer object we can close up
33906
25:15:43,191 --> 25:15:47,679
the left side bar here to have some more
33907
25:15:45,831 --> 25:15:49,511
breathing room we're going to build a
33908
25:15:47,679 --> 25:15:52,079
civil engineer object we're going to
33909
25:15:49,512 --> 25:15:55,360
pass in full name age address contract
33910
25:15:52,080 --> 25:15:59,040
count and a speciality which i think we
33911
25:15:55,360 --> 25:16:00,399
expect from our civil engineer custom
33912
25:16:00,399 --> 25:16:04,479
that's going to be an std strength
33913
25:16:02,551 --> 25:16:06,551
that's what we are passing in here i
33914
25:16:04,479 --> 25:16:09,759
should say that's going to be
33915
25:16:06,551 --> 25:16:12,319
a string view but we can pass in string
33916
25:16:09,759 --> 25:16:13,679
data just like this and the string view
33917
25:16:13,679 --> 25:16:17,191
so what we're going to see here we're
33918
25:16:15,360 --> 25:16:19,600
going to see the person constructor
33919
25:16:17,191 --> 25:16:21,911
called the person custom constructor i
33920
25:16:19,600 --> 25:16:24,800
should say we're going to see the
33921
25:16:21,911 --> 25:16:26,959
engineer custom constructor called and
33922
25:16:26,960 --> 25:16:31,760
the civil engineer custom constructor
33923
25:16:29,440 --> 25:16:32,872
called to pass and forward all this
33924
25:16:32,872 --> 25:16:39,040
in related parts of our civil engineer
33925
25:16:36,479 --> 25:16:41,831
object let's build and see that this is
33926
25:16:39,039 --> 25:16:43,360
actually going to even compile
33927
25:16:41,831 --> 25:16:44,799
the book is going to be good we can
33928
25:16:44,800 --> 25:16:49,040
and run rooster and we're going to see
33929
25:16:46,551 --> 25:16:50,872
that this is exactly what we expect the
33930
25:16:49,039 --> 25:16:53,119
custom constructor for person is going
33931
25:16:53,119 --> 25:16:57,512
the custom constructor for engineer is
33932
25:16:54,960 --> 25:17:00,000
going to be called and then the custom
33933
25:16:57,512 --> 25:17:01,512
constructor for a civil engineer is
33934
25:17:01,512 --> 25:17:06,080
and this really falls in line with what
33935
25:17:03,679 --> 25:17:08,871
we expect if we are building a civil
33936
25:17:06,080 --> 25:17:11,911
engineer object and the civil engineer
33937
25:17:08,872 --> 25:17:15,279
class happens to be inheriting both from
33938
25:17:11,911 --> 25:17:19,119
engineer and from person we're going to
33939
25:17:15,279 --> 25:17:20,872
have the person part of us world first
33940
25:17:19,119 --> 25:17:23,119
and because of this we're going to see
33941
25:17:20,872 --> 25:17:25,760
the person constructor called but in
33942
25:17:23,119 --> 25:17:28,159
this lecture the rio focus is getting
33943
25:17:25,759 --> 25:17:30,159
our custom constructor called so the
33944
25:17:28,160 --> 25:17:32,400
person custom constructor is going to be
33945
25:17:30,160 --> 25:17:34,720
called after that we're going to call
33946
25:17:32,399 --> 25:17:37,119
the custom constructor for the engineer
33947
25:17:34,720 --> 25:17:40,232
part of us and that's going to set up
33948
25:17:37,119 --> 25:17:42,959
the engineer specific member variables
33949
25:17:40,232 --> 25:17:45,512
in our object after that we're going to
33950
25:17:42,960 --> 25:17:48,232
set up another layer of civil engineer
33951
25:17:45,512 --> 25:17:50,160
in our object and this is going to
33952
25:17:48,232 --> 25:17:52,480
initialize the member variable that
33953
25:17:50,160 --> 25:17:55,512
belongs to the civil engineer
33954
25:17:52,479 --> 25:17:58,399
part of us in our object so this is
33955
25:17:55,512 --> 25:18:00,639
really the main goal in this lecture
33956
25:17:58,399 --> 25:18:03,439
showing you that you can set up fans in
33957
25:18:00,639 --> 25:18:06,399
such a way that your custom constructors
33958
25:18:03,440 --> 25:18:07,680
are called when setting up your object
33959
25:18:07,679 --> 25:18:12,639
as you see here okay now that we have
33960
25:18:10,160 --> 25:18:14,552
this working i want you to see that
33961
25:18:12,639 --> 25:18:16,551
there are some bad ways to do these
33962
25:18:14,551 --> 25:18:19,599
things and some people are actually
33963
25:18:16,551 --> 25:18:22,551
going to try to set things up in that
33964
25:18:19,600 --> 25:18:24,800
way the first bad way is to try and
33965
25:18:22,551 --> 25:18:27,599
initialize our member variables in the
33966
25:18:24,800 --> 25:18:30,551
body of the class if you do things like
33967
25:18:27,600 --> 25:18:32,800
this again this is going to work because
33968
25:18:30,551 --> 25:18:35,512
full name and age are going to be
33969
25:18:32,800 --> 25:18:38,080
inherited publicly from the person class
33970
25:18:35,512 --> 25:18:40,320
so the code here is going to work but we
33971
25:18:38,080 --> 25:18:42,872
have no way to initialize the address
33972
25:18:40,320 --> 25:18:45,440
member variable because it is private to
33973
25:18:42,872 --> 25:18:47,440
the person class so if we try to access
33974
25:18:45,440 --> 25:18:49,832
that we're going to get a compiler error
33975
25:18:47,440 --> 25:18:52,479
let's try this out in code and see the
33976
25:18:49,831 --> 25:18:54,959
actual compiler error to try this out i
33977
25:18:52,479 --> 25:18:57,759
am going to comment out the good code
33978
25:18:54,960 --> 25:18:59,360
here and i am going to copy and put in
33979
25:18:57,759 --> 25:19:02,231
something that is going to be
33980
25:18:59,360 --> 25:19:04,479
problematic as we saw in the slides i am
33981
25:19:02,232 --> 25:19:07,192
going to paste in my constructor here i
33982
25:19:04,479 --> 25:19:09,119
should close my powershell window here
33983
25:19:07,191 --> 25:19:11,360
and i am going to take out my
33984
25:19:09,119 --> 25:19:13,440
initializer lust because we're not going
33985
25:19:13,440 --> 25:19:19,512
and we're going to just grab the data
33986
25:19:15,600 --> 25:19:21,192
and use that to initialize our data in
33987
25:19:19,512 --> 25:19:23,512
our member variable here so we're going
33988
25:19:21,191 --> 25:19:26,639
to grab the full name and say m full
33989
25:19:23,512 --> 25:19:29,680
name equals full name we can do that
33990
25:19:26,639 --> 25:19:31,360
we're going to say mh equals h that's
33991
25:19:29,679 --> 25:19:34,159
the information we get we're going to
33992
25:19:31,360 --> 25:19:37,119
say m address and you see that we don't
33993
25:19:34,160 --> 25:19:38,720
even have that in autocomplete so we're
33994
25:19:37,119 --> 25:19:41,512
going to pass the address we're going to
33995
25:19:38,720 --> 25:19:43,600
be stubborn and ignore these squiggly
33996
25:19:41,512 --> 25:19:45,760
lines and we're going to say m
33997
25:19:43,600 --> 25:19:49,192
speciality and we're going to grab the
33998
25:19:45,759 --> 25:19:51,911
speciality and pass that in but you see
33999
25:19:49,191 --> 25:19:52,871
that line 26 has a bunch of squiggly
34000
25:19:52,872 --> 25:19:57,832
and the reason is the m address member
34001
25:19:55,440 --> 25:20:00,872
variable is invisible and not
34002
25:19:57,831 --> 25:20:03,119
manipulable from a civil engineer class
34003
25:20:00,872 --> 25:20:05,680
again the reason is that the address
34004
25:20:03,119 --> 25:20:08,799
member variable is private to the person
34005
25:20:05,679 --> 25:20:12,639
class so the civil engineer class has no
34006
25:20:08,800 --> 25:20:15,512
business initializing this in the body
34007
25:20:12,639 --> 25:20:18,232
this is not going to work so if we try
34008
25:20:15,512 --> 25:20:20,800
and build this we're going to pass this
34009
25:20:18,232 --> 25:20:22,960
through gcc we are going to see that the
34010
25:20:20,800 --> 25:20:25,680
world is going to finish with errors and
34011
25:20:22,960 --> 25:20:28,639
if we go up we're going to probably see
34012
25:20:25,679 --> 25:20:31,039
the error person m address is private
34013
25:20:28,639 --> 25:20:33,600
within this context and we have no
34014
25:20:31,039 --> 25:20:37,360
business accessing that in the civil
34015
25:20:33,600 --> 25:20:39,512
engineer cpp file at line 26 this is
34016
25:20:37,360 --> 25:20:41,512
what we see here and this is the
34017
25:20:39,512 --> 25:20:44,080
offending line we shouldn't really be
34018
25:20:41,512 --> 25:20:46,000
doing this if we comment out this line
34019
25:20:44,080 --> 25:20:48,000
this is going to work but our member
34020
25:20:48,000 --> 25:20:54,000
with a junk value and this is really not
34021
25:20:51,119 --> 25:20:55,191
good because our address that we worked
34022
25:20:55,191 --> 25:21:00,319
to set up in our parameter here is just
34023
25:20:57,679 --> 25:21:02,159
going to be ignored so this is bad you
34024
25:21:00,320 --> 25:21:04,400
shouldn't really be initializing your
34025
25:21:02,160 --> 25:21:07,360
member variables like this especially if
34026
25:21:04,399 --> 25:21:09,279
you have an inheritance hierarchy in
34027
25:21:07,360 --> 25:21:11,831
your classes so we're going to comment
34028
25:21:09,279 --> 25:21:13,911
this out and say that this is really bad
34029
25:21:11,831 --> 25:21:15,831
it's going to give you compiler errors
34030
25:21:13,911 --> 25:21:18,232
and some of you are going to say okay
34031
25:21:15,831 --> 25:21:21,360
this is not working but what if we try
34032
25:21:18,232 --> 25:21:23,760
to use an initializer list directly
34033
25:21:21,360 --> 25:21:25,360
let's see if that actually works
34034
25:21:25,360 --> 25:21:30,720
set up another constructor here and we
34035
25:21:27,911 --> 25:21:33,119
are going to set up the data in our
34036
25:21:30,720 --> 25:21:34,831
initializer list we're going to say
34037
25:21:34,831 --> 25:21:39,911
name and pass in the full name we can do
34038
25:21:37,759 --> 25:21:42,000
that let's try this out we're going to
34039
25:21:42,000 --> 25:21:48,080
and we're going to pass age we can do
34040
25:21:44,479 --> 25:21:50,551
that and we're going to grab the address
34041
25:21:48,080 --> 25:21:52,160
and we're going to pass an address here
34042
25:21:50,551 --> 25:21:54,231
and after that we're going to say m
34043
25:21:52,160 --> 25:21:56,639
spatiality and we're going to pass in
34044
25:21:56,639 --> 25:22:00,232
what if we do something like this but
34045
25:21:59,119 --> 25:22:02,159
you're going to see that we have
34046
25:22:00,232 --> 25:22:05,120
squiggly lines here and the problem with
34047
25:22:02,160 --> 25:22:08,639
this way of doing things is that the
34048
25:22:05,119 --> 25:22:10,799
civil engineer class has no business
34049
25:22:10,800 --> 25:22:17,192
that belong to the person class in the
34050
25:22:13,759 --> 25:22:19,439
initializer list your initializer list
34051
25:22:17,191 --> 25:22:21,759
only has the capability to initialize
34052
25:22:19,440 --> 25:22:25,680
the member variables that belong to the
34053
25:22:21,759 --> 25:22:28,080
current class and m full name mh and m
34054
25:22:25,679 --> 25:22:30,399
address don't belong to the cipher
34055
25:22:28,080 --> 25:22:32,479
engineer class that's why we're going to
34056
25:22:30,399 --> 25:22:34,871
have a compiler error if we try to set
34057
25:22:32,479 --> 25:22:37,039
up things in this way if we're trying to
34058
25:22:34,872 --> 25:22:39,680
build the program we're going to get a
34059
25:22:39,679 --> 25:22:43,439
we're going to see that the build is
34060
25:22:41,039 --> 25:22:46,479
going to finish with errors and it is
34061
25:22:43,440 --> 25:22:49,360
going to say expected initializer before
34062
25:22:49,360 --> 25:22:54,232
and we need a column column here sorry
34063
25:22:51,759 --> 25:22:56,399
for this so this is not the error we
34064
25:22:54,232 --> 25:22:58,720
expect but you see that the moment we do
34065
25:22:56,399 --> 25:23:02,000
this we have a bunch of squiggly lines
34066
25:22:58,720 --> 25:23:04,320
on full name age and address and let's
34067
25:23:02,000 --> 25:23:06,399
build and see the problem we have and
34068
25:23:04,320 --> 25:23:08,800
we're going to build with errors as we
34069
25:23:08,800 --> 25:23:13,832
we are going to see our errors civil
34070
25:23:11,360 --> 25:23:16,160
engineer does not have any field called
34071
25:23:13,831 --> 25:23:18,319
m full name we're going to see that
34072
25:23:16,160 --> 25:23:20,800
civil engineer doesn't have any field
34073
25:23:18,320 --> 25:23:24,320
called mh and civil engineer doesn't
34074
25:23:20,800 --> 25:23:27,192
have any field named m full name or m
34075
25:23:24,320 --> 25:23:29,440
address here that's the problem we have
34076
25:23:27,191 --> 25:23:32,319
no business initializing these member
34077
25:23:29,440 --> 25:23:34,551
variables that don't belong to the civil
34078
25:23:32,320 --> 25:23:37,120
engineer class in the first place so
34079
25:23:34,551 --> 25:23:39,191
this is also not going to work the best
34080
25:23:37,119 --> 25:23:42,231
bet we have already is to call the best
34081
25:23:39,191 --> 25:23:44,720
constructor and let that initialize the
34082
25:23:42,232 --> 25:23:46,480
member variables that belong to our
34083
25:23:46,479 --> 25:23:52,159
in the inheritance hierarchy for example
34084
25:23:49,831 --> 25:23:54,479
in our civil engineer constructor here
34085
25:23:54,479 --> 25:23:59,440
constructor to initialize the engineer
34086
25:23:57,759 --> 25:24:01,439
part of us and we're going to be
34087
25:23:59,440 --> 25:24:03,360
forwarding the information the full name
34088
25:24:01,440 --> 25:24:06,232
the age the address and the contract
34089
25:24:03,360 --> 25:24:08,551
account the engineer class is in turn
34090
25:24:06,232 --> 25:24:10,720
going to call its base constructor to
34091
25:24:08,551 --> 25:24:13,119
forward the information about the full
34092
25:24:10,720 --> 25:24:14,872
name of the agent the address and it is
34093
25:24:13,119 --> 25:24:17,191
going to initialize its own member
34094
25:24:14,872 --> 25:24:19,440
variable m construct count and the
34095
25:24:17,191 --> 25:24:21,599
information is going to be passed in
34096
25:24:19,440 --> 25:24:23,119
correctly and if we try to build our
34097
25:24:21,600 --> 25:24:25,512
class now we're going to see that
34098
25:24:23,119 --> 25:24:27,512
everything is going to work and i really
34099
25:24:25,512 --> 25:24:29,360
wanted you to be aware of this because
34100
25:24:27,512 --> 25:24:31,040
the moment you understand this you're
34101
25:24:29,360 --> 25:24:33,119
going to set up your inheritance
34102
25:24:31,039 --> 25:24:34,719
hierarchies in a way that is going to
34103
25:24:33,119 --> 25:24:37,759
make sense and you're not going to be
34104
25:24:34,720 --> 25:24:39,911
getting all these weird compiler errors
34105
25:24:37,759 --> 25:24:41,831
this is really all we set out to do in
34106
25:24:39,911 --> 25:24:45,279
this lecture showing you how you can set
34107
25:24:41,831 --> 25:24:48,159
up your own custom constructors in your
34108
25:24:45,279 --> 25:24:49,911
own inheritance hierarchy and at the
34109
25:24:48,160 --> 25:24:52,960
moment you do that you're going to get
34110
25:24:49,911 --> 25:24:54,959
your classes called in the order that
34111
25:24:52,960 --> 25:24:57,120
you expect things are going to be set up
34112
25:24:54,960 --> 25:24:59,040
in layers the base constructors are
34113
25:24:57,119 --> 25:25:01,119
going to be called in a way that you
34114
25:24:59,039 --> 25:25:03,511
expect and your objects are going to be
34115
25:25:01,119 --> 25:25:06,080
built in a way that you can print them
34116
25:25:03,512 --> 25:25:08,800
and see the information that you expect
34117
25:25:06,080 --> 25:25:10,872
set up in your object if you want you
34118
25:25:08,800 --> 25:25:13,360
can also use a debugger to see the
34119
25:25:10,872 --> 25:25:15,440
information in your thumb so we're going
34120
25:25:13,360 --> 25:25:17,680
to set up a breakpoint here and we're
34121
25:25:17,679 --> 25:25:21,599
debugging tab we're going to hit the
34122
25:25:19,512 --> 25:25:24,232
green button to start debugging this
34123
25:25:21,600 --> 25:25:26,480
program the binary is going to be set up
34124
25:25:24,232 --> 25:25:29,360
once the vote is good the binary is
34125
25:25:26,479 --> 25:25:31,599
going to be passed in our debugger and
34126
25:25:29,360 --> 25:25:34,232
we are going to hit our breakpoint in a
34127
25:25:31,600 --> 25:25:37,360
minute let's wait for this so we have
34128
25:25:34,232 --> 25:25:40,400
hit the break point at line 20 and if we
34129
25:25:37,360 --> 25:25:42,800
expand our civil engineer object in our
34130
25:25:40,399 --> 25:25:46,000
locals we're going to see that we have
34131
25:25:42,800 --> 25:25:48,551
an engineer part of us we can expand
34132
25:25:46,000 --> 25:25:49,831
that and see that we also have a person
34133
25:25:49,831 --> 25:25:54,720
if we look at person we're going to see
34134
25:25:51,512 --> 25:25:56,720
that the full name is we can see john
34135
25:25:54,720 --> 25:26:00,639
travolta which is what we are passing
34136
25:25:56,720 --> 25:26:03,040
here we can also look at our age the age
34137
25:26:03,039 --> 25:26:07,599
and we're going to also have information
34138
25:26:07,600 --> 25:26:13,279
if we expand this we're going to see
34139
25:26:09,679 --> 25:26:16,399
that the address is this gibb brush that
34140
25:26:19,039 --> 25:26:23,191
number 89 we can see this information
34141
25:26:21,360 --> 25:26:26,399
here and you can really expand and see
34142
25:26:23,191 --> 25:26:28,319
all these things that make up our object
34143
25:26:26,399 --> 25:26:30,959
for example we can see the information
34144
25:26:28,320 --> 25:26:33,120
about the contract count which is 31 and
34145
25:26:30,960 --> 25:26:35,832
it is what we are passing when we build
34146
25:26:33,119 --> 25:26:40,000
this object here and the speciality
34147
25:26:35,831 --> 25:26:42,000
happens to be road strength as we see in
34148
25:26:40,000 --> 25:26:44,639
our locals here you can really see all
34149
25:26:42,000 --> 25:26:46,551
these things we are going to stop here
34150
25:26:44,639 --> 25:26:49,360
in this lecture in the next one we're
34151
25:26:46,551 --> 25:26:53,119
going to explore how copy constructors
34152
25:26:49,360 --> 25:26:54,872
work in our inheritance hierarchy so go
34153
25:26:56,399 --> 25:27:01,439
in this lecture we want to explore how
34154
25:27:01,440 --> 25:27:07,040
with our inheritance hierarchies and we
34155
25:27:04,960 --> 25:27:09,440
will still be using the same example we
34156
25:27:07,039 --> 25:27:12,159
have been using in this chapter we will
34157
25:27:09,440 --> 25:27:14,639
have this inheritance hierarchy and we
34158
25:27:12,160 --> 25:27:17,040
will still be using the same example we
34159
25:27:14,639 --> 25:27:18,720
have been using in this chapter the base
34160
25:27:17,039 --> 25:27:21,119
class is going to be person we're going
34161
25:27:18,720 --> 25:27:24,232
to be inheriting from that publicly to
34162
25:27:21,119 --> 25:27:26,319
create an engineer class and we will be
34163
25:27:24,232 --> 25:27:28,800
inheriting from the engineer class
34164
25:27:26,320 --> 25:27:31,040
publicly to create the civil engineer
34165
25:27:28,800 --> 25:27:34,000
class and with this we want to be able
34166
25:27:31,039 --> 25:27:36,399
to copy construct objects and the code
34167
25:27:34,000 --> 25:27:38,872
we want to be running is something like
34168
25:27:36,399 --> 25:27:41,439
this we have an engineer object we want
34169
25:27:38,872 --> 25:27:44,160
to be able to create another object from
34170
25:27:41,440 --> 25:27:46,551
this engineer object using the syntax
34171
25:27:44,160 --> 25:27:48,872
here and from what we already know this
34172
25:27:46,551 --> 25:27:50,959
is going to call our copy constructor
34173
25:27:48,872 --> 25:27:53,120
the funny thing is this is going to work
34174
25:27:50,960 --> 25:27:55,360
by default even if you don't put in your
34175
25:27:53,119 --> 25:27:57,360
copy constructor the reason is the
34176
25:27:55,360 --> 25:27:59,512
compiler is going to insert a copy
34177
25:27:57,360 --> 25:28:01,831
constructor for you and things are going
34178
25:27:59,512 --> 25:28:05,832
to be copied in a way that you expect
34179
25:28:01,831 --> 25:28:08,399
because none of our classes is using
34180
25:28:05,831 --> 25:28:10,399
dynamic memory allocation so everything
34181
25:28:08,399 --> 25:28:12,399
is just going to fall in place and it is
34182
25:28:10,399 --> 25:28:14,319
going to work but if you happen to need
34183
25:28:12,399 --> 25:28:15,911
to set up your own copy constructor
34184
25:28:14,320 --> 25:28:17,680
we're going to see how you could do that
34185
25:28:15,911 --> 25:28:19,279
in this lecture and we're going to start
34186
25:28:17,679 --> 25:28:21,831
by the base class we're going to set up
34187
25:28:19,279 --> 25:28:24,551
a copy constructor for the person class
34188
25:28:21,831 --> 25:28:26,720
and this is nothing complicated we just
34189
25:28:24,551 --> 25:28:28,872
pass our parameter by reference this is
34190
25:28:26,720 --> 25:28:31,279
going to be our source object and we
34191
25:28:28,872 --> 25:28:33,680
will be copying the data from our source
34192
25:28:31,279 --> 25:28:36,232
object to initialize the member
34193
25:28:33,679 --> 25:28:39,119
variables in the current object that we
34194
25:28:36,232 --> 25:28:40,872
are copying here again this is a copy
34195
25:28:39,119 --> 25:28:43,119
constructor which will be copy
34196
25:28:40,872 --> 25:28:46,160
constructing from the parameter that we
34197
25:28:43,119 --> 25:28:49,599
pass by reference now how do we do the
34198
25:28:46,160 --> 25:28:52,080
constructor for the engineer class which
34199
25:28:49,600 --> 25:28:54,160
happens to be inheriting from person try
34200
25:28:52,080 --> 25:28:56,551
to think about that one way to do things
34201
25:28:54,160 --> 25:28:59,512
is to set up things like this and this
34202
25:28:56,551 --> 25:29:03,440
will be just initializing the engineer
34203
25:28:59,512 --> 25:29:06,080
layer of our class but nothing is going
34204
25:29:03,440 --> 25:29:07,760
to be initializing the person part of us
34205
25:29:06,080 --> 25:29:10,320
and this is bad this is going to call
34206
25:29:07,759 --> 25:29:12,720
the default constructor to initialize
34207
25:29:10,320 --> 25:29:15,760
the person part of us and we will just
34208
25:29:12,720 --> 25:29:17,680
be left in with junk data that is
34209
25:29:15,759 --> 25:29:20,799
initializing the person object by
34210
25:29:17,679 --> 25:29:23,279
default and all the data we have in our
34211
25:29:20,800 --> 25:29:26,160
parameter engineer object is just going
34212
25:29:23,279 --> 25:29:28,479
to be lost for the person part of us so
34213
25:29:26,160 --> 25:29:30,960
we don't want to do this this is bad
34214
25:29:28,479 --> 25:29:33,279
design you shouldn't do this some of you
34215
25:29:30,960 --> 25:29:35,192
are going to say but what if we call the
34216
25:29:33,279 --> 25:29:38,319
best constructor we have seen that we
34217
25:29:35,191 --> 25:29:40,871
could do that right but remember this is
34218
25:29:38,320 --> 25:29:42,640
a copy constructor what we have on the
34219
25:29:45,440 --> 25:29:49,832
if you set up a syntax like this with
34220
25:29:47,679 --> 25:29:52,159
the copy constructor the compiler is
34221
25:29:49,831 --> 25:29:55,119
going to set up a temporary person
34222
25:29:52,160 --> 25:29:57,911
object and a copy from that object to
34223
25:29:55,119 --> 25:30:00,319
initialize the person part of us so this
34224
25:29:57,911 --> 25:30:02,959
is going to be creating a temporary copy
34225
25:30:00,320 --> 25:30:06,400
object containing the same data we have
34226
25:30:02,960 --> 25:30:08,800
in our engineer object so to some extent
34227
25:30:06,399 --> 25:30:11,679
this is going to work but the problem we
34228
25:30:08,800 --> 25:30:14,400
still have is that we are using the m
34229
25:30:11,679 --> 25:30:16,871
address member variable directly from an
34230
25:30:14,399 --> 25:30:19,911
engineer object and from what we already
34231
25:30:16,872 --> 25:30:22,320
know this m address member variable is
34232
25:30:19,911 --> 25:30:24,639
private to the person class and we have
34233
25:30:24,639 --> 25:30:28,551
from an engineer construct so this is
34234
25:30:26,720 --> 25:30:31,040
going to give us a compiler error but
34235
25:30:28,551 --> 25:30:34,080
you know that it is possible to set up a
34236
25:30:31,039 --> 25:30:36,871
getter in the engineer class that is
34237
25:30:34,080 --> 25:30:38,960
going to return this address and you can
34238
25:30:36,872 --> 25:30:41,360
call that together here and get this
34239
25:30:38,960 --> 25:30:43,512
thing to initialize your data this is
34240
25:30:41,360 --> 25:30:45,600
going to work but this is really weird
34241
25:30:43,512 --> 25:30:47,279
you shouldn't do this this is bad design
34242
25:30:45,600 --> 25:30:49,360
there is a better way i am going to show
34243
25:30:47,279 --> 25:30:51,759
you but before we look at that wave
34244
25:30:49,360 --> 25:30:54,479
let's try and summarize the problems we
34245
25:30:51,759 --> 25:30:56,159
have with this way of doing things this
34246
25:30:54,479 --> 25:30:59,119
is not going to be reusing the copy
34247
25:30:56,160 --> 25:31:01,832
constructor we have worked hard to set
34248
25:30:59,119 --> 25:31:04,551
up in person so this is just going to be
34249
25:31:01,831 --> 25:31:07,279
called duplication another thing is that
34250
25:31:04,551 --> 25:31:10,080
the m address member variable is private
34251
25:31:07,279 --> 25:31:12,160
to person so if we try and use it like
34252
25:31:10,080 --> 25:31:15,360
this we're going to get a compiler error
34253
25:31:12,160 --> 25:31:17,680
again it is possible to set up a getter
34254
25:31:15,360 --> 25:31:20,160
that could return that and we could use
34255
25:31:17,679 --> 25:31:23,679
that getter in this place but this is
34256
25:31:20,160 --> 25:31:26,320
bad design we are really forced to set
34257
25:31:23,679 --> 25:31:28,319
up a getter that is possibly only used
34258
25:31:26,320 --> 25:31:30,480
in this place that's bad design we don't
34259
25:31:28,320 --> 25:31:32,232
want to do something like this another
34260
25:31:30,479 --> 25:31:35,191
thing is that this is going to create a
34261
25:31:32,232 --> 25:31:38,480
temporary copy of person from which we
34262
25:31:35,191 --> 25:31:40,799
will be copying to initialize the person
34263
25:31:38,479 --> 25:31:43,831
part of us we don't want to be making
34264
25:31:40,800 --> 25:31:46,000
that copy because we hate copies in c
34265
25:31:43,831 --> 25:31:48,319
plus plus code so the best way to do
34266
25:31:46,000 --> 25:31:51,039
this is to set up your copy constructor
34267
25:31:48,320 --> 25:31:54,480
in this way we are going to say person
34268
25:31:51,039 --> 25:31:56,799
and directly passing our engineer object
34269
25:31:54,479 --> 25:32:00,080
the compiler is smart enough to see that
34270
25:31:56,800 --> 25:32:03,040
we are passing an engineer object to
34271
25:32:00,080 --> 25:32:05,759
initialize a person object and what the
34272
25:32:03,039 --> 25:32:09,039
compiler is going to do is really smart
34273
25:32:05,759 --> 25:32:11,360
suppose our engineer object is made up
34274
25:32:09,039 --> 25:32:14,159
of two layers the inner layer is going
34275
25:32:11,360 --> 25:32:16,800
to be containing the information about
34276
25:32:14,160 --> 25:32:18,960
the person part of us and the outer
34277
25:32:16,800 --> 25:32:21,760
layer is going to be containing the
34278
25:32:18,960 --> 25:32:23,512
engineer part of us okay so this is the
34279
25:32:21,759 --> 25:32:25,039
setup we have so the compiler is going
34280
25:32:23,512 --> 25:32:27,512
to see that we are passing in an
34281
25:32:25,039 --> 25:32:29,679
engineer object to initialize a person
34282
25:32:27,512 --> 25:32:31,911
object and what it is going to do is
34283
25:32:29,679 --> 25:32:35,279
really smart it is going to strip off
34284
25:32:31,911 --> 25:32:37,119
all this engineer part if i can describe
34285
25:32:35,279 --> 25:32:39,279
it like this we're going to strip off
34286
25:32:39,279 --> 25:32:45,679
that we have in our engineer object and
34287
25:32:42,551 --> 25:32:48,639
we will be just left with the person
34288
25:32:45,679 --> 25:32:50,479
part that we passed then to initialize
34289
25:32:48,639 --> 25:32:52,872
our person object and this is really
34290
25:32:50,479 --> 25:32:55,191
smart and it is going to work so again
34291
25:32:52,872 --> 25:32:57,360
the syntax is what you see here
34292
25:32:55,191 --> 25:33:00,080
we say person we pass in our source
34293
25:32:57,360 --> 25:33:02,551
object and then we can initialize the
34294
25:33:00,080 --> 25:33:04,232
member variable that belong to the
34295
25:33:02,551 --> 25:33:06,479
engineer part of us we will be
34296
25:33:04,232 --> 25:33:08,000
initializing contract count and this is
34297
25:33:06,479 --> 25:33:09,512
going to work now that you know this
34298
25:33:08,000 --> 25:33:11,440
we're going to head over to visual
34299
25:33:09,512 --> 25:33:14,000
studio code and play with us a little
34300
25:33:11,440 --> 25:33:16,551
more here we are in our working folder
34301
25:33:14,000 --> 25:33:19,440
the current project is copy constructors
34302
25:33:16,551 --> 25:33:22,080
with inheritance we will be reusing the
34303
25:33:19,440 --> 25:33:24,160
code from the last lecture so we're
34304
25:33:22,080 --> 25:33:26,720
going to grab everything from that
34305
25:33:24,160 --> 25:33:30,080
except for the binary and we're going to
34306
25:33:26,720 --> 25:33:32,551
copy that and put that in our current
34307
25:33:30,080 --> 25:33:34,960
project let's do this and we are going
34308
25:33:32,551 --> 25:33:37,512
to open this bad boy in visual studio
34309
25:33:34,960 --> 25:33:40,160
code by dragging and dropping here and
34310
25:33:37,512 --> 25:33:42,720
we will have our starting point we will
34311
25:33:40,160 --> 25:33:46,080
have our person class the engineer class
34312
25:33:42,720 --> 25:33:49,191
and the civil engineer class and we will
34313
25:33:46,080 --> 25:33:51,279
just be doing public inheritance to make
34314
25:33:49,191 --> 25:33:54,080
things easier here so engineer is going
34315
25:33:51,279 --> 25:33:56,232
to publicly inherit from person and
34316
25:33:54,080 --> 25:33:58,872
civil engineer is going to publicly
34317
25:33:56,232 --> 25:34:00,960
inherit from engineer and this is
34318
25:33:58,872 --> 25:34:03,600
everything we had from the last lecture
34319
25:34:00,960 --> 25:34:06,639
nothing special but what we want is to
34320
25:34:03,600 --> 25:34:09,360
set up copy constructors in such a way
34321
25:34:06,639 --> 25:34:12,319
that we will be able to build objects
34322
25:34:09,360 --> 25:34:14,800
from others for example if we leave in
34323
25:34:12,320 --> 25:34:16,872
our engineer object i think this is what
34324
25:34:14,800 --> 25:34:19,832
we used in the slides we're going to
34325
25:34:19,831 --> 25:34:25,759
we want to be able to create a another
34326
25:34:23,119 --> 25:34:28,231
engineer let's say engineer two and
34327
25:34:25,759 --> 25:34:31,119
above that from engineer one the thing
34328
25:34:28,232 --> 25:34:32,960
that might be puzzling to some of you is
34329
25:34:31,119 --> 25:34:35,360
that this is going to work out of the
34330
25:34:32,960 --> 25:34:37,832
box even if we didn't really put in a
34331
25:34:35,360 --> 25:34:40,000
copy constructor but the thing is the
34332
25:34:37,831 --> 25:34:42,720
compiler is going to insert a copy
34333
25:34:40,000 --> 25:34:45,440
constructor for you but that constructor
34334
25:34:45,440 --> 25:34:50,232
copy so it is basically going to be
34335
25:34:47,600 --> 25:34:52,400
copying thanks memberwise it is going to
34336
25:34:50,232 --> 25:34:55,440
take the contract count from engineer
34337
25:34:52,399 --> 25:34:57,191
one and copy that into engineer two and
34338
25:34:55,440 --> 25:34:58,551
we are basically going to have the same
34339
25:34:58,551 --> 25:35:03,831
engineer one in engineer two let's try
34340
25:35:01,440 --> 25:35:06,400
and print engineer two can do that we're
34341
25:35:03,831 --> 25:35:09,511
going to say and two and we're going to
34342
25:35:06,399 --> 25:35:12,231
put this out and we are going to run the
34343
25:35:09,512 --> 25:35:14,000
task to build with gcc that's what we
34344
25:35:12,232 --> 25:35:16,552
want here and you're going to see that
34345
25:35:14,000 --> 25:35:19,039
it is going to work out of the box if we
34346
25:35:16,551 --> 25:35:21,440
bring up a powershell window and run
34347
25:35:19,039 --> 25:35:23,911
rooster we're going to see that we have
34348
25:35:21,440 --> 25:35:26,160
the data in here we have engineer full
34349
25:35:23,911 --> 25:35:28,479
name daniel gray that's the data we have
34350
25:35:26,160 --> 25:35:31,120
in engineer one but notice that we are
34351
25:35:28,479 --> 25:35:33,279
printing engineer two here the age is
34352
25:35:31,119 --> 25:35:35,831
going to be 41 and the address is going
34353
25:35:33,279 --> 25:35:37,831
to be exactly what we had in engineer
34354
25:35:35,831 --> 25:35:39,679
one and you're going to see that the
34355
25:35:37,831 --> 25:35:42,639
constructors are going to be called to
34356
25:35:39,679 --> 25:35:44,319
set up engineer 2 and the custom
34357
25:35:42,639 --> 25:35:46,160
constructor for a person is going to be
34358
25:35:44,320 --> 25:35:47,912
called the custom constructor for
34359
25:35:46,160 --> 25:35:49,192
engineer is going to be called and this
34360
25:35:49,191 --> 25:35:54,639
what we expect here but what if we want
34361
25:35:52,000 --> 25:35:57,119
to set up our own copy constructor and
34362
25:35:54,639 --> 25:35:59,759
the need to do that might arise
34363
25:35:57,119 --> 25:36:02,799
if we happen to be doing some dynamic
34364
25:35:59,759 --> 25:36:05,439
memory allocation in our classes suppose
34365
25:36:02,800 --> 25:36:07,680
maybe person class has some dynamic
34366
25:36:05,440 --> 25:36:09,832
memory allocation it has some pointer
34367
25:36:07,679 --> 25:36:12,399
member variable and in the personal
34368
25:36:09,831 --> 25:36:14,720
custom constructor we are doing some
34369
25:36:12,399 --> 25:36:16,799
dynamic memory allocation to initialize
34370
25:36:14,720 --> 25:36:19,119
that pointer we may be doing the same
34371
25:36:16,800 --> 25:36:21,512
thing at the engineer level or the civil
34372
25:36:19,119 --> 25:36:23,831
engineer level and that will force you
34373
25:36:21,512 --> 25:36:25,360
to set up your own copy constructor and
34374
25:36:23,831 --> 25:36:28,000
we're going to see how you could do that
34375
25:36:25,360 --> 25:36:29,831
in your classes we are going to start
34376
25:36:28,000 --> 25:36:32,872
with the person class we're going to go
34377
25:36:29,831 --> 25:36:35,599
on top and set up a copy constructor in
34378
25:36:32,872 --> 25:36:37,192
front of our destructor here we're going
34379
25:36:35,600 --> 25:36:40,080
to say person and we're going to say
34380
25:36:37,191 --> 25:36:42,159
const person reference source
34381
25:36:40,080 --> 25:36:44,080
this is the syntax you use to set up
34382
25:36:42,160 --> 25:36:46,872
your copy constructor you already know
34383
25:36:44,080 --> 25:36:48,639
this from a previous chapter and we're
34384
25:36:46,872 --> 25:36:51,760
going to put in the implementation for
34385
25:36:48,639 --> 25:36:54,872
this we're going to go in the cpp file
34386
25:36:51,759 --> 25:36:55,831
before the destructor or we should go
34387
25:36:55,831 --> 25:37:00,399
our custom constructor it doesn't really
34388
25:36:58,320 --> 25:37:02,800
matter where you put this and we're
34389
25:37:00,399 --> 25:37:05,191
going to put in our scope resolution
34390
25:37:02,800 --> 25:37:07,440
operator let's do person here and we
34391
25:37:05,191 --> 25:37:09,911
will just be copying the data from the
34392
25:37:07,440 --> 25:37:12,160
source person so we're going to put in
34393
25:37:09,911 --> 25:37:14,399
our initializer list and we're going to
34394
25:37:12,160 --> 25:37:16,160
say m full name we're going to grab the
34395
25:37:14,399 --> 25:37:18,720
name from the source person we're going
34396
25:37:16,160 --> 25:37:21,440
to say source m full name we're going to
34397
25:37:18,720 --> 25:37:23,911
initialize the age we're going to say mh
34398
25:37:21,440 --> 25:37:26,639
and we're going to grab the age from the
34399
25:37:26,639 --> 25:37:31,512
and we can go to the next line so that
34400
25:37:28,872 --> 25:37:34,160
we see the entire thing here and say m
34401
25:37:31,512 --> 25:37:36,800
address and we're going to say source
34402
25:37:34,160 --> 25:37:39,440
and say m address this is going to set
34403
25:37:36,800 --> 25:37:41,512
up our constructor and down below we can
34404
25:37:39,440 --> 25:37:43,600
put in our body this is going to work
34405
25:37:41,512 --> 25:37:46,000
but this is everything we have seen so
34406
25:37:43,600 --> 25:37:47,832
far this is nothing new the syntax to
34407
25:37:46,000 --> 25:37:50,639
set up your copy constructor you just
34408
25:37:47,831 --> 25:37:52,551
pass it by const reference if you don't
34409
25:37:50,639 --> 25:37:55,679
pass by reference here you're going to
34410
25:37:52,551 --> 25:37:56,639
get an endless chain of copy constructor
34411
25:37:56,639 --> 25:38:00,639
if this is confusing to you please go
34412
25:37:58,551 --> 25:38:03,440
back to the chapter on classes you're
34413
25:38:00,639 --> 25:38:05,679
going to see everything about this and
34414
25:38:03,440 --> 25:38:08,000
this is really all we need to do here to
34415
25:38:05,679 --> 25:38:10,479
have a copy constructor for a person now
34416
25:38:08,000 --> 25:38:13,191
let's do things at the engineer level
34417
25:38:10,479 --> 25:38:15,191
we're going to go to our engineer class
34418
25:38:13,191 --> 25:38:16,959
and we need to set up a copy constructor
34419
25:38:15,191 --> 25:38:19,440
the syntax is going to be the same we're
34420
25:38:16,960 --> 25:38:22,320
going to say engineer and we will be
34421
25:38:19,440 --> 25:38:24,400
constructing from a cost engineer object
34422
25:38:22,320 --> 25:38:27,440
we pass as a parameter here so we're
34423
25:38:24,399 --> 25:38:29,679
going to say cost engineer by reference
34424
25:38:27,440 --> 25:38:32,479
and say source and the problem is going
34425
25:38:29,679 --> 25:38:34,719
to be how we implement this thing we're
34426
25:38:32,479 --> 25:38:37,831
going to copy this and go in our
34427
25:38:34,720 --> 25:38:40,160
engineer cpp file we're going to put our
34428
25:38:37,831 --> 25:38:42,159
copy constructor after our customer
34429
25:38:40,160 --> 25:38:44,000
constructor and we're going to put in
34430
25:38:42,160 --> 25:38:46,000
our scope resolution operator we're
34431
25:38:44,000 --> 25:38:48,479
going to say engineer and we're going to
34432
25:38:46,000 --> 25:38:50,720
put in our body let's go below and put
34433
25:38:48,479 --> 25:38:53,440
that in if we do things like this this
34434
25:38:50,720 --> 25:38:55,911
is just going to initialize our engineer
34435
25:38:53,440 --> 25:38:58,479
with junk data we don't want that but
34436
25:38:55,911 --> 25:39:01,679
some of you might say uh-huh i don't
34437
25:38:58,479 --> 25:39:04,959
know how to call my base constructor but
34438
25:39:01,679 --> 25:39:07,359
at least i can initialize my contract
34439
25:39:04,960 --> 25:39:09,600
count okay let's go back and see if we
34440
25:39:07,360 --> 25:39:12,080
have this member variable here yes it is
34441
25:39:09,600 --> 25:39:14,552
called contract count we can say
34442
25:39:12,080 --> 25:39:17,119
contract count here and we are going to
34443
25:39:14,551 --> 25:39:19,279
initialize this with source contract
34444
25:39:17,119 --> 25:39:21,759
count this is going to work but this is
34445
25:39:19,279 --> 25:39:24,399
going to call the default constructor of
34446
25:39:21,759 --> 25:39:27,599
person to initialize the person part of
34447
25:39:24,399 --> 25:39:30,159
us and let's go back in our main cpp
34448
25:39:27,600 --> 25:39:32,232
file and see what we are using to try
34449
25:39:30,160 --> 25:39:34,872
things out we are building an engineer
34450
25:39:32,232 --> 25:39:37,512
object from another let's try this out
34451
25:39:34,872 --> 25:39:40,000
and see if our copy constructor is
34452
25:39:37,512 --> 25:39:42,800
called here so we're going to say custom
34453
25:39:40,000 --> 25:39:44,720
copy constructor called for engineer
34454
25:39:42,800 --> 25:39:46,551
we're going to put in the message and
34455
25:39:44,720 --> 25:39:49,119
we're going to say custom copy
34456
25:39:46,551 --> 25:39:51,759
constructor and we're going to build our
34457
25:39:49,119 --> 25:39:54,639
code let's build we're going to pass
34458
25:39:51,759 --> 25:39:57,039
this through gcc to see what happens the
34459
25:39:54,639 --> 25:39:58,872
build is going to be good and let's see
34460
25:39:57,039 --> 25:40:01,439
what happens we're going to clear and
34461
25:39:58,872 --> 25:40:03,192
run rooster we are going to see that the
34462
25:40:01,440 --> 25:40:05,119
constructors are going to be called to
34463
25:40:05,119 --> 25:40:10,000
but we see that the copy constructor for
34464
25:40:10,000 --> 25:40:14,080
and what i want to do to really make
34465
25:40:11,911 --> 25:40:16,319
this super clear is put a separator
34466
25:40:14,080 --> 25:40:18,160
between these two guys to really know
34467
25:40:16,320 --> 25:40:20,400
what is happening here i am going to put
34468
25:40:18,160 --> 25:40:22,552
in a bunch of dashes just like this i am
34469
25:40:20,399 --> 25:40:24,399
going to put in my new line character
34470
25:40:22,551 --> 25:40:26,319
and i am going to bolt again the bolt is
34471
25:40:24,399 --> 25:40:29,511
going to be good as you see here we can
34472
25:40:26,320 --> 25:40:31,680
clear and run rooster now we are going
34473
25:40:29,512 --> 25:40:34,320
to see that the default constructor for
34474
25:40:31,679 --> 25:40:37,511
person was called to set up the person
34475
25:40:34,320 --> 25:40:40,640
part of us in our engineer copy
34476
25:40:37,512 --> 25:40:43,600
constructor and the reason is we are not
34477
25:40:40,639 --> 25:40:46,399
doing anything to call the custom copy
34478
25:40:46,399 --> 25:40:50,871
and let's go back in person and make
34479
25:40:48,160 --> 25:40:52,400
sure we are printing proper information
34480
25:40:52,399 --> 25:40:57,279
when we get to do this right we are not
34481
25:40:54,639 --> 25:40:59,679
putting in any message here so we should
34482
25:40:57,279 --> 25:41:02,551
do that we are going to say custom
34483
25:40:59,679 --> 25:41:05,279
constructor or custom copy constructor
34484
25:41:02,551 --> 25:41:07,039
called for person but this is not called
34485
25:41:05,279 --> 25:41:08,959
you see that we are calling the default
34486
25:41:07,039 --> 25:41:12,079
constructor and this is going to
34487
25:41:08,960 --> 25:41:14,232
initialize our person part with junk
34488
25:41:12,080 --> 25:41:15,600
data if we print engineer two here
34489
25:41:14,232 --> 25:41:18,160
you're going to see that the full name
34490
25:41:15,600 --> 25:41:21,040
is none the edge is zero and the address
34491
25:41:18,160 --> 25:41:24,000
is none so we are basically getting the
34492
25:41:21,039 --> 25:41:25,911
default data we have in our person
34493
25:41:24,000 --> 25:41:27,191
object let's go back and really show you
34494
25:41:27,191 --> 25:41:31,279
default full name is going to be none
34495
25:41:29,440 --> 25:41:33,360
the default address is going to be none
34496
25:41:31,279 --> 25:41:36,399
of the edge is going to be 0 by default
34497
25:41:33,360 --> 25:41:38,872
and this is what we get because in our
34498
25:41:36,399 --> 25:41:42,159
copy constructor we're not doing
34499
25:41:38,872 --> 25:41:44,720
anything to get our customer constructor
34500
25:41:42,160 --> 25:41:46,720
in person to be called okay so this is
34501
25:41:44,720 --> 25:41:49,360
not going to work this is bad we don't
34502
25:41:46,720 --> 25:41:51,119
want to do something like this but let's
34503
25:41:49,360 --> 25:41:53,831
comment this out and show you another
34504
25:41:51,119 --> 25:41:56,319
way we might try to do things and we are
34505
25:41:53,831 --> 25:41:58,080
going to copy our copy constructor let's
34506
25:41:56,320 --> 25:42:00,232
go down and do this we're going to put
34507
25:41:58,080 --> 25:42:03,040
in another copy of this but we don't
34508
25:42:00,232 --> 25:42:04,800
want to just initialize our contract
34509
25:42:04,800 --> 25:42:09,120
instead we want to do something else
34510
25:42:07,119 --> 25:42:11,119
we're going to put a comma here and
34511
25:42:09,119 --> 25:42:13,119
we're going to say person some of you
34512
25:42:11,119 --> 25:42:16,000
might be thinking what if we call the
34513
25:42:13,119 --> 25:42:17,831
base constructor directly we can do
34514
25:42:16,000 --> 25:42:20,960
something like this we can say person
34515
25:42:17,831 --> 25:42:24,319
and we can say source m full name we can
34516
25:42:20,960 --> 25:42:27,120
do that we can say source mh and some of
34517
25:42:24,320 --> 25:42:29,912
you are going to say source m address
34518
25:42:27,119 --> 25:42:32,159
let's do that source m address and we're
34519
25:42:29,911 --> 25:42:35,360
going to build the person object and use
34520
25:42:32,160 --> 25:42:37,832
that to initialize the person part of us
34521
25:42:35,360 --> 25:42:40,720
we are basically going to be calling the
34522
25:42:37,831 --> 25:42:42,799
other person constructor that we have
34523
25:42:40,720 --> 25:42:44,872
which takes three parameters this
34524
25:42:42,800 --> 25:42:46,320
constructor here this is what we are
34525
25:42:46,320 --> 25:42:51,192
in our copy constructor but as we saw in
34526
25:42:49,512 --> 25:42:53,191
the slides this is going to have a bunch
34527
25:42:51,191 --> 25:42:55,759
of problems this is going to be creating
34528
25:42:53,191 --> 25:42:57,759
a temporary person object that we are
34529
25:42:55,759 --> 25:43:00,080
going to be copying from to set up the
34530
25:42:57,759 --> 25:43:01,599
person part of us but another problem we
34531
25:43:00,080 --> 25:43:03,831
have which is actually going to cause a
34532
25:43:01,600 --> 25:43:06,320
compiler error is that we don't have
34533
25:43:03,831 --> 25:43:08,551
access to the m address member variable
34534
25:43:06,320 --> 25:43:10,232
from an engineer constructor and this is
34535
25:43:08,551 --> 25:43:12,639
going to give us a compiler error let's
34536
25:43:10,232 --> 25:43:14,400
actually try and compile this program to
34537
25:43:12,639 --> 25:43:15,911
really show you this we are learning we
34538
25:43:15,911 --> 25:43:21,911
as many compiler errors as we can so the
34539
25:43:19,279 --> 25:43:24,399
world is finished with errors and if we
34540
25:43:21,911 --> 25:43:27,440
go up we're going to see that our error
34541
25:43:24,399 --> 25:43:30,000
is the m address member variable is
34542
25:43:27,440 --> 25:43:32,639
private to the person class and we have
34543
25:43:30,000 --> 25:43:35,831
no business accessing that in the
34544
25:43:32,639 --> 25:43:38,551
engineer cpp file at line 27 in our
34545
25:43:35,831 --> 25:43:41,439
constructor here and this is going to be
34546
25:43:38,551 --> 25:43:44,000
our offending line we can't do this one
34547
25:43:41,440 --> 25:43:46,000
could go in our person class and set up
34548
25:43:44,000 --> 25:43:48,960
a public getter method which is going to
34549
25:43:46,000 --> 25:43:50,872
be inherited by engineer and we could
34550
25:43:48,960 --> 25:43:53,120
call that to return the address let's
34551
25:43:50,872 --> 25:43:54,479
actually do that to show you that you
34552
25:43:54,479 --> 25:43:59,759
so we are going to go in and put in a
34553
25:43:58,000 --> 25:44:02,080
public method which is going to return
34554
25:43:59,759 --> 25:44:04,479
the address we actually have that here
34555
25:44:02,080 --> 25:44:06,800
so we can call that we can say
34556
25:44:04,479 --> 25:44:09,119
source get address this is going to work
34557
25:44:06,800 --> 25:44:11,600
this is going to set up our thumb
34558
25:44:09,119 --> 25:44:13,679
let's try to build because i think a
34559
25:44:11,600 --> 25:44:15,912
visual studio code is messing with us
34560
25:44:13,679 --> 25:44:18,159
here okay you see the both is good it is
34561
25:44:15,911 --> 25:44:20,800
visual studio code which wasn't
34562
25:44:18,160 --> 25:44:22,400
understanding our code here and if we
34563
25:44:20,800 --> 25:44:24,400
run our program we're going to see that
34564
25:44:22,399 --> 25:44:26,231
things are going to work exactly as we
34565
25:44:26,232 --> 25:44:30,320
run the program here we're going to
34566
25:44:27,759 --> 25:44:32,231
clear and run rooster we're going to see
34567
25:44:30,320 --> 25:44:34,960
that now the information is being
34568
25:44:32,232 --> 25:44:37,911
forwarded properly but we are setting up
34569
25:44:34,960 --> 25:44:39,440
a temporary person copy which we are
34570
25:44:39,440 --> 25:44:45,512
to then forward the data to the person
34571
25:44:42,080 --> 25:44:47,680
part of us this is not good design and
34572
25:44:45,512 --> 25:44:50,320
what we really want is the setup that is
34573
25:44:47,679 --> 25:44:53,119
going to allow us to call the copy
34574
25:44:50,320 --> 25:44:55,512
constructor that we worked hard to set
34575
25:44:53,119 --> 25:44:57,759
up in our base class here let's go back
34576
25:44:55,512 --> 25:44:59,600
to person and see that if we go up we're
34577
25:44:57,759 --> 25:45:01,759
going to see that we have a copy
34578
25:44:59,600 --> 25:45:04,160
constructor we really worked hard to set
34579
25:45:01,759 --> 25:45:06,639
up we wanted to reuse this in our
34580
25:45:04,160 --> 25:45:09,279
engineer class and that's what we're
34581
25:45:06,639 --> 25:45:11,279
going to see here so this is working but
34582
25:45:11,279 --> 25:45:16,551
and we should really try to reuse our
34583
25:45:14,000 --> 25:45:19,512
code as much as we can so what we're
34584
25:45:16,551 --> 25:45:21,599
going to do is set up a mechanism that
34585
25:45:19,512 --> 25:45:24,400
is going to reuse the copy constructor
34586
25:45:21,600 --> 25:45:26,960
we have in person and all we need to do
34587
25:45:24,399 --> 25:45:29,191
to get that to work we can say person
34588
25:45:26,960 --> 25:45:32,320
and then call the copy constructor of
34589
25:45:29,191 --> 25:45:35,039
person by directly passing in our source
34590
25:45:32,320 --> 25:45:37,440
object notice that we don't need to set
34591
25:45:35,039 --> 25:45:40,079
up a temporary person object we will
34592
25:45:37,440 --> 25:45:42,320
directly be copying from our engineer
34593
25:45:40,080 --> 25:45:45,440
object but this is going to do the
34594
25:45:42,320 --> 25:45:48,640
slicing we saw in the slides again if we
34595
25:45:45,440 --> 25:45:50,800
have two layers on our object the inner
34596
25:45:48,639 --> 25:45:54,232
layer is going to be the person part of
34597
25:45:50,800 --> 25:45:55,192
us and the outer green layer is going to
34598
25:45:57,512 --> 25:46:01,119
what the compiler is going to do the
34599
25:45:59,440 --> 25:46:02,960
compiler is going to see that we are
34600
25:46:03,679 --> 25:46:08,959
engineer object to initialize the person
34601
25:46:07,119 --> 25:46:11,440
part of us here and it is going to say
34602
25:46:08,960 --> 25:46:13,832
that we just need the red part we don't
34603
25:46:11,440 --> 25:46:16,232
need the green part here the compiler is
34604
25:46:13,831 --> 25:46:18,720
really smart so it is going to slice off
34605
25:46:21,831 --> 25:46:26,720
person part and it is going to use that
34606
25:46:24,160 --> 25:46:29,680
to initialize the person part of our
34607
25:46:26,720 --> 25:46:33,911
engineer object and this will be reusing
34608
25:46:29,679 --> 25:46:35,759
the copy constructor we have in our
34609
25:46:33,911 --> 25:46:38,800
person object then this is really cool
34610
25:46:35,759 --> 25:46:41,360
this is the optimal way to set up your
34611
25:46:38,800 --> 25:46:44,232
copical structures if you have an
34612
25:46:41,360 --> 25:46:46,000
inheritance hierarchy so let's try and
34613
25:46:44,232 --> 25:46:48,720
build the code again we're going to pass
34614
25:46:46,000 --> 25:46:50,479
this through gcc to see if this actually
34615
25:46:48,720 --> 25:46:52,720
works the bullet is going to be good we
34616
25:46:50,479 --> 25:46:54,551
can clear and run rooster we're going to
34617
25:46:52,720 --> 25:46:56,872
see that the copy constructor is going
34618
25:46:54,551 --> 25:46:59,440
to be called for person to set up the
34619
25:46:56,872 --> 25:47:01,279
person part of us and then the custom
34620
25:46:59,440 --> 25:47:03,600
copy constructor for engineer is going
34621
25:47:01,279 --> 25:47:06,319
to be called to set up the engineer part
34622
25:47:03,600 --> 25:47:08,480
of us and if we look at the information
34623
25:47:06,320 --> 25:47:10,232
we have in the main function you're
34624
25:47:08,479 --> 25:47:13,360
going to see that it is the same data
34625
25:47:10,232 --> 25:47:16,080
daniel gray for the full name ages 41
34626
25:47:13,360 --> 25:47:18,551
address is this gibberish here and the
34627
25:47:16,080 --> 25:47:21,279
contract count is 12 it is exactly what
34628
25:47:18,551 --> 25:47:23,679
we passed here and our copy constructor
34629
25:47:21,279 --> 25:47:27,039
is working now that we have this working
34630
25:47:23,679 --> 25:47:30,719
we can safely reuse the same ideas
34631
25:47:27,039 --> 25:47:33,679
in our civil engineer copy constructor
34632
25:47:30,720 --> 25:47:35,440
we can head over in our civil engineer
34633
25:47:33,679 --> 25:47:37,439
and set up the copy constructor so let's
34634
25:47:37,440 --> 25:47:43,191
close the left sidebar here so that we
34635
25:47:39,759 --> 25:47:46,159
see the entire thing we are going to say
34636
25:47:43,191 --> 25:47:47,911
civil engineer and we want to set up a
34637
25:47:46,160 --> 25:47:51,040
copy constructor so we're going to say
34638
25:47:47,911 --> 25:47:53,191
cast civil engineer here and we will be
34639
25:47:51,039 --> 25:47:55,911
passing this by reference we're going to
34640
25:47:53,191 --> 25:47:59,360
say source and we're going to put the
34641
25:47:55,911 --> 25:48:02,399
implementation of this in our cpp file
34642
25:47:59,360 --> 25:48:05,360
we can hop over there and go below our
34643
25:48:02,399 --> 25:48:06,720
custom constructor we can put in our
34644
25:48:05,360 --> 25:48:09,191
constructor here we're going to say
34645
25:48:06,720 --> 25:48:11,040
civil engineer and put in our scope
34646
25:48:09,191 --> 25:48:14,231
resolution operator and we're going to
34647
25:48:11,039 --> 25:48:16,159
go down and put in the body and in our
34648
25:48:14,232 --> 25:48:18,720
initializer list we're going to call the
34649
25:48:16,160 --> 25:48:21,760
copy constructor from engineer because
34650
25:48:18,720 --> 25:48:24,232
remember civil engineer is inheriting
34651
25:48:21,759 --> 25:48:27,039
from the engineer class so we are going
34652
25:48:24,232 --> 25:48:29,360
to call the engineer copy constructor
34653
25:48:27,039 --> 25:48:31,439
we're going to pass in source and again
34654
25:48:29,360 --> 25:48:35,039
this is going to slice off the civil
34655
25:48:31,440 --> 25:48:37,760
engineer port and only use the engineer
34656
25:48:35,039 --> 25:48:41,279
part of us to construct an engineer
34657
25:48:37,759 --> 25:48:44,159
object from this sliced of engineer
34658
25:48:41,279 --> 25:48:46,160
object we get from our copy constructor
34659
25:48:44,160 --> 25:48:49,760
here and this is really cool after that
34660
25:48:46,160 --> 25:48:52,872
we will initialize our contract count
34661
25:48:49,759 --> 25:48:55,279
member variable oh it is m speciality if
34662
25:48:52,872 --> 25:48:58,639
i remember correctly and we're going to
34663
25:48:55,279 --> 25:49:01,279
grab a source m speciality and we will
34664
25:48:58,639 --> 25:49:04,399
use that to initialize the civil
34665
25:49:01,279 --> 25:49:06,959
engineer part of us here let's go in and
34666
25:49:04,399 --> 25:49:09,191
say that the custom copy constructor is
34667
25:49:06,960 --> 25:49:11,600
being called here and we're going to say
34668
25:49:09,191 --> 25:49:14,319
custom copy constructor called for a
34669
25:49:11,600 --> 25:49:18,000
civil engineer what did we do here we
34670
25:49:14,320 --> 25:49:20,080
said engineer let's do engineer this is
34671
25:49:18,000 --> 25:49:23,360
what we want and we're going to say
34672
25:49:20,080 --> 25:49:25,911
engineer here properly sorry for this
34673
25:49:23,360 --> 25:49:28,232
but this is no big deal and now that we
34674
25:49:25,911 --> 25:49:30,959
have this in place we can actually build
34675
25:49:28,232 --> 25:49:32,800
civil engineer objects and copy
34676
25:49:32,800 --> 25:49:37,832
comment out the engineering stuff we
34677
25:49:34,800 --> 25:49:39,680
have and we can just put this in a black
34678
25:49:37,831 --> 25:49:42,479
comment and we're going to copy
34679
25:49:39,679 --> 25:49:44,551
construct civil engineers how cool is
34680
25:49:42,479 --> 25:49:46,872
that we're going to set up a civil
34681
25:49:46,872 --> 25:49:51,440
and this is going to be a civil engineer
34682
25:49:49,679 --> 25:49:53,039
and we're going to say daniel gray we're
34683
25:49:51,440 --> 25:49:55,440
going to put in all the data and we're
34684
25:49:53,039 --> 25:49:57,360
going to specify the speciality to be
34685
25:49:55,440 --> 25:49:59,279
road strength this is something i just
34686
25:49:59,279 --> 25:50:04,551
if this kind of speciality exists and we
34687
25:50:02,639 --> 25:50:07,831
will set up another civil engineer
34688
25:50:04,551 --> 25:50:10,319
object called n2 which we are going to
34689
25:50:07,831 --> 25:50:13,191
be copy constructing from and we will
34690
25:50:10,320 --> 25:50:15,680
see what happens when we copy construct
34691
25:50:13,191 --> 25:50:18,399
this thing here we should call our copy
34692
25:50:15,679 --> 25:50:21,439
constructor in civil engineer and the
34693
25:50:18,399 --> 25:50:23,279
things should propagate up all the way
34694
25:50:21,440 --> 25:50:25,760
to the person part of us and we're going
34695
25:50:23,279 --> 25:50:27,679
to see what happens let's build this
34696
25:50:25,759 --> 25:50:30,639
code we're going to pass this through
34697
25:50:27,679 --> 25:50:32,719
gcc as we always do the budget is going
34698
25:50:30,639 --> 25:50:35,039
to be good so this is good news we're
34699
25:50:32,720 --> 25:50:36,551
going to clear and run rooster and we're
34700
25:50:35,039 --> 25:50:38,719
going to see that the custom copy
34701
25:50:36,551 --> 25:50:40,399
constructor is called for person the
34702
25:50:38,720 --> 25:50:43,119
custom copy constructor is going to be
34703
25:50:40,399 --> 25:50:44,720
called for engineer and the custom copy
34704
25:50:43,119 --> 25:50:47,039
constructor is going to be called full
34705
25:50:44,720 --> 25:50:49,191
civil engineer and you see that things
34706
25:50:47,039 --> 25:50:51,439
are really propagating all the way to
34707
25:50:49,191 --> 25:50:53,679
the person part and we are calling and
34708
25:50:51,440 --> 25:50:55,360
reusing our copy constructors and this
34709
25:50:53,679 --> 25:50:57,119
is really cool if you go down you're
34710
25:50:55,360 --> 25:50:59,680
going to see that the information is
34711
25:50:57,119 --> 25:51:02,080
printed out correctly the full name is
34712
25:50:59,679 --> 25:51:05,119
daniel gray which we have in engineer
34713
25:51:02,080 --> 25:51:08,080
one the age is 41 the address is all
34714
25:51:05,119 --> 25:51:10,959
this gibberish the contract count is 12
34715
25:51:08,080 --> 25:51:12,080
and the speciality is road strength and
34716
25:51:12,080 --> 25:51:18,080
properly reusing our copy constructors
34717
25:51:15,191 --> 25:51:19,911
in our inheritance hierarchy this is
34718
25:51:18,080 --> 25:51:21,911
really all i had to share in this
34719
25:51:19,911 --> 25:51:24,720
lecture again the syntax you should be
34720
25:51:21,911 --> 25:51:26,959
using to set up your copy constructors
34721
25:51:24,720 --> 25:51:30,479
is what we see here this is going to be
34722
25:51:26,960 --> 25:51:33,360
reusing the code we have in our upper
34723
25:51:30,479 --> 25:51:35,759
classes in our hierarchy we will be
34724
25:51:33,360 --> 25:51:37,831
avoiding the temporary copies we saw
34725
25:51:35,759 --> 25:51:40,399
when we called the other constructor
34726
25:51:37,831 --> 25:51:43,360
directly and this is much cleaner it is
34727
25:51:40,399 --> 25:51:45,511
reusing code we have in other classes we
34728
25:51:43,360 --> 25:51:47,119
are going to stop here in this lecture
34729
25:51:45,512 --> 25:51:50,160
in the next one we're going to see that
34730
25:51:47,119 --> 25:51:52,871
it is actually possible to inherit base
34731
25:51:50,160 --> 25:51:55,120
constructors go ahead and finish up here
34732
25:51:52,872 --> 25:51:57,760
and meet me there in this lecture we're
34733
25:51:55,119 --> 25:52:00,871
going to explore the fact that we can
34734
25:51:57,759 --> 25:52:03,511
inherit base constructors and use them
34735
25:52:00,872 --> 25:52:05,360
in our derived classes we will build
34736
25:52:03,512 --> 25:52:07,440
we're using the same hierarchy we have
34737
25:52:05,360 --> 25:52:09,831
been using so we will have the person
34738
25:52:07,440 --> 25:52:12,479
class and we will be inheriting from
34739
25:52:09,831 --> 25:52:14,159
this person to create an engineer class
34740
25:52:12,479 --> 25:52:17,279
and that's what we're going to be using
34741
25:52:14,160 --> 25:52:20,160
to learn about this concept here so the
34742
25:52:17,279 --> 25:52:22,720
personal class is what we know from the
34743
25:52:20,160 --> 25:52:25,120
previous lectures we have a bunch of
34744
25:52:22,720 --> 25:52:27,680
member variables here we have the full
34745
25:52:25,119 --> 25:52:29,831
name the age and the address and we have
34746
25:52:27,679 --> 25:52:32,639
a bunch of constructors now we have a
34747
25:52:29,831 --> 25:52:35,439
default constructor a custom constructor
34748
25:52:32,639 --> 25:52:38,319
and a copy constructor that we set up
34749
25:52:35,440 --> 25:52:40,800
tirelessly in the last lecture now what
34750
25:52:38,320 --> 25:52:42,960
do we mean when we say that we can
34751
25:52:40,800 --> 25:52:45,279
inherit a constructor well based
34752
25:52:42,960 --> 25:52:48,160
constructors are not inherited by
34753
25:52:45,279 --> 25:52:51,512
default and what we mean by that is that
34754
25:52:48,160 --> 25:52:54,872
by default it is really not possible
34755
25:52:51,512 --> 25:52:58,000
to get derived classes to use base
34756
25:52:54,872 --> 25:53:00,232
constructors to set up things but it is
34757
25:52:58,000 --> 25:53:03,831
possible to tell the compiler to use the
34758
25:53:00,232 --> 25:53:06,800
base constructor to set up our own
34759
25:53:03,831 --> 25:53:08,799
objects for example we can put our
34760
25:53:08,800 --> 25:53:14,400
using person column column person this
34761
25:53:12,160 --> 25:53:17,600
is going to tell the compiler when
34762
25:53:14,399 --> 25:53:20,399
welding engineer objects don't use your
34763
25:53:17,600 --> 25:53:22,400
own constructor set up a base like a
34764
25:53:20,399 --> 25:53:25,759
constructor which is going to only
34765
25:53:22,399 --> 25:53:27,360
initialize the base member variables and
34766
25:53:25,759 --> 25:53:30,000
the compiler is going to see this
34767
25:53:27,360 --> 25:53:32,720
statement and it is going to generate a
34768
25:53:30,000 --> 25:53:35,039
constructor for you that looks something
34769
25:53:32,720 --> 25:53:36,720
like this so it is going to be engineer
34770
25:53:35,039 --> 25:53:39,360
it is going to be taking in the full
34771
25:53:36,720 --> 25:53:41,279
name the age and the address and it is
34772
25:53:39,360 --> 25:53:44,320
going to be forwarding the work to
34773
25:53:41,279 --> 25:53:46,720
initialize your object to the person
34774
25:53:44,320 --> 25:53:48,872
class and this is all this constructor
34775
25:53:46,720 --> 25:53:51,512
is going to do hopefully you can see
34776
25:53:48,872 --> 25:53:53,911
that this is called inheriting a base
34777
25:53:51,512 --> 25:53:57,191
constructor because all this constructor
34778
25:53:53,911 --> 25:54:00,000
is really doing is initializing the base
34779
25:53:57,191 --> 25:54:03,119
member variables it's not initializing
34780
25:54:00,000 --> 25:54:05,679
any member variable that belongs to the
34781
25:54:03,119 --> 25:54:07,360
engineer class so the engineer part of
34782
25:54:05,679 --> 25:54:10,479
us is going to be basically empty
34783
25:54:07,360 --> 25:54:12,960
containing junk data that we get by just
34784
25:54:10,479 --> 25:54:15,759
calling the default constructor and we
34785
25:54:12,960 --> 25:54:18,480
will only be initializing the data
34786
25:54:15,759 --> 25:54:20,959
belonging to the person part of us this
34787
25:54:18,479 --> 25:54:23,759
is really what i want you to see again
34788
25:54:20,960 --> 25:54:25,440
the syntax is what we see here
34789
25:54:23,759 --> 25:54:27,439
this is going to tell the compiler to
34790
25:54:25,440 --> 25:54:30,232
generate a constructor that is only
34791
25:54:27,440 --> 25:54:32,639
going to initialize the base member
34792
25:54:30,232 --> 25:54:36,232
variables but this constructor will be
34793
25:54:32,639 --> 25:54:37,191
callable and usable from the engineer
34794
25:54:37,191 --> 25:54:43,191
okay so this is really what we mean
34795
25:54:39,512 --> 25:54:45,119
by inheriting constructors one thing you
34796
25:54:43,191 --> 25:54:47,191
should know is that the constructor is
34797
25:54:45,119 --> 25:54:48,231
going to be inherited with whatever
34798
25:54:48,232 --> 25:54:54,080
specifier it had in the base class so if
34799
25:54:51,440 --> 25:54:56,000
our constructor was in the public scope
34800
25:54:54,080 --> 25:54:58,479
it's going to be inherited with public
34801
25:54:56,000 --> 25:55:01,279
access so we will be able to use it from
34802
25:54:58,479 --> 25:55:03,360
the outside and world engineer objects
34803
25:55:01,279 --> 25:55:05,759
if it was in a protected scope we want
34804
25:55:03,360 --> 25:55:08,080
to be able to use it from the outside if
34805
25:55:05,759 --> 25:55:10,159
it was private we won't even be able to
34806
25:55:08,080 --> 25:55:12,400
use it from a derived class you should
34807
25:55:10,160 --> 25:55:15,279
really know that so it is going to be
34808
25:55:12,399 --> 25:55:18,639
inherited with whatever access specifier
34809
25:55:15,279 --> 25:55:20,872
we had in our base class now that we
34810
25:55:18,639 --> 25:55:23,279
know this let's see some things you
34811
25:55:20,872 --> 25:55:25,760
should really be careful about the first
34812
25:55:23,279 --> 25:55:28,232
is that copy constructors are not
34813
25:55:25,759 --> 25:55:30,319
inheritable if you try to do that you're
34814
25:55:28,232 --> 25:55:32,400
going to get a compiler error but you
34815
25:55:30,320 --> 25:55:34,400
won't usually notice this because the
34816
25:55:32,399 --> 25:55:36,399
compiler is going to insert copy
34817
25:55:34,399 --> 25:55:38,159
constructors for you anyway this is
34818
25:55:36,399 --> 25:55:40,959
going to become a problem if you are
34819
25:55:38,160 --> 25:55:42,960
doing some dynamic memory allocation and
34820
25:55:40,960 --> 25:55:44,960
you're going to get pointers copied this
34821
25:55:42,960 --> 25:55:47,040
is really bad if you don't know about
34822
25:55:44,960 --> 25:55:49,360
this please go back to the chapter on
34823
25:55:47,039 --> 25:55:51,759
classes and you're going to see all the
34824
25:55:49,360 --> 25:55:53,911
story about shallow copying and deep
34825
25:55:51,759 --> 25:55:55,911
copying we talked about these things
34826
25:55:53,911 --> 25:55:58,160
another thing you should know is that
34827
25:55:55,911 --> 25:56:00,399
inherited constructors are really based
34828
25:55:58,160 --> 25:56:03,512
constructors and what we mean by this is
34829
25:56:00,399 --> 25:56:05,911
that they will only be initializing the
34830
25:56:03,512 --> 25:56:07,911
base member variables because they are
34831
25:56:05,911 --> 25:56:10,399
based constructors they have no
34832
25:56:07,911 --> 25:56:12,800
knowledge of derived member variables
34833
25:56:10,399 --> 25:56:14,959
that's why they only initialize base
34834
25:56:12,800 --> 25:56:17,279
member variables again as we said the
34835
25:56:14,960 --> 25:56:19,512
constructors are inherited with whatever
34836
25:56:17,279 --> 25:56:21,679
access specifier they had in the base
34837
25:56:19,512 --> 25:56:25,279
class and it is possible to set up your
34838
25:56:21,679 --> 25:56:27,191
own constructors on top of the inherited
34839
25:56:25,279 --> 25:56:28,872
constructors and you can use these
34840
25:56:27,191 --> 25:56:30,551
things another thing i should really
34841
25:56:28,872 --> 25:56:32,720
tell you is that inheritance
34842
25:56:30,551 --> 25:56:34,959
constructors is going to make your code
34843
25:56:32,720 --> 25:56:37,600
really confusing it is a technical
34844
25:56:34,960 --> 25:56:40,000
possibility but i strongly advise
34845
25:56:37,600 --> 25:56:41,912
against using this in your code because
34846
25:56:40,000 --> 25:56:43,600
it is just going to confuse people
34847
25:56:41,911 --> 25:56:45,599
people are going to see for example an
34848
25:56:43,600 --> 25:56:47,912
engineer constructor and they are going
34849
25:56:45,600 --> 25:56:50,552
to think that that constructor is going
34850
25:56:47,911 --> 25:56:52,872
to even initializing the engineer member
34851
25:56:50,551 --> 25:56:55,279
variables but it's not going to do that
34852
25:56:52,872 --> 25:56:57,600
because it is a base constructor it's
34853
25:56:55,279 --> 25:56:59,831
only going to be initializing the base
34854
25:56:57,600 --> 25:57:02,160
member variables and that may lead to
34855
25:56:59,831 --> 25:57:04,551
some confusion or even really bad
34856
25:57:02,160 --> 25:57:06,000
problems in your code so don't use this
34857
25:57:04,551 --> 25:57:08,551
it is just going to make things
34858
25:57:06,000 --> 25:57:11,279
confusing but i wanted you to be aware
34859
25:57:08,551 --> 25:57:14,231
of this and if you see this kind of
34860
25:57:11,279 --> 25:57:16,160
setup in classes out there you will know
34861
25:57:14,232 --> 25:57:18,720
what they mean this is just going to
34862
25:57:16,160 --> 25:57:20,872
inherit a base constructor and use it to
34863
25:57:18,720 --> 25:57:22,320
build objects now that we know this
34864
25:57:20,872 --> 25:57:23,911
we're going to head over to visual
34865
25:57:22,320 --> 25:57:26,960
studio code and play with us a little
34866
25:57:23,911 --> 25:57:30,232
more here we are in our working folder
34867
25:57:26,960 --> 25:57:33,120
the current project is inheriting based
34868
25:57:30,232 --> 25:57:35,440
constructors we are going to steal code
34869
25:57:33,119 --> 25:57:38,399
from the last lecture and we will be
34870
25:57:35,440 --> 25:57:40,800
using the main cpp file the person class
34871
25:57:38,399 --> 25:57:43,511
and the engineer class this is just
34872
25:57:40,800 --> 25:57:45,512
going to be enough for our purposes here
34873
25:57:43,512 --> 25:57:48,320
we're going to go back in our current
34874
25:57:45,512 --> 25:57:50,479
project and we're going to put this in
34875
25:57:48,320 --> 25:57:52,552
and we will open this in visual studio
34876
25:57:50,479 --> 25:57:54,551
code by dragging and dropping here this
34877
25:57:52,551 --> 25:57:56,800
is going to give us our thumb
34878
25:57:54,551 --> 25:57:59,512
and let's go to person and see that we
34879
25:57:56,800 --> 25:58:01,360
have our constructors and we have a
34880
25:57:59,512 --> 25:58:03,512
default constructor we have a custom
34881
25:58:01,360 --> 25:58:05,512
constructor and we have a copy
34882
25:58:03,512 --> 25:58:08,400
constructor one thing you should know is
34883
25:58:05,512 --> 25:58:10,479
that copy constructors are not inherited
34884
25:58:08,399 --> 25:58:12,871
so you will need to set up your copy
34885
25:58:10,479 --> 25:58:14,959
constructors explicitly if you want to
34886
25:58:12,872 --> 25:58:16,800
use them know that they want to be
34887
25:58:14,960 --> 25:58:18,872
coming from the upstream class you
34888
25:58:16,800 --> 25:58:21,600
should know that okay so this is the
34889
25:58:18,872 --> 25:58:23,600
message here now let's look at our
34890
25:58:21,600 --> 25:58:26,639
engineer class the engineer class is
34891
25:58:23,600 --> 25:58:30,000
publicly inheriting from person and it
34892
25:58:26,639 --> 25:58:32,479
has a bunch of its own constructors but
34893
25:58:30,000 --> 25:58:35,512
what we want to do is to take out all
34894
25:58:32,479 --> 25:58:38,639
these constructors and we're going to
34895
25:58:35,512 --> 25:58:40,320
take them out i think we can uh yeah
34896
25:58:38,639 --> 25:58:42,639
we're going to take them out let's do
34897
25:58:40,320 --> 25:58:44,800
that and we're going to go in our cpp
34898
25:58:42,639 --> 25:58:46,800
file and also take out all these
34899
25:58:44,800 --> 25:58:48,639
constructors here we're going to comment
34900
25:58:46,800 --> 25:58:50,720
them out i think we can take out all
34901
25:58:48,639 --> 25:58:53,039
these bad code we got from previous
34902
25:58:50,720 --> 25:58:55,600
lectures and we're going to just comment
34903
25:58:53,039 --> 25:58:58,719
out our constructors we're going to
34904
25:58:55,600 --> 25:59:01,832
close them all with a blog comment and
34905
25:58:58,720 --> 25:59:02,720
what we are going to do in our class is
34906
25:59:02,720 --> 25:59:07,360
using person person we're going to say
34907
25:59:04,639 --> 25:59:10,399
using person person this is going to
34908
25:59:07,360 --> 25:59:12,551
inherit the constructors from person and
34909
25:59:10,399 --> 25:59:14,639
now that we have this in place the
34910
25:59:12,551 --> 25:59:17,759
compiler is really going to generate a
34911
25:59:14,639 --> 25:59:19,759
base like constructor in our engineer
34912
25:59:17,759 --> 25:59:22,080
class in other words we're going to have
34913
25:59:19,759 --> 25:59:24,799
a default engineer constructor which is
34914
25:59:22,080 --> 25:59:27,040
just going to not initialize anything we
34915
25:59:24,800 --> 25:59:29,192
are going to have a custom constructor
34916
25:59:27,039 --> 25:59:31,039
which is going to take three parameters
34917
25:59:29,191 --> 25:59:33,039
but it is going to be an engineer
34918
25:59:31,039 --> 25:59:35,911
constructor and let's prove this we're
34919
25:59:33,039 --> 25:59:37,439
going to go in our main cpp file and
34920
25:59:35,911 --> 25:59:40,000
we're going to take out everything we
34921
25:59:37,440 --> 25:59:41,911
have here and we don't have a civil
34922
25:59:40,000 --> 25:59:44,080
engineer file so we shouldn't really
34923
25:59:41,911 --> 25:59:46,872
include that and we are going to create
34924
25:59:44,080 --> 25:59:48,872
an engineer object we can say and one
34925
25:59:46,872 --> 25:59:50,320
using the default constructor we can try
34926
25:59:48,872 --> 25:59:53,360
and print that out and you're going to
34927
25:59:50,320 --> 25:59:55,120
see that this code seems to work in
34928
25:59:53,360 --> 25:59:56,800
visual studio code we can try and build
34929
25:59:55,119 --> 26:00:00,000
this we're going to pass this through
34930
26:00:00,000 --> 26:00:04,320
set up a powershell window we can use to
34931
26:00:04,320 --> 26:00:08,160
and we're going to see that the default
34932
26:00:06,000 --> 26:00:10,232
constructor for person was called to
34933
26:00:10,232 --> 26:00:15,512
and the data is really junk data we have
34934
26:00:12,800 --> 26:00:18,639
in person so what the compiler is really
34935
26:00:15,512 --> 26:00:21,440
doing behind the scenes is to generate a
34936
26:00:18,639 --> 26:00:23,679
bezel-like constructor at the engineer
34937
26:00:21,440 --> 26:00:25,680
level and it is going to call the base
34938
26:00:23,679 --> 26:00:28,959
constructor to initialize the person
34939
26:00:25,679 --> 26:00:31,039
part of us so the data is just going to
34940
26:00:28,960 --> 26:00:32,480
be junk data we have in person and
34941
26:00:31,039 --> 26:00:34,551
you're going to see that the contract
34942
26:00:32,479 --> 26:00:36,639
count is going to be zero this is just a
34943
26:00:34,551 --> 26:00:38,800
default constructor which is just going
34944
26:00:36,639 --> 26:00:41,279
to grab whatever default data we have in
34945
26:00:38,800 --> 26:00:43,600
our object you see the contract count is
34946
26:00:41,279 --> 26:00:46,399
zero if we go back in person we're going
34947
26:00:43,600 --> 26:00:48,720
to see that the full name is none which
34948
26:00:46,399 --> 26:00:50,799
is what we see here the age is zero and
34949
26:00:48,720 --> 26:00:53,512
the address is none this is a default
34950
26:00:50,800 --> 26:00:55,360
constructor but we can even explicitly
34951
26:00:53,512 --> 26:00:57,279
pass in the data and that's going to
34952
26:00:55,360 --> 26:00:58,639
also work so we can pass in the full
34953
26:00:58,639 --> 26:01:03,600
daniel gray we can pass in the edge to
34954
26:01:00,872 --> 26:01:05,360
b23 for example and we can pass in a
34955
26:01:03,600 --> 26:01:07,440
junk address let's say something like
34956
26:01:05,360 --> 26:01:10,551
this and you see that this is going to
34957
26:01:07,440 --> 26:01:11,911
work even if we don't have any engineer
34958
26:01:11,911 --> 26:01:15,512
that takes three parameters let's go
34959
26:01:13,911 --> 26:01:18,800
back and you're going to see that all
34960
26:01:15,512 --> 26:01:20,639
our constructors are commented out but
34961
26:01:18,800 --> 26:01:23,360
this is working because we told the
34962
26:01:23,360 --> 26:01:30,080
a base like constructor for our engineer
34963
26:01:27,039 --> 26:01:33,191
so it is going to also have in
34964
26:01:30,080 --> 26:01:35,831
an engineer constructor that looks like
34965
26:01:33,191 --> 26:01:38,399
this constructor here which takes in
34966
26:01:35,831 --> 26:01:40,551
three parameters and this is really cool
34967
26:01:38,399 --> 26:01:42,079
and this is really crucial to understand
34968
26:01:40,551 --> 26:01:44,479
so again we are going to set up a
34969
26:01:42,080 --> 26:01:46,639
constructor for engineer so it is going
34970
26:01:44,479 --> 26:01:49,679
to be an engineer constructor but it is
34971
26:01:46,639 --> 26:01:51,759
going to be taking three parameters just
34972
26:01:49,679 --> 26:01:53,759
like the person constructor here and
34973
26:01:51,759 --> 26:01:55,831
this is the message i really want to
34974
26:01:53,759 --> 26:01:57,191
convey here so if we run this code
34975
26:01:55,831 --> 26:02:00,000
you're going to see that it is going to
34976
26:01:57,191 --> 26:02:02,231
work it is going to call our baseline
34977
26:02:00,000 --> 26:02:04,399
constructor for engineer and we're going
34978
26:02:02,232 --> 26:02:06,080
to have the data forwarded and but
34979
26:02:04,399 --> 26:02:08,231
you're going to see that the contract
34980
26:02:06,080 --> 26:02:10,400
count is not going to be taken into
34981
26:02:08,232 --> 26:02:13,040
account so it is going to still contain
34982
26:02:10,399 --> 26:02:15,119
some default data if we try and pass
34983
26:02:13,039 --> 26:02:16,871
that in we're going to see that we're
34984
26:02:15,119 --> 26:02:19,440
going to get a compiler error because
34985
26:02:16,872 --> 26:02:21,600
now we have no such constructor that
34986
26:02:19,440 --> 26:02:24,639
takes four parameters the only one we
34987
26:02:21,600 --> 26:02:26,872
have is one that is generated because of
34988
26:02:24,639 --> 26:02:29,759
this statement here and this is going to
34989
26:02:26,872 --> 26:02:32,639
be a baseline constructor which is just
34990
26:02:29,759 --> 26:02:34,871
going to take three parameters just like
34991
26:02:32,639 --> 26:02:37,831
this constructor here and another thing
34992
26:02:34,872 --> 26:02:39,680
i don't think i made clear enough is
34993
26:02:37,831 --> 26:02:41,831
that this is going to bring in all the
34994
26:02:39,679 --> 26:02:44,159
constructors you have notice that we
34995
26:02:41,831 --> 26:02:46,479
just put in this statement but it is
34996
26:02:44,160 --> 26:02:49,760
going to grab all these constructors we
34997
26:02:46,479 --> 26:02:52,399
have except for the copy constructors
34998
26:02:49,759 --> 26:02:54,399
which are not inherited in c plus plus
34999
26:02:52,399 --> 26:02:55,679
so you should really know this if we
35000
26:02:54,399 --> 26:02:58,000
build this code we're going to get a
35001
26:02:55,679 --> 26:02:59,279
compiler error because the compiler
35002
26:02:59,279 --> 26:03:04,080
what to do with the 45 parameter that we
35003
26:03:01,911 --> 26:03:05,911
have here but let's build and really
35004
26:03:04,080 --> 26:03:08,872
show you this you need to see this
35005
26:03:05,911 --> 26:03:11,360
compiler error with your own eyes let's
35006
26:03:08,872 --> 26:03:13,832
go in so the world is finished with
35007
26:03:11,360 --> 26:03:15,440
errors and we have an error saying no
35008
26:03:13,831 --> 26:03:18,231
matching function called to this
35009
26:03:15,440 --> 26:03:19,911
constructor which takes four parameters
35010
26:03:18,232 --> 26:03:21,911
if we take this out we're going to see
35011
26:03:19,911 --> 26:03:24,319
that this is going to work this is going
35012
26:03:21,911 --> 26:03:25,599
to use the compiler generated
35013
26:03:25,600 --> 26:03:30,552
as a result of this statement we have in
35014
26:03:28,232 --> 26:03:32,480
our code now if we will we're going to
35015
26:03:30,551 --> 26:03:34,720
see that this is going to work okay the
35016
26:03:32,479 --> 26:03:36,479
build is good can clear and run rooster
35017
26:03:34,720 --> 26:03:39,680
we're going to see that we have the full
35018
26:03:36,479 --> 26:03:41,911
name to be daniel gray we have the h2b23
35019
26:03:39,679 --> 26:03:44,799
we have our address which is really some
35020
26:03:41,911 --> 26:03:47,679
junk data and the contract count has no
35021
26:03:44,800 --> 26:03:50,320
data in it is just the default data we
35022
26:03:47,679 --> 26:03:53,039
have in our member variable here we have
35023
26:03:50,320 --> 26:03:55,680
no way to initialize this from a base
35024
26:03:53,039 --> 26:03:58,000
like a constructor but not everything is
35025
26:03:55,679 --> 26:04:00,079
really bad news if you don't want to be
35026
26:03:58,000 --> 26:04:02,639
limited by the constructors that are
35027
26:04:00,080 --> 26:04:04,872
generated by your compiler as a result
35028
26:04:02,639 --> 26:04:07,911
of inheritance you can set up your own
35029
26:04:04,872 --> 26:04:10,720
constructors for example we can uncover
35030
26:04:07,911 --> 26:04:12,959
our engineer constructor here and bring
35031
26:04:10,720 --> 26:04:15,600
it out of our comment we can do
35032
26:04:12,960 --> 26:04:18,720
something like this we can go in the
35033
26:04:15,600 --> 26:04:22,080
implementation file and also bring this
35034
26:04:18,720 --> 26:04:24,080
out of our comment section and now we
35035
26:04:22,080 --> 26:04:25,911
will be able to use this constructor
35036
26:04:24,080 --> 26:04:28,000
which is going to take the fourth
35037
26:04:25,911 --> 26:04:31,119
parameter here and do something with
35038
26:04:28,000 --> 26:04:32,960
that now if we go back in main the code
35039
26:04:31,119 --> 26:04:34,551
with three parameters is going to work
35040
26:04:32,960 --> 26:04:38,232
it is going to use the compiler
35041
26:04:34,551 --> 26:04:41,119
generated constructor but if we pass the
35042
26:04:38,232 --> 26:04:43,279
contract count to b4 this is also going
35043
26:04:41,119 --> 26:04:46,159
to work because it is going to be using
35044
26:04:43,279 --> 26:04:47,679
our own constructor here if we build the
35045
26:04:46,160 --> 26:04:50,320
code we're going to see that it is going
35046
26:04:47,679 --> 26:04:51,439
to work just fine let's use gcc to show
35047
26:04:51,440 --> 26:04:54,800
you're going to see that the world is
35048
26:04:56,399 --> 26:05:01,360
now our contract count is taken into
35049
26:04:59,119 --> 26:05:03,440
account this is really cool this is
35050
26:05:01,360 --> 26:05:06,080
really all i wanted you to see in this
35051
26:05:03,440 --> 26:05:09,119
lecture that you can let the compiler
35052
26:05:06,080 --> 26:05:12,080
generate the baseline constructor using
35053
26:05:09,119 --> 26:05:14,551
the syntax we have in our header here
35054
26:05:12,080 --> 26:05:17,360
this using statement can really show up
35055
26:05:14,551 --> 26:05:19,679
anywhere but it is going to inherit the
35056
26:05:17,360 --> 26:05:22,479
constructor with whatever access
35057
26:05:19,679 --> 26:05:24,719
specifier the constructor had in the
35058
26:05:22,479 --> 26:05:27,679
base class and you should really keep
35059
26:05:24,720 --> 26:05:29,191
these points in mind especially the last
35060
26:05:29,191 --> 26:05:34,231
inheriting constructors is going to make
35061
26:05:31,279 --> 26:05:36,800
your code confusing people are going to
35062
26:05:34,232 --> 26:05:38,400
notice that they can call constructors
35063
26:05:36,800 --> 26:05:41,192
that are really not going to be
35064
26:05:38,399 --> 26:05:43,511
initializing derived member variables
35065
26:05:41,191 --> 26:05:46,159
and this may cause serious problems in
35066
26:05:43,512 --> 26:05:48,232
your code we are going to stop here in
35067
26:05:46,160 --> 26:05:51,440
this lecture in the next one we're going
35068
26:05:48,232 --> 26:05:53,760
to explore how inheritance works with
35069
26:05:51,440 --> 26:05:56,080
these structures so far we have been
35070
26:05:53,759 --> 26:05:58,639
ignoring the structures we are going to
35071
26:05:56,080 --> 26:06:00,479
focus on them in the next lecture so go
35072
26:05:58,639 --> 26:06:02,232
ahead and finish up here and meet me
35073
26:06:00,479 --> 26:06:05,119
there in this lecture we're going to
35074
26:06:02,232 --> 26:06:07,911
focus on how destructors work with
35075
26:06:05,119 --> 26:06:10,639
inheritance and suppose we have an
35076
26:06:07,911 --> 26:06:13,119
inheritance hierarchy like we have been
35077
26:06:10,639 --> 26:06:15,191
using all along in this chapter so our
35078
26:06:13,119 --> 26:06:17,039
base class is person we have the
35079
26:06:15,191 --> 26:06:19,191
engineer class which is publicly
35080
26:06:17,039 --> 26:06:21,439
inheriting from person and we have a
35081
26:06:19,191 --> 26:06:25,119
civil engineer class which is inheriting
35082
26:06:21,440 --> 26:06:28,232
from engineer publicly so when we create
35083
26:06:25,119 --> 26:06:31,039
a civil engineer object we have seen
35084
26:06:28,232 --> 26:06:33,120
that the burst part is built first so we
35085
26:06:31,039 --> 26:06:35,511
are going to build the personal part of
35086
26:06:33,119 --> 26:06:37,679
us we are going to build the engineer
35087
26:06:35,512 --> 26:06:39,680
part of us on top of that and we are
35088
26:06:37,679 --> 26:06:42,551
going to build the civil engineer part
35089
26:06:39,679 --> 26:06:44,319
of us on top of that so the constructors
35090
26:06:42,551 --> 26:06:46,551
are going to be called in this order we
35091
26:06:44,320 --> 26:06:48,872
will call the person constructor first
35092
26:06:46,551 --> 26:06:51,440
engineer constructor after that and then
35093
26:06:48,872 --> 26:06:54,800
a civil engineer constructor after that
35094
26:06:51,440 --> 26:06:57,279
to set up our civil engineer object the
35095
26:06:54,800 --> 26:06:59,832
thing i want you to see in this lecture
35096
26:06:57,279 --> 26:07:02,479
is that the structures are called in the
35097
26:06:59,831 --> 26:07:04,639
reverse order to that so the most
35098
26:07:02,479 --> 26:07:07,440
specialized destructor is going to be
35099
26:07:04,639 --> 26:07:10,232
called first then we're going to destroy
35100
26:07:07,440 --> 26:07:13,040
the engineer part of us and the person
35101
26:07:10,232 --> 26:07:15,040
part of us is going to be destroyed last
35102
26:07:13,039 --> 26:07:17,679
so we are going to construct things in
35103
26:07:15,039 --> 26:07:20,231
this order from the base part to the
35104
26:07:17,679 --> 26:07:24,159
most specialized one and then we are
35105
26:07:20,232 --> 26:07:26,080
going to destroy thanks in this order so
35106
26:07:24,160 --> 26:07:28,639
these structures are going to be called
35107
26:07:28,639 --> 26:07:33,440
constructors that's the message i want
35108
26:07:31,279 --> 26:07:35,191
to convey here and we're going to set up
35109
26:07:33,440 --> 26:07:37,440
a simple example to play with us we're
35110
26:07:35,191 --> 26:07:39,119
going to create a civil engineer object
35111
26:07:37,440 --> 26:07:41,600
and we're going to see the order in
35112
26:07:39,119 --> 26:07:43,759
which these things are called and let's
35113
26:07:41,600 --> 26:07:46,400
head over to visual studio code and
35114
26:07:43,759 --> 26:07:48,959
actually do this here we are in our
35115
26:07:46,399 --> 26:07:51,679
working folder the current project is
35116
26:07:48,960 --> 26:07:54,080
inheritance and destructors we are going
35117
26:07:51,679 --> 26:07:56,639
to be reusing the code from a previous
35118
26:07:54,080 --> 26:07:58,720
lecture i don't think the last lecture
35119
26:07:56,639 --> 26:08:01,191
is a good example because we don't have
35120
26:07:58,720 --> 26:08:03,831
a civil engineer class so we are going
35121
26:08:01,191 --> 26:08:06,080
to go to the lecture before that and use
35122
26:08:03,831 --> 26:08:08,231
the code from our lecture or the copy
35123
26:08:06,080 --> 26:08:10,160
constructors with inheritance that's
35124
26:08:08,232 --> 26:08:12,800
going to give us all the classes we have
35125
26:08:10,160 --> 26:08:14,960
person engineer and civil engineer and
35126
26:08:12,800 --> 26:08:17,360
we need that in this lecture here so
35127
26:08:14,960 --> 26:08:20,232
let's grab all these things we're going
35128
26:08:17,360 --> 26:08:21,512
to copy them and put them in our current
35129
26:08:21,512 --> 26:08:26,551
which is inheritance and the structures
35130
26:08:24,399 --> 26:08:28,799
and we are going to open this in visual
35131
26:08:26,551 --> 26:08:31,119
studio code and it is going to be our
35132
26:08:28,800 --> 26:08:33,512
starting point here so we have person
35133
26:08:31,119 --> 26:08:36,959
engineer and civil engineer let's see
35134
26:08:33,512 --> 26:08:39,512
what we are doing and the main cpp file
35135
26:08:36,960 --> 26:08:42,480
we can take out all the junk here or we
35136
26:08:39,512 --> 26:08:44,232
can leave in the civil engineer object
35137
26:08:42,479 --> 26:08:45,512
we are creating here and we're going to
35138
26:08:45,512 --> 26:08:50,320
the constructors and the instructors are
35139
26:08:48,320 --> 26:08:52,872
called we're going to go to person and
35140
26:08:50,320 --> 26:08:56,080
make sure we have a constructor and we
35141
26:08:52,872 --> 26:08:58,960
have a bunch of constructors and
35142
26:08:56,080 --> 26:09:01,512
let's go to the cpp file and see that we
35143
26:08:58,960 --> 26:09:02,800
have messages in our constructors this
35144
26:09:02,800 --> 26:09:08,232
what we expect but we want to also put a
35145
26:09:05,279 --> 26:09:11,360
message in the destructor let's say sddc
35146
26:09:08,232 --> 26:09:13,512
out and say destructor for person called
35147
26:09:11,360 --> 26:09:15,279
this is going to do we're going to go in
35148
26:09:13,512 --> 26:09:17,360
our engineer class we're going to see
35149
26:09:15,279 --> 26:09:19,279
that we have a bunch of constructors we
35150
26:09:17,360 --> 26:09:22,000
have a destructor here we're going to
35151
26:09:22,000 --> 26:09:26,551
and make sure we take out the bad code
35152
26:09:24,960 --> 26:09:29,832
here because we don't really need that
35153
26:09:26,551 --> 26:09:32,159
we only need good code and we make sure
35154
26:09:29,831 --> 26:09:34,000
that we have output statements in our
35155
26:09:32,160 --> 26:09:36,320
constructors to know when they are
35156
26:09:34,000 --> 26:09:38,800
called looks like we are good we're
35157
26:09:36,320 --> 26:09:41,760
going to put an sddc out statement in
35158
26:09:38,800 --> 26:09:43,832
our destructor for engineer or engineer
35159
26:09:41,759 --> 26:09:46,319
called this is going to do and we are
35160
26:09:43,831 --> 26:09:47,759
going to hop over in our civil engineer
35161
26:09:46,320 --> 26:09:50,400
class we're going to have a bunch of
35162
26:09:47,759 --> 26:09:51,759
constructors we're going to have a civil
35163
26:09:53,119 --> 26:09:58,231
we can go in the cpp file and make sure
35164
26:09:55,679 --> 26:10:00,871
that we have output statements in our
35165
26:09:58,232 --> 26:10:02,960
civil engineer constructors looks like
35166
26:10:00,872 --> 26:10:05,832
we are good here we can take out all the
35167
26:10:02,960 --> 26:10:08,552
bad code we don't need and we are going
35168
26:10:05,831 --> 26:10:11,191
to put a message in our destructor here
35169
26:10:08,551 --> 26:10:14,080
so let's do that the the structure
35170
26:10:11,191 --> 26:10:16,479
called for civil engineer i think this
35171
26:10:14,080 --> 26:10:18,551
is going to be good enough let's go back
35172
26:10:16,479 --> 26:10:20,551
and make sure we have the same messages
35173
26:10:20,551 --> 26:10:24,959
and we have a destructor for person
35174
26:10:22,720 --> 26:10:26,479
called message and we're going to try
35175
26:10:26,479 --> 26:10:31,679
constructors and destructors are called
35176
26:10:29,279 --> 26:10:34,080
this is the order we want to make sure
35177
26:10:31,679 --> 26:10:36,319
we understand if you want you can even
35178
26:10:34,080 --> 26:10:38,479
use a debugger to follow things but i am
35179
26:10:36,320 --> 26:10:40,320
not going to do that here i am just
35180
26:10:38,479 --> 26:10:41,599
going to weld and show you the output
35181
26:10:41,600 --> 26:10:44,320
hopefully that's going to be proof
35182
26:10:44,320 --> 26:10:49,600
that things happen in the order that i
35183
26:10:47,119 --> 26:10:51,831
just described in the slides the build
35184
26:10:49,600 --> 26:10:54,320
is good we can clear we can bring up a
35185
26:10:51,831 --> 26:10:56,231
powershell window and then clear and
35186
26:10:54,320 --> 26:10:57,832
we're going to run rooster we're going
35187
26:10:56,232 --> 26:11:01,440
to see that the constructor is going to
35188
26:10:57,831 --> 26:11:02,799
be called for person for civil engineer
35189
26:11:01,440 --> 26:11:05,911
and you're going to see that things are
35190
26:11:02,800 --> 26:11:08,479
going to happen from the must-based
35191
26:11:05,911 --> 26:11:11,360
constructor to the most specialized
35192
26:11:08,479 --> 26:11:13,911
constructor so we are going to call
35193
26:11:11,360 --> 26:11:15,600
person engineer and civil engineer but
35194
26:11:13,911 --> 26:11:17,599
you're going to see that the structures
35195
26:11:15,600 --> 26:11:18,480
are going to be called in the reverse
35196
26:11:18,479 --> 26:11:22,479
the most specialized the destructor is
35197
26:11:20,479 --> 26:11:24,479
going to be called the first then we're
35198
26:11:22,479 --> 26:11:26,319
going to call the distractor for
35199
26:11:24,479 --> 26:11:29,119
engineer then we're going to call the
35200
26:11:26,320 --> 26:11:30,872
destructor for the base class so things
35201
26:11:29,119 --> 26:11:33,599
are going to be happening in reverse
35202
26:11:30,872 --> 26:11:35,512
order we will build thanks starting from
35203
26:11:35,512 --> 26:11:40,960
finish by the most specialized class
35204
26:11:38,160 --> 26:11:42,960
which is doing the inheritance and then
35205
26:11:40,960 --> 26:11:45,600
we're going to call the destructor for
35206
26:11:42,960 --> 26:11:48,232
the most specialized class first and
35207
26:11:45,600 --> 26:11:50,639
then the destructor for the most based
35208
26:11:48,232 --> 26:11:52,400
class is going to be cold last you
35209
26:11:50,639 --> 26:11:54,872
should really make sure you understand
35210
26:11:52,399 --> 26:11:57,039
this because sometimes your things are
35211
26:11:54,872 --> 26:11:58,720
going to be depending on this order and
35212
26:11:57,039 --> 26:12:00,959
you need to understand this and this is
35213
26:11:58,720 --> 26:12:03,360
really the main message here that the
35214
26:12:00,960 --> 26:12:04,320
structures are ridiculed in the reverse
35215
26:12:06,080 --> 26:12:09,279
we are going to stop here in this
35216
26:12:07,679 --> 26:12:12,479
lecture in the next one we're going to
35217
26:12:09,279 --> 26:12:15,039
see that we can actually reuse names in
35218
26:12:12,479 --> 26:12:16,720
our inheritance hierarchy and we're
35219
26:12:15,039 --> 26:12:18,871
going to see how that works out in the
35220
26:12:16,720 --> 26:12:21,440
next lecture so go ahead and finish up
35221
26:12:18,872 --> 26:12:23,440
here and meet me there in this lecture
35222
26:12:21,440 --> 26:12:27,191
we're going to see that we can reuse
35223
26:12:23,440 --> 26:12:29,760
names in our inheritance hierarchy
35224
26:12:27,191 --> 26:12:32,399
and what we mean by that is that we can
35225
26:12:29,759 --> 26:12:34,959
have a parent class for example and have
35226
26:12:32,399 --> 26:12:38,639
a child class inheriting from the parent
35227
26:12:34,960 --> 26:12:41,280
class and have exactly the same names
35228
26:12:38,639 --> 26:12:43,512
for the member variables and types or
35229
26:12:41,279 --> 26:12:45,911
the same signatures for functions for
35230
26:12:43,512 --> 26:12:48,320
example in the parent class you see that
35231
26:12:45,911 --> 26:12:50,479
we have a member function called
35232
26:12:48,320 --> 26:12:53,600
printfur it is going to be printing some
35233
26:12:50,479 --> 26:12:56,399
information we can have a function named
35234
26:12:53,600 --> 26:12:58,639
exactly the same in the child class and
35235
26:12:56,399 --> 26:13:00,639
c plus plus is going to allow this we
35236
26:12:58,639 --> 26:13:03,279
can also do the same things for member
35237
26:13:00,639 --> 26:13:06,720
variables for example we have m var
35238
26:13:03,279 --> 26:13:09,831
which is of type and we have exactly the
35239
26:13:06,720 --> 26:13:12,232
same thing in our child class and c plus
35240
26:13:09,831 --> 26:13:14,799
plus is going to allow this now the
35241
26:13:12,232 --> 26:13:17,832
problem is if you create an object of
35242
26:13:14,800 --> 26:13:20,080
child which method will be called if you
35243
26:13:20,080 --> 26:13:25,191
what c plus plus does is it is going to
35244
26:13:25,191 --> 26:13:30,080
things you have in the base class if you
35245
26:13:27,279 --> 26:13:33,191
happen to set up exactly the same thing
35246
26:13:30,080 --> 26:13:36,551
in a derived class so for example the
35247
26:13:33,191 --> 26:13:39,039
members in our child class are going to
35248
26:13:36,551 --> 26:13:41,599
hide the members we had in the base
35249
26:13:39,039 --> 26:13:44,159
class and if we call these methods on a
35250
26:13:41,600 --> 26:13:46,960
child object we are going to get the
35251
26:13:44,160 --> 26:13:49,600
versions in the child class called if we
35252
26:13:46,960 --> 26:13:51,680
call these methods on a parent object we
35253
26:13:49,600 --> 26:13:53,360
are going to get the parent version
35254
26:13:51,679 --> 26:13:55,359
called and we're going to see the data
35255
26:13:53,360 --> 26:13:57,831
in the parent class printed out this is
35256
26:13:55,360 --> 26:14:00,399
the message here it is possible to use
35257
26:13:57,831 --> 26:14:03,511
the same names in both parent and child
35258
26:14:00,399 --> 26:14:05,911
classes and if you do that things in
35259
26:14:03,512 --> 26:14:08,720
child classes are going to hide or
35260
26:14:05,911 --> 26:14:10,800
override what we had in the parent class
35261
26:14:08,720 --> 26:14:13,191
this is the message i want to convey
35262
26:14:10,800 --> 26:14:15,832
here and here is a simple example to
35263
26:14:13,191 --> 26:14:18,399
drive home how you can use these things
35264
26:14:15,831 --> 26:14:20,399
for example we can create a child object
35265
26:14:20,399 --> 26:14:24,871
and if we call a method on the child
35266
26:14:23,039 --> 26:14:27,759
object this is going to call the method
35267
26:14:24,872 --> 26:14:31,192
in child but it is possible to force the
35268
26:14:27,759 --> 26:14:32,959
compiler to call the version in the base
35269
26:14:31,191 --> 26:14:35,512
class and you're going to see this
35270
26:14:32,960 --> 26:14:38,872
syntax used somewhere in your code out
35271
26:14:35,512 --> 26:14:41,440
there so the syntax is to say the object
35272
26:14:38,872 --> 26:14:44,232
name you put it up you say the name for
35273
26:14:41,440 --> 26:14:46,400
the parent class and then you call the
35274
26:14:44,232 --> 26:14:48,480
method using the scope resolution
35275
26:14:46,399 --> 26:14:50,720
operator here and this is going to hold
35276
26:14:48,479 --> 26:14:52,159
the method in the parent okay now that
35277
26:14:50,720 --> 26:14:54,160
you know this we're going to head over
35278
26:14:52,160 --> 26:14:56,872
to visual studio code and play with this
35279
26:14:54,160 --> 26:14:59,279
a little more here we are in our working
35280
26:14:56,872 --> 26:15:02,400
folder the current project is reused
35281
26:14:59,279 --> 26:15:05,440
symbols and inheritance we are going to
35282
26:15:02,399 --> 26:15:07,279
just grab the template files because we
35283
26:15:05,440 --> 26:15:09,440
are going to be building things from
35284
26:15:07,279 --> 26:15:12,399
scratch here and we're going to put in
35285
26:15:09,440 --> 26:15:14,872
our files no big deal here and we can
35286
26:15:12,399 --> 26:15:18,079
open this in visual studio code this is
35287
26:15:14,872 --> 26:15:21,040
going to give us a bare minimum main cpp
35288
26:15:18,080 --> 26:15:22,960
file we can clean it up a little bit and
35289
26:15:21,039 --> 26:15:24,639
we're going to set up our parent class
35290
26:15:22,960 --> 26:15:27,360
let's do that pretty fast we're going to
35291
26:15:24,639 --> 26:15:29,119
say parent and set up the header and
35292
26:15:27,360 --> 26:15:32,000
we're going to set up the implementation
35293
26:15:29,119 --> 26:15:35,599
cpp file we are going to set up the
35294
26:15:32,000 --> 26:15:38,639
header file and this is going to do
35295
26:15:35,600 --> 26:15:40,872
everything we want we have a constructor
35296
26:15:38,639 --> 26:15:43,512
which is really defaulted here so let's
35297
26:15:40,872 --> 26:15:45,600
say default and we cannot default the
35298
26:15:43,512 --> 26:15:47,832
destructor can we default it let's do
35299
26:15:45,600 --> 26:15:50,400
this and see what happens and we don't
35300
26:15:47,831 --> 26:15:52,319
really need to do anything in the cpp
35301
26:15:50,399 --> 26:15:54,959
file we can leave it empty this is not
35302
26:15:52,320 --> 26:15:57,512
going to hurt anything and with this we
35303
26:15:54,960 --> 26:15:58,872
can create parent objects let's do that
35304
26:15:58,872 --> 26:16:02,800
we're going to hop over to the main cpp
35305
26:16:00,720 --> 26:16:04,800
file and include current and make sure
35306
26:16:02,800 --> 26:16:07,192
that we can use that and we're going to
35307
26:16:04,800 --> 26:16:10,232
create a parent object let's do that
35308
26:16:07,191 --> 26:16:13,039
we're going to say parent p1 and say
35309
26:16:10,232 --> 26:16:15,279
p1 print values we can do that and we
35310
26:16:13,039 --> 26:16:17,759
can work and run this program i think it
35311
26:16:15,279 --> 26:16:20,232
is going to work just fine okay the
35312
26:16:17,759 --> 26:16:23,119
build is good we can clear or we can set
35313
26:16:20,232 --> 26:16:25,360
up a powershell window and a clear
35314
26:16:23,119 --> 26:16:27,911
and run rooster this is going to say the
35315
26:16:25,360 --> 26:16:29,831
value in parent is 100 which is what we
35316
26:16:27,911 --> 26:16:32,872
have by default here we have a simple
35317
26:16:29,831 --> 26:16:35,599
member variable which is of ant type it
35318
26:16:32,872 --> 26:16:38,320
is protected because we want it to be
35319
26:16:35,600 --> 26:16:40,000
inherited and we have a bunch of
35320
26:16:38,320 --> 26:16:41,600
constructors here we have a constructor
35321
26:16:40,000 --> 26:16:43,360
which is going to take a value but we're
35322
26:16:41,600 --> 26:16:45,512
not going to use that here the default
35323
26:16:43,360 --> 26:16:47,680
is just fine you can use that if you
35324
26:16:45,512 --> 26:16:49,600
want and we have a member function which
35325
26:16:47,679 --> 26:16:51,831
is going to print the value in parent
35326
26:16:49,600 --> 26:16:53,680
now that this is working we can set up a
35327
26:16:51,831 --> 26:16:56,231
child class which is going to be
35328
26:16:53,679 --> 26:16:58,079
inheriting from the parent class here so
35329
26:16:56,232 --> 26:17:01,192
let's do that we're going to set up the
35330
26:16:58,080 --> 26:17:03,759
child header file child dot h and we're
35331
26:17:01,191 --> 26:17:06,551
going to set up a cpp file for that that
35332
26:17:03,759 --> 26:17:08,959
cpp so we are going to put the data in
35333
26:17:06,551 --> 26:17:11,679
the header file again it is nothing
35334
26:17:08,960 --> 26:17:13,680
complicated it is just a simple class
35335
26:17:11,679 --> 26:17:16,479
which is going to be inheriting from
35336
26:17:13,679 --> 26:17:17,831
parent and we are going to have our own
35337
26:17:16,479 --> 26:17:20,159
member variable which is going to
35338
26:17:17,831 --> 26:17:22,720
eclipse what we had in the parent so the
35339
26:17:20,160 --> 26:17:25,911
names here must be the same m a member
35340
26:17:22,720 --> 26:17:28,960
of r if we go in parent it is m member
35341
26:17:25,911 --> 26:17:31,360
for and what we have in child is going
35342
26:17:28,960 --> 26:17:34,080
to eclipse what we had in the parent
35343
26:17:31,360 --> 26:17:36,399
class in other words if we print the
35344
26:17:34,080 --> 26:17:39,680
member variable in child we're going to
35345
26:17:36,399 --> 26:17:43,191
see 1000 printed out here we want to see
35346
26:17:39,679 --> 26:17:45,359
100 that we have in the parent printed
35347
26:17:43,191 --> 26:17:48,000
out hopefully this is going to drive the
35348
26:17:45,360 --> 26:17:50,399
point home that if you have members
35349
26:17:50,399 --> 26:17:56,079
what you have in your derived classes is
35350
26:17:53,119 --> 26:17:57,831
going to eclipse or hide what we had in
35351
26:17:56,080 --> 26:18:01,191
the parent class this is the message
35352
26:17:57,831 --> 26:18:04,080
here but even if this is the case c plus
35353
26:18:01,191 --> 26:18:07,512
plus allows us to specify that we want
35354
26:18:04,080 --> 26:18:10,960
to grab the data in parent from a child
35355
26:18:07,512 --> 26:18:13,440
object for example in our show values
35356
26:18:10,960 --> 26:18:16,232
method we can print the value in child
35357
26:18:13,440 --> 26:18:18,551
directly using m member war but we can
35358
26:18:16,232 --> 26:18:21,192
also specify that we want the value in
35359
26:18:18,551 --> 26:18:24,720
the parent class because even if this is
35360
26:18:21,191 --> 26:18:27,360
a child object it has a current part of
35361
26:18:24,720 --> 26:18:30,000
it so we can access the data in parent
35362
26:18:27,360 --> 26:18:32,720
and print that if the data happens to be
35363
26:18:30,000 --> 26:18:34,720
accessible from our derived class and
35364
26:18:32,720 --> 26:18:37,512
that's why we set up our member variable
35365
26:18:34,720 --> 26:18:39,759
to be protected for it to be accessible
35366
26:18:37,512 --> 26:18:41,832
in our derived classes this is going to
35367
26:18:39,759 --> 26:18:44,000
allow us to print something like this
35368
26:18:41,831 --> 26:18:46,231
and this is going to really work now
35369
26:18:44,000 --> 26:18:48,320
that we have this in place we can go in
35370
26:18:48,320 --> 26:18:53,120
and only include the child we can do
35371
26:18:50,960 --> 26:18:55,600
that and we're going to create a child
35372
26:18:53,119 --> 26:18:57,440
object or we can just take out
35373
26:18:57,440 --> 26:19:01,911
and adjust putting the code we can use
35374
26:18:59,440 --> 26:19:03,680
to play with this things we can create
35375
26:19:03,679 --> 26:19:07,679
and on this child we can print for we're
35376
26:19:06,160 --> 26:19:10,080
going to see that the data is going to
35377
26:19:07,679 --> 26:19:13,191
be printed out but we can also use this
35378
26:19:10,080 --> 26:19:14,800
syntax to print the data in the parent
35379
26:19:13,191 --> 26:19:17,119
part of us and we're going to see that
35380
26:19:14,800 --> 26:19:20,160
the data is printed out we can also show
35381
26:19:17,119 --> 26:19:22,720
the values and make sure we see this
35382
26:19:20,160 --> 26:19:25,192
from a member function of the child
35383
26:19:22,720 --> 26:19:26,800
class this is going to call this member
35384
26:19:25,191 --> 26:19:28,479
and we're going to get to the value in
35385
26:19:26,800 --> 26:19:31,832
child and we're going to get the value
35386
26:19:28,479 --> 26:19:34,080
in parent printed out on the console now
35387
26:19:31,831 --> 26:19:36,479
that we have this we can actually try
35388
26:19:34,080 --> 26:19:37,512
and work this we're going to use gcc to
35389
26:19:37,512 --> 26:19:42,160
we're going to see that we're going to
35390
26:19:39,679 --> 26:19:44,319
finish building with errors what is the
35391
26:19:42,160 --> 26:19:46,872
problem here we have an undefined
35392
26:19:44,320 --> 26:19:49,192
reference to child destructor
35393
26:19:46,872 --> 26:19:52,000
we didn't put in a definition for the
35394
26:19:49,191 --> 26:19:54,799
child destructor so let's go there
35395
26:19:52,000 --> 26:19:56,551
and default it we can do that we're
35396
26:19:54,800 --> 26:20:00,320
going to say equals default and the
35397
26:19:56,551 --> 26:20:02,872
compiler is going to generate one for us
35398
26:20:00,320 --> 26:20:05,192
and now if we build we're going to build
35399
26:20:02,872 --> 26:20:08,000
with gcc again the bolt is going to be
35400
26:20:05,191 --> 26:20:09,512
good you can clear and run rooster and
35401
26:20:08,000 --> 26:20:12,720
we're going to see that the value in
35402
26:20:09,512 --> 26:20:15,360
child is 33 because we passed that in
35403
26:20:12,720 --> 26:20:17,680
explicitly and this is going to call the
35404
26:20:15,360 --> 26:20:20,232
constructor we have in child that
35405
26:20:17,679 --> 26:20:22,399
happens to be this guy here and you see
35406
26:20:20,232 --> 26:20:24,480
that we are really keeping things simple
35407
26:20:22,399 --> 26:20:27,831
we are not calling the base constructor
35408
26:20:24,479 --> 26:20:30,231
here the compiler is just going to call
35409
26:20:27,831 --> 26:20:32,551
the default constructor we have in
35410
26:20:30,232 --> 26:20:34,480
parent here and this is going to just
35411
26:20:32,551 --> 26:20:37,599
work the main message here is that you
35412
26:20:34,479 --> 26:20:40,800
can set up member variables and member
35413
26:20:37,600 --> 26:20:43,192
functions named exactly the same way in
35414
26:20:40,800 --> 26:20:45,360
the parent class and in child classes
35415
26:20:43,191 --> 26:20:48,479
and what you have in your derived
35416
26:20:45,360 --> 26:20:51,440
classes is going to hide what we have in
35417
26:20:48,479 --> 26:20:54,080
our current classes so if we call a
35418
26:20:51,440 --> 26:20:56,160
method on a child object for example
35419
26:20:54,080 --> 26:20:58,232
like we are doing here this is going to
35420
26:20:56,160 --> 26:21:00,480
call the method in child but we still
35421
26:20:58,232 --> 26:21:02,960
have the ability to call data in the
35422
26:21:00,479 --> 26:21:05,279
parent part of us and this is what we do
35423
26:21:02,960 --> 26:21:07,040
here i would like to welcome you in this
35424
26:21:05,279 --> 26:21:09,759
new chapter where we're going to be
35425
26:21:07,039 --> 26:21:12,799
learning about polymorphism and
35426
26:21:09,759 --> 26:21:15,279
polymorphism is the setup we can do in
35427
26:21:15,279 --> 26:21:21,039
to use a base pointer and manage derived
35428
26:21:18,399 --> 26:21:23,191
objects suppose we have an inheritance
35429
26:21:21,039 --> 26:21:26,319
hierarchy like we have here we have
35430
26:21:23,191 --> 26:21:28,871
shaped as our base class and we can
35431
26:21:26,320 --> 26:21:31,360
inherit from oval and create a circle
35432
26:21:28,872 --> 26:21:34,160
class imagine that we can create all
35433
26:21:31,360 --> 26:21:36,399
kinds of crazy shapes that inherit from
35434
26:21:34,160 --> 26:21:38,320
shape in our simplest path program for
35435
26:21:36,399 --> 26:21:40,399
example we have a rectangle class we
35436
26:21:38,320 --> 26:21:42,960
have a triangle class we have all kinds
35437
26:21:40,399 --> 26:21:45,679
of crazy shapes now if we have this
35438
26:21:42,960 --> 26:21:48,000
inheritance hierarchy here is something
35439
26:21:45,679 --> 26:21:50,719
we might want to do we might want to set
35440
26:21:48,000 --> 26:21:53,600
up a base pointer that is managing a
35441
26:21:50,720 --> 26:21:56,399
derived object and set up code like this
35442
26:21:53,600 --> 26:21:58,480
for example we say shape pointer and i
35443
26:21:56,399 --> 26:22:01,439
set up a pointer variable here and use
35444
26:21:58,479 --> 26:22:04,231
this pointer to manage a circle object
35445
26:22:01,440 --> 26:22:07,119
that we dynamically allocate for on this
35446
26:22:04,232 --> 26:22:09,600
line here we can also do a shape pointer
35447
26:22:07,119 --> 26:22:11,512
that is managing a rectangle we can set
35448
26:22:09,600 --> 26:22:14,232
up a shape pointer that is managing a
35449
26:22:11,512 --> 26:22:16,551
novel object we can really set up a base
35450
26:22:14,232 --> 26:22:19,192
pointer that is managing any kind of
35451
26:22:16,551 --> 26:22:21,360
object we support in our inheritance
35452
26:22:19,191 --> 26:22:23,679
hierarchy now some of you are going to
35453
26:22:21,360 --> 26:22:27,039
ask a few questions one of them is going
35454
26:22:23,679 --> 26:22:30,319
to be is this even legal c plus plus
35455
26:22:27,039 --> 26:22:33,439
syntax and the answer is yes because if
35456
26:22:30,320 --> 26:22:35,280
circle is inherited somehow from shape a
35457
26:22:33,440 --> 26:22:37,911
circle is really a shape and if
35458
26:22:35,279 --> 26:22:40,399
rectangle is inheriting from shape it is
35459
26:22:37,911 --> 26:22:41,759
a shape and if we try to assign a circle
35460
26:22:40,399 --> 26:22:44,319
to a shape we're going to see that
35461
26:22:41,759 --> 26:22:46,959
that's going to work so this is valid c
35462
26:22:44,320 --> 26:22:49,120
plus plus syntax and we can do the same
35463
26:22:46,960 --> 26:22:50,872
thing using references as we see here we
35464
26:22:49,119 --> 26:22:52,399
can set up a reference that is going to
35465
26:22:52,399 --> 26:22:57,511
a circle object that we have through
35466
26:22:55,119 --> 26:22:59,831
circle one we can set up a reference to
35467
26:22:57,512 --> 26:23:02,320
manage a rectangle that we have in shape
35468
26:22:59,831 --> 26:23:04,639
two we can set up a reference to manage
35469
26:23:02,320 --> 26:23:05,912
an awful object we can really do all
35470
26:23:08,160 --> 26:23:12,480
why would we want to do something like
35471
26:23:10,160 --> 26:23:14,960
this now try and think about your
35472
26:23:12,479 --> 26:23:17,599
inheritance hierarchy here and try to
35473
26:23:14,960 --> 26:23:20,080
think about what if you want to
35474
26:23:17,600 --> 26:23:22,800
draw this kind of ship for example if
35475
26:23:20,080 --> 26:23:24,960
you didn't use polymorphism you would
35476
26:23:22,800 --> 26:23:27,911
need to set up all kinds of crazy
35477
26:23:24,960 --> 26:23:29,912
methods to draw each kind of object and
35478
26:23:27,911 --> 26:23:32,319
we have no way around this because these
35479
26:23:29,911 --> 26:23:34,479
are different types if you have a method
35480
26:23:32,320 --> 26:23:35,760
that takes a novel and you pass in a
35481
26:23:34,479 --> 26:23:38,399
circle that's going to give you a
35482
26:23:35,759 --> 26:23:40,479
compiler error but with polymorphism we
35483
26:23:38,399 --> 26:23:43,191
can set up a single method which takes a
35484
26:23:40,479 --> 26:23:45,679
shape pointer or a shape reference
35485
26:23:43,191 --> 26:23:48,639
and we can pass in all kinds of crazy
35486
26:23:45,679 --> 26:23:50,551
objects whose class derive from shape so
35487
26:23:48,639 --> 26:23:52,232
for example we can pass in the address
35488
26:23:50,551 --> 26:23:54,231
of the circle and this function is going
35489
26:23:52,232 --> 26:23:56,160
to draw a circle we can pass in the
35490
26:23:54,232 --> 26:23:58,232
address of a rectangle this is going to
35491
26:23:56,160 --> 26:24:00,080
draw a rectangle we can pass in the
35492
26:23:58,232 --> 26:24:02,320
address of a novel and this is going to
35493
26:24:00,080 --> 26:24:04,720
draw a novel hopefully you can see how
35494
26:24:02,320 --> 26:24:07,120
this is useful we can even do this using
35495
26:24:04,720 --> 26:24:09,119
references so if we pass in a rectangle
35496
26:24:07,119 --> 26:24:11,360
this is going to draw a rectangle if we
35497
26:24:09,119 --> 26:24:14,319
pass in a circle this is going to draw a
35498
26:24:11,360 --> 26:24:17,119
circle you get the idea this is one of
35499
26:24:14,320 --> 26:24:20,232
the benefits of using polymorphism again
35500
26:24:17,119 --> 26:24:23,512
polymorphism is about using base class
35501
26:24:20,232 --> 26:24:26,480
pointers or references to manage derived
35502
26:24:23,512 --> 26:24:29,191
objects in our inheritance hierarchies
35503
26:24:26,479 --> 26:24:31,512
another benefit of polymorphism is to
35504
26:24:29,191 --> 26:24:33,679
allow us to be able to store
35505
26:24:31,512 --> 26:24:36,551
different kinds of objects in a single
35506
26:24:33,679 --> 26:24:39,191
collection remember an array can store
35507
26:24:36,551 --> 26:24:41,599
objects of different types if you say
35508
26:24:39,191 --> 26:24:43,191
tap an end array and try to store in a
35509
26:24:41,600 --> 26:24:44,720
string or a double you're going to get a
35510
26:24:43,191 --> 26:24:47,512
compiler error because that's not
35511
26:24:44,720 --> 26:24:49,911
allowed so if you have an array that is
35512
26:24:47,512 --> 26:24:52,000
going to store circles you can't put in
35513
26:24:49,911 --> 26:24:54,872
a novel you can't put in a rectangle you
35514
26:24:52,000 --> 26:24:57,759
can put in a star you can't really do
35515
26:24:54,872 --> 26:25:00,479
that because an array by design is going
35516
26:24:57,759 --> 26:25:02,551
to store objects of the same type but we
35517
26:25:00,479 --> 26:25:04,872
can avoid this limitation using
35518
26:25:02,551 --> 26:25:07,759
polymorphism again we can set up an
35519
26:25:04,872 --> 26:25:10,551
array that is going to store base class
35520
26:25:07,759 --> 26:25:13,439
pointers and we can store in all kinds
35521
26:25:10,551 --> 26:25:16,231
of crazy objects whose class derived
35522
26:25:13,440 --> 26:25:18,232
from this base class here so here we can
35523
26:25:16,232 --> 26:25:20,232
store in a circle object we can store in
35524
26:25:18,232 --> 26:25:23,192
a novel we can store in any kind of
35525
26:25:20,232 --> 26:25:26,400
object that is part of our inheritance
35526
26:25:23,191 --> 26:25:28,159
hierarchy with the base class as shape
35527
26:25:26,399 --> 26:25:29,831
and this is going to work and this is
35528
26:25:28,160 --> 26:25:31,360
going to be using polymorphism for
35529
26:25:29,831 --> 26:25:33,831
example if you look through this
35530
26:25:31,360 --> 26:25:35,512
collection calling the joe method for
35531
26:25:33,831 --> 26:25:37,759
the first element this is going to call
35532
26:25:35,512 --> 26:25:39,191
the draw method on the circle for the
35533
26:25:37,759 --> 26:25:41,191
second element we're going to call the
35534
26:25:39,191 --> 26:25:42,080
draw method on a novel and this is going
35535
26:25:42,080 --> 26:25:46,400
really cool this is something we can
35536
26:25:43,759 --> 26:25:48,551
achieve with polymorphism and i want to
35537
26:25:46,399 --> 26:25:50,639
back up a little bit and talk about what
35538
26:25:48,551 --> 26:25:53,759
is really meant by polymorphism
35539
26:25:50,639 --> 26:25:56,232
polymorphism really means multiple forms
35540
26:25:53,759 --> 26:25:58,720
and in my opinion what this means is
35541
26:25:56,232 --> 26:26:01,360
that the base class pointer or base
35542
26:25:58,720 --> 26:26:03,279
class reference can take multiple forms
35543
26:26:01,360 --> 26:26:05,360
at one point it might be managing a
35544
26:26:03,279 --> 26:26:07,279
circle at one point it might be managing
35545
26:26:05,360 --> 26:26:10,080
a rectangle at one point it might be
35546
26:26:07,279 --> 26:26:13,191
managing a novel object so it is a basic
35547
26:26:10,080 --> 26:26:14,960
pointer but it can take multiple forms
35548
26:26:13,191 --> 26:26:18,399
because it can be managing multiple
35549
26:26:14,960 --> 26:26:21,120
kinds of objects whose class are part of
35550
26:26:18,399 --> 26:26:23,511
our inheritance hierarchy this is what
35551
26:26:21,119 --> 26:26:25,679
we mean by polymorphism so again the
35552
26:26:23,512 --> 26:26:27,832
idea is that we can use the base class
35553
26:26:25,679 --> 26:26:30,399
pointer or reference to manage all kinds
35554
26:26:27,831 --> 26:26:32,799
of crazy objects in our program and this
35555
26:26:30,399 --> 26:26:35,439
is going to have many benefits as we are
35556
26:26:32,800 --> 26:26:37,760
about to experience in this chapter here
35557
26:26:35,440 --> 26:26:39,832
i am really excited to be explaining
35558
26:26:37,759 --> 26:26:42,399
this to you this is one of the most
35559
26:26:39,831 --> 26:26:44,319
powerful features in c plus plus we are
35560
26:26:42,399 --> 26:26:46,639
going to start in the next lecture and
35561
26:26:44,320 --> 26:26:49,280
show you that you don't get polymorphism
35562
26:26:46,639 --> 26:26:52,000
by default in c plus plus and what you
35563
26:26:49,279 --> 26:26:54,551
get is static binding go ahead and
35564
26:26:52,000 --> 26:26:57,039
finish up here and meet me there
35565
26:26:54,551 --> 26:26:59,440
manage derived objects in our c plus
35566
26:26:57,039 --> 26:27:02,399
plus program hopefully this is going to
35567
26:26:59,440 --> 26:27:04,720
give you a clear idea on why we might
35568
26:27:02,399 --> 26:27:06,399
need to do this so let's look at our
35569
26:27:04,720 --> 26:27:08,232
classes that we're going to be using
35570
26:27:06,399 --> 26:27:10,551
here we're going to set up a shape class
35571
26:27:08,232 --> 26:27:12,800
which is going to be representing our
35572
26:27:10,551 --> 26:27:15,360
shapes this is going to be our base
35573
26:27:12,800 --> 26:27:17,360
class that's the basic use for this here
35574
26:27:15,360 --> 26:27:20,000
it has a simple member variable which is
35575
26:27:17,360 --> 26:27:22,720
going to store the description for our
35576
26:27:20,000 --> 26:27:24,639
shape it is also going to have our draw
35577
26:27:22,720 --> 26:27:26,800
method which is really not going to draw
35578
26:27:24,639 --> 26:27:29,679
anything it is just going to say the
35579
26:27:26,800 --> 26:27:31,512
description for our shape here once we
35580
26:27:29,679 --> 26:27:33,511
have this shape we can create other
35581
26:27:31,512 --> 26:27:35,680
shapes from it for example we can create
35582
26:27:33,512 --> 26:27:38,080
a novel class which is going to be
35583
26:27:35,679 --> 26:27:40,479
representing a shape like this it is
35584
26:27:38,080 --> 26:27:43,191
going to have two member variables one
35585
26:27:40,479 --> 26:27:45,512
is going to be mx radius the other is
35586
26:27:43,191 --> 26:27:47,119
going to be m y radius this may
35587
26:27:47,119 --> 26:27:53,119
the radiuses for our oval here for
35588
26:27:50,551 --> 26:27:55,360
example the x radius might be something
35589
26:27:53,119 --> 26:27:57,039
like this the y radius might be
35590
26:27:55,360 --> 26:27:59,191
something like this and this is how
35591
26:27:57,039 --> 26:28:01,511
we're going to be representing
35592
26:27:59,191 --> 26:28:03,039
this shape here we also have a draw
35593
26:28:01,512 --> 26:28:05,832
method which is going to print the
35594
26:28:03,039 --> 26:28:07,599
information about this shape here it is
35595
26:28:05,831 --> 26:28:09,759
going to say the description that we're
35596
26:28:07,600 --> 26:28:12,000
going to be inheriting publicly from
35597
26:28:09,759 --> 26:28:14,479
shape but it is also going to say the
35598
26:28:12,000 --> 26:28:17,279
radius information for this shape it is
35599
26:28:14,479 --> 26:28:19,831
going to give us the x radius and the y
35600
26:28:17,279 --> 26:28:21,759
radius here and we have a bunch of
35601
26:28:19,831 --> 26:28:23,511
constructors here we have a default
35602
26:28:21,759 --> 26:28:25,831
constructor which is really not going to
35603
26:28:23,512 --> 26:28:27,360
do anything we also have a constructor
35604
26:28:25,831 --> 26:28:30,551
that is going to be taking two
35605
26:28:27,360 --> 26:28:32,960
parameters to forward the data in our
35606
26:28:30,551 --> 26:28:34,872
member variables here this is the kind
35607
26:28:32,960 --> 26:28:37,600
of class we're going to set up in our
35608
26:28:34,872 --> 26:28:40,551
program we also have another derived
35609
26:28:37,600 --> 26:28:42,912
class from oval and this is going to be
35610
26:28:40,551 --> 26:28:47,191
a circle class it is going to be a
35611
26:28:42,911 --> 26:28:50,551
specialization on oval in which both x
35612
26:28:47,191 --> 26:28:52,479
and y radius are equal so the x radius
35613
26:28:50,551 --> 26:28:54,551
is going to be something like this and
35614
26:28:52,479 --> 26:28:57,360
the y radius is going to be something
35615
26:28:54,551 --> 26:28:59,911
like this and both of these are going to
35616
26:28:57,360 --> 26:29:02,720
be equal so this is going to give us a
35617
26:28:59,911 --> 26:29:05,039
circle shape we also have a draw method
35618
26:29:02,720 --> 26:29:07,911
which is going to print the description
35619
26:29:05,039 --> 26:29:10,319
and the radius we can really pick any
35620
26:29:07,911 --> 26:29:12,399
radius we can pick the x radius we can
35621
26:29:10,320 --> 26:29:14,552
pick the y radius they are really going
35622
26:29:12,399 --> 26:29:17,360
to be the same because they are equal
35623
26:29:14,551 --> 26:29:19,119
for our circle shape we also have a
35624
26:29:17,360 --> 26:29:21,600
simple constructor which is going to
35625
26:29:19,119 --> 26:29:23,440
take the radius and we are going to be
35626
26:29:23,440 --> 26:29:29,440
to forward the data to our oval part of
35627
26:29:26,800 --> 26:29:32,160
us and we're going to be setting this as
35628
26:29:29,440 --> 26:29:34,639
both x and y radius this is the setup we
35629
26:29:32,160 --> 26:29:37,040
have here okay now that we have our
35630
26:29:34,639 --> 26:29:39,600
inheritance hierarchy we're going to try
35631
26:29:37,039 --> 26:29:42,399
and use it and really explore the idea
35632
26:29:39,600 --> 26:29:45,040
of static binding in c plus plus
35633
26:29:42,399 --> 26:29:47,039
inheritance hierarchies so here we are
35634
26:29:47,039 --> 26:29:52,639
objects of our classes we have a shape
35635
26:29:50,160 --> 26:29:55,440
object we have an oval object and we
35636
26:29:52,639 --> 26:29:58,479
have a circle object we are going to go
35637
26:29:55,440 --> 26:30:00,160
through a base pointer and try to manage
35638
26:30:00,160 --> 26:30:03,832
in our first line we're going to set up
35639
26:30:02,000 --> 26:30:06,872
a shape pointer and we're going to store
35640
26:30:03,831 --> 26:30:09,759
in the address of shape one and what we
35641
26:30:06,872 --> 26:30:12,720
would want in our c plus plus program is
35642
26:30:09,759 --> 26:30:15,191
that if we call the draw method on this
35643
26:30:12,720 --> 26:30:17,680
shape pointer we would want the shape
35644
26:30:15,191 --> 26:30:20,551
draw method to be called because we have
35645
26:30:17,679 --> 26:30:22,959
a shape object stored in our base
35646
26:30:20,551 --> 26:30:25,911
pointer here or in other words we are
35647
26:30:22,960 --> 26:30:28,552
using a base pointer to manage this
35648
26:30:25,911 --> 26:30:32,080
object in memory down here we store a
35649
26:30:28,551 --> 26:30:34,080
novel object in our shape pointer or in
35650
26:30:32,080 --> 26:30:37,360
other words we're going to be using this
35651
26:30:34,080 --> 26:30:40,000
base pointer to manage an actual oval
35652
26:30:37,360 --> 26:30:42,479
object in memory and the setup we want
35653
26:30:40,000 --> 26:30:44,872
is that if we call the draw method on
35654
26:30:42,479 --> 26:30:47,831
this shape pointer now we are going to
35655
26:30:44,872 --> 26:30:49,832
get the oval draw method to be called
35656
26:30:49,831 --> 26:30:54,639
and down here we have another example
35657
26:30:52,080 --> 26:30:57,680
where we are using this base pointer to
35658
26:30:54,639 --> 26:31:00,080
manage a circle object we are going to
35659
26:30:57,679 --> 26:31:02,000
store the address of the circle object
35660
26:31:00,080 --> 26:31:04,479
in this base pointer this is how we do
35661
26:31:04,479 --> 26:31:10,551
a draw method on this base pointer we
35662
26:31:07,759 --> 26:31:13,911
want the circle draw method to be called
35663
26:31:10,551 --> 26:31:18,159
so with polymorphism what we really want
35664
26:31:13,911 --> 26:31:20,639
is to call a method on the base pointer
35665
26:31:18,160 --> 26:31:23,360
and get the most specific possible
35666
26:31:20,639 --> 26:31:25,600
method called on our pointer this is the
35667
26:31:23,360 --> 26:31:28,399
setup we want but this is not what we
35668
26:31:25,600 --> 26:31:31,192
get by default in c plus plus if we
35669
26:31:28,399 --> 26:31:33,759
happen to do this and run our program as
35670
26:31:31,191 --> 26:31:36,080
is now with the current knowledge that
35671
26:31:33,759 --> 26:31:37,831
we have on the first line here we're
35672
26:31:36,080 --> 26:31:40,000
going to get the shape draw method
35673
26:31:37,831 --> 26:31:42,000
called this is what we want but on the
35674
26:31:40,000 --> 26:31:44,720
second example here we will see that we
35675
26:31:42,000 --> 26:31:47,279
see the shape draw method also called
35676
26:31:44,720 --> 26:31:49,512
and on this line we will also see that
35677
26:31:47,279 --> 26:31:52,080
we get the shape draw method to be
35678
26:31:49,512 --> 26:31:54,960
called this is not what we want and this
35679
26:31:52,080 --> 26:31:58,000
is static binding so what is happening
35680
26:31:54,960 --> 26:32:00,872
here is the compiler is looking at the
35681
26:31:58,000 --> 26:32:03,911
type of the pointer and it is using that
35682
26:32:00,872 --> 26:32:06,080
to decide which draw method to call so
35683
26:32:03,911 --> 26:32:08,959
the compiler is so the compiler is
35684
26:32:06,080 --> 26:32:11,440
basically saying i have a shape pointer
35685
26:32:08,960 --> 26:32:14,080
so i am going to call the joe method on
35686
26:32:11,440 --> 26:32:16,960
the shape class down here it is going to
35687
26:32:14,080 --> 26:32:19,512
see that it also has a shape pointer and
35688
26:32:16,960 --> 26:32:22,080
it is going to call the draw method on
35689
26:32:19,512 --> 26:32:24,551
shape and down here it is going to see
35690
26:32:22,080 --> 26:32:27,040
that it has a shape pointer and it is
35691
26:32:24,551 --> 26:32:30,000
going to call the jaw method on the
35692
26:32:27,039 --> 26:32:31,759
shape class this is what static binding
35693
26:32:30,000 --> 26:32:35,360
is all about the compiler is going to
35694
26:32:31,759 --> 26:32:37,679
resolve the joe method statically and
35695
26:32:35,360 --> 26:32:39,680
what that means is that the compiler is
35696
26:32:37,679 --> 26:32:42,319
going to look at the type of the pointer
35697
26:32:39,679 --> 26:32:46,000
that we have and it is going to use that
35698
26:32:42,320 --> 26:32:48,720
to decide which joe method to call in
35699
26:32:46,000 --> 26:32:51,039
our inheritance hierarchy so this is the
35700
26:32:48,720 --> 26:32:53,360
default and it is called static binding
35701
26:32:51,039 --> 26:32:55,759
in c plus plus we also get the same
35702
26:32:53,360 --> 26:32:58,639
behavior if we try to use a base
35703
26:32:55,759 --> 26:33:01,191
reference to manage our actual object in
35704
26:32:58,639 --> 26:33:04,232
memory here we have the same kinds of
35705
26:33:01,191 --> 26:33:07,512
objects we had in a previous slide and
35706
26:33:04,232 --> 26:33:10,639
we are using a base reference to manage
35707
26:33:07,512 --> 26:33:13,279
our object and what we really want is
35708
26:33:10,639 --> 26:33:16,160
that if we go through a base reference
35709
26:33:13,279 --> 26:33:19,512
to call our draw method we will get the
35710
26:33:16,160 --> 26:33:22,080
most specific draw method called so if
35711
26:33:19,512 --> 26:33:24,872
our base reference is managing a shape
35712
26:33:22,080 --> 26:33:27,440
we will get the shape draw method called
35713
26:33:24,872 --> 26:33:30,000
if our base reference is managing an
35714
26:33:27,440 --> 26:33:33,360
alpha object we want the oval draw
35715
26:33:30,000 --> 26:33:36,320
method to be called here and if our base
35716
26:33:33,360 --> 26:33:39,440
reference is managing a circle object we
35717
26:33:36,320 --> 26:33:41,280
want the circle joe method called here
35718
26:33:39,440 --> 26:33:43,191
this is what we want but again the
35719
26:33:41,279 --> 26:33:45,512
compiler is just going to look at the
35720
26:33:43,191 --> 26:33:47,360
type of the reference so for the first
35721
26:33:45,512 --> 26:33:50,000
line here it's going to say i have a
35722
26:33:47,360 --> 26:33:51,911
shape reference so i am going to call
35723
26:33:50,000 --> 26:33:54,320
the shape draw method that's what we're
35724
26:33:51,911 --> 26:33:56,160
going to get here on the second line
35725
26:33:54,320 --> 26:33:59,040
here it's going to say uh-huh i have a
35726
26:33:56,160 --> 26:34:01,040
shape reference so i will call
35727
26:33:59,039 --> 26:34:02,399
the draw method of the shape class
35728
26:34:01,039 --> 26:34:04,871
that's what we're going to see here by
35729
26:34:02,399 --> 26:34:07,360
default and on this line here it is
35730
26:34:04,872 --> 26:34:09,512
going to say i have a shape reference so
35731
26:34:07,360 --> 26:34:11,360
i am going to call the draw method on
35732
26:34:09,512 --> 26:34:14,400
the shape class and this is the behavior
35733
26:34:11,360 --> 26:34:16,960
we get by default and this is static
35734
26:34:14,399 --> 26:34:19,039
binding in action okay so now that we
35735
26:34:16,960 --> 26:34:22,480
have seen what static binding is all
35736
26:34:19,039 --> 26:34:24,959
about let's re-examine the idea of why
35737
26:34:22,479 --> 26:34:26,639
we need polymorphism and i am going to
35738
26:34:24,960 --> 26:34:29,120
give you a simple example here suppose
35739
26:34:26,639 --> 26:34:32,080
we have a bunch of shapes we manage in
35740
26:34:29,119 --> 26:34:34,551
our programs and we want to draw all
35741
26:34:32,080 --> 26:34:37,119
these shapes if we want to draw a circle
35742
26:34:34,551 --> 26:34:39,360
with the current setup we have we would
35743
26:34:37,119 --> 26:34:41,360
set up a draw circle method if we want
35744
26:34:39,360 --> 26:34:44,000
to draw a novel we would need to set up
35745
26:34:41,360 --> 26:34:46,232
a draw over method and this will call
35746
26:34:44,000 --> 26:34:48,960
our circle draw method and this will
35747
26:34:46,232 --> 26:34:51,120
call our oval joe method this is going
35748
26:34:48,960 --> 26:34:54,160
to do what we want but try to think
35749
26:34:51,119 --> 26:34:57,831
about this if we have 100 shapes in our
35750
26:34:54,160 --> 26:34:59,600
program we will need to set up 100 such
35751
26:34:57,831 --> 26:35:01,759
methods and this is a mess i don't think
35752
26:34:59,600 --> 26:35:04,400
you want to do something like this
35753
26:35:01,759 --> 26:35:06,720
and we have another simple case that i
35754
26:35:04,399 --> 26:35:10,000
want you to consider suppose we want to
35755
26:35:06,720 --> 26:35:12,000
store all these objects in collections
35756
26:35:10,000 --> 26:35:14,800
and we're going to use an array to try
35757
26:35:12,000 --> 26:35:16,720
and drive this point home here if we
35758
26:35:14,800 --> 26:35:18,160
want to store these guys in collections
35759
26:35:16,720 --> 26:35:21,911
we will need to set up different
35760
26:35:18,160 --> 26:35:24,800
collections because as we have it now we
35761
26:35:21,911 --> 26:35:27,119
can't store different types in an array
35762
26:35:24,800 --> 26:35:29,832
so what we would need to do now is to
35763
26:35:27,119 --> 26:35:32,639
set up an array for circles and set up
35764
26:35:29,831 --> 26:35:34,479
an array for ovals and do more
35765
26:35:32,639 --> 26:35:36,720
collections for different kinds of
35766
26:35:34,479 --> 26:35:38,872
shapes that we support in our program
35767
26:35:36,720 --> 26:35:40,872
and if we want to draw them we have no
35768
26:35:38,872 --> 26:35:43,192
choice but to set up different kinds of
35769
26:35:40,872 --> 26:35:44,960
loops and each of these loops is going
35770
26:35:43,191 --> 26:35:47,039
to be looping on each of these
35771
26:35:44,960 --> 26:35:49,040
collections here hopefully you can see
35772
26:35:47,039 --> 26:35:51,360
that this is by design we don't want to
35773
26:35:49,039 --> 26:35:53,191
do this we want to set up something that
35774
26:35:51,360 --> 26:35:56,551
is really easier to manage in our
35775
26:35:53,191 --> 26:35:59,039
program and polymorphism was
35776
26:35:56,551 --> 26:36:02,319
and polymorphism and c plus plus was
35777
26:35:59,039 --> 26:36:03,279
designed to exactly solve this kind of
35778
26:36:03,279 --> 26:36:08,160
what we really want in our c plus plus
35779
26:36:05,039 --> 26:36:10,159
programs is to set up one draw method
35780
26:36:08,160 --> 26:36:12,720
for example we can give it a base
35781
26:36:10,160 --> 26:36:15,279
pointer and it doesn't matter which kind
35782
26:36:12,720 --> 26:36:17,759
of object we pass it when we call this
35783
26:36:15,279 --> 26:36:20,872
we will get that method to be called at
35784
26:36:17,759 --> 26:36:23,191
run time when we actually need to draw
35785
26:36:20,872 --> 26:36:25,279
this shape if we pass in a circle this
35786
26:36:23,191 --> 26:36:28,799
is going to draw the draw method on a
35787
26:36:25,279 --> 26:36:32,000
circle if we pass in a novel it will
35788
26:36:28,800 --> 26:36:34,551
call the draw method on our oval object
35789
26:36:32,000 --> 26:36:36,800
if we pass in a rectangle for example it
35790
26:36:34,551 --> 26:36:39,191
is going to call the draw method on our
35791
26:36:36,800 --> 26:36:41,279
rectangle object this is what we want we
35792
26:36:39,191 --> 26:36:43,039
also want the same kind of setup if for
35793
26:36:41,279 --> 26:36:44,800
example our functions are taking
35794
26:36:43,039 --> 26:36:46,959
reference and this is what we're going
35795
26:36:44,800 --> 26:36:49,279
to get this is what we want with
35796
26:36:46,960 --> 26:36:51,760
polymorphism and this is really going to
35797
26:36:49,279 --> 26:36:54,319
improve on the design that we had
35798
26:36:51,759 --> 26:36:56,639
earlier when we needed to set up a
35799
26:36:54,320 --> 26:36:58,640
specific method for each shape and we
35800
26:36:56,639 --> 26:37:00,960
would end up with hundreds of draw
35801
26:36:58,639 --> 26:37:02,960
methods and that's really bad it's not
35802
26:37:00,960 --> 26:37:05,360
manageable this is also going to solve
35803
26:37:05,360 --> 26:37:09,759
we really need to set up one collection
35804
26:37:07,600 --> 26:37:12,480
which is going to be taking into account
35805
26:37:09,759 --> 26:37:15,279
all the ships that we manage in our
35806
26:37:12,479 --> 26:37:16,639
inheritance hierarchy so the setup we do
35807
26:37:15,279 --> 26:37:18,551
is something like this we're going to
35808
26:37:16,639 --> 26:37:21,440
set up an array that is going to be
35809
26:37:18,551 --> 26:37:24,319
storing pointers to shape and we can
35810
26:37:21,440 --> 26:37:26,400
store in the address of a shape we can
35811
26:37:24,320 --> 26:37:28,080
store in the address of a novel we can
35812
26:37:26,399 --> 26:37:30,000
store in the address of the circle
35813
26:37:28,080 --> 26:37:32,080
because if you really think about it a
35814
26:37:30,000 --> 26:37:33,911
circle is a shape a novel is the shape
35815
26:37:32,080 --> 26:37:36,720
and the shape is the shape so this is
35816
26:37:33,911 --> 26:37:38,551
going to work and when we get to loop
35817
26:37:36,720 --> 26:37:41,191
through this collection and call the
35818
26:37:38,551 --> 26:37:43,440
draw method for the first item here we
35819
26:37:41,191 --> 26:37:45,512
will call the draw method on the shape
35820
26:37:43,440 --> 26:37:48,960
for the second element here we will call
35821
26:37:45,512 --> 26:37:51,040
the joe method on the oval object and
35822
26:37:48,960 --> 26:37:54,000
for the third element here we will call
35823
26:37:51,039 --> 26:37:56,399
the draw method on our circle object and
35824
26:37:54,000 --> 26:37:59,119
we will draw a shape a novel and a
35825
26:37:56,399 --> 26:38:01,439
circle with just one loop and this is
35826
26:37:59,119 --> 26:38:03,679
really cool this is the design we want
35827
26:38:01,440 --> 26:38:06,232
now this is not the default behavior we
35828
26:38:03,679 --> 26:38:08,399
get in our c plus plus classes if we set
35829
26:38:06,232 --> 26:38:10,800
up an inheritance hierarchy
35830
26:38:08,399 --> 26:38:13,439
with our draw methods what we get by
35831
26:38:10,800 --> 26:38:16,639
default is static binding but we will
35832
26:38:13,440 --> 26:38:19,191
see how we can get dynamic binding or
35833
26:38:16,639 --> 26:38:20,872
polymorphism in the next lecture for
35834
26:38:19,191 --> 26:38:22,639
this one we're going to explore static
35835
26:38:20,872 --> 26:38:24,551
binding and we're going to head over to
35836
26:38:22,639 --> 26:38:27,191
visual studio code and play with us a
35837
26:38:24,551 --> 26:38:29,440
little more here we are in our working
35838
26:38:27,191 --> 26:38:32,231
folder the current project is static
35839
26:38:29,440 --> 26:38:35,040
binding with inheritance we are going to
35840
26:38:32,232 --> 26:38:37,360
grab our template files this is going to
35841
26:38:35,039 --> 26:38:40,231
be our starting point here we're going
35842
26:38:37,360 --> 26:38:42,872
to put in these files and i am going to
35843
26:38:40,232 --> 26:38:44,639
put in our classes to save time
35844
26:38:42,872 --> 26:38:47,192
if you want you can download these
35845
26:38:47,191 --> 26:38:50,799
resource section on this lecture you're
35846
26:38:48,960 --> 26:38:52,800
going to find them and you can use them
35847
26:38:50,800 --> 26:38:54,872
as a starting point this is going to
35848
26:38:52,800 --> 26:38:56,960
save us a few seconds because we don't
35849
26:38:54,872 --> 26:38:59,192
really want to type these classes you
35850
26:38:56,960 --> 26:39:02,232
already know how to create classes if
35851
26:38:59,191 --> 26:39:04,639
you made it this far in the course so i
35852
26:39:02,232 --> 26:39:07,040
am going to drag this and drop here to
35853
26:39:04,639 --> 26:39:08,720
open in visual studio code and this is
35854
26:39:07,039 --> 26:39:11,439
going to give us a good starting point
35855
26:39:08,720 --> 26:39:13,759
here we have a base class which is our
35856
26:39:11,440 --> 26:39:15,832
shape class it is going to have a simple
35857
26:39:13,759 --> 26:39:18,551
member variable which is going to be the
35858
26:39:15,831 --> 26:39:21,279
description one thing i think we need to
35859
26:39:18,551 --> 26:39:23,759
improve on this is to use a string view
35860
26:39:23,759 --> 26:39:28,399
so let's include string view we can
35861
26:39:26,639 --> 26:39:31,119
include that here we're going to say
35862
26:39:28,399 --> 26:39:32,871
include string view because we are using
35863
26:39:31,119 --> 26:39:36,479
modern c plus plus and we're going to
35864
26:39:32,872 --> 26:39:39,192
change this to be an sdd string view by
35865
26:39:36,479 --> 26:39:41,679
value we can do this okay so we have our
35866
26:39:39,191 --> 26:39:43,512
class here and we have a draw method
35867
26:39:41,679 --> 26:39:45,279
which is really not going to do anything
35868
26:39:43,512 --> 26:39:47,512
special it's going to just print the
35869
26:39:45,279 --> 26:39:50,720
description here and we're going to see
35870
26:39:47,512 --> 26:39:53,760
it printed out on the output stream
35871
26:39:50,720 --> 26:39:56,080
if we look at the cpp file we just have
35872
26:39:53,759 --> 26:39:58,720
an implementation of our constructor and
35873
26:39:56,080 --> 26:40:01,680
we have a destructor we're going to fix
35874
26:39:58,720 --> 26:40:05,191
our parameter here to make it an std
35875
26:40:01,679 --> 26:40:06,719
string view let's look at our oval class
35876
26:40:09,440 --> 26:40:13,760
and we have a bunch of member variables
35877
26:40:11,600 --> 26:40:16,160
here two to be exact one is going to be
35878
26:40:13,759 --> 26:40:19,360
the x radius the other is going to be
35879
26:40:16,160 --> 26:40:21,120
our y radius we have a constructor here
35880
26:40:19,360 --> 26:40:24,232
which is going to be taking three
35881
26:40:21,119 --> 26:40:28,399
parameters two parameters for the data
35882
26:40:24,232 --> 26:40:30,480
for our radius here and we have a
35883
26:40:28,399 --> 26:40:33,119
third parameter which is going to store
35884
26:40:30,479 --> 26:40:36,399
our description data we're going to also
35885
26:40:33,119 --> 26:40:38,959
change this to bstd string view and this
35886
26:40:36,399 --> 26:40:41,039
is going to do we have a draw method
35887
26:40:38,960 --> 26:40:44,480
which is going to be printing the
35888
26:40:41,039 --> 26:40:46,551
description and our radius data and this
35889
26:40:44,479 --> 26:40:50,231
is really it we don't need anything
35890
26:40:46,551 --> 26:40:51,831
fancy here let's look at our oval cpp
35891
26:40:50,232 --> 26:40:54,400
file it is going to have the
35892
26:40:51,831 --> 26:40:56,399
implementation for our constructor
35893
26:40:56,399 --> 26:41:01,911
we just need to change the type for our
35894
26:40:59,440 --> 26:41:04,400
description here and make this an sdd
35895
26:41:01,911 --> 26:41:06,959
string view let's do this and we will
35896
26:41:04,399 --> 26:41:10,000
look at our circle class which is going
35897
26:41:10,000 --> 26:41:14,232
publicly it won't have any member
35898
26:41:12,639 --> 26:41:18,000
variable because it's just going to
35899
26:41:14,232 --> 26:41:20,360
forward the data to the over portoverse
35900
26:41:18,000 --> 26:41:23,039
it doesn't really need to do any other
35901
26:41:20,360 --> 26:41:24,551
specialization but what we need is a
35902
26:41:23,039 --> 26:41:26,479
method which is going to return the
35903
26:41:24,551 --> 26:41:30,080
radius because we want to print that
35904
26:41:26,479 --> 26:41:33,039
here so we can head over in our oval
35905
26:41:30,080 --> 26:41:34,960
class and set up a protected section
35906
26:41:33,039 --> 26:41:36,959
which is going to give us these methods
35907
26:41:34,960 --> 26:41:39,440
here so i'm just going to put them in
35908
26:41:36,960 --> 26:41:41,680
here to save on some time it is
35909
26:41:39,440 --> 26:41:44,720
protected because we want this to be
35910
26:41:41,679 --> 26:41:47,511
usable in derived classes but we don't
35911
26:41:44,720 --> 26:41:49,600
want this usable from the outside this
35912
26:41:47,512 --> 26:41:52,479
is the setup we can achieve by making
35913
26:41:49,600 --> 26:41:55,512
these guys protected here get x rad is
35914
26:41:52,479 --> 26:41:57,831
going to return the x radius get y rad
35915
26:41:55,512 --> 26:42:00,080
is going to return the y radius they are
35916
26:41:57,831 --> 26:42:03,360
const because we don't intend for this
35917
26:42:00,080 --> 26:42:06,320
to modify our object and if we go in our
35918
26:42:03,360 --> 26:42:08,800
circle class this is going to work now
35919
26:42:08,800 --> 26:42:14,800
information on our circle object and we
35920
26:42:11,360 --> 26:42:17,039
will see on our output stream if we look
35921
26:42:14,800 --> 26:42:19,680
at the implementation of our circle
35922
26:42:17,039 --> 26:42:22,159
class it is nothing complicated it is
35923
26:42:19,679 --> 26:42:24,231
just going to take the double radius and
35924
26:42:22,160 --> 26:42:27,680
it is going to forward the data to the
35925
26:42:24,232 --> 26:42:29,832
oval part of us and our description here
35926
26:42:29,831 --> 26:42:34,799
to take into account that we want to use
35927
26:42:32,479 --> 26:42:38,959
std string view here so let's change
35928
26:42:34,800 --> 26:42:42,160
this to bhd string view we can do that
35929
26:42:38,960 --> 26:42:45,600
and we are going to head over in our cpp
35930
26:42:42,160 --> 26:42:48,552
file and change that as well std string
35931
26:42:45,600 --> 26:42:51,040
view you can do that and now our classes
35932
26:42:48,551 --> 26:42:54,479
are really complete we can head over in
35933
26:42:51,039 --> 26:42:56,159
our main cpp file we can clean that up a
35934
26:42:54,479 --> 26:42:58,080
little bit and we're going to remove
35935
26:42:58,080 --> 26:43:02,232
we are going to include our classes so
35936
26:43:00,160 --> 26:43:03,040
we're going to include shape let's do
35937
26:43:03,039 --> 26:43:09,279
we are going to put in oval let's do
35938
26:43:05,831 --> 26:43:11,439
that oval dot h and we are going to put
35939
26:43:09,279 --> 26:43:13,512
in circle and we are going to create
35940
26:43:11,440 --> 26:43:15,760
objects of these classes and try to
35941
26:43:13,512 --> 26:43:18,000
print their information so we're going
35942
26:43:15,759 --> 26:43:19,511
to set up a shape called the shape one
35943
26:43:18,000 --> 26:43:21,600
we're going to set up a novel called
35944
26:43:19,512 --> 26:43:23,360
oval one we're going to set up a circle
35945
26:43:21,600 --> 26:43:25,832
called circle one and we're going to see
35946
26:43:23,360 --> 26:43:28,720
what kind of information we see
35947
26:43:25,831 --> 26:43:30,639
if we try to call the job method again
35948
26:43:28,720 --> 26:43:33,512
in shape the draw method is just going
35949
26:43:30,639 --> 26:43:35,600
to say that we are calling shape joe
35950
26:43:33,512 --> 26:43:38,000
in alvo we are going to say that we are
35951
26:43:35,600 --> 26:43:40,639
drawing an oval and we're going to say
35952
26:43:38,000 --> 26:43:42,320
the description and the radius in circle
35953
26:43:40,639 --> 26:43:44,800
we're going to say that we are calling
35954
26:43:42,320 --> 26:43:47,120
the draw method on the circle object and
35955
26:43:44,800 --> 26:43:49,512
say the description and the radius here
35956
26:43:47,119 --> 26:43:52,871
this is the information we want so we
35957
26:43:49,512 --> 26:43:55,680
are going to try and build this program
35958
26:43:52,872 --> 26:43:57,760
using gcc our favorite compiler you can
35959
26:43:55,679 --> 26:44:00,079
really use any compiler you have your
35960
26:43:57,759 --> 26:44:02,479
hands on but we are going to use gcc
35961
26:44:00,080 --> 26:44:05,512
here because it is our favorite and
35962
26:44:02,479 --> 26:44:08,231
we're going to have a bunch of errors
35963
26:44:05,512 --> 26:44:10,320
what it is that we have here what is it
35964
26:44:08,232 --> 26:44:11,360
that we have here let's go in shape
35965
26:44:11,360 --> 26:44:17,279
at line 4 and see what we have and we
35966
26:44:14,960 --> 26:44:19,040
have a j here that we don't want let's
35967
26:44:17,279 --> 26:44:20,872
take this out and we're going to build
35968
26:44:19,039 --> 26:44:23,511
it and we're going to pass this through
35969
26:44:20,872 --> 26:44:26,080
gcc and the bolt is going to be good we
35970
26:44:23,512 --> 26:44:28,639
can bring up a powershell window to run
35971
26:44:26,080 --> 26:44:30,960
our program let's run rooster and we're
35972
26:44:28,639 --> 26:44:33,831
going to see that shape draw was called
35973
26:44:30,960 --> 26:44:36,720
drawing shape one you see we have just
35974
26:44:33,831 --> 26:44:38,799
created shape one here and we are
35975
26:44:38,800 --> 26:44:43,832
we are going to call the oval drill
35976
26:44:41,360 --> 26:44:45,600
method and we're going to print
35977
26:44:43,831 --> 26:44:48,000
the information on that you see that it
35978
26:44:45,600 --> 26:44:50,960
is over one here and we're going to put
35979
26:44:48,000 --> 26:44:54,080
out our radius data x radius is going to
35980
26:44:50,960 --> 26:44:56,232
be 2 as we specified here y radius is
35981
26:44:54,080 --> 26:44:58,800
going to be 3.5 and this is our
35982
26:44:56,232 --> 26:45:01,120
information we are also going to call
35983
26:44:58,800 --> 26:45:03,600
the draw method on our circle object
35984
26:45:01,119 --> 26:45:05,759
this is what we get and we're going to
35985
26:45:03,600 --> 26:45:08,320
say we are drawing circle 1 and the
35986
26:45:05,759 --> 26:45:11,439
radius is going to be 3 3 this is our
35987
26:45:08,320 --> 26:45:14,160
information here but we don't want to go
35988
26:45:11,440 --> 26:45:16,800
through direct objects to manage our
35989
26:45:14,160 --> 26:45:20,320
data here what we want is to either go
35990
26:45:16,800 --> 26:45:22,232
through base pointers or base references
35991
26:45:20,320 --> 26:45:24,160
so we are going to set up a shape
35992
26:45:22,232 --> 26:45:26,480
pointer let's do that we're going to say
35993
26:45:24,160 --> 26:45:27,832
shift because that's our base class and
35994
26:45:27,831 --> 26:45:33,360
shape ptr to represent our pointer and
35995
26:45:30,960 --> 26:45:35,512
we're going to store in the address of
35996
26:45:33,360 --> 26:45:37,360
shape one we can do something like this
35997
26:45:35,512 --> 26:45:39,832
and that's really see what is happening
35998
26:45:37,360 --> 26:45:42,160
we're going to comment out our calls to
35999
26:45:39,831 --> 26:45:46,231
draw methods here and we're going to see
36000
26:45:42,160 --> 26:45:48,320
what happens so if we say shape ptr and
36001
26:45:46,232 --> 26:45:50,480
call the draw method we can do that
36002
26:45:48,320 --> 26:45:52,800
let's try and build our program
36003
26:45:50,479 --> 26:45:54,231
we're going to pass this through gcc
36004
26:45:52,800 --> 26:45:56,080
you're going to see that it is going to
36005
26:45:54,232 --> 26:45:58,400
work and it is going to do what we
36006
26:45:56,080 --> 26:46:00,639
expect if we run this program here you
36007
26:45:58,399 --> 26:46:03,360
can clear and run rooster we're going to
36008
26:46:00,639 --> 26:46:05,440
see that shape draw was called and we
36009
26:46:03,360 --> 26:46:08,232
are going to be drawing shape one here
36010
26:46:05,440 --> 26:46:11,191
this is what we expect but if we go down
36011
26:46:08,232 --> 26:46:13,680
and say we don't want to call the draw
36012
26:46:11,191 --> 26:46:15,759
method here we are going to store in
36013
26:46:13,679 --> 26:46:19,439
let's say shape ptr and we're going to
36014
26:46:15,759 --> 26:46:20,479
store in the address of our over one
36015
26:46:20,479 --> 26:46:26,231
and we want to call the draw method here
36016
26:46:23,831 --> 26:46:28,319
now if you do this as we saw in the
36017
26:46:28,320 --> 26:46:35,120
is to get the draw method on our actual
36018
26:46:32,160 --> 26:46:37,040
oval object called and if we will for
36019
26:46:35,119 --> 26:46:39,191
example drawing things on the screen we
36020
26:46:37,039 --> 26:46:41,039
would draw a novel this is what we want
36021
26:46:39,191 --> 26:46:42,720
here but this is not what we're going to
36022
26:46:41,039 --> 26:46:43,831
get you're going to see that we still
36023
26:46:43,831 --> 26:46:48,399
job method from the shape class called
36024
26:46:46,551 --> 26:46:51,679
and it is going to and it is going to
36025
26:46:48,399 --> 26:46:53,599
say drawing over one let's try and build
36026
26:46:51,679 --> 26:46:55,911
this program and i really want you to
36027
26:46:53,600 --> 26:46:57,912
see this so the builder is good we can
36028
26:46:55,911 --> 26:46:59,360
clear and run rooster you're going to
36029
26:46:59,360 --> 26:47:03,911
row even if we are storing again
36030
26:47:03,911 --> 26:47:09,279
object so this is the default behavior
36031
26:47:07,119 --> 26:47:12,639
we get and this is static binding that
36032
26:47:09,279 --> 26:47:15,039
we get by default in our inheritance
36033
26:47:12,639 --> 26:47:16,639
hierarchies so what the compiler is
36034
26:47:15,039 --> 26:47:19,039
really going to do here it's going to
36035
26:47:16,639 --> 26:47:21,360
look at the type of the pointer that we
36036
26:47:19,039 --> 26:47:24,399
have here it is going to say i have a
36037
26:47:21,360 --> 26:47:26,872
shape pointer so i am going to call the
36038
26:47:24,399 --> 26:47:29,279
jaw method on the shape type that i have
36039
26:47:26,872 --> 26:47:30,080
in my pointer here and we are going to
36040
26:47:30,080 --> 26:47:35,680
that this is calling the draw method on
36041
26:47:32,479 --> 26:47:38,319
our shape and this is not what we want
36042
26:47:35,679 --> 26:47:41,119
in most cases we are going to see that
36043
26:47:38,320 --> 26:47:43,512
we get the same behavior if we store an
36044
26:47:41,119 --> 26:47:45,440
a circle object let's do that we're
36045
26:47:43,512 --> 26:47:48,232
going to say shift pointer and we're
36046
26:47:45,440 --> 26:47:50,479
going to store in the address of our
36047
26:47:48,232 --> 26:47:53,760
circle one and then we're going to call
36048
26:47:50,479 --> 26:47:57,191
our draw method on our shape pointer
36049
26:47:53,759 --> 26:47:59,679
again this is going to draw a shape it's
36050
26:47:57,191 --> 26:48:02,231
not going to draw a circle that we
36051
26:47:59,679 --> 26:48:04,479
really are managing with our base
36052
26:48:02,232 --> 26:48:05,600
pointer here and some of you must be
36053
26:48:05,600 --> 26:48:11,680
why are we able to store circle pointers
36054
26:48:09,191 --> 26:48:14,319
for example in a shape well a circle is
36055
26:48:11,679 --> 26:48:16,959
a shape according to our inheritance
36056
26:48:14,320 --> 26:48:19,120
hierarchy if we take a closer look again
36057
26:48:16,960 --> 26:48:22,960
here you're going to see that oval is
36058
26:48:19,119 --> 26:48:25,599
going to be inheriting from shape
36059
26:48:22,960 --> 26:48:28,639
and the circle is going to be inheriting
36060
26:48:25,600 --> 26:48:30,000
from oval so from what we learned in the
36061
26:48:30,000 --> 26:48:36,000
oval has a shape part in it and the
36062
26:48:32,872 --> 26:48:38,551
circle has a novel part in it which in
36063
26:48:36,000 --> 26:48:40,720
turn is going to have a shaped board in
36064
26:48:38,551 --> 26:48:43,279
it so from this understanding it
36065
26:48:40,720 --> 26:48:45,759
shouldn't really be surprising that we
36066
26:48:45,759 --> 26:48:52,000
novel object with a shape pointer or the
36067
26:48:49,440 --> 26:48:53,040
fact that we are able to manage a circle
36068
26:48:53,039 --> 26:48:58,319
using a shape pointer this is why we are
36069
26:48:55,600 --> 26:49:00,800
able to do something like this okay so i
36070
26:48:58,320 --> 26:49:03,280
hope this is super clear but again we
36071
26:49:00,800 --> 26:49:05,512
are not getting the default behavior
36072
26:49:03,279 --> 26:49:08,319
that we want but we will see how we can
36073
26:49:05,512 --> 26:49:10,720
achieve that in the next lecture for now
36074
26:49:08,320 --> 26:49:13,120
i really want you to understand what
36075
26:49:10,720 --> 26:49:15,119
static binding is all about and it is
36076
26:49:13,119 --> 26:49:17,679
the fact that the compiler is going to
36077
26:49:15,119 --> 26:49:20,319
look at the type of the pointer here and
36078
26:49:17,679 --> 26:49:21,831
use that to decide which method it is
36079
26:49:21,831 --> 26:49:25,599
in our inheritance hierarchy the
36080
26:49:24,160 --> 26:49:28,400
compiler for example is going to see
36081
26:49:25,600 --> 26:49:31,192
that we have a circle object stored n at
36082
26:49:28,399 --> 26:49:34,479
lineup 25 here but when it wants to
36083
26:49:31,191 --> 26:49:36,399
decide which joe version to call it is
36084
26:49:34,479 --> 26:49:38,800
going to look at the type of this
36085
26:49:36,399 --> 26:49:41,360
pointer here and it is going to use that
36086
26:49:38,800 --> 26:49:43,120
to decide which draw method to call and
36087
26:49:41,360 --> 26:49:45,512
in this case it is going to call the
36088
26:49:43,119 --> 26:49:48,231
shape version because the type of this
36089
26:49:45,512 --> 26:49:50,639
pointer is shape okay so i really hope
36090
26:49:48,232 --> 26:49:52,800
this is super clear here we are going to
36091
26:49:50,639 --> 26:49:55,831
get the same behavior if we try to
36092
26:49:52,800 --> 26:49:58,160
manage our objects using references for
36093
26:49:55,831 --> 26:49:59,679
example if we go through a shape
36094
26:49:58,160 --> 26:50:02,400
reference let's do that we're going to
36095
26:49:59,679 --> 26:50:04,639
say shape reference and say shape ref
36096
26:50:02,399 --> 26:50:06,959
and we are going to store in shape one
36097
26:50:06,960 --> 26:50:13,040
and we want to call the draw method on
36098
26:50:09,911 --> 26:50:15,440
ship reference let's do that so let's
36099
26:50:13,039 --> 26:50:18,079
call the joe method and you're going to
36100
26:50:15,440 --> 26:50:19,040
see that we will get the shape method
36101
26:50:19,039 --> 26:50:23,119
and this is really making sense because
36102
26:50:23,119 --> 26:50:27,191
managed by this reference here so if we
36103
26:50:25,512 --> 26:50:29,360
build our program let's do that we're
36104
26:50:27,191 --> 26:50:31,039
going to pass this through gcc
36105
26:50:29,360 --> 26:50:32,800
you're going to see that we get what we
36106
26:50:31,039 --> 26:50:35,191
expect the build is going to be good
36107
26:50:32,800 --> 26:50:37,680
we're going to clear and run rooster and
36108
26:50:35,191 --> 26:50:40,720
we see shape drill called this is what
36109
26:50:37,679 --> 26:50:43,119
we want but if we use this reference to
36110
26:50:40,720 --> 26:50:45,680
manage derived object for example let's
36111
26:50:43,119 --> 26:50:48,551
put in over one we can do that we're
36112
26:50:45,679 --> 26:50:51,759
going to see that we don't get the most
36113
26:50:48,551 --> 26:50:54,399
specific draw method for oval here
36114
26:50:51,759 --> 26:50:56,319
called we will still get the method
36115
26:50:54,399 --> 26:50:59,039
for a shape called let's build and show
36116
26:50:56,320 --> 26:51:01,280
you this this is static binding again
36117
26:50:59,039 --> 26:51:02,799
okay the build is good we can clear and
36118
26:51:01,279 --> 26:51:05,831
run rooster we're going to see that
36119
26:51:02,800 --> 26:51:08,872
shape draw it is drawing we don't get
36120
26:51:05,831 --> 26:51:10,959
the ovo draw method called we get shape
36121
26:51:08,872 --> 26:51:12,960
drill method again the compiler is going
36122
26:51:10,960 --> 26:51:15,192
to look at the type of this reference by
36123
26:51:12,960 --> 26:51:17,832
default and it is going to use that to
36124
26:51:15,191 --> 26:51:20,319
decide which draw method to call if we
36125
26:51:17,831 --> 26:51:23,279
even put in a circle we are going to get
36126
26:51:20,320 --> 26:51:25,512
the same behavior let's build with gcc
36127
26:51:23,279 --> 26:51:27,911
the bolt is good we can clear and run
36128
26:51:25,512 --> 26:51:29,512
rooster we see that shape draw is called
36129
26:51:29,512 --> 26:51:34,232
what we want okay so this is static
36130
26:51:31,831 --> 26:51:36,959
binding and it is the default behavior
36131
26:51:34,232 --> 26:51:40,320
we get if we have an inheritance
36132
26:51:36,960 --> 26:51:43,192
hierarchy with the same method spread
36133
26:51:40,320 --> 26:51:45,600
across each derived class we're going to
36134
26:51:43,191 --> 26:51:47,911
get the shape version called even if
36135
26:51:45,600 --> 26:51:50,480
what we are really managing with a shape
36136
26:51:47,911 --> 26:51:52,479
pointer or a shape reference is a
36137
26:51:50,479 --> 26:51:55,119
derived object i really want you to
36138
26:51:52,479 --> 26:51:58,000
understand this now let's see why this
36139
26:51:55,119 --> 26:52:00,399
is really badly designed by default in c
36140
26:51:58,000 --> 26:52:02,872
plus plus if you happen to need to pass
36141
26:52:00,399 --> 26:52:04,799
ship parameters to functions for example
36142
26:52:02,872 --> 26:52:06,960
we might do something like this we might
36143
26:52:04,800 --> 26:52:08,960
need a function to draw a circle we
36144
26:52:06,960 --> 26:52:11,680
might need a function to draw a novel
36145
26:52:08,960 --> 26:52:14,080
and if you happen to have 100 objects
36146
26:52:11,679 --> 26:52:17,191
you can draw in your program you have no
36147
26:52:14,080 --> 26:52:19,512
choice but to set up 100 drawing methods
36148
26:52:17,191 --> 26:52:21,599
or functions this is really bad design
36149
26:52:19,512 --> 26:52:23,680
you don't want to do something like this
36150
26:52:21,600 --> 26:52:25,832
so what you would do in your program for
36151
26:52:27,679 --> 26:52:32,799
and you would say for example draw
36152
26:52:29,759 --> 26:52:35,279
circle and pass in a circle and say draw
36153
26:52:32,800 --> 26:52:37,512
oval do we have a draw or full function
36154
26:52:35,279 --> 26:52:40,800
let's see yes we have that we can go
36155
26:52:37,512 --> 26:52:43,279
down and say draw oval and pass in our
36156
26:52:40,800 --> 26:52:44,872
oval one this is going to work just fine
36157
26:52:43,279 --> 26:52:47,600
but hopefully you can see that this is
36158
26:52:44,872 --> 26:52:50,000
bad design if you have a lot of shapes
36159
26:52:47,600 --> 26:52:52,232
in your program this is going to quickly
36160
26:52:50,000 --> 26:52:54,800
become and manageable and you don't want
36161
26:52:52,232 --> 26:52:56,720
to do something like this what we want
36162
26:52:56,720 --> 26:53:02,080
to only have one method and get to the c
36163
26:52:59,759 --> 26:53:05,119
plus plus runtime to resolve which one
36164
26:53:02,080 --> 26:53:08,080
is called at runtime when we get to pass
36165
26:53:05,119 --> 26:53:10,399
our actual objects and we will only have
36166
26:53:08,080 --> 26:53:13,191
one function which is going to take into
36167
26:53:10,399 --> 26:53:14,959
account hundreds of shapes that we might
36168
26:53:13,191 --> 26:53:17,360
potentially have in our c plus plus
36169
26:53:14,960 --> 26:53:19,512
program this is going to be much easier
36170
26:53:17,360 --> 26:53:22,160
to manage and we will actually be able
36171
26:53:19,512 --> 26:53:24,551
to achieve this in the next lecture so
36172
26:53:22,160 --> 26:53:26,872
stay tuned for that another problem with
36173
26:53:24,551 --> 26:53:29,440
us is if you happen to need to store
36174
26:53:26,872 --> 26:53:31,120
these shapes in collections if you need
36175
26:53:29,440 --> 26:53:33,600
to set up something like this you will
36176
26:53:31,119 --> 26:53:36,799
have no choice but to set up different
36177
26:53:33,600 --> 26:53:39,120
collections for each type for example we
36178
26:53:36,800 --> 26:53:41,760
might set up a collection for a circle a
36179
26:53:39,119 --> 26:53:44,479
collection for oval and here we are just
36180
26:53:41,759 --> 26:53:46,399
using arrays to model our collections
36181
26:53:44,479 --> 26:53:49,119
this is really bad design if you happen
36182
26:53:46,399 --> 26:53:52,551
to have 100 shapes in your program you
36183
26:53:49,119 --> 26:53:54,399
will set up 100 such collections and the
36184
26:53:52,551 --> 26:53:56,319
only difference is that they are just
36185
26:53:54,399 --> 26:53:58,000
different types and this is really bad
36186
26:53:56,320 --> 26:54:00,640
design because even if they are
36187
26:53:58,000 --> 26:54:02,720
different types they are related and
36188
26:54:00,639 --> 26:54:05,191
they are all shapes in our c plus plus
36189
26:54:02,720 --> 26:54:07,191
program and what we really want is to
36190
26:54:05,191 --> 26:54:09,599
set up one collection which is going to
36191
26:54:07,191 --> 26:54:11,599
take into account all these kinds of
36192
26:54:09,600 --> 26:54:14,000
shapes that we might have in our c plus
36193
26:54:11,600 --> 26:54:16,480
plus program and we will be able to
36194
26:54:14,000 --> 26:54:18,320
achieve this again in the next lecture
36195
26:54:16,479 --> 26:54:20,639
but the whole point of this lecture was
36196
26:54:18,320 --> 26:54:22,800
to show you static binding that we get
36197
26:54:20,639 --> 26:54:26,000
by default with our inheritance
36198
26:54:22,800 --> 26:54:29,279
hierarchies static binding may be bad if
36199
26:54:26,000 --> 26:54:31,679
you really are managing a lot of related
36200
26:54:29,279 --> 26:54:34,319
objects in your c plus plus program
36201
26:54:31,679 --> 26:54:35,359
and all these objects have the same
36202
26:54:35,360 --> 26:54:40,800
that each derived class is specializing
36203
26:54:38,399 --> 26:54:43,911
but you want the most specialized method
36204
26:54:40,800 --> 26:54:46,800
to be called on the actual object that
36205
26:54:43,911 --> 26:54:48,959
you are managing with a base pointer or
36206
26:54:46,800 --> 26:54:51,440
a base reference hopefully this is super
36207
26:54:48,960 --> 26:54:54,000
clear i apologize this lecture turned
36208
26:54:51,440 --> 26:54:56,479
out to be really long but i wanted you
36209
26:54:54,000 --> 26:54:58,551
to make this super clear and everything
36210
26:54:56,479 --> 26:55:00,639
else we do in the reminder of this
36211
26:54:58,551 --> 26:55:02,639
chapter is really going to fall in place
36212
26:55:00,639 --> 26:55:04,872
so make sure you understand this and if
36213
26:55:02,639 --> 26:55:07,039
you have a problem do you ask me i will
36214
26:55:04,872 --> 26:55:08,639
do the best i can to help you out this
36215
26:55:07,039 --> 26:55:10,871
is really all i had to share in this
36216
26:55:08,639 --> 26:55:12,720
lecture i hope you found it interesting
36217
26:55:10,872 --> 26:55:14,400
we are going to stop here in this
36218
26:55:12,720 --> 26:55:16,872
lecture in the next one we're going to
36219
26:55:14,399 --> 26:55:20,079
show you how you can achieve dynamic
36220
26:55:16,872 --> 26:55:21,192
binding using virtual functions in c
36221
26:55:21,191 --> 26:55:25,512
go ahead and finish up here and meet me
36222
26:55:23,440 --> 26:55:28,800
there in this lecture we're going to see
36223
26:55:25,512 --> 26:55:30,551
how we can achieve dynamic binding or
36224
26:55:30,551 --> 26:55:35,279
using virtual functions in our
36225
26:55:32,960 --> 26:55:37,912
inheritance hierarchies in the last
36226
26:55:35,279 --> 26:55:40,319
lecture we had a hierarchy like this
36227
26:55:37,911 --> 26:55:43,279
where the base class was shaped we had
36228
26:55:40,320 --> 26:55:45,832
an overclass which was publicly deriving
36229
26:55:43,279 --> 26:55:48,000
or inheriting from shape and we had a
36230
26:55:45,831 --> 26:55:50,231
circle class which was publicly
36231
26:55:48,000 --> 26:55:53,279
inherited from over and the problem we
36232
26:55:50,232 --> 26:55:56,480
had was that if we happen to be managing
36233
26:55:56,479 --> 26:56:02,080
shape pointers or shape references we
36234
26:55:59,600 --> 26:56:04,160
don't get the correct methods called if
36235
26:56:04,160 --> 26:56:09,440
on our base pointer or base reference
36236
26:56:07,512 --> 26:56:12,160
and this was really bad and this is
36237
26:56:09,440 --> 26:56:14,400
something we want in practical c plus
36238
26:56:12,160 --> 26:56:16,400
plus programs i am here to tell you in
36239
26:56:14,399 --> 26:56:17,191
this lecture that you can just achieve
36240
26:56:17,191 --> 26:56:22,639
by doing a tiny modification on your
36241
26:56:20,160 --> 26:56:25,192
inheritance hierarchy all you need to do
36242
26:56:22,639 --> 26:56:27,600
is to mark the methods you need to be
36243
26:56:27,600 --> 26:56:33,832
virtual and we do that by inserting this
36244
26:56:30,639 --> 26:56:35,440
virtual keyword in front of our function
36245
26:56:33,831 --> 26:56:37,599
so we're going to do that on our shape
36246
26:56:35,440 --> 26:56:40,000
class we're going to do that on our over
36247
26:56:37,600 --> 26:56:42,800
class and we're going to do that on our
36248
26:56:40,000 --> 26:56:45,279
circle class once we do this the c plus
36249
26:56:42,800 --> 26:56:47,832
plus compiler is going to know i want to
36250
26:56:45,279 --> 26:56:50,160
be looking at the type of the pointer or
36251
26:56:47,831 --> 26:56:53,360
reference to know which kind of method
36252
26:56:50,160 --> 26:56:55,832
to call and my inheritance hierarchy if
36253
26:56:53,360 --> 26:56:58,639
i happen to be using a base pointer or a
36254
26:56:55,831 --> 26:57:00,399
base reference to manage a derived
36255
26:56:58,639 --> 26:57:02,800
object and we're going to be making this
36256
26:57:00,399 --> 26:57:04,639
super clear in a minute and if you are
36257
26:57:02,800 --> 26:57:06,639
lost please bear with me you're going to
36258
26:57:04,639 --> 26:57:10,080
understand so let's do this we're going
36259
26:57:06,639 --> 26:57:12,232
to modify our shape class and change our
36260
26:57:12,232 --> 26:57:16,800
as you see here we're going to head over
36261
26:57:14,479 --> 26:57:18,959
in our oval class we're going to modify
36262
26:57:16,800 --> 26:57:21,760
our draw method and mark it to be
36263
26:57:18,960 --> 26:57:24,080
virtual using the virtual keyword here
36264
26:57:21,759 --> 26:57:27,911
and we're going to move in our circle
36265
26:57:24,080 --> 26:57:29,759
class and change it to be virtual as you
36266
26:57:27,911 --> 26:57:30,720
see down here this is really all we need
36267
26:57:30,720 --> 26:57:36,160
from what we had in the last lecture and
36268
26:57:33,600 --> 26:57:38,160
this is going to be magic let's look at
36269
26:57:36,160 --> 26:57:41,040
what we can achieve now we're going to
36270
26:57:38,160 --> 26:57:43,192
set up three objects shape oval and
36271
26:57:41,039 --> 26:57:45,119
circle as you see here and we're going
36272
26:57:43,191 --> 26:57:46,959
to be calling our method which is going
36273
26:57:45,119 --> 26:57:50,000
to be taking references and we're going
36274
26:57:46,960 --> 26:57:52,552
to see that we get the correct most
36275
26:57:50,000 --> 26:57:55,279
specific method called so for example
36276
26:57:52,551 --> 26:57:57,512
here we will call the shape joe down
36277
26:57:55,279 --> 26:58:00,479
here we will call the oval draw method
36278
26:57:57,512 --> 26:58:02,720
because we just passed in a novel object
36279
26:58:00,479 --> 26:58:05,360
and on the third line here we will get
36280
26:58:02,720 --> 26:58:07,680
the circle joe method called and we will
36281
26:58:05,360 --> 26:58:09,360
see it printed out on the console this
36282
26:58:07,679 --> 26:58:12,000
is really cool this is what we want to
36283
26:58:09,360 --> 26:58:14,800
achieve if we want to call our methods
36284
26:58:12,000 --> 26:58:16,872
that take pointers we can do that and on
36285
26:58:14,800 --> 26:58:19,192
the first line here we will call shape
36286
26:58:16,872 --> 26:58:21,832
draw on the second line here we will
36287
26:58:19,191 --> 26:58:24,080
call overdraw and on the third line here
36288
26:58:21,831 --> 26:58:26,319
we will call circuit draw this is what
36289
26:58:24,080 --> 26:58:29,119
we want to achieve and if we happen to
36290
26:58:26,320 --> 26:58:31,120
be setting up a roll base pointer like
36291
26:58:31,119 --> 26:58:36,799
a derived object like this or another
36292
26:58:34,399 --> 26:58:39,439
way to say this if we happen to be using
36293
26:58:36,800 --> 26:58:42,160
this base pointer to manage a derived
36294
26:58:39,440 --> 26:58:44,800
object and we call the draw method on
36295
26:58:42,160 --> 26:58:47,279
the base pointer the compiler is going
36296
26:58:44,800 --> 26:58:50,720
to know that it will need to resolve
36297
26:58:47,279 --> 26:58:53,759
this draw method dynamically the reason
36298
26:58:50,720 --> 26:58:56,000
is this is a virtual method and if a
36299
26:58:53,759 --> 26:58:56,720
method is virtual the compiler want to
36300
26:58:56,720 --> 26:59:00,320
static binding like we did in the last
36301
26:58:58,800 --> 26:59:04,400
lecture the compiler is going to be
36302
26:59:00,320 --> 26:59:06,160
doing dynamic binding and with dynamic
36303
26:59:04,399 --> 26:59:08,551
binding the compiler is not going to
36304
26:59:06,160 --> 26:59:11,279
look at the type of the pointer it is
36305
26:59:08,551 --> 26:59:14,551
going to look at the type of the actual
36306
26:59:11,279 --> 26:59:16,872
object that the pointer is managing and
36307
26:59:14,551 --> 26:59:19,039
this is going to give us the behavior
36308
26:59:16,872 --> 26:59:20,800
that we wanted starting from the last
36309
26:59:19,039 --> 26:59:22,231
lecture okay now that you know this
36310
26:59:20,800 --> 26:59:24,080
we're going to head over to visual
36311
26:59:22,232 --> 26:59:26,960
studio code and play with us a little
36312
26:59:24,080 --> 26:59:29,759
more here we are in our working folder
36313
26:59:26,960 --> 26:59:32,320
the current project is polymorphism with
36314
26:59:29,759 --> 26:59:34,319
virtual functions we are going to be
36315
26:59:32,320 --> 26:59:35,680
reusing the code from the last lecture
36316
26:59:34,320 --> 26:59:37,440
because that's going to give us
36317
26:59:39,600 --> 26:59:43,832
binary file here which is rooster and
36318
26:59:42,160 --> 26:59:46,000
we're going to copy everything we want
36319
26:59:43,831 --> 26:59:48,479
we're going to put that in the current
36320
26:59:46,000 --> 26:59:51,119
project and we're going to open this in
36321
26:59:48,479 --> 26:59:54,080
visual studio code we are going to have
36322
26:59:51,119 --> 26:59:55,512
our main cpp file with a bunch of
36323
26:59:55,512 --> 27:00:01,119
and we will just need to modify this a
36324
26:59:58,232 --> 27:00:03,600
little bit to achieve dynamic binding as
36325
27:00:01,119 --> 27:00:06,479
we saw in the slides all we need to do
36326
27:00:03,600 --> 27:00:08,720
is to mark all these draw methods as
36327
27:00:06,479 --> 27:00:11,599
virtual so we're going to say virtual
36328
27:00:08,720 --> 27:00:14,000
void draw in the shape class we're going
36329
27:00:11,600 --> 27:00:15,760
to go in the oval class and do that
36330
27:00:14,000 --> 27:00:18,320
we're going to mark our method as
36331
27:00:15,759 --> 27:00:21,511
virtual and we are going to go in our
36332
27:00:18,320 --> 27:00:23,680
circle class and mark our draw method as
36333
27:00:21,512 --> 27:00:25,760
virtual let's do that and at the moment
36334
27:00:23,679 --> 27:00:29,191
we do this we're going to get dynamic
36335
27:00:25,759 --> 27:00:31,360
binding behavior in our inheritance
36336
27:00:29,191 --> 27:00:34,159
hierarchy here and this is really cool
36337
27:00:31,360 --> 27:00:36,720
so let's go back and try to play with
36338
27:00:34,160 --> 27:00:39,512
what we had before i am going to comment
36339
27:00:36,720 --> 27:00:42,551
out everything we had and we're going to
36340
27:00:39,512 --> 27:00:45,360
be doing things in step here let's go
36341
27:00:42,551 --> 27:00:46,399
through the code that uses base pointers
36342
27:00:46,399 --> 27:00:49,831
that's where we started out from in the
36343
27:00:52,320 --> 27:00:57,760
mark that here let's put in some space
36344
27:00:54,399 --> 27:01:00,319
to make it easy to follow so we are
36345
27:00:57,759 --> 27:01:02,551
going to uncomment the line here that
36346
27:01:00,320 --> 27:01:05,600
calls the draw method when we have a
36347
27:01:02,551 --> 27:01:08,000
shape object stored in our base pointer
36348
27:01:05,600 --> 27:01:10,552
or when we are using a base pointer to
36349
27:01:08,000 --> 27:01:12,639
manage a shape object here we can also
36350
27:01:10,551 --> 27:01:15,039
comment out all these lines because we
36351
27:01:12,639 --> 27:01:17,679
don't want this to do anything
36352
27:01:15,039 --> 27:01:20,231
and let's see yes this is what we want
36353
27:01:17,679 --> 27:01:22,719
we are setting up our shapes and we are
36354
27:01:20,232 --> 27:01:25,279
using a base pointer to manage an actual
36355
27:01:22,720 --> 27:01:27,512
shape object and if we call the draw
36356
27:01:25,279 --> 27:01:29,440
method we expect this to call
36357
27:01:27,512 --> 27:01:31,119
shape draw and this is what we're going
36358
27:01:29,440 --> 27:01:33,832
to get let's build our program we're
36359
27:01:31,119 --> 27:01:35,759
going to pass this through gcc our
36360
27:01:33,831 --> 27:01:38,159
favorite compiler the build is going to
36361
27:01:35,759 --> 27:01:40,319
be good we can bring up a powershell
36362
27:01:38,160 --> 27:01:42,000
window we can use to play with us if we
36363
27:01:40,320 --> 27:01:44,400
call rooster we're going to see that
36364
27:01:42,000 --> 27:01:46,551
shape draw is called and we are drawing
36365
27:01:44,399 --> 27:01:49,360
shape one now if we change this to
36366
27:01:46,551 --> 27:01:51,440
manage an actual oval object we can do
36367
27:01:49,360 --> 27:01:54,960
that we can do that through this line
36368
27:01:51,440 --> 27:01:57,279
here and we expect this to call overdraw
36369
27:01:54,960 --> 27:02:00,160
and because the draw method is now
36370
27:01:57,279 --> 27:02:02,479
virtual this will use dynamic binding
36371
27:02:00,160 --> 27:02:04,720
again with dynamic binding we are
36372
27:02:02,479 --> 27:02:07,599
telling the compiler don't look at the
36373
27:02:04,720 --> 27:02:10,551
type of the base pointer look at the
36374
27:02:07,600 --> 27:02:12,480
type of the actual object that the
36375
27:02:10,551 --> 27:02:14,639
pointer is managing and the compiler is
36376
27:02:12,479 --> 27:02:17,279
going to see that this object is a novel
36377
27:02:17,279 --> 27:02:22,160
the oval version of the draw method here
36378
27:02:20,639 --> 27:02:24,720
and this is really cool this is what we
36379
27:02:22,160 --> 27:02:27,192
want let's run the task to build with
36380
27:02:24,720 --> 27:02:29,360
gcc again the world is going to be good
36381
27:02:27,191 --> 27:02:31,831
as you see here we can clear
36382
27:02:29,360 --> 27:02:34,232
and if we run booster look at this
36383
27:02:31,831 --> 27:02:37,679
overdraw calls and we are going to be
36384
27:02:34,232 --> 27:02:39,680
drawing our oval object and this is the
36385
27:02:37,679 --> 27:02:42,319
data we have inside we can use this
36386
27:02:39,679 --> 27:02:44,639
radius data to draw this on the screen
36387
27:02:42,320 --> 27:02:46,400
if that's what we are after in our c
36388
27:02:44,639 --> 27:02:49,279
plus plus program and this is really
36389
27:02:46,399 --> 27:02:52,159
cool we can even use our base pointer to
36390
27:02:49,279 --> 27:02:54,232
manage a circle object we can do that
36391
27:02:52,160 --> 27:02:57,360
and if we do that and call the joe
36392
27:02:54,232 --> 27:03:00,000
method because this draw method is now
36393
27:02:57,360 --> 27:03:02,551
virtual the compiler will note that it
36394
27:03:00,000 --> 27:03:05,512
doesn't need to look at the type of the
36395
27:03:02,551 --> 27:03:06,399
pointer that we are using to manage our
36396
27:03:06,399 --> 27:03:11,191
the compiler is going to look at the
36397
27:03:08,160 --> 27:03:13,512
type of the actual object that the base
36398
27:03:11,191 --> 27:03:16,000
pointer is managing and in this case it
36399
27:03:13,512 --> 27:03:19,191
happens to be a circle object so here we
36400
27:03:16,000 --> 27:03:21,600
will call circle draw and this is going
36401
27:03:19,191 --> 27:03:23,679
to draw a circle on the screen and this
36402
27:03:21,600 --> 27:03:26,232
is really going to be super cool so
36403
27:03:26,232 --> 27:03:29,760
and we're going to see this in action
36404
27:03:28,232 --> 27:03:32,160
the build is going to be good we can
36405
27:03:29,759 --> 27:03:34,551
clear and run rooster and you see that
36406
27:03:32,160 --> 27:03:37,120
we are drawing a circle and this is
36407
27:03:34,551 --> 27:03:40,000
really cool and just using virtual
36408
27:03:37,119 --> 27:03:42,231
functions we can really achieve powerful
36409
27:03:40,000 --> 27:03:45,039
features and you see that this wasn't
36410
27:03:42,232 --> 27:03:48,872
really hard to achieve all we had to do
36411
27:03:45,039 --> 27:03:50,871
was to mark our inherited methods as a
36412
27:03:48,872 --> 27:03:53,832
virtual and this is going to tell the
36413
27:03:50,872 --> 27:03:55,832
compiler to do dynamic binding and this
36414
27:03:53,831 --> 27:03:58,159
is going to be super cool let's see that
36415
27:03:55,831 --> 27:04:00,799
we can also achieve the same thing using
36416
27:03:58,160 --> 27:04:03,680
base references i am not going to run
36417
27:04:03,679 --> 27:04:08,871
base reference i am not going to be
36418
27:04:06,320 --> 27:04:11,120
running the code where we are using a
36419
27:04:12,639 --> 27:04:17,440
object because that's going to be really
36420
27:04:14,720 --> 27:04:19,191
boring but what we can do is put in an
36421
27:04:17,440 --> 27:04:22,320
awful object for example you can say
36422
27:04:19,191 --> 27:04:24,959
over one and say shape ref and call the
36423
27:04:22,320 --> 27:04:27,040
draw method again this is dynamic
36424
27:04:24,960 --> 27:04:29,360
binding because the draw method is
36425
27:04:27,039 --> 27:04:31,599
virtual so the compiler is not going to
36426
27:04:29,360 --> 27:04:33,831
look at the type of the reference to
36427
27:04:31,600 --> 27:04:36,552
decide which version of the draw method
36428
27:04:33,831 --> 27:04:39,679
to call it is going to look at the
36429
27:04:36,551 --> 27:04:42,000
actual object that this reference is
36430
27:04:39,679 --> 27:04:44,719
managing and it is going to see that the
36431
27:04:42,000 --> 27:04:48,000
type of the object is awful so c plus
36432
27:04:44,720 --> 27:04:50,000
plus is going to call the oval version
36433
27:04:48,000 --> 27:04:52,551
of the draw method that's what we're
36434
27:04:50,000 --> 27:04:54,160
going to get if we run this program here
36435
27:04:52,551 --> 27:04:56,551
let's build and see this we're going to
36436
27:04:54,160 --> 27:04:59,040
pass this through gcc the voltage should
36437
27:04:56,551 --> 27:05:01,679
be good as we see here we are going to
36438
27:04:59,039 --> 27:05:04,319
clear and run rooster you see we are
36439
27:05:01,679 --> 27:05:06,719
drawing oval if we happen to be using
36440
27:05:04,320 --> 27:05:07,760
this to manage our circle object let's
36441
27:05:07,759 --> 27:05:12,639
we will see that we will get the circle
36442
27:05:10,399 --> 27:05:14,639
method called okay let's build and we're
36443
27:05:12,639 --> 27:05:16,479
going to pass this through gcc to do
36444
27:05:14,639 --> 27:05:19,191
that the both is going to be good we can
36445
27:05:16,479 --> 27:05:21,911
clear and run rooster you see that we
36446
27:05:19,191 --> 27:05:25,679
are drawing a circle because our base
36447
27:05:21,911 --> 27:05:29,039
pointer is now managing a circle object
36448
27:05:25,679 --> 27:05:32,000
now because we are using dynamic binding
36449
27:05:29,039 --> 27:05:33,911
or late binding as some people call it
36450
27:05:32,000 --> 27:05:36,080
we can really do all kinds of crazy
36451
27:05:33,911 --> 27:05:38,800
things the first thing we can achieve is
36452
27:05:36,080 --> 27:05:41,360
set up one single method which is really
36453
27:05:38,800 --> 27:05:43,279
going to draw any kind of shape we throw
36454
27:05:41,360 --> 27:05:44,872
at it so let's do something like this
36455
27:05:43,279 --> 27:05:47,119
we're going to say void and we're going
36456
27:05:44,872 --> 27:05:50,232
to say draw shape and it is going to
36457
27:05:47,119 --> 27:05:51,911
take a shape pointer let's say s and the
36458
27:05:50,232 --> 27:05:54,720
only thing we're going to do in this
36459
27:05:51,911 --> 27:05:56,399
function and say s draw this is going to
36460
27:05:54,720 --> 27:05:58,551
call the draw method on whatever
36461
27:05:56,399 --> 27:06:01,511
parameter that we pass in here
36462
27:05:58,551 --> 27:06:04,551
and watch this if we go down here and
36463
27:06:01,512 --> 27:06:08,000
uncomment this section on drawing shapes
36464
27:06:04,551 --> 27:06:10,319
if we say draw and pass in a circle for
36465
27:06:08,000 --> 27:06:13,039
example or let's pass an oval and do
36466
27:06:10,320 --> 27:06:15,040
this one level and to do this level by
36467
27:06:13,039 --> 27:06:16,719
level we're going to pass in over one
36468
27:06:15,039 --> 27:06:18,871
and we should pass an address because
36469
27:06:16,720 --> 27:06:21,512
this is taking a pointer let's so let's
36470
27:06:18,872 --> 27:06:23,279
do this and if we build and run this
36471
27:06:21,512 --> 27:06:25,600
program let's see what happens here
36472
27:06:23,279 --> 27:06:27,360
we're going to build with gcc the world
36473
27:06:25,600 --> 27:06:30,400
is going to be good as you see here if
36474
27:06:27,360 --> 27:06:33,360
we clear and run rooster you see
36475
27:06:30,399 --> 27:06:35,599
and let's take out this thing using base
36476
27:06:33,360 --> 27:06:37,191
references here because this is just
36477
27:06:35,600 --> 27:06:40,320
going to confuse us we're going to build
36478
27:06:37,191 --> 27:06:42,639
again and i use gcc for this the build
36479
27:06:40,320 --> 27:06:44,800
is going to be good within clear and run
36480
27:06:42,639 --> 27:06:47,911
rooster you see oval drill because we
36481
27:06:44,800 --> 27:06:50,320
are passing in a novel object if we pass
36482
27:06:47,911 --> 27:06:52,720
in our shape let's say shape one for
36483
27:06:50,320 --> 27:06:54,480
example we're going to build the book is
36484
27:06:52,720 --> 27:06:57,440
going to be good as you see here if we
36485
27:06:54,479 --> 27:06:59,831
clear and run rooster we're going to see
36486
27:06:57,440 --> 27:07:00,872
shape draw if we pass in circle let's do
36487
27:07:00,872 --> 27:07:05,360
and the bold again we're going to build
36488
27:07:02,551 --> 27:07:07,119
with gcc we're going to clear and run
36489
27:07:05,360 --> 27:07:09,360
rooster you're going to see that circle
36490
27:07:07,119 --> 27:07:12,799
draw is called and this is really cool
36491
27:07:09,360 --> 27:07:14,639
we can only use a single method and this
36492
27:07:12,800 --> 27:07:16,872
method is going to take any shape we
36493
27:07:14,639 --> 27:07:19,600
throw at it and it is going to draw it
36494
27:07:16,872 --> 27:07:21,600
if we happen to be having 100 kinds of
36495
27:07:19,600 --> 27:07:23,279
shapes in our program we can just for
36496
27:07:21,600 --> 27:07:25,600
example loop through a collection
36497
27:07:23,279 --> 27:07:28,319
containing those shapes and if we call
36498
27:07:25,600 --> 27:07:30,320
the draw method on any shape we store in
36499
27:07:28,320 --> 27:07:32,720
our collection we're going to get the
36500
27:07:30,320 --> 27:07:35,040
correct shape drone and this is super
36501
27:07:32,720 --> 27:07:37,191
cool this is really powerful and i hope
36502
27:07:35,039 --> 27:07:39,679
you are excited to be able to achieve
36503
27:07:37,191 --> 27:07:42,000
this in c plus plus now we can also
36504
27:07:39,679 --> 27:07:44,639
achieve the same thing by using a method
36505
27:07:42,000 --> 27:07:48,479
that takes a reference for example so we
36506
27:07:44,639 --> 27:07:50,800
can say void joe shape let's say v1 and
36507
27:07:48,479 --> 27:07:53,679
we're going to pass a reference
36508
27:07:50,800 --> 27:07:56,551
we can say const and pass a reference
36509
27:07:53,679 --> 27:07:59,279
and say sr to say ship reference we can
36510
27:07:56,551 --> 27:08:01,360
do that and we're going to say sjo we're
36511
27:07:59,279 --> 27:08:03,440
going to call the jaw method on this
36512
27:08:01,360 --> 27:08:06,399
reference and let's see what happens if
36513
27:08:03,440 --> 27:08:08,800
we try this out let's say sr that's what
36514
27:08:06,399 --> 27:08:11,599
we should say here and this is going to
36515
27:08:08,800 --> 27:08:14,551
be taken by our visual studio code
36516
27:08:11,600 --> 27:08:15,760
editor if we go in here and change this
36517
27:08:15,759 --> 27:08:21,191
draw shape v1 we can pass in shape one
36518
27:08:19,279 --> 27:08:22,551
we can do that because this is taking a
36519
27:08:22,551 --> 27:08:27,599
if we build with gcc we are going to see
36520
27:08:25,512 --> 27:08:29,279
that the world is good we can clear
36521
27:08:27,600 --> 27:08:31,279
let's clear we're going to run the
36522
27:08:29,279 --> 27:08:33,512
rooster this is going to call shape draw
36523
27:08:31,279 --> 27:08:36,000
because we are using a reference to
36524
27:08:33,512 --> 27:08:38,000
manage a shaped object we can also pass
36525
27:08:36,000 --> 27:08:41,440
it over one and we're going to build
36526
27:08:38,000 --> 27:08:43,600
again and see how this works the bolt is
36527
27:08:41,440 --> 27:08:45,440
going to be good we can clear and run
36528
27:08:43,600 --> 27:08:47,760
rooster we're going to say overdraw and
36529
27:08:45,440 --> 27:08:50,639
we're going to see our information here
36530
27:08:47,759 --> 27:08:52,871
if we pass in our circle object
36531
27:08:50,639 --> 27:08:55,191
and the bolt we're going to pass this
36532
27:08:52,872 --> 27:08:57,440
through gcc the bolt is going to be good
36533
27:08:55,191 --> 27:08:59,599
we can clear and run rooster this is
36534
27:08:57,440 --> 27:09:02,320
going to draw a circle for us this is
36535
27:08:59,600 --> 27:09:04,552
really cool we have one method again
36536
27:09:02,320 --> 27:09:07,440
that is taking a parameter by reference
36537
27:09:04,551 --> 27:09:09,911
but we can use this method to draw any
36538
27:09:07,440 --> 27:09:12,232
kind of shape in our inheritance
36539
27:09:09,911 --> 27:09:15,191
hierarchy this is going to work really
36540
27:09:12,232 --> 27:09:17,680
well and it is doing dynamic binding
36541
27:09:15,191 --> 27:09:20,551
which is powered by virtual functions we
36542
27:09:17,679 --> 27:09:22,871
are using in our inheritance hierarchy
36543
27:09:20,551 --> 27:09:25,679
here you should really keep this in mind
36544
27:09:22,872 --> 27:09:28,720
now let's go back and see if we can even
36545
27:09:25,679 --> 27:09:30,639
use row pointers to do stuff i am going
36546
27:09:28,720 --> 27:09:33,191
to comment this out and i am going to
36547
27:09:30,639 --> 27:09:34,800
say roll pointers because i want you to
36548
27:09:33,191 --> 27:09:36,551
see something we're going to set up a
36549
27:09:34,800 --> 27:09:37,760
shape pointer we're going to say shape
36550
27:09:37,759 --> 27:09:41,279
do we have that on top here let's see if
36551
27:09:41,279 --> 27:09:46,319
yes we have shape ptr so let's say shape
36552
27:09:46,320 --> 27:09:50,552
and pass it a novel object we're going
36553
27:09:48,479 --> 27:09:53,279
to pass a novel again and we're going to
36554
27:09:50,551 --> 27:09:56,000
pass the address of 01 this is going to
36555
27:09:53,279 --> 27:09:58,319
do we can call the draw method and get
36556
27:09:58,320 --> 27:10:03,192
or get it called using dynamic binding
36557
27:10:03,191 --> 27:10:08,799
and say draw this is going to call the
36558
27:10:05,911 --> 27:10:11,831
correct version but one thing i want you
36559
27:10:08,800 --> 27:10:14,800
to see is that if a method is not
36560
27:10:11,831 --> 27:10:15,911
polymorphic or if a method is not
36561
27:10:15,911 --> 27:10:21,039
you want to get it called using
36562
27:10:18,039 --> 27:10:22,799
polymorphism for example if we go to our
36563
27:10:21,039 --> 27:10:25,679
oval class we're going to see that we
36564
27:10:22,800 --> 27:10:27,832
have a bunch of getters let's go in and
36565
27:10:25,679 --> 27:10:31,191
make them public so that they are
36566
27:10:27,831 --> 27:10:33,159
callable from the outside and if we try
36567
27:10:33,160 --> 27:10:38,320
polymorphically or using dynamic binding
36568
27:10:36,479 --> 27:10:41,119
that's not going to work let's do that
36569
27:10:38,320 --> 27:10:42,960
we're going to say get x rad and the
36570
27:10:41,119 --> 27:10:45,119
reason we might want to do something
36571
27:10:42,960 --> 27:10:46,000
like this is because we have this method
36572
27:10:46,000 --> 27:10:52,080
and it is set up on our oval class
36573
27:10:49,440 --> 27:10:54,960
so because we are using a base pointer
36574
27:10:52,080 --> 27:10:57,191
to manage a novel object some of you
36575
27:10:54,960 --> 27:11:00,232
might think uh-huh i might be able to
36576
27:10:57,191 --> 27:11:03,279
call this method because i am able to
36577
27:11:00,232 --> 27:11:06,720
call the job method which is also in the
36578
27:11:03,279 --> 27:11:08,720
public scope of our overclass but that's
36579
27:11:06,720 --> 27:11:10,872
not going to work because this method
36580
27:11:10,872 --> 27:11:16,720
dynamic binding or polymorphism is only
36581
27:11:14,320 --> 27:11:19,760
going to work if your methods are
36582
27:11:16,720 --> 27:11:22,551
virtual and they are set up across your
36583
27:11:19,759 --> 27:11:24,399
inheritance hierarchy so this is not
36584
27:11:22,551 --> 27:11:26,159
going to work if you try to do something
36585
27:11:24,399 --> 27:11:28,799
like this this is going to give you a
36586
27:11:26,160 --> 27:11:30,552
compiler error let's try and build and
36587
27:11:28,800 --> 27:11:33,440
see the compiler error and we're going
36588
27:11:30,551 --> 27:11:36,479
to see an error that says that no such
36589
27:11:33,440 --> 27:11:38,320
method on this object let's go here
36590
27:11:38,320 --> 27:11:42,320
class shape has no member name to get x
36591
27:11:42,320 --> 27:11:46,960
because the method is not virtual the
36592
27:11:44,479 --> 27:11:49,512
compiler is going to do static binding
36593
27:11:46,960 --> 27:11:51,600
and it is going to be using the type of
36594
27:11:49,512 --> 27:11:54,000
the pointer which is shaped to resolve
36595
27:11:51,600 --> 27:11:56,000
this method and it is going to see that
36596
27:11:54,000 --> 27:11:58,399
in shape we don't have a method called
36597
27:11:56,000 --> 27:12:00,639
get xrad and the compiler is going to
36598
27:11:58,399 --> 27:12:02,799
throw this compiler error here this is
36599
27:12:00,639 --> 27:12:05,119
what we get so this is not going to work
36600
27:12:02,800 --> 27:12:06,960
and i want you to be aware of this
36601
27:12:05,119 --> 27:12:10,080
another thing i want you to see
36602
27:12:06,960 --> 27:12:11,600
is that because we are using dynamic
36603
27:12:11,600 --> 27:12:16,720
we don't need we don't need to set up
36604
27:12:14,080 --> 27:12:18,960
all kinds of crazy collections to take
36605
27:12:16,720 --> 27:12:22,160
into account different shapes that we
36606
27:12:18,960 --> 27:12:24,320
have in our c plus plus program what
36607
27:12:22,160 --> 27:12:27,192
we're going to do here is use a base
36608
27:12:24,320 --> 27:12:30,480
pointer to manage the data that we store
36609
27:12:27,191 --> 27:12:33,360
in our array here so all i am going to
36610
27:12:30,479 --> 27:12:35,119
do is remove all this dirt here because
36611
27:12:33,360 --> 27:12:37,119
this is really dirt you don't want to do
36612
27:12:35,119 --> 27:12:39,191
something like that and we're going to
36613
27:12:37,119 --> 27:12:42,231
use a base pointer which is a shape
36614
27:12:39,191 --> 27:12:44,231
pointer and use that to set up an array
36615
27:12:42,232 --> 27:12:47,440
which can handle any kind of shape we
36616
27:12:44,232 --> 27:12:50,000
have in our inheritance hierarchy so we
36617
27:12:47,440 --> 27:12:52,320
can store it shape objects we can store
36618
27:12:50,000 --> 27:12:54,960
it over objects we can store in circle
36619
27:12:52,320 --> 27:12:56,640
objects and if we look like we do here
36620
27:12:54,960 --> 27:12:58,720
we're going to get the correct method
36621
27:12:56,639 --> 27:13:01,191
called and this is going to be super
36622
27:12:58,720 --> 27:13:03,680
cool so let's try and run this program
36623
27:13:01,191 --> 27:13:05,911
we're going to pass this through gcc why
36624
27:13:03,679 --> 27:13:08,959
do we have the red thing here let's
36625
27:13:05,911 --> 27:13:11,191
build and see if it goes away maybe this
36626
27:13:08,960 --> 27:13:13,120
is visual studio code having a problem
36627
27:13:11,191 --> 27:13:15,360
with our code the world is good so
36628
27:13:13,119 --> 27:13:17,512
visual studio code was playing with us
36629
27:13:15,360 --> 27:13:19,191
we're going to clear and run rooster
36630
27:13:17,512 --> 27:13:22,551
you're going to see that we're going to
36631
27:13:19,191 --> 27:13:24,159
be looping through this array here and
36632
27:13:22,551 --> 27:13:26,159
on the first iteration we're going to
36633
27:13:24,160 --> 27:13:28,480
call shape draw because the first thing
36634
27:13:26,160 --> 27:13:30,552
is the shape on the second iteration
36635
27:13:28,479 --> 27:13:33,191
we're going to call overdraw because the
36636
27:13:30,551 --> 27:13:34,159
second thing is a novel and we're going
36637
27:13:34,160 --> 27:13:39,279
hit the third iteration and call circle
36638
27:13:36,720 --> 27:13:41,831
draw because the third thing in this
36639
27:13:39,279 --> 27:13:44,080
collection is a circle hopefully you can
36640
27:13:41,831 --> 27:13:47,191
see that this is going to simplify our
36641
27:13:44,080 --> 27:13:48,479
programs a lot compared to what we were
36642
27:13:48,479 --> 27:13:52,159
in the last lecture and this is really
36643
27:13:50,160 --> 27:13:54,720
all i had to share in this lecture
36644
27:13:52,160 --> 27:13:58,480
showing you that you can achieve dynamic
36645
27:13:54,720 --> 27:14:01,040
binding or polymorphism or late binding
36646
27:13:58,479 --> 27:14:03,831
as some people call it using virtual
36647
27:14:01,039 --> 27:14:06,719
functions in your inheritance hierarchy
36648
27:14:03,831 --> 27:14:09,511
again all we had to do was mark our
36649
27:14:06,720 --> 27:14:11,360
member functions as a virtual and the
36650
27:14:09,512 --> 27:14:14,160
compiler is going to know that it can
36651
27:14:11,360 --> 27:14:17,039
set up dynamic polymorphism for your
36652
27:14:14,160 --> 27:14:20,232
types if you happen to be managing them
36653
27:14:17,039 --> 27:14:21,911
using a base pointer or a base reference
36654
27:14:20,232 --> 27:14:23,680
we are going to stop here in this
36655
27:14:21,911 --> 27:14:26,551
lecture and the next one we're going to
36656
27:14:23,679 --> 27:14:28,799
learn about slicing and the size of
36657
27:14:28,800 --> 27:14:32,872
go ahead and finish up here and meet me
36658
27:14:31,119 --> 27:14:37,039
there in this lecture we're going to
36659
27:14:32,872 --> 27:14:40,160
explore the size of polymorphic objects
36660
27:14:37,039 --> 27:14:42,159
or objects that use dynamic binding and
36661
27:14:40,160 --> 27:14:45,192
we're going to learn about the concept
36662
27:14:42,160 --> 27:14:48,400
of slicing if you happen to assign a
36663
27:14:45,191 --> 27:14:50,231
derived object to a base object we're
36664
27:14:48,399 --> 27:14:52,231
going to see how this works out in the
36665
27:14:50,232 --> 27:14:54,872
last two lectures we saw that we could
36666
27:14:52,232 --> 27:14:57,192
achieve static binding using a setup
36667
27:14:54,872 --> 27:15:00,000
like this we can set up an inheritance
36668
27:14:57,191 --> 27:15:02,799
hierarchy and we're going to have oval
36669
27:15:00,000 --> 27:15:06,399
derive or inherit from shape and we're
36670
27:15:02,800 --> 27:15:09,440
going to have circle inherit or derive
36671
27:15:06,399 --> 27:15:11,439
from over here and our methods are going
36672
27:15:09,440 --> 27:15:13,600
to be row they are not going to be
36673
27:15:11,440 --> 27:15:16,080
virtual on anything and this is going to
36674
27:15:13,600 --> 27:15:18,552
do static binding if you happen to
36675
27:15:16,080 --> 27:15:21,040
manage a derived object through a base
36676
27:15:18,551 --> 27:15:23,360
pointer or reference you want to get
36677
27:15:21,039 --> 27:15:25,511
dynamic holes you will get static
36678
27:15:23,360 --> 27:15:28,000
binding and the compiler will use the
36679
27:15:25,512 --> 27:15:31,119
base pointer or base reference to decide
36680
27:15:28,000 --> 27:15:32,872
which draw method to call on your object
36681
27:15:31,119 --> 27:15:36,080
we also saw that we could achieve
36682
27:15:32,872 --> 27:15:38,639
dynamic binding using virtual functions
36683
27:15:36,080 --> 27:15:41,680
and all we needed to do was mark our
36684
27:15:38,639 --> 27:15:44,119
methods as virtual in our inheritance
36685
27:15:41,679 --> 27:15:47,911
hierarchy here and this would give us
36686
27:15:44,119 --> 27:15:50,231
polymorphism or dynamic binding but one
36687
27:15:47,911 --> 27:15:52,479
thing you should know is that dynamic
36688
27:15:50,232 --> 27:15:55,600
binding is not free you're going to be
36689
27:15:52,479 --> 27:15:57,512
paying in terms of memory to get all
36690
27:15:55,600 --> 27:15:59,192
these cool things we saw in the last
36691
27:15:57,512 --> 27:16:01,360
lecture and we're going to be proving
36692
27:15:59,191 --> 27:16:03,512
that in this lecture what we're going to
36693
27:16:01,360 --> 27:16:05,911
be doing is basically set up our
36694
27:16:03,512 --> 27:16:08,400
inheritance hierarchy and we are going
36695
27:16:05,911 --> 27:16:10,232
to set that up in such a way that it is
36696
27:16:08,399 --> 27:16:12,000
going to be using static binding we're
36697
27:16:10,232 --> 27:16:14,400
going to see the sizes we get printed
36698
27:16:12,000 --> 27:16:17,360
out here and we're going to use dynamic
36699
27:16:14,399 --> 27:16:19,911
binding and compare the sizes and the
36700
27:16:17,360 --> 27:16:22,872
constitution is going to be that with
36701
27:16:19,911 --> 27:16:25,759
dynamic binding your objects are going
36702
27:16:22,872 --> 27:16:28,800
to be much larger because your simplest
36703
27:16:25,759 --> 27:16:30,319
plus program will need to keep track of
36704
27:16:32,960 --> 27:16:37,360
function calls dynamically and that
36705
27:16:35,279 --> 27:16:40,319
information is stored in what we call
36706
27:16:37,360 --> 27:16:42,551
virtual tables but i am not going to go
36707
27:16:40,320 --> 27:16:45,512
into that here because it is really out
36708
27:16:42,551 --> 27:16:47,599
of scope of a course like this but i
36709
27:16:45,512 --> 27:16:50,639
want you to be aware of this if you use
36710
27:16:47,600 --> 27:16:53,279
dynamic if you use dynamic binding your
36711
27:16:50,639 --> 27:16:55,039
objects are going to be much larger okay
36712
27:16:53,279 --> 27:16:56,232
the first thing i want to bring your
36713
27:16:56,232 --> 27:17:01,040
is object slicing and we're going to
36714
27:16:58,800 --> 27:17:03,512
look at a simple example here we have
36715
27:17:01,039 --> 27:17:06,079
our objects we have a shape object we
36716
27:17:03,512 --> 27:17:10,080
have an oval object and we have a circle
36717
27:17:06,080 --> 27:17:14,080
object and down here we want to assign
36718
27:17:10,080 --> 27:17:16,800
our circle object to a shape object
36719
27:17:14,080 --> 27:17:19,191
now notice that here we are not using a
36720
27:17:16,800 --> 27:17:21,600
pointer or a reference these are just
36721
27:17:19,191 --> 27:17:23,759
the row objects that we are assigning to
36722
27:17:21,600 --> 27:17:25,440
each other and what the competitor is
36723
27:17:25,440 --> 27:17:30,872
it's going to notice that a circle has a
36724
27:17:28,160 --> 27:17:33,832
shape according to it and it is going to
36725
27:17:30,872 --> 27:17:35,832
strip off the outer layers or in other
36726
27:17:33,831 --> 27:17:38,319
words it is going to strip off the
36727
27:17:35,831 --> 27:17:40,551
circle layer it is going to strip off
36728
27:17:38,320 --> 27:17:43,360
the oval layer and it is going to leave
36729
27:17:40,551 --> 27:17:46,399
in the shape part and that's what it is
36730
27:17:43,360 --> 27:17:49,039
going to assign to our shape object here
36731
27:17:46,399 --> 27:17:51,360
let's visualize this our shape class
36732
27:17:49,039 --> 27:17:55,191
looks like what we have here on the left
36733
27:17:51,360 --> 27:17:57,440
our oval class has a shape part into it
36734
27:17:55,191 --> 27:17:59,831
and our circle is going to have an over
36735
27:17:57,440 --> 27:18:02,160
part into it and that oval part is going
36736
27:17:59,831 --> 27:18:05,119
to have a shape part of it and this is
36737
27:18:02,160 --> 27:18:06,872
the setup that we have here now if we do
36738
27:18:05,119 --> 27:18:08,639
our assignment we're going to do
36739
27:18:06,872 --> 27:18:10,400
something like this the compiler is
36740
27:18:08,639 --> 27:18:12,551
going to see that we are already
36741
27:18:12,551 --> 27:18:16,639
to a shape and the compiler is going to
36742
27:18:14,399 --> 27:18:19,511
notice that what we have on the left is
36743
27:18:16,639 --> 27:18:22,639
just a shape and we don't have enough
36744
27:18:19,512 --> 27:18:24,960
space to store information about oval
36745
27:18:22,639 --> 27:18:26,872
and the circle here so what the compiler
36746
27:18:24,960 --> 27:18:28,872
is going to do it is going to strip off
36747
27:18:26,872 --> 27:18:31,680
all these things that we don't really
36748
27:18:28,872 --> 27:18:32,551
need and it is going to leave in only
36749
27:18:32,551 --> 27:18:38,551
shape part that we can assign on what we
36750
27:18:36,000 --> 27:18:40,551
have to the left so it is going to strip
36751
27:18:38,551 --> 27:18:42,479
off all these stands and we are going to
36752
27:18:40,551 --> 27:18:44,479
be left with something like this and
36753
27:18:42,479 --> 27:18:46,639
then what we have on the right is going
36754
27:18:44,479 --> 27:18:50,319
to be assigned on the left and we will
36755
27:18:46,639 --> 27:18:52,960
have our data stored in our ship to
36756
27:18:50,320 --> 27:18:55,192
object and if we try to use it that's
36757
27:18:52,960 --> 27:18:57,832
what you're going to get in memory so
36758
27:18:55,191 --> 27:18:59,440
this is referred to as slicing again the
36759
27:18:57,831 --> 27:19:01,511
compiler is going to notice that it
36760
27:18:59,440 --> 27:19:03,040
doesn't really have enough space on the
36761
27:19:03,039 --> 27:19:07,511
everything we have to the right of the
36762
27:19:04,872 --> 27:19:09,680
assignment here and it is going to strip
36763
27:19:09,679 --> 27:19:15,599
everything we don't need and it is only
36764
27:19:12,639 --> 27:19:18,720
going to leave in the shape part and
36765
27:19:15,600 --> 27:19:21,440
that's what it is going to assign on our
36766
27:19:18,720 --> 27:19:23,759
object that we have on the left of the
36767
27:19:21,440 --> 27:19:27,279
assignment operator here and this is
36768
27:19:23,759 --> 27:19:29,360
referred to as slicing in c plus plus
36769
27:19:27,279 --> 27:19:31,512
terminology i just want you to be aware
36770
27:19:29,360 --> 27:19:34,000
of this and we're going to see a lot of
36771
27:19:31,512 --> 27:19:35,600
this starting from now now that you know
36772
27:19:34,000 --> 27:19:37,440
this we're going to head over to visual
36773
27:19:35,600 --> 27:19:40,160
studio code and play with this a little
36774
27:19:37,440 --> 27:19:42,800
more here we are in our working folder
36775
27:19:40,160 --> 27:19:46,320
the current project is size of
36776
27:19:42,800 --> 27:19:48,000
polymorphic objects and slicing we are
36777
27:19:46,320 --> 27:19:50,552
going to grab the code from the last
36778
27:19:48,000 --> 27:19:53,600
lecture so let's grab everything except
36779
27:19:50,551 --> 27:19:55,759
for the binary file we are going to copy
36780
27:19:53,600 --> 27:19:58,480
everything and we're going to put that
36781
27:19:55,759 --> 27:20:00,551
in the current folder and we're going to
36782
27:19:58,479 --> 27:20:03,039
open this little guy in visual studio
36783
27:20:00,551 --> 27:20:05,512
code by dragging and dropping here this
36784
27:20:03,039 --> 27:20:09,191
is going to give us our project and we
36785
27:20:05,512 --> 27:20:11,512
can head over in the main cpp file
36786
27:20:09,191 --> 27:20:14,231
and clean up all the mess we got from
36787
27:20:11,512 --> 27:20:16,639
the last previous lectures we can also
36788
27:20:14,232 --> 27:20:18,800
take out these functions because i don't
36789
27:20:18,800 --> 27:20:24,000
and we are going to check out on our
36790
27:20:21,279 --> 27:20:26,720
classes notice that we are using dynamic
36791
27:20:24,000 --> 27:20:29,191
polymorphism because we have virtual
36792
27:20:26,720 --> 27:20:31,831
functions here so if we happen to be
36793
27:20:29,191 --> 27:20:35,039
using base pointers or base references
36794
27:20:31,831 --> 27:20:37,911
to manage our derived objects we will
36795
27:20:35,039 --> 27:20:40,639
get polymorphic results okay the first
36796
27:20:37,911 --> 27:20:43,679
thing we want to see is the size of
36797
27:20:40,639 --> 27:20:46,399
objects for our classes here because we
36798
27:20:43,679 --> 27:20:48,959
are using virtual functions let's head
36799
27:20:46,399 --> 27:20:51,191
over in the main cpp file and we're
36800
27:20:48,960 --> 27:20:53,440
going to put in a piece of code which is
36801
27:20:51,191 --> 27:20:55,279
just going to use the size of operator
36802
27:20:55,279 --> 27:21:00,479
of objects of these classes we can try
36803
27:20:58,399 --> 27:21:02,871
to build and run this program we're
36804
27:21:00,479 --> 27:21:05,599
going to use gcc here the world is just
36805
27:21:02,872 --> 27:21:07,600
going to be good we can bring up a
36806
27:21:05,600 --> 27:21:09,120
powershell window we can use to run
36807
27:21:09,119 --> 27:21:13,831
we're going to do that new terminal this
36808
27:21:11,831 --> 27:21:16,479
is going to bring us our window here we
36809
27:21:13,831 --> 27:21:19,599
can clear and run rooster we're going to
36810
27:21:19,600 --> 27:21:25,360
so you see that these are our sizes so
36811
27:21:22,639 --> 27:21:28,232
let's say that with uh dynamic is going
36812
27:21:25,360 --> 27:21:31,279
to be 40 for the base class with dynamic
36813
27:21:28,232 --> 27:21:32,400
portal morphism we're going to get 56
36814
27:21:32,399 --> 27:21:38,319
oval object and we're going to get
36815
27:21:38,320 --> 27:21:44,720
circle object here now we're going to
36816
27:21:41,039 --> 27:21:46,231
remove the setup that uses polymorphism
36817
27:21:44,720 --> 27:21:48,639
and we're going to see the results that
36818
27:21:46,232 --> 27:21:51,040
we get all we need to do is to remove
36819
27:21:48,639 --> 27:21:53,759
the virtual keyword here we can comment
36820
27:21:51,039 --> 27:21:56,479
it out you can do something like this in
36821
27:21:53,759 --> 27:21:59,191
shape and we're going to hop over in
36822
27:21:56,479 --> 27:22:00,872
oval and comment out the virtual key
36823
27:21:59,191 --> 27:22:02,319
world we can do something like this and
36824
27:22:02,320 --> 27:22:06,872
work without removing this completely
36825
27:22:04,639 --> 27:22:09,679
from our code because we still need to
36826
27:22:06,872 --> 27:22:12,160
leave this in as a reference we're going
36827
27:22:09,679 --> 27:22:13,119
to hop over to circle and do the same
36828
27:22:13,119 --> 27:22:17,911
and now that we have this setup we can
36829
27:22:15,279 --> 27:22:19,512
hop over to our main cpp file we're
36830
27:22:17,911 --> 27:22:22,080
going to see that we don't have any
36831
27:22:19,512 --> 27:22:24,639
squiggly lines of some kind so this is
36832
27:22:22,080 --> 27:22:26,720
going to be accepted by the compiler but
36833
27:22:24,639 --> 27:22:28,960
if we build and run this program we're
36834
27:22:26,720 --> 27:22:30,960
going to see different sizes let's see
36835
27:22:28,960 --> 27:22:33,912
if the world is good it is good as you
36836
27:22:30,960 --> 27:22:36,080
see here we can clear and run rooster
36837
27:22:36,080 --> 27:22:43,600
static binding the base object is 32
36838
27:22:39,911 --> 27:22:45,119
bytes the awful object is going to be 48
36839
27:22:43,600 --> 27:22:48,080
and hopefully you can see that with
36840
27:22:45,119 --> 27:22:50,231
dynamic polymorphism our objects are
36841
27:22:48,080 --> 27:22:52,160
going to be much larger because the
36842
27:22:50,232 --> 27:22:54,480
compiler has to keep track of the
36843
27:22:52,160 --> 27:22:56,720
information that allows it to
36844
27:22:56,720 --> 27:23:02,872
virtual function calls that's why our
36845
27:22:59,191 --> 27:23:04,959
objects are larger with polymorphism and
36846
27:23:02,872 --> 27:23:07,680
you should know that you are not getting
36847
27:23:04,960 --> 27:23:11,040
polymorphic results for free you are
36848
27:23:07,679 --> 27:23:13,679
going to be paying in terms of much more
36849
27:23:11,039 --> 27:23:16,079
memory that you use for your objects in
36850
27:23:13,679 --> 27:23:17,911
your c plus plus programs this is the
36851
27:23:16,080 --> 27:23:19,831
first thing i want you to see in this
36852
27:23:17,911 --> 27:23:23,360
lecture the second thing i want you to
36853
27:23:19,831 --> 27:23:25,191
be aware of is the concept of slicing
36854
27:23:23,360 --> 27:23:27,440
and this is going to happen if you
36855
27:23:27,440 --> 27:23:32,551
derived object and assign that to a row
36856
27:23:30,551 --> 27:23:34,800
based object let's do something like
36857
27:23:32,551 --> 27:23:36,872
that we are going to create a circle
36858
27:23:34,800 --> 27:23:39,360
object and then we're going to say shape
36859
27:23:36,872 --> 27:23:41,680
and say shape here and we're going to
36860
27:23:41,679 --> 27:23:46,159
this is something we could do
36861
27:23:43,512 --> 27:23:48,320
but notice that the compiler is not
36862
27:23:46,160 --> 27:23:50,080
giving us any kind of compiler error
36863
27:23:48,320 --> 27:23:52,232
because we can assign a circle to a
36864
27:23:50,080 --> 27:23:54,872
shape because a circle is really a shape
36865
27:23:52,232 --> 27:23:57,832
but from what we know in our inheritance
36866
27:23:54,872 --> 27:24:00,320
hierarchy a circle is really much more
36867
27:23:57,831 --> 27:24:03,439
than a row shape a circle has awful
36868
27:24:00,320 --> 27:24:05,760
information in it and it also has circle
36869
27:24:03,440 --> 27:24:08,080
information in it so it is really much
36870
27:24:05,759 --> 27:24:10,319
larger and much wider than a shape
36871
27:24:08,080 --> 27:24:12,960
object but the compiler is going to see
36872
27:24:10,320 --> 27:24:15,120
that we are trying to assign a circle to
36873
27:24:12,960 --> 27:24:16,552
a shape and it is going to be smart
36874
27:24:16,551 --> 27:24:21,360
that we don't really need oval and
36875
27:24:18,720 --> 27:24:23,680
circle information in our shape object
36876
27:24:21,360 --> 27:24:26,160
that we are storing here so the compiler
36877
27:24:23,679 --> 27:24:29,039
is going to slice off circle and oval
36878
27:24:26,160 --> 27:24:30,960
information and it is going to leave in
36879
27:24:29,039 --> 27:24:33,511
shape information and that's the only
36880
27:24:30,960 --> 27:24:35,440
thing we will be able to use with this
36881
27:24:33,512 --> 27:24:38,080
shape variable that we have in our c
36882
27:24:35,440 --> 27:24:40,232
plus plus program so if we say shape
36883
27:24:38,080 --> 27:24:42,320
drill you can try to guess what we are
36884
27:24:40,232 --> 27:24:45,600
going to get and let's go back and
36885
27:24:42,320 --> 27:24:47,192
re-enable polymorphism because some of
36886
27:24:45,600 --> 27:24:49,360
you might think we are going to get
36887
27:24:49,360 --> 27:24:54,551
with this setup here that's not what
36888
27:24:51,679 --> 27:24:57,119
we're going to get because we are not
36889
27:24:54,551 --> 27:24:58,479
going through bezel references or base
36890
27:24:58,479 --> 27:25:03,599
do what we are doing in this example on
36891
27:25:01,039 --> 27:25:06,159
slicing here so because we are not using
36892
27:25:03,600 --> 27:25:08,480
base references or base pointers in this
36893
27:25:06,160 --> 27:25:10,800
line here the compiler is going to see
36894
27:25:08,479 --> 27:25:13,279
that these are raw objects and it is
36895
27:25:10,800 --> 27:25:16,479
going to do slicing and slice of things
36896
27:25:13,279 --> 27:25:19,279
we don't need in our shape variable
36897
27:25:16,479 --> 27:25:21,679
that we are setting up on line 16 here
36898
27:25:19,279 --> 27:25:23,831
so if we call the draw method this is
36899
27:25:23,831 --> 27:25:27,831
it is not going to do dynamic
36900
27:25:25,440 --> 27:25:29,760
polymorphism here you should be aware of
36901
27:25:27,831 --> 27:25:32,080
this if you're not using the base
36902
27:25:29,759 --> 27:25:35,679
pointers or references and you hope to
36903
27:25:32,080 --> 27:25:37,040
get dynamic polymorphism results i hate
36904
27:25:35,679 --> 27:25:39,279
to break it to you but you're going to
36905
27:25:37,039 --> 27:25:41,360
be disappointed because the compiler is
36906
27:25:39,279 --> 27:25:43,679
going to slice off derived class
36907
27:25:41,360 --> 27:25:46,479
information and all you're going to be
36908
27:25:43,679 --> 27:25:48,871
left with is base class information here
36909
27:25:46,479 --> 27:25:51,119
that's why this is going to call ship
36910
27:25:48,872 --> 27:25:52,960
draw let's build and run and really make
36911
27:25:51,119 --> 27:25:55,911
you see this this is going to go through
36912
27:25:52,960 --> 27:25:58,160
gcc our favorite compiler the bullet is
36913
27:25:55,911 --> 27:26:00,399
going to be good we cannot clear and run
36914
27:25:58,160 --> 27:26:03,192
rooster you're going to see that it is
36915
27:26:00,399 --> 27:26:06,639
going to say shape draw even if we try
36916
27:26:03,191 --> 27:26:08,399
to assign a circle to a shape here this
36917
27:26:06,639 --> 27:26:11,039
is going to disappoint us because this
36918
27:26:08,399 --> 27:26:12,399
is really going to slice off circle and
36919
27:26:12,399 --> 27:26:18,479
and it is just going to leave in the
36920
27:26:14,800 --> 27:26:19,760
shape nucleus that we have in our circle
36921
27:26:19,759 --> 27:26:23,911
if i can say it like that this is really
36922
27:26:22,080 --> 27:26:26,080
all i had to share in this lecture i
36923
27:26:23,911 --> 27:26:27,911
hope you found it interesting we are
36924
27:26:26,080 --> 27:26:29,680
going to stop here in this lecture in
36925
27:26:27,911 --> 27:26:32,800
the next one we're going to see what
36926
27:26:29,679 --> 27:26:35,039
happens if we try to store polymorphic
36927
27:26:35,039 --> 27:26:39,279
go ahead and finish up here and meet me
36928
27:26:37,279 --> 27:26:42,399
there in this lecture we're going to
36929
27:26:39,279 --> 27:26:46,399
explore what happens if you try to
36930
27:26:42,399 --> 27:26:48,639
directly store polymorphic objects in a
36931
27:26:48,639 --> 27:26:54,551
in the last lecture we have seen that if
36932
27:26:50,872 --> 27:26:55,760
you assign a derived object to a base
36933
27:26:55,759 --> 27:27:01,439
the data from the derived object is
36934
27:26:58,320 --> 27:27:04,720
going to be basically sliced off if you
36935
27:27:01,440 --> 27:27:07,440
assign an oval to a shape the oval part
36936
27:27:04,720 --> 27:27:10,232
of the object is going to be sliced off
36937
27:27:07,440 --> 27:27:12,960
and we're going to be left with only
36938
27:27:10,232 --> 27:27:15,440
shaped data that we assigned to our
36939
27:27:12,960 --> 27:27:18,552
shape object we saw that this was
36940
27:27:15,440 --> 27:27:20,400
referred to as slicing in c plus plus
36941
27:27:18,551 --> 27:27:23,191
and the same is going to happen if you
36942
27:27:20,399 --> 27:27:25,279
assign a circle object to a shape the
36943
27:27:23,191 --> 27:27:26,231
circle information is going to be sliced
36944
27:27:26,232 --> 27:27:31,040
then the oval information is also going
36945
27:27:29,039 --> 27:27:34,399
to be sliced off and we're going to be
36946
27:27:31,039 --> 27:27:38,079
left with the inner shape part
36947
27:27:34,399 --> 27:27:39,911
that we assign to our shape object here
36948
27:27:38,080 --> 27:27:42,639
now i want you to see that this can
36949
27:27:39,911 --> 27:27:45,512
happen indirectly in ways that you might
36950
27:27:42,639 --> 27:27:48,080
not expect and we are going to use our
36951
27:27:45,512 --> 27:27:50,551
inheritance hierarchy again the base
36952
27:27:48,080 --> 27:27:53,040
class is going to be shape we're going
36953
27:27:50,551 --> 27:27:55,512
to inherit from that and get oval and
36954
27:27:53,039 --> 27:27:57,759
we're going to inherit from oval and get
36955
27:27:57,759 --> 27:28:03,039
so let's look at a piece of code here we
36956
27:28:00,639 --> 27:28:06,080
are creating a bunch of objects we have
36957
27:28:03,039 --> 27:28:08,399
a bunch of circles and ovals and we are
36958
27:28:06,080 --> 27:28:11,360
setting up an array that is going to
36959
27:28:11,360 --> 27:28:19,360
but what we are doing is storing our
36960
27:28:14,800 --> 27:28:22,000
pre created objects in our array here
36961
27:28:19,360 --> 27:28:25,512
and from what you already know if you
36962
27:28:22,000 --> 27:28:27,759
store objects in an array like this this
36963
27:28:25,512 --> 27:28:30,320
is going to create copies even if you
36964
27:28:27,759 --> 27:28:33,360
can't see that directly so what we have
36965
27:28:30,320 --> 27:28:36,640
in our array here is not dirt so what we
36966
27:28:33,360 --> 27:28:39,039
have in our array here is not any kind
36967
27:28:36,639 --> 27:28:42,399
of direct reference to the object we
36968
27:28:39,039 --> 27:28:44,319
have on top here these are just copies
36969
27:28:42,399 --> 27:28:47,119
and notice what is happening we are
36970
27:28:47,119 --> 27:28:52,959
in spots that are designed to store
36971
27:28:49,911 --> 27:28:54,551
direct shape objects and you might guess
36972
27:28:52,960 --> 27:28:56,160
what this is going to do this is going
36973
27:28:56,160 --> 27:29:01,120
circle and oval information and only
36974
27:28:59,191 --> 27:29:03,440
shape information is going to be stored
36975
27:29:01,119 --> 27:29:05,679
in this array here so if we happen to
36976
27:29:03,440 --> 27:29:07,040
look through this array like we do here
36977
27:29:09,119 --> 27:29:14,720
this is not going to call the most
36978
27:29:11,600 --> 27:29:16,872
specific drill method for circle or oval
36979
27:29:14,720 --> 27:29:19,831
this is just going to call the shape
36980
27:29:16,872 --> 27:29:22,400
version of our draw method here this is
36981
27:29:19,831 --> 27:29:24,799
something i want you to see okay some of
36982
27:29:22,399 --> 27:29:27,279
you might say what if i take my
36983
27:29:24,800 --> 27:29:29,360
shape information in here and assign
36984
27:29:27,279 --> 27:29:31,679
that to a pointer and then go through
36985
27:29:29,360 --> 27:29:34,232
that pointer to call the draw method
36986
27:29:31,679 --> 27:29:36,639
well i hate to break it to you but the
36987
27:29:34,232 --> 27:29:39,040
moment your data is sliced off in a
36988
27:29:36,639 --> 27:29:41,279
situation like this you'll never get
36989
27:29:39,039 --> 27:29:43,511
that data back so even if you try and
36990
27:29:41,279 --> 27:29:45,831
take the object and sign that to a
36991
27:29:43,512 --> 27:29:48,872
pointer or a reference you're never
36992
27:29:45,831 --> 27:29:51,119
going to get polymorphic data again the
36993
27:29:48,872 --> 27:29:53,760
data has been lost permanently and you
36994
27:29:51,119 --> 27:29:55,679
never get that so even if you try to go
36995
27:29:53,759 --> 27:29:58,000
through a pointer or a reference to
36996
27:29:55,679 --> 27:30:00,719
manage your object that we have in this
36997
27:29:58,000 --> 27:30:03,279
array if we call the draw method we want
36998
27:30:00,720 --> 27:30:06,080
to get polymorphic behavior we will get
36999
27:30:03,279 --> 27:30:09,039
to the shape version of our draw method
37000
27:30:06,080 --> 27:30:11,911
called so the data has been sliced off
37001
27:30:09,039 --> 27:30:15,191
permanently if we store our derived
37002
27:30:11,911 --> 27:30:18,800
objects in an array like this or even if
37003
27:30:15,191 --> 27:30:21,440
we directly assign a derived object to a
37004
27:30:18,800 --> 27:30:24,400
base object this is going to slice off
37005
27:30:21,440 --> 27:30:27,040
the data and we will never get it back
37006
27:30:24,399 --> 27:30:29,679
anyway you should really know this okay
37007
27:30:27,039 --> 27:30:31,679
anytime i try to explain this
37008
27:30:29,679 --> 27:30:34,799
students mostly come up with this
37009
27:30:31,679 --> 27:30:37,511
question what if i try to store
37010
27:30:37,512 --> 27:30:42,160
and do something like this now this is
37011
27:30:39,759 --> 27:30:45,191
not going to work and this is not even
37012
27:30:42,160 --> 27:30:48,080
go past the compilation stage of your
37013
27:30:45,191 --> 27:30:50,799
program the reason is we can't store
37014
27:30:48,080 --> 27:30:53,040
references in a collection and the
37015
27:30:53,039 --> 27:30:59,599
assignability rule you can't assign to a
37016
27:30:56,800 --> 27:31:02,160
reference and i changed the reference to
37017
27:30:59,600 --> 27:31:04,480
store somewhere else and it really drive
37018
27:31:02,160 --> 27:31:07,040
this home let's look at this example
37019
27:31:04,479 --> 27:31:09,759
here we have a variable called a it is
37020
27:31:07,039 --> 27:31:12,231
of entertype and we have a 56 value
37021
27:31:09,759 --> 27:31:14,479
inside and we set up a reference which
37022
27:31:12,232 --> 27:31:17,440
is going to be referencing the data we
37023
27:31:14,479 --> 27:31:20,231
have in a and down on this line here we
37024
27:31:17,440 --> 27:31:22,400
try to change the data in our reference
37025
27:31:20,232 --> 27:31:25,760
but this is not going to be changing
37026
27:31:22,399 --> 27:31:28,479
where this reference is pointing to or
37027
27:31:25,759 --> 27:31:32,319
where this reference is referencing this
37028
27:31:28,479 --> 27:31:35,911
will merely be changing the values in
37029
27:31:32,320 --> 27:31:38,480
our reference here and once we have this
37030
27:31:35,911 --> 27:31:41,119
reference we'll never be able to change
37031
27:31:38,479 --> 27:31:42,800
where it is pointing again so from this
37032
27:31:41,119 --> 27:31:46,080
hopefully you can understand that
37033
27:31:42,800 --> 27:31:48,960
references are not left assignable you
37034
27:31:46,080 --> 27:31:51,191
can't store thanks that are not left
37035
27:31:51,191 --> 27:31:57,119
because an array is designed to modify
37036
27:31:54,080 --> 27:31:59,279
the data of what is stored inside so if
37037
27:31:57,119 --> 27:32:01,512
we set up an array like this
37038
27:31:59,279 --> 27:32:04,000
the compiler thinks that at some later
37039
27:32:01,512 --> 27:32:06,400
point you will want to assign
37040
27:32:04,000 --> 27:32:08,639
other data to what is already stored in
37041
27:32:06,399 --> 27:32:10,959
this array and there is a hard
37042
27:32:08,639 --> 27:32:13,600
requirement on the data you store in
37043
27:32:10,960 --> 27:32:16,400
your collections for the type of that
37044
27:32:13,600 --> 27:32:18,800
data at least to be left assignable
37045
27:32:16,399 --> 27:32:21,039
and references are not left assignable
37046
27:32:18,800 --> 27:32:22,872
so we can't store them in a collection
37047
27:32:21,039 --> 27:32:25,191
like this if we're trying to do this
37048
27:32:22,872 --> 27:32:26,960
we're going to get a compiler error but
37049
27:32:25,191 --> 27:32:28,799
again some of you are going to say what
37050
27:32:26,960 --> 27:32:31,600
if we store in pointers well this is
37051
27:32:28,800 --> 27:32:33,911
going to work this is the basic working
37052
27:32:33,911 --> 27:32:39,479
going through base pointers to manage
37053
27:32:36,320 --> 27:32:42,000
derived objects this is going to use
37054
27:32:39,479 --> 27:32:44,551
polymorphism and here we will get the
37055
27:32:44,551 --> 27:32:49,119
so if our object is a circle we will
37056
27:32:46,960 --> 27:32:51,280
call the draw method on the circle
37057
27:32:49,119 --> 27:32:54,959
object if it is a novel we're going to
37058
27:32:51,279 --> 27:32:57,831
call the draw method for the over part
37059
27:32:54,960 --> 27:33:00,639
of our object here this is even going to
37060
27:32:57,831 --> 27:33:03,279
work if we go through smart pointers so
37061
27:33:00,639 --> 27:33:06,160
if we do something like this and store
37062
27:33:03,279 --> 27:33:08,639
in smart pointers and create our smart
37063
27:33:06,160 --> 27:33:10,480
pointers on the fly in our initializer
37064
27:33:08,639 --> 27:33:13,279
here this is going to work because
37065
27:33:10,479 --> 27:33:16,080
really a smart pointer is a wrapper on
37066
27:33:13,279 --> 27:33:18,720
top of the regular roll pointer in c
37067
27:33:16,080 --> 27:33:21,119
plus plus so again the message here is
37068
27:33:18,720 --> 27:33:24,080
that you need to be careful on what you
37069
27:33:21,119 --> 27:33:26,319
store in your collections if it is a raw
37070
27:33:24,080 --> 27:33:29,911
piece of ghana your data is going to be
37071
27:33:26,320 --> 27:33:32,320
sliced off if you store derived objects
37072
27:33:29,911 --> 27:33:33,360
in a collection that is designed to
37073
27:33:33,360 --> 27:33:38,160
base class data if you store any
37074
27:33:36,232 --> 27:33:40,720
references that's not even going to
37075
27:33:38,160 --> 27:33:43,512
compile but if you're storing any kind
37076
27:33:40,720 --> 27:33:46,160
of pointer row or smart this is going to
37077
27:33:43,512 --> 27:33:48,400
work because polymorphism was designed
37078
27:33:46,160 --> 27:33:50,639
in the first place to work with base
37079
27:33:48,399 --> 27:33:52,871
pointers that are managing derived
37080
27:33:50,639 --> 27:33:55,279
objects this is really cool and i want
37081
27:33:52,872 --> 27:33:56,639
you to be aware of this now that you
37082
27:33:55,279 --> 27:33:58,551
know this we're going to head over to
37083
27:33:56,639 --> 27:34:01,191
visual studio code and play with this a
37084
27:33:58,551 --> 27:34:03,039
little more here we are in our working
37085
27:34:01,191 --> 27:34:05,512
folder the current project is
37086
27:34:03,039 --> 27:34:07,911
polymorphic objects stored in
37087
27:34:05,512 --> 27:34:10,160
collections we are going to reuse the
37088
27:34:07,911 --> 27:34:13,440
code from the last lecture because we
37089
27:34:10,160 --> 27:34:15,680
need our inheritance hierarchy here and
37090
27:34:13,440 --> 27:34:17,360
this is going to serve us just well
37091
27:34:17,360 --> 27:34:22,399
and we are going to head over in our
37092
27:34:20,160 --> 27:34:24,000
current project and put in our code and
37093
27:34:22,399 --> 27:34:26,000
then we're going to open this in visual
37094
27:34:24,000 --> 27:34:28,080
studio code pretty quick let's do this
37095
27:34:26,000 --> 27:34:30,080
this is going to give us our code and we
37096
27:34:28,080 --> 27:34:32,960
have our shape class which is really
37097
27:34:30,080 --> 27:34:33,911
what we already know we have our oval
37098
27:34:33,911 --> 27:34:39,279
and we have our circle class take a good
37099
27:34:36,639 --> 27:34:40,720
look at this and what we want to see is
37100
27:34:40,720 --> 27:34:47,119
if we use different kinds of setups to
37101
27:34:44,320 --> 27:34:49,912
store objects of this inheritance
37102
27:34:47,119 --> 27:34:52,871
hierarchy in a collection like an array
37103
27:34:49,911 --> 27:34:54,959
let's go back to our main cpp file and
37104
27:34:52,872 --> 27:34:56,551
we are going to take out what we have in
37105
27:34:54,960 --> 27:34:59,120
here we're going to set up what we're
37106
27:34:56,551 --> 27:35:00,872
going to be using in this lecture we are
37107
27:34:59,119 --> 27:35:02,871
going to set up a bunch of objects that
37108
27:35:00,872 --> 27:35:05,600
we're going to be using here basically a
37109
27:35:02,872 --> 27:35:08,320
bunch of circles and ovals we can close
37110
27:35:05,600 --> 27:35:10,400
the left sidebar here and have some more
37111
27:35:08,320 --> 27:35:12,872
breathing room after this we're going to
37112
27:35:10,399 --> 27:35:16,479
set up an array which is going to store
37113
27:35:12,872 --> 27:35:18,960
copies of this object in this array here
37114
27:35:16,479 --> 27:35:20,720
which is called shapes one and after
37115
27:35:18,960 --> 27:35:23,192
this we're going to try and loop through
37116
27:35:20,720 --> 27:35:26,320
this array and try to do things with it
37117
27:35:23,191 --> 27:35:30,080
for example we can say for shape and we
37118
27:35:26,320 --> 27:35:33,280
may want to call the draw method on our
37119
27:35:30,080 --> 27:35:35,512
copy here so for example we can say s
37120
27:35:33,279 --> 27:35:36,959
and say draw going to see what happens
37121
27:35:36,960 --> 27:35:41,360
let's say references because we don't
37122
27:35:41,360 --> 27:35:46,479
range based for loop here so this is
37123
27:35:43,911 --> 27:35:48,000
going to avoid copies we do in this loop
37124
27:35:46,479 --> 27:35:50,231
and we're going to be directly
37125
27:35:48,000 --> 27:35:51,440
referencing whatever we have in this
37126
27:35:51,440 --> 27:35:56,320
now what do you expect to get we have
37127
27:35:53,831 --> 27:35:59,119
derived objects in this array
37128
27:35:56,320 --> 27:36:01,832
and with the setup we have here because
37129
27:35:59,119 --> 27:36:04,159
we are using virtual functions
37130
27:36:04,160 --> 27:36:08,160
polymorphic behavior so here we would
37131
27:36:08,160 --> 27:36:13,192
joe versions in circle and oval to be
37132
27:36:11,191 --> 27:36:14,479
called but that's not what is going to
37133
27:36:13,191 --> 27:36:16,799
happen we're going to see that we're
37134
27:36:14,479 --> 27:36:19,679
going to be calling shape versions of
37135
27:36:16,800 --> 27:36:21,911
our draw methods let's try and build and
37136
27:36:19,679 --> 27:36:24,551
show you this we're going to world with
37137
27:36:21,911 --> 27:36:26,959
gcc our favorite compiler the build is
37138
27:36:24,551 --> 27:36:29,512
going to go through we can kill this and
37139
27:36:26,960 --> 27:36:31,440
bring up a powershell window to allow us
37140
27:36:29,512 --> 27:36:33,191
to run our program we're going to say
37141
27:36:31,440 --> 27:36:36,400
rooster here and you're going to see
37142
27:36:33,191 --> 27:36:38,720
that we are drawing circle one over one
37143
27:36:36,399 --> 27:36:41,679
circle two over two circle three oval
37144
27:36:38,720 --> 27:36:44,320
three but we are calling the shape
37145
27:36:44,320 --> 27:36:50,800
and the reason is we are slicing off
37146
27:36:47,440 --> 27:36:53,191
derived class information in our objects
37147
27:36:50,800 --> 27:36:56,800
the moment we try to make a copy and
37148
27:36:53,191 --> 27:37:00,080
copy in a spot that is designed to store
37149
27:36:56,800 --> 27:37:01,832
objects of the base class so this is
37150
27:37:00,080 --> 27:37:02,872
basically what we saw in the last
37151
27:37:02,872 --> 27:37:08,872
on the slicing but it is disguised
37152
27:37:05,679 --> 27:37:11,439
because we are storing data in an array
37153
27:37:08,872 --> 27:37:13,279
and when you store data in an array like
37154
27:37:11,440 --> 27:37:16,639
this you're going to be making copies
37155
27:37:13,279 --> 27:37:18,160
and storing copies in your array and in
37156
27:37:16,639 --> 27:37:20,800
any copy you make you're going to be
37157
27:37:18,160 --> 27:37:23,760
basically slicing off oval and circle
37158
27:37:20,800 --> 27:37:26,551
information and only storing in shape
37159
27:37:23,759 --> 27:37:28,399
information for our objects here this is
37160
27:37:26,551 --> 27:37:30,800
what the compiler is going to do and
37161
27:37:28,399 --> 27:37:34,000
that really try and prove this we can
37162
27:37:30,800 --> 27:37:36,800
try and print the size of these objects
37163
27:37:34,000 --> 27:37:39,191
and see the sizes of these objects in
37164
27:37:36,800 --> 27:37:43,760
this array here when we loop so for
37165
27:37:39,191 --> 27:37:47,279
example we can say stdc out size of
37166
27:37:43,759 --> 27:37:49,759
circle one do we have circle one yes we
37167
27:37:47,279 --> 27:37:50,959
do so we're going to say size of circle
37168
27:37:50,960 --> 27:37:55,040
and we're going to put its size
37169
27:37:52,399 --> 27:37:57,191
information out here to be seen by
37170
27:37:55,039 --> 27:37:59,039
everybody we're going to say size of
37171
27:37:57,191 --> 27:38:01,360
circle one and we're going to print it
37172
27:37:59,039 --> 27:38:04,479
out and we are also going to print the
37173
27:38:01,360 --> 27:38:06,399
size of whatever iteration we are at in
37174
27:38:04,479 --> 27:38:08,000
our loop here that's the first thing
37175
27:38:06,399 --> 27:38:10,639
we're going to prep and we're going to
37176
27:38:08,000 --> 27:38:13,911
say size of object and we're going to
37177
27:38:10,639 --> 27:38:15,679
say size of s this is going to do
37178
27:38:13,911 --> 27:38:17,831
and we're going to loop and see if the
37179
27:38:15,679 --> 27:38:20,479
information we have on the outside is
37180
27:38:17,831 --> 27:38:22,871
the same as we have on the outside again
37181
27:38:20,479 --> 27:38:24,800
we are printing this information on the
37182
27:38:24,800 --> 27:38:29,512
which is really not yet in our array and
37183
27:38:29,512 --> 27:38:35,760
bring this in front of our array to make
37184
27:38:32,639 --> 27:38:38,160
this super clear and in our loop we are
37185
27:38:35,759 --> 27:38:41,119
printing information on a copy that we
37186
27:38:38,160 --> 27:38:44,232
have in our array because this is the
37187
27:38:41,119 --> 27:38:45,911
real deal we have in our array because
37188
27:38:44,232 --> 27:38:48,320
this is a reference hopefully this is
37189
27:38:45,911 --> 27:38:51,191
going to make sense and prove to you
37190
27:38:48,320 --> 27:38:53,680
that we are going to be working with
37191
27:38:51,191 --> 27:38:57,119
derived objects and the data is going to
37192
27:38:53,679 --> 27:38:58,959
be sliced off if we copy the data in our
37193
27:38:57,119 --> 27:39:01,119
array here this is what i want you to
37194
27:38:58,960 --> 27:39:03,192
see so we're going to run this again
37195
27:39:01,119 --> 27:39:04,720
we're going to pass this through gcc the
37196
27:39:03,191 --> 27:39:06,080
build is going to be good we're going to
37197
27:39:07,759 --> 27:39:12,871
now let's look at what we have here size
37198
27:39:10,000 --> 27:39:16,000
of circle 1 is 56 but you're going to
37199
27:39:12,872 --> 27:39:17,440
see that the size for all our objects in
37200
27:39:17,440 --> 27:39:23,191
has shrinked to 40 because derived class
37201
27:39:20,720 --> 27:39:26,232
information has been sliced off the
37202
27:39:23,191 --> 27:39:28,551
moment we copied our data in our array
37203
27:39:26,232 --> 27:39:30,872
here and this is what i want you to see
37204
27:39:28,551 --> 27:39:33,831
and i think we can even see this if we
37205
27:39:30,872 --> 27:39:36,551
go through our debugger for example we
37206
27:39:36,551 --> 27:39:42,080
and uh open our run tab and if we try to
37207
27:39:40,080 --> 27:39:44,800
run our program through the debugger the
37208
27:39:42,080 --> 27:39:47,600
build is going to be good and the binary
37209
27:39:44,800 --> 27:39:49,279
is going to be passed into our debugger
37210
27:39:47,600 --> 27:39:52,000
and we're going to hit our break point
37211
27:39:49,279 --> 27:39:54,160
in a minute so let's wait for this and
37212
27:39:52,000 --> 27:39:56,000
we have hit our break point here but
37213
27:39:56,000 --> 27:40:01,759
is look at our local variables on the
37214
27:39:59,119 --> 27:40:03,831
left let's look at our array the array
37215
27:40:03,831 --> 27:40:09,439
and if we go up we're going to see our
37216
27:40:09,440 --> 27:40:13,279
and we're going to see that we have five
37217
27:40:11,279 --> 27:40:14,872
indexes here because we have six
37218
27:40:14,872 --> 27:40:19,680
we can expand and see what we have at
37219
27:40:17,360 --> 27:40:22,320
index zero and you're going to see that
37220
27:40:19,679 --> 27:40:24,551
we just have description data because
37221
27:40:22,320 --> 27:40:26,480
this is a shape if we go back in our
37222
27:40:24,551 --> 27:40:28,479
class we're going to see that the only
37223
27:40:26,479 --> 27:40:31,191
thing we have in our shape class is
37224
27:40:28,479 --> 27:40:34,000
really a description member variable and
37225
27:40:31,191 --> 27:40:36,319
it is what we see in our array here just
37226
27:40:34,000 --> 27:40:39,039
description information because this is
37227
27:40:36,320 --> 27:40:41,360
a shaped object and we have lost or
37228
27:40:39,039 --> 27:40:43,599
derived class information and this is
37229
27:40:41,360 --> 27:40:45,831
really cool but if we go on top and for
37230
27:40:43,600 --> 27:40:48,480
example expand circle one we're going to
37231
27:40:45,831 --> 27:40:50,639
see that we have a novel part of us and
37232
27:40:48,479 --> 27:40:53,360
we have a ship part of us but these
37233
27:40:50,639 --> 27:40:56,551
events have been stripped off in our
37234
27:40:53,360 --> 27:40:59,440
array when we slice off the data from
37235
27:40:56,551 --> 27:41:01,831
derived objects to only store shape
37236
27:40:59,440 --> 27:41:04,000
information in our array here i hope
37237
27:41:01,831 --> 27:41:06,080
this makes sense now we're going to kill
37238
27:41:04,000 --> 27:41:08,479
our debugging session because we don't
37239
27:41:06,080 --> 27:41:10,960
need this anymore and we are going to
37240
27:41:08,479 --> 27:41:13,440
comment this out and see some other
37241
27:41:13,440 --> 27:41:18,551
comment with our data here we're going
37242
27:41:15,191 --> 27:41:21,360
to say if you store row derived objects
37243
27:41:18,551 --> 27:41:23,440
in an array which was set up to store
37244
27:41:21,360 --> 27:41:25,360
base class object the data is going to
37245
27:41:23,440 --> 27:41:27,680
be sliced off this is something i want
37246
27:41:25,360 --> 27:41:28,479
you to know but some of you are going to
37247
27:41:28,479 --> 27:41:32,399
what if we store it in references okay
37248
27:41:30,872 --> 27:41:34,160
so let's try and do that we're going to
37249
27:41:32,399 --> 27:41:35,831
set up a piece of code like this and
37250
27:41:34,160 --> 27:41:38,400
we're going to set up an array called
37251
27:41:35,831 --> 27:41:40,639
shapes2 and this array is going to be
37252
27:41:38,399 --> 27:41:43,279
basically storing references to the
37253
27:41:40,639 --> 27:41:44,800
objects we have on top here and we're
37254
27:41:43,279 --> 27:41:47,831
going to see what happens you notice
37255
27:41:44,800 --> 27:41:50,479
that we have a squiggly line already and
37256
27:41:47,831 --> 27:41:52,479
this is saying this is not going to work
37257
27:41:50,479 --> 27:41:54,399
because references can't really be
37258
27:41:54,399 --> 27:41:58,079
again as we saw in the slides the reason
37259
27:41:58,080 --> 27:42:03,440
references are not left assignable and
37260
27:42:00,960 --> 27:42:06,480
they can't be stored in a collection
37261
27:42:03,440 --> 27:42:09,191
like an array here the basic requirement
37262
27:42:06,479 --> 27:42:11,599
on the types that you can store in your
37263
27:42:09,191 --> 27:42:15,119
array is that they have to be left
37264
27:42:11,600 --> 27:42:17,192
assignable and our references are not
37265
27:42:15,119 --> 27:42:20,319
rest assignable so this is not going to
37266
27:42:17,191 --> 27:42:21,599
compile if we try to build our program
37267
27:42:20,320 --> 27:42:24,080
we're going to see that we're going to
37268
27:42:24,080 --> 27:42:27,911
and the build is going to finish with
37269
27:42:25,911 --> 27:42:31,191
errors and if we go up we're going to
37270
27:42:27,911 --> 27:42:33,512
see that declaration of shapes to us
37271
27:42:31,191 --> 27:42:35,679
array of references and this is not
37272
27:42:33,512 --> 27:42:38,479
allowed you can't have an array of
37273
27:42:35,679 --> 27:42:39,911
references in c plus plus and this is
37274
27:42:38,479 --> 27:42:42,159
the reason why so we're going to get a
37275
27:42:39,911 --> 27:42:43,599
compiler error here okay so now you know
37276
27:42:42,160 --> 27:42:45,279
this but some of you are going to say
37277
27:42:43,600 --> 27:42:47,232
what if we go through pointers well
37278
27:42:47,232 --> 27:42:53,040
polymorphism through virtual functions
37279
27:42:50,720 --> 27:42:55,680
was basically designed to work with base
37280
27:42:53,039 --> 27:42:58,231
pointers that are managing derived
37281
27:42:55,679 --> 27:43:00,399
objects and this is what we have here so
37282
27:42:58,232 --> 27:43:03,440
if we look we're going to be getting
37283
27:43:00,399 --> 27:43:05,511
polymorphic behavior and if we call our
37284
27:43:03,440 --> 27:43:08,479
draw method on our pointer here we're
37285
27:43:05,512 --> 27:43:10,872
going to get the most specific
37286
27:43:08,479 --> 27:43:13,039
joe method called and this is what we
37287
27:43:10,872 --> 27:43:14,720
want so we're going to try and weld this
37288
27:43:13,039 --> 27:43:16,551
again and show you that this is going to
37289
27:43:14,720 --> 27:43:17,680
work the build is going to be good we
37290
27:43:17,679 --> 27:43:22,479
and run rooster and we're going to see
37291
27:43:20,080 --> 27:43:24,080
that we are going to be looping around
37292
27:43:22,479 --> 27:43:26,720
and if we call the draw method we're
37293
27:43:24,080 --> 27:43:29,119
going to call the overdraw method circle
37294
27:43:26,720 --> 27:43:31,360
draw method overdraw method circle draw
37295
27:43:29,119 --> 27:43:33,440
method this is basically what we want
37296
27:43:31,360 --> 27:43:36,232
and we are going through base pointers
37297
27:43:33,440 --> 27:43:37,911
to really use polymorphism here this is
37298
27:43:36,232 --> 27:43:40,232
definitely going to work if you go
37299
27:43:37,911 --> 27:43:42,399
through smart pointers so let's comment
37300
27:43:40,232 --> 27:43:44,552
this out and set up another example to
37301
27:43:42,399 --> 27:43:46,720
really drive this home you can really
37302
27:43:44,551 --> 27:43:50,159
use any kind of smart pointer you can
37303
27:43:46,720 --> 27:43:52,639
use unique pointer or shared pointers so
37304
27:43:50,160 --> 27:43:54,480
here we will just be storing in shared
37305
27:43:52,639 --> 27:43:56,639
pointers because this is easier to
37306
27:43:54,479 --> 27:43:58,800
handle and we're going to head over to
37307
27:43:56,639 --> 27:44:01,191
the top and include the memory header if
37308
27:43:58,800 --> 27:44:03,832
you remember if you want to use smart
37309
27:44:01,191 --> 27:44:05,911
pointers in c plus plus you will have to
37310
27:44:03,831 --> 27:44:08,639
include the memory header which brings
37311
27:44:05,911 --> 27:44:10,399
in the data to set up smart pointers in
37312
27:44:10,399 --> 27:44:14,959
so this is going to look good now and if
37313
27:44:13,360 --> 27:44:18,000
we build we're going to get the most
37314
27:44:14,960 --> 27:44:20,800
specific version of our draw method
37315
27:44:18,000 --> 27:44:23,119
called through polymorphism that is
37316
27:44:20,800 --> 27:44:24,872
using virtual functions here so let's
37317
27:44:23,119 --> 27:44:26,871
build and show you that this is going to
37318
27:44:24,872 --> 27:44:28,080
work the book is going to be good we can
37319
27:44:28,080 --> 27:44:33,680
and run rooster and we are going to get
37320
27:44:30,551 --> 27:44:36,159
our versions of draw called the version
37321
27:44:33,679 --> 27:44:38,639
for a circle and the version for oval
37322
27:44:36,160 --> 27:44:41,680
because we are using base pointers to
37323
27:44:38,639 --> 27:44:44,000
manage derived objects here and our
37324
27:44:41,679 --> 27:44:46,479
class inheritance hierarchy is using
37325
27:44:44,000 --> 27:44:48,399
virtual functions for the draw method
37326
27:44:46,479 --> 27:44:50,399
here so this is going to work this is
37327
27:44:48,399 --> 27:44:53,279
really all i wanted you to see in this
37328
27:44:50,399 --> 27:44:54,639
lecture you should be careful if you try
37329
27:44:54,639 --> 27:45:01,679
derived objects in an array that was
37330
27:44:58,320 --> 27:45:03,760
designed to store base class data if you
37331
27:45:01,679 --> 27:45:05,039
are using raw data you're going to get
37332
27:45:05,039 --> 27:45:09,679
and you really need to be aware of this
37333
27:45:07,512 --> 27:45:12,000
because you want to have derived class
37334
27:45:09,679 --> 27:45:13,759
information if you try to store any
37335
27:45:12,000 --> 27:45:16,232
references this is not even going to
37336
27:45:13,759 --> 27:45:18,399
compile because references are not left
37337
27:45:16,232 --> 27:45:20,960
assignable but this is going to work if
37338
27:45:18,399 --> 27:45:23,119
you use role pointers or smart pointers
37339
27:45:20,960 --> 27:45:25,760
because polymorphism was basically
37340
27:45:23,119 --> 27:45:28,720
designed to work with base pointers or
37341
27:45:25,759 --> 27:45:32,159
references that are managing a derived
37342
27:45:28,720 --> 27:45:34,000
object which uses polymorphism we are
37343
27:45:32,160 --> 27:45:35,760
going to stop here in this lecture the
37344
27:45:34,000 --> 27:45:39,191
next one we're going to learn about the
37345
27:45:35,759 --> 27:45:41,360
override mechanism in c plus plus go
37346
27:45:39,191 --> 27:45:42,871
ahead and finish up here and meet me
37347
27:45:41,360 --> 27:45:45,831
there in this lecture we're going to
37348
27:45:42,872 --> 27:45:49,440
learn about the override specification
37349
27:45:45,831 --> 27:45:52,479
a kind of setup you can do to avoid
37350
27:45:49,440 --> 27:45:54,800
errors in your inheritance hierarchies
37351
27:45:52,479 --> 27:45:58,000
if you use virtual functions to set up
37352
27:45:54,800 --> 27:46:00,639
polymorphic behavior for your derived
37353
27:45:58,000 --> 27:46:03,360
objects and this is something that was
37354
27:46:00,639 --> 27:46:04,720
set up in ziplus plus to avoid easy to
37355
27:46:04,720 --> 27:46:10,232
for example if you have an inheritance
37356
27:46:07,440 --> 27:46:12,960
hierarchy like this you might be meaning
37357
27:46:10,232 --> 27:46:15,440
to set up a draw overrides for what we
37358
27:46:12,960 --> 27:46:17,912
have in the base class and an override
37359
27:46:17,911 --> 27:46:23,512
method that you have in your derived
37360
27:46:20,551 --> 27:46:25,759
class to really hide what we had in the
37361
27:46:23,512 --> 27:46:28,000
base class for example the draw method
37362
27:46:25,759 --> 27:46:30,399
novel is going to be overriding or
37363
27:46:30,399 --> 27:46:35,119
and the draw method in circle is going
37364
27:46:32,479 --> 27:46:38,000
to be overriding or hiding what we have
37365
27:46:35,119 --> 27:46:40,720
in oval this is the idea here but as you
37366
27:46:38,000 --> 27:46:42,720
set up your overrides you might make
37367
27:46:40,720 --> 27:46:46,639
mistakes for example you may mean to say
37368
27:46:42,720 --> 27:46:49,040
draw and i use a w that is in uppercase
37369
27:46:46,639 --> 27:46:51,279
and that's going to be bad because what
37370
27:46:49,039 --> 27:46:54,159
you will be putting in oval is going to
37371
27:46:51,279 --> 27:46:56,232
be a completely separate method that is
37372
27:46:54,160 --> 27:46:58,000
different from what we have on the top
37373
27:46:56,232 --> 27:46:59,832
and this is going to be really bad
37374
27:46:58,000 --> 27:47:02,639
you're not going to get polymorphic
37375
27:46:59,831 --> 27:47:05,119
behavior for the draw method in oval
37376
27:47:02,639 --> 27:47:07,440
because we are simply not overriding the
37377
27:47:05,119 --> 27:47:10,319
jaw method from shape and this is going
37378
27:47:07,440 --> 27:47:14,232
to be bad so in ziploc plus we can avoid
37379
27:47:10,320 --> 27:47:16,960
these problems by explicitly specifying
37380
27:47:14,232 --> 27:47:19,360
that the draw method we have in alpha is
37381
27:47:16,960 --> 27:47:23,192
an override and we can add this
37382
27:47:19,360 --> 27:47:25,440
specification after our method header
37383
27:47:23,191 --> 27:47:28,231
and the c plus plus compiler is going to
37384
27:47:25,440 --> 27:47:31,040
enforce that we are actually overriding
37385
27:47:28,232 --> 27:47:34,232
a method that exists in our parents
37386
27:47:31,039 --> 27:47:36,551
class which happens to be shape here if
37387
27:47:34,232 --> 27:47:38,160
we have no method called draw in the
37388
27:47:36,551 --> 27:47:40,551
base class we're going to get a compiler
37389
27:47:38,160 --> 27:47:42,960
error because we want to be basically
37390
27:47:40,551 --> 27:47:45,679
overriding any method here this is going
37391
27:47:42,960 --> 27:47:48,552
to protect us from problems if we make
37392
27:47:45,679 --> 27:47:51,191
typos in setting up our polymorphic
37393
27:47:48,551 --> 27:47:53,512
methods here this is the main thing we
37394
27:47:51,191 --> 27:47:55,759
can achieve with the override
37395
27:47:53,512 --> 27:47:57,119
specification now that you know this
37396
27:47:55,759 --> 27:47:58,871
we're going to head over to visual
37397
27:47:57,119 --> 27:48:01,759
studio code and play with us a little
37398
27:47:58,872 --> 27:48:04,080
more here we are in our working folder
37399
27:48:01,759 --> 27:48:05,599
the current project is override here
37400
27:48:04,080 --> 27:48:07,680
we're going to grab the code from the
37401
27:48:05,600 --> 27:48:09,912
last lecture because we are basically
37402
27:48:07,679 --> 27:48:10,871
going to be reusing the same code over
37403
27:48:10,872 --> 27:48:16,160
building on top of that if we need to do
37404
27:48:13,360 --> 27:48:18,080
that so we're going to put in our code
37405
27:48:16,160 --> 27:48:19,832
and we are going to open this in visual
37406
27:48:18,080 --> 27:48:22,160
studio code by dragging and dropping
37407
27:48:19,831 --> 27:48:24,080
here this is going to give us our code
37408
27:48:22,160 --> 27:48:27,040
and we can really do whatever we want
37409
27:48:24,080 --> 27:48:29,911
with that i think we can leave in the
37410
27:48:27,039 --> 27:48:32,639
code that is using the base pointer to
37411
27:48:29,911 --> 27:48:34,319
manage our derived objects i think this
37412
27:48:34,320 --> 27:48:37,760
well enough and we can take out
37413
27:48:36,080 --> 27:48:40,232
everything else because that's just
37414
27:48:37,759 --> 27:48:42,959
going to be confusion we don't need all
37415
27:48:40,232 --> 27:48:45,192
this here this is going to be serving us
37416
27:48:42,960 --> 27:48:46,960
well now we want to learn about the
37417
27:48:46,960 --> 27:48:52,232
and to learn about that we're going to
37418
27:48:49,440 --> 27:48:55,440
introduce a title on purpose here for
37419
27:48:52,232 --> 27:48:57,440
example suppose we want to set up a draw
37420
27:48:57,440 --> 27:49:02,232
an uppercase letter here for the w key
37421
27:49:00,000 --> 27:49:04,800
world i don't think this is really easy
37422
27:49:02,232 --> 27:49:06,480
to spot once you've made this mistake
37423
27:49:04,800 --> 27:49:09,192
and you're not going to be getting any
37424
27:49:09,191 --> 27:49:14,871
this is something valid you can set up a
37425
27:49:11,191 --> 27:49:16,959
completely new method and call it joe
37426
27:49:14,872 --> 27:49:20,400
and this is going to work but this will
37427
27:49:16,960 --> 27:49:22,232
be very hard to spot in your program and
37428
27:49:20,399 --> 27:49:24,551
the compiler won't protect you as we
37429
27:49:22,232 --> 27:49:26,232
just said if we build our program you're
37430
27:49:24,551 --> 27:49:29,759
going to see that it is going to bulk
37431
27:49:26,232 --> 27:49:31,512
just fine so let's pass this through gcc
37432
27:49:29,759 --> 27:49:33,911
the voltage is going to be good but we
37433
27:49:31,512 --> 27:49:36,320
want to get to the behavior that we want
37434
27:49:33,911 --> 27:49:39,440
i think we can take out this sddc out
37435
27:49:36,320 --> 27:49:41,440
statement inside our for loop here and
37436
27:49:39,440 --> 27:49:44,400
we can weld again this is going to be
37437
27:49:41,440 --> 27:49:47,680
less confusing okay so the build is good
37438
27:49:44,399 --> 27:49:49,439
we can bring up our powershell window
37439
27:49:47,679 --> 27:49:51,439
and i'm going to run rooster and see
37440
27:49:49,440 --> 27:49:53,279
what happens you're going to see that
37441
27:49:51,440 --> 27:49:54,320
for a circle we're going to draw a
37442
27:49:56,000 --> 27:50:02,000
we're going to be drawing shape so what
37443
27:49:58,080 --> 27:50:04,639
is happening here we are overriding our
37444
27:50:02,000 --> 27:50:07,191
joe method in the overclass so we should
37445
27:50:04,639 --> 27:50:10,000
get polymorphic behavior because this is
37446
27:50:07,191 --> 27:50:12,871
a virtual function and it is called draw
37447
27:50:10,000 --> 27:50:15,119
exactly the same thing like we had in
37448
27:50:12,872 --> 27:50:17,911
the base class except we've made a
37449
27:50:15,119 --> 27:50:20,319
really simple typo here but it is really
37450
27:50:17,911 --> 27:50:24,000
hard to track and get hold of we have
37451
27:50:20,320 --> 27:50:26,080
named our method draw but the w is in
37452
27:50:24,000 --> 27:50:29,911
uppercase so this is a completely
37453
27:50:26,080 --> 27:50:33,040
different method than the draw method we
37454
27:50:29,911 --> 27:50:34,959
originally intended to override in our
37455
27:50:33,039 --> 27:50:37,679
base class and this is really hard to
37456
27:50:34,960 --> 27:50:40,000
follow and keep track of we can protect
37457
27:50:37,679 --> 27:50:43,039
ourselves by adding the override
37458
27:50:40,000 --> 27:50:44,960
specification so if we say override the
37459
27:50:43,039 --> 27:50:47,119
compiler is going to help out and make
37460
27:50:44,960 --> 27:50:49,912
sure that we are actually trying to
37461
27:50:47,119 --> 27:50:52,399
override the method that exists in the
37462
27:50:49,911 --> 27:50:54,000
shape class and if it doesn't exist
37463
27:50:52,399 --> 27:50:55,679
we're going to get a compiler error then
37464
27:50:54,000 --> 27:50:57,911
we're going to look at this and really
37465
27:50:55,679 --> 27:51:00,639
spot this mistake here this is what you
37466
27:50:57,911 --> 27:51:03,759
can achieve with the override keyword
37467
27:51:00,639 --> 27:51:06,319
and in fact i do recommend and advise
37468
27:51:03,759 --> 27:51:08,720
you to use this in your inheritance
37469
27:51:06,320 --> 27:51:10,400
hierarchy if you happen to be using
37470
27:51:10,399 --> 27:51:14,720
this is going to save you a lot of time
37471
27:51:12,551 --> 27:51:16,399
if you make mistakes like this so we're
37472
27:51:14,720 --> 27:51:18,800
going to try and run this and show you
37473
27:51:16,399 --> 27:51:20,399
the compiler error we get so let's do
37474
27:51:18,800 --> 27:51:22,800
that we're going to pass this through
37475
27:51:22,800 --> 27:51:27,680
fail as we see here and we're going to
37476
27:51:24,551 --> 27:51:30,639
get a compiler saying errol virtual void
37477
27:51:27,679 --> 27:51:33,831
overall joe cost marked override but
37478
27:51:30,639 --> 27:51:36,551
does not override this is super clear we
37479
27:51:33,831 --> 27:51:39,439
are saying we want to override here but
37480
27:51:36,551 --> 27:51:42,000
we're not overriding any method called
37481
27:51:39,440 --> 27:51:43,600
joe with an uppercase because we don't
37482
27:51:42,000 --> 27:51:45,759
have that in shape here this is the
37483
27:51:43,600 --> 27:51:47,440
message once we see the problem we can
37484
27:51:45,759 --> 27:51:50,319
correct it we're going to use in
37485
27:51:47,440 --> 27:51:52,551
lowercase letter for w and this is going
37486
27:51:50,320 --> 27:51:55,280
to work just fine now we're going to use
37487
27:51:52,551 --> 27:51:57,831
the same mechanism to protect ourselves
37488
27:51:55,279 --> 27:51:59,831
from ourselves in circle class so we're
37489
27:51:57,831 --> 27:52:01,511
going to override our draw method but
37490
27:51:59,831 --> 27:52:04,959
we're going to say that we want to
37491
27:52:01,512 --> 27:52:07,760
override explicitly and if we're both
37492
27:52:04,960 --> 27:52:09,680
now let's pass this through gcc this is
37493
27:52:07,759 --> 27:52:11,191
going to build successfully and if we
37494
27:52:09,679 --> 27:52:14,079
run our program we're going to get
37495
27:52:11,191 --> 27:52:16,231
polymorphic behavior let's do that you
37496
27:52:14,080 --> 27:52:18,479
see that circle draw overdraw circle
37497
27:52:16,232 --> 27:52:20,552
draw overdraw this is what we expect
37498
27:52:18,479 --> 27:52:22,399
this is really cool this is really all i
37499
27:52:20,551 --> 27:52:25,039
had to share in this lecture i hope you
37500
27:52:22,399 --> 27:52:27,511
found it interesting use the override
37501
27:52:25,039 --> 27:52:29,831
keyword in your inheritance hierarchy
37502
27:52:27,512 --> 27:52:32,080
because that's going to protect you from
37503
27:52:29,831 --> 27:52:35,039
easy to make typos that are really going
37504
27:52:32,080 --> 27:52:37,040
to give you a hard time otherwise we are
37505
27:52:35,039 --> 27:52:38,799
going to stop here in this lecture in
37506
27:52:37,039 --> 27:52:42,159
the next one we're going to explore the
37507
27:52:38,800 --> 27:52:43,279
concepts of overriding and hiding in
37508
27:52:43,279 --> 27:52:47,191
go ahead and finish up here and meet me
37509
27:52:45,512 --> 27:52:50,232
there in this lecture we're going to
37510
27:52:47,191 --> 27:52:53,191
zoom in on overloading overriding and
37511
27:52:50,232 --> 27:52:55,680
hiding we have seen that overriding is a
37512
27:52:53,191 --> 27:52:57,191
mechanism we have in c plus plus to be
37513
27:52:57,191 --> 27:53:03,119
most specific versions of our virtual
37514
27:53:00,639 --> 27:53:05,600
methods in derived classes so for
37515
27:53:03,119 --> 27:53:08,399
example the draw method we have in oval
37516
27:53:05,600 --> 27:53:11,512
is overriding or eclipsing the one we
37517
27:53:08,399 --> 27:53:13,759
have in shape and the draw method in
37518
27:53:13,759 --> 27:53:20,231
or hiding or eclipsing the one we have
37519
27:53:17,279 --> 27:53:23,360
in awful this is the concept here but
37520
27:53:20,232 --> 27:53:26,160
what happens if we introduce the concept
37521
27:53:23,360 --> 27:53:28,639
of overloading and mix that up with
37522
27:53:26,160 --> 27:53:30,800
overriding as we have seen so far so
37523
27:53:28,639 --> 27:53:33,831
suppose we do something like this this
37524
27:53:30,800 --> 27:53:36,080
is our shape class it is going to have
37525
27:53:33,831 --> 27:53:38,871
two versions of the draw method we have
37526
27:53:36,080 --> 27:53:41,040
one that takes one parameter for example
37527
27:53:38,872 --> 27:53:43,440
this could be the color that we want to
37528
27:53:41,039 --> 27:53:45,831
draw our shape with and another one is
37529
27:53:43,440 --> 27:53:49,040
not going to take any parameter and
37530
27:53:45,831 --> 27:53:51,360
these are two overloads of our virtual
37531
27:53:49,039 --> 27:53:54,231
method here so what is going to happen
37532
27:53:51,360 --> 27:53:56,720
in our derived classes that are going to
37533
27:53:54,232 --> 27:53:58,720
inherit this virtual method so let's
37534
27:53:56,720 --> 27:54:01,119
look at an example here we have a simple
37535
27:53:58,720 --> 27:54:03,512
example that is setting up objects of
37536
27:54:01,119 --> 27:54:05,759
our shapes we have a shape object we
37537
27:54:03,512 --> 27:54:08,479
have a novel object and we have a circle
37538
27:54:05,759 --> 27:54:10,959
object here if we call the draw method
37539
27:54:08,479 --> 27:54:12,800
on our most derived class which is
37540
27:54:10,960 --> 27:54:14,400
circle we're going to see that this is
37541
27:54:12,800 --> 27:54:16,479
going to work we can draw without a
37542
27:54:14,399 --> 27:54:19,119
parameter and we can draw with one
37543
27:54:16,479 --> 27:54:21,512
parameter which is going to be our color
37544
27:54:19,119 --> 27:54:23,279
depth this is going to work just fine we
37545
27:54:23,279 --> 27:54:28,080
our inherited method from the shape
37546
27:54:25,759 --> 27:54:31,599
class and this is really cool but what
37547
27:54:28,080 --> 27:54:34,639
happens if you override this method in
37548
27:54:31,600 --> 27:54:36,872
our overclass suppose we hijack the
37549
27:54:34,639 --> 27:54:40,639
inheritance process and set up another
37550
27:54:36,872 --> 27:54:44,160
draw method in our overclass and we only
37551
27:54:40,639 --> 27:54:45,911
override the overload that doesn't take
37552
27:54:44,160 --> 27:54:48,720
any parameter we can do something like
37553
27:54:45,911 --> 27:54:51,440
this but the moment you do this this is
37554
27:54:48,720 --> 27:54:53,911
going to only override this method and
37555
27:54:51,440 --> 27:54:57,600
it is going to hide all the other draw
37556
27:54:53,911 --> 27:54:59,119
methods that we had in our base class
37557
27:54:57,600 --> 27:55:01,600
which is shaped here and this is
37558
27:54:59,119 --> 27:55:04,479
something i want you to know so once you
37559
27:55:01,600 --> 27:55:06,232
override a single overload of your
37560
27:55:06,232 --> 27:55:11,512
all the other overloads are going to be
37561
27:55:08,479 --> 27:55:14,800
hidden and they won't be usable anymore
37562
27:55:11,512 --> 27:55:17,040
by downstream inheritance classes if you
37563
27:55:14,800 --> 27:55:19,120
want all the overloads to be available
37564
27:55:19,119 --> 27:55:24,959
classes you have no choice but to
37565
27:55:21,911 --> 27:55:27,191
explicitly override each of them and
37566
27:55:24,960 --> 27:55:28,872
that's how it's going to work so if we
37567
27:55:27,191 --> 27:55:31,599
look at the example here we're going to
37568
27:55:28,872 --> 27:55:33,600
see that the draw call without a
37569
27:55:31,600 --> 27:55:37,440
parameter is going to work because this
37570
27:55:33,600 --> 27:55:39,832
is overridden in our oval class but if
37571
27:55:37,440 --> 27:55:42,320
we call the one which takes a parameter
37572
27:55:39,831 --> 27:55:44,959
this is going to be hidden at the oval
37573
27:55:42,320 --> 27:55:46,800
level and we want to have access to that
37574
27:55:44,960 --> 27:55:48,552
in circle and if we try to call this
37575
27:55:46,800 --> 27:55:52,232
we're going to get a compiler error
37576
27:55:48,551 --> 27:55:56,159
again the message is if you override one
37577
27:55:52,232 --> 27:55:58,320
overload of your virtual functions in
37578
27:55:56,160 --> 27:56:00,320
the base class all the other ones are
37579
27:55:58,320 --> 27:56:03,120
going to be hidden and you have no
37580
27:56:00,320 --> 27:56:06,000
choice but to explicitly override them
37581
27:56:03,119 --> 27:56:08,799
for them to be available and usable in
37582
27:56:06,000 --> 27:56:10,800
downstream classes this is the message i
37583
27:56:08,800 --> 27:56:13,760
wanted to convey here okay so now we
37584
27:56:10,800 --> 27:56:15,279
know this but what if we set up another
37585
27:56:15,279 --> 27:56:20,639
downstream for example what if we go in
37586
27:56:17,911 --> 27:56:22,800
our oval class and set up another
37587
27:56:20,639 --> 27:56:24,720
overload which is going to have two
37588
27:56:22,800 --> 27:56:27,360
parameters for example we might have the
37589
27:56:24,720 --> 27:56:29,440
color depth and the color here that we
37590
27:56:27,360 --> 27:56:31,680
want to draw with okay so one thing you
37591
27:56:29,440 --> 27:56:33,680
should know is that this this method is
37592
27:56:31,679 --> 27:56:37,039
not going to participate in shape
37593
27:56:33,679 --> 27:56:38,799
polymorphism and what i mean is that if
37594
27:56:37,039 --> 27:56:41,599
we go through a base pointer or
37595
27:56:38,800 --> 27:56:43,680
reference to manage derived objects we
37596
27:56:41,600 --> 27:56:46,160
can't really call this method with shape
37597
27:56:43,679 --> 27:56:48,231
polymorphism so if we go through our
37598
27:56:46,160 --> 27:56:50,552
shape pointer or reference we want to be
37599
27:56:48,232 --> 27:56:52,552
really able to call this method if we
37600
27:56:50,551 --> 27:56:55,440
try to call it we will get a compiler
37601
27:56:52,551 --> 27:56:56,479
error the reason is this method is not
37602
27:56:56,479 --> 27:57:00,872
to the shape class that's why it's not
37603
27:56:58,720 --> 27:57:03,360
going to participate in shape
37604
27:57:00,872 --> 27:57:05,040
polymorphism the only methods that are
37605
27:57:03,360 --> 27:57:07,600
going to participate in shape
37606
27:57:05,039 --> 27:57:10,159
polymorphism are the methods that are
37607
27:57:07,600 --> 27:57:12,320
declared in the base class and they are
37608
27:57:10,160 --> 27:57:15,192
virtual this is the condition here and
37609
27:57:12,320 --> 27:57:17,280
if you violate this condition in any way
37610
27:57:15,191 --> 27:57:19,279
shape polymorphism or base class
37611
27:57:17,279 --> 27:57:21,191
polymorphism in this case is not going
37612
27:57:19,279 --> 27:57:23,440
to work and you will get a compiler
37613
27:57:21,191 --> 27:57:25,512
error so if you try to do something like
37614
27:57:23,440 --> 27:57:27,512
this and you want to call your draw
37615
27:57:25,512 --> 27:57:29,191
method with two parameters you're going
37616
27:57:27,512 --> 27:57:31,191
to get a bunch of compiler errors and
37617
27:57:29,191 --> 27:57:33,360
this is not going to work another thing
37618
27:57:31,191 --> 27:57:36,720
i want you to see is that if you assign
37619
27:57:33,360 --> 27:57:40,399
a derived object to a base object
37620
27:57:36,720 --> 27:57:43,911
your derived virtual functions are going
37621
27:57:40,399 --> 27:57:46,399
to be wiped out as part of the slicing
37622
27:57:43,911 --> 27:57:49,191
that we have learned about already so
37623
27:57:46,399 --> 27:57:51,599
the circle port is going to be wiped out
37624
27:57:49,191 --> 27:57:54,000
the oval part is going to be sliced off
37625
27:57:51,600 --> 27:57:56,872
and the draw method is going to go with
37626
27:57:54,000 --> 27:57:59,119
our oval part and we will only be left
37627
27:57:56,872 --> 27:58:01,040
with the shareport and if we try to call
37628
27:57:59,119 --> 27:58:03,360
this method here we will get a compiler
37629
27:58:01,039 --> 27:58:05,599
error because it's no longer available
37630
27:58:03,360 --> 27:58:07,759
it's been sliced off this is really what
37631
27:58:05,600 --> 27:58:09,279
i want you to see here now that we know
37632
27:58:07,759 --> 27:58:11,119
this we're going to head over to visual
37633
27:58:09,279 --> 27:58:13,831
studio code and play with this a little
37634
27:58:11,119 --> 27:58:16,231
more here we are in our working folder
37635
27:58:13,831 --> 27:58:18,720
the current project is overloading
37636
27:58:16,232 --> 27:58:21,279
overriding and hiding we want to explore
37637
27:58:18,720 --> 27:58:22,720
these concepts in a little more detail
37638
27:58:21,279 --> 27:58:24,479
we're going to grab the code from the
37639
27:58:22,720 --> 27:58:26,160
last lecture because that's going to be
37640
27:58:24,479 --> 27:58:28,231
a good starting point we're going to
37641
27:58:26,160 --> 27:58:30,080
take out the binary we don't want that
37642
27:58:28,232 --> 27:58:32,720
and we're going to copy and we're going
37643
27:58:30,080 --> 27:58:34,872
to put that in our current project here
37644
27:58:32,720 --> 27:58:36,800
this is going to do and we are going to
37645
27:58:34,872 --> 27:58:39,040
open this in visual studio code pretty
37646
27:58:36,800 --> 27:58:41,192
quick by dragging and dropping here and
37647
27:58:39,039 --> 27:58:42,319
we're going to see that we have a bunch
37648
27:58:42,320 --> 27:58:47,192
virtual functions here who just have the
37649
27:58:44,160 --> 27:58:49,512
draw version but we can set up an
37650
27:58:47,191 --> 27:58:51,599
overload of this draw method here this
37651
27:58:49,512 --> 27:58:54,000
is what we want to do so i am going to
37652
27:58:51,600 --> 27:58:55,912
go below here and set up an overload of
37653
27:58:54,000 --> 27:58:59,119
this method this is going to be taking
37654
27:58:55,911 --> 27:59:01,440
the color depth as a parameter and we
37655
27:58:59,119 --> 27:59:04,319
want to see how usable this is
37656
27:59:01,440 --> 27:59:06,872
downstream so we're going to go down in
37657
27:59:06,872 --> 27:59:12,000
and take out what we don't need here we
37658
27:59:09,440 --> 27:59:15,119
really need a bunch of objects we can
37659
27:59:12,000 --> 27:59:17,119
set up circle one and over one and we
37660
27:59:15,119 --> 27:59:19,191
will see that we can call this method
37661
27:59:17,119 --> 27:59:20,720
we're going to say circle one draw
37662
27:59:19,191 --> 27:59:24,551
without a parameter and we're going to
37663
27:59:20,720 --> 27:59:26,872
say circle one draw and pass and 44 as
37664
27:59:24,551 --> 27:59:30,000
our parameter and let's go back and make
37665
27:59:26,872 --> 27:59:32,720
sure that we have our overload and this
37666
27:59:30,000 --> 27:59:34,872
is going to be taking the color depth
37667
27:59:32,720 --> 27:59:37,191
and let's try and build our program
37668
27:59:34,872 --> 27:59:39,440
because we have a squiggly line here
37669
27:59:37,191 --> 27:59:41,360
let's see if it is just a visual studio
37670
27:59:39,440 --> 27:59:43,600
code playing games with us we're going
37671
27:59:41,360 --> 27:59:45,911
to pass this through gcc and we will
37672
27:59:43,600 --> 27:59:49,040
have a compiler error here so what is
37673
27:59:45,911 --> 27:59:51,911
going on candidate virtual draw cost
37674
27:59:49,039 --> 27:59:54,551
let's go up and see what kind of problem
37675
27:59:51,911 --> 27:59:57,119
we have here ah this is the concept we
37676
27:59:54,551 --> 28:00:00,479
just talked about in the slides we are
37677
27:59:57,119 --> 28:00:03,279
setting up our overloads here but this
37678
28:00:00,479 --> 28:00:05,360
is being eclipsed by the overloads that
37679
28:00:03,279 --> 28:00:07,759
we are setting up in oval you see we
37680
28:00:05,360 --> 28:00:10,800
have a draw override and this is also
37681
28:00:07,759 --> 28:00:14,319
being eclipsed by the override we have
37682
28:00:10,800 --> 28:00:16,551
in our circle class here if we want the
37683
28:00:14,320 --> 28:00:18,400
two overloads we have from shape to be
37684
28:00:16,551 --> 28:00:20,720
available we can comment out the
37685
28:00:18,399 --> 28:00:23,039
overrides we have both in circle and
37686
28:00:20,720 --> 28:00:25,600
oval let's do that and that's going to
37687
28:00:23,039 --> 28:00:26,959
be available and usable so let's do that
37688
28:00:25,600 --> 28:00:30,480
this is a really good learning
37689
28:00:26,960 --> 28:00:31,912
opportunity and now if we go in main cpp
37690
28:00:30,479 --> 28:00:34,479
we're going to see that this is going to
37691
28:00:31,911 --> 28:00:37,759
become available so we can upload this
37692
28:00:34,479 --> 28:00:40,231
with gcc again to bring visual studio
37693
28:00:37,759 --> 28:00:43,039
code up to date and you see the build is
37694
28:00:40,232 --> 28:00:46,080
good and our methods are usable even
37695
28:00:43,039 --> 28:00:49,279
from derived classes so for example we
37696
28:00:46,080 --> 28:00:51,911
can also set up a novel object let's say
37697
28:00:49,279 --> 28:00:54,800
oval one and say draw this is going to
37698
28:00:51,911 --> 28:00:57,831
work if we say ovo one draw and pass in
37699
28:00:54,800 --> 28:00:59,832
a parameter let's put in 54 for example
37700
28:00:57,831 --> 28:01:01,679
this is going to do you're going to see
37701
28:00:59,831 --> 28:01:05,039
that this is going to be accepted by
37702
28:01:01,679 --> 28:01:07,511
visual studio code and if we weld and
37703
28:01:05,039 --> 28:01:09,911
run this program it is going to build it
37704
28:01:07,512 --> 28:01:12,551
is going to be calling the inherited
37705
28:01:12,551 --> 28:01:17,679
circle here the boat is good we can kill
37706
28:01:15,440 --> 28:01:19,680
our terminal here and bring up a
37707
28:01:17,679 --> 28:01:21,911
powershell window we can use to run our
37708
28:01:19,679 --> 28:01:24,799
program we're going to see that we call
37709
28:01:21,911 --> 28:01:27,512
shape draw and shape draw because these
37710
28:01:27,512 --> 28:01:31,600
the shape class that's why we are saying
37711
28:01:29,679 --> 28:01:34,319
shape draw here and we're going to be
37712
28:01:31,600 --> 28:01:36,160
drawing a oval and a drawing with a
37713
28:01:34,320 --> 28:01:38,160
color depth we're going to be drawing
37714
28:01:36,160 --> 28:01:40,160
the circle and drawing with the color
37715
28:01:38,160 --> 28:01:42,872
depth here this is the message i want to
37716
28:01:40,160 --> 28:01:45,680
convey but the moment we override these
37717
28:01:42,872 --> 28:01:48,800
methods in any downstream class for
37718
28:01:45,679 --> 28:01:51,039
example if we go in our over class and
37719
28:01:48,800 --> 28:01:53,760
and comment out the override for the
37720
28:01:51,039 --> 28:01:56,959
draw method notice that we are just
37721
28:01:53,759 --> 28:01:59,119
overriding a single overload again if we
37722
28:01:56,960 --> 28:02:01,440
go back to our shape class we have an
37723
28:01:59,119 --> 28:02:03,360
overload that doesn't take any parameter
37724
28:02:01,440 --> 28:02:05,832
we also have an overload which is going
37725
28:02:03,360 --> 28:02:09,512
to take one parameter in oval we are
37726
28:02:05,831 --> 28:02:11,511
just going to override the overload that
37727
28:02:09,512 --> 28:02:13,911
doesn't take any parameter but this is
37728
28:02:11,512 --> 28:02:17,040
going to hide all the other overloads we
37729
28:02:13,911 --> 28:02:19,191
had for the draw method here and this is
37730
28:02:17,039 --> 28:02:20,399
the only overload that is going to be
37731
28:02:20,399 --> 28:02:24,720
in downstream classes so if we go back
37732
28:02:23,191 --> 28:02:26,551
in main we're going to see that the one
37733
28:02:24,720 --> 28:02:27,759
with a parameter is not going to work
37734
28:02:26,551 --> 28:02:30,231
and we're going to get a bunch of
37735
28:02:27,759 --> 28:02:32,871
compiler errors this is going to be the
37736
28:02:32,872 --> 28:02:37,832
uncomment this guy the others are going
37737
28:02:35,279 --> 28:02:40,160
to be eclipsed again the other one we
37738
28:02:37,831 --> 28:02:42,319
have is just the one with one parameter
37739
28:02:40,160 --> 28:02:44,872
but this is going to stay true even if
37740
28:02:42,320 --> 28:02:46,800
you have a hundred overloads all the
37741
28:02:44,872 --> 28:02:49,600
others are not going to be available if
37742
28:02:46,800 --> 28:02:51,832
you happen to only override one of the
37743
28:02:51,831 --> 28:02:57,191
the other overloads are going to be
37744
28:02:53,759 --> 28:02:59,279
hidden by this one overall ride that you
37745
28:02:57,191 --> 28:03:01,679
are putting in your inheritance
37746
28:02:59,279 --> 28:03:03,911
hierarchy you should really know this if
37747
28:03:01,679 --> 28:03:06,399
you want this guide to be available in
37748
28:03:03,911 --> 28:03:09,279
downstream classes for example you can
37749
28:03:06,399 --> 28:03:12,159
also override that in derived classes
37750
28:03:09,279 --> 28:03:14,800
this is an option we can go in oval and
37751
28:03:12,160 --> 28:03:17,600
put in another overload for this this is
37752
28:03:14,800 --> 28:03:21,192
going to bring this back in scope so we
37753
28:03:17,600 --> 28:03:23,360
can say overdraw here with the color
37754
28:03:21,191 --> 28:03:25,911
depth i don't think we copied the right
37755
28:03:23,360 --> 28:03:28,232
thing we can grab this and go in oval
37756
28:03:25,911 --> 28:03:31,440
and put this in place this is going to
37757
28:03:28,232 --> 28:03:33,832
do we're going to say oval drawing and
37758
28:03:31,440 --> 28:03:36,320
we can go in circle and also put this
37759
28:03:33,831 --> 28:03:39,759
end this is an option and we're going to
37760
28:03:36,320 --> 28:03:41,912
say circle drawing and now you see that
37761
28:03:39,759 --> 28:03:44,551
the squiggly lines in main go away
37762
28:03:41,911 --> 28:03:47,119
because we have overridden all the
37763
28:03:44,551 --> 28:03:48,639
overloads okay if we build and run our
37764
28:03:47,119 --> 28:03:50,871
program we're going to see that this is
37765
28:03:48,639 --> 28:03:53,440
going to work as we expect the world is
37766
28:03:50,872 --> 28:03:55,120
going to be good and we can clear
37767
28:03:53,440 --> 28:03:58,080
and run rooster we're going to see that
37768
28:03:55,119 --> 28:04:00,799
overdraw called overdraw called we are
37769
28:03:58,080 --> 28:04:03,119
calling our derived overrides and this
37770
28:04:00,800 --> 28:04:05,192
is really cool this is what we want here
37771
28:04:03,119 --> 28:04:06,479
let's take this back because we don't
37772
28:04:06,479 --> 28:04:12,231
overridden in our inherited classes so
37773
28:04:09,440 --> 28:04:14,160
we're going to take this out in oval
37774
28:04:12,232 --> 28:04:17,440
and we're going to take this out in
37775
28:04:14,160 --> 28:04:20,232
circle and i want you to see that shaped
37776
28:04:17,440 --> 28:04:23,760
polymorphism is not going to work if you
37777
28:04:20,232 --> 28:04:25,760
override your methods at a downstream
37778
28:04:23,759 --> 28:04:28,231
level so what we are going to do we are
37779
28:04:25,759 --> 28:04:31,759
going to go at the oval level and set up
37780
28:04:28,232 --> 28:04:33,911
another overload for the joe method here
37781
28:04:31,759 --> 28:04:36,399
but this draw method is not going to
37782
28:04:33,911 --> 28:04:38,639
participate in shape polymorphism
37783
28:04:36,399 --> 28:04:41,831
because it is really declared at the
37784
28:04:38,639 --> 28:04:44,232
oval level and any base pointer we have
37785
28:04:41,831 --> 28:04:46,080
or any shape pointer we have is not
37786
28:04:44,232 --> 28:04:48,160
going to have any knowledge of this
37787
28:04:46,080 --> 28:04:50,232
overload that we are about to set up
37788
28:04:48,160 --> 28:04:52,552
here this is what i want you to know
37789
28:04:50,232 --> 28:04:54,872
okay so we are going to go in our oval
37790
28:04:52,551 --> 28:04:58,159
class and set up that overload we can
37791
28:04:54,872 --> 28:05:00,479
set that up here it is going to be taken
37792
28:04:58,160 --> 28:05:02,320
two parameters one is going to be the
37793
28:05:00,479 --> 28:05:05,191
color depth the other is going to be the
37794
28:05:02,320 --> 28:05:07,360
color and we don't want to pass a string
37795
28:05:05,191 --> 28:05:10,479
by a value like this we can use std
37796
28:05:07,360 --> 28:05:12,800
string view and we can include that if
37797
28:05:10,479 --> 28:05:15,279
we need to but it looks like visual
37798
28:05:12,800 --> 28:05:17,680
studio code has got this from something
37799
28:05:15,279 --> 28:05:19,759
else we have included before but we can
37800
28:05:17,679 --> 28:05:21,679
include that explicitly to avoid
37801
28:05:19,759 --> 28:05:24,479
problems so let's do that we're going to
37802
28:05:21,679 --> 28:05:26,231
say stream view here and now we want to
37803
28:05:24,479 --> 28:05:29,360
see that this method is not going to
37804
28:05:26,232 --> 28:05:31,760
participate in shape polymorphism even
37805
28:05:29,360 --> 28:05:34,000
if it is a virtual functions the reason
37806
28:05:31,759 --> 28:05:36,000
is this is not going to be known by your
37807
28:05:34,000 --> 28:05:38,320
shape pointers because it is not
37808
28:05:36,000 --> 28:05:40,080
declared at the sherpa level here i
37809
28:05:38,320 --> 28:05:42,552
really want you to know this we're going
37810
28:05:40,080 --> 28:05:44,080
to take out everything we had here and
37811
28:05:42,551 --> 28:05:47,039
we can set up a shape pointer we're
37812
28:05:44,080 --> 28:05:49,360
going to say shape and say ship ptr and
37813
28:05:47,039 --> 28:05:52,079
we're going to set up a derived object
37814
28:05:49,360 --> 28:05:54,232
here we can say new and serious circle
37815
28:05:52,080 --> 28:05:56,720
and what do we need to build the circle
37816
28:05:54,232 --> 28:05:58,800
object we need the radius and the
37817
28:05:56,720 --> 28:06:01,040
description so we're going to put that
37818
28:05:58,800 --> 28:06:03,360
in place here the radius is going to be
37819
28:06:01,039 --> 28:06:05,119
something like 10 why not and the
37820
28:06:03,360 --> 28:06:08,080
description is going to be circle one
37821
28:06:05,119 --> 28:06:10,551
how creative and we want to see if our
37822
28:06:08,080 --> 28:06:12,479
method is available through polymorphism
37823
28:06:10,551 --> 28:06:15,360
and it is not going to be available
37824
28:06:12,479 --> 28:06:18,319
because the method was not declared at
37825
28:06:15,360 --> 28:06:20,872
the shape level so if we do shape ptr
37826
28:06:18,320 --> 28:06:23,600
and say draw and we have a method which
37827
28:06:20,872 --> 28:06:26,000
is going to take two parameters at the
37828
28:06:23,600 --> 28:06:27,279
oval level we have the color depth and
37829
28:06:27,279 --> 28:06:34,000
so for example if we go in main and say
37830
28:06:34,000 --> 28:06:37,831
not let's say this is something that
37831
28:06:37,831 --> 28:06:42,159
45 because this is an integer parameter
37832
28:06:40,551 --> 28:06:44,479
and we're going to pass in a string
37833
28:06:42,160 --> 28:06:46,552
let's say red you're going to see that
37834
28:06:44,479 --> 28:06:48,551
this is not going to compile
37835
28:06:46,551 --> 28:06:51,191
because the draw method with two
37836
28:06:48,551 --> 28:06:53,360
parameters is not known at the shape
37837
28:06:51,191 --> 28:06:56,231
level this is the message i want to
37838
28:06:53,360 --> 28:06:58,960
convey here so if you want your method
37839
28:06:56,232 --> 28:07:02,080
to be usable with polymorphism the
37840
28:06:58,960 --> 28:07:04,232
method has to show up at the top level
37841
28:07:02,080 --> 28:07:05,600
this is what i want you to see here if
37842
28:07:04,232 --> 28:07:07,911
we're trying to build this we're going
37843
28:07:05,600 --> 28:07:11,040
to get a compiler error and you need to
37844
28:07:07,911 --> 28:07:12,720
be aware of this but know that even if
37845
28:07:11,039 --> 28:07:15,639
this is not working with shape
37846
28:07:12,720 --> 28:07:18,320
polymorphism this can work with oval
37847
28:07:15,639 --> 28:07:20,800
polymorphism and this is an idea i am
37848
28:07:18,320 --> 28:07:23,512
going to explore in the next lecture
37849
28:07:20,800 --> 28:07:26,160
where we learn about the fact that polar
37850
28:07:23,512 --> 28:07:28,232
morphism can be set up at different
37851
28:07:26,160 --> 28:07:30,960
levels so we are going to stop here in
37852
28:07:28,232 --> 28:07:33,360
this lecture and explore that idea in
37853
28:07:30,960 --> 28:07:35,760
detail in the next lecture so go ahead
37854
28:07:33,360 --> 28:07:37,759
and finish up here and meet me there in
37855
28:07:35,759 --> 28:07:40,119
this lecture we're going to explore the
37856
28:07:40,119 --> 28:07:45,279
polymorphism at different levels in our
37857
28:07:45,279 --> 28:07:50,872
suppose we have a hierarchy like we see
37858
28:07:48,080 --> 28:07:53,600
here the top level class is animal and
37859
28:07:50,872 --> 28:07:56,720
we can derive from animal and create a
37860
28:07:53,600 --> 28:07:59,680
feline animal we can derive from feline
37861
28:07:56,720 --> 28:08:02,479
and create a dog animal we can derive
37862
28:07:59,679 --> 28:08:04,639
from feline create a cat animal we can
37863
28:08:02,479 --> 28:08:07,360
also do it the other way and create a
37864
28:08:04,639 --> 28:08:09,759
bird which is also an animal a bird is
37865
28:08:07,360 --> 28:08:12,479
going to have its own methods and member
37866
28:08:09,759 --> 28:08:15,039
variables that make it a bird we can
37867
28:08:12,479 --> 28:08:17,440
derive from a bird create a pigeon and
37868
28:08:15,039 --> 28:08:18,479
we can derive from a bird and create a
37869
28:08:18,479 --> 28:08:22,080
and we can do all these things that
37870
28:08:22,080 --> 28:08:26,400
so the idea i want to expose here is
37871
28:08:26,399 --> 28:08:31,831
doesn't have to always only work on the
37872
28:08:29,279 --> 28:08:34,160
top level class if you have an
37873
28:08:31,831 --> 28:08:37,360
inheritance hierarchy like this if you
37874
28:08:34,160 --> 28:08:39,911
want you can declare a virtual method at
37875
28:08:37,360 --> 28:08:42,080
the feline level and make sure that
37876
28:08:39,911 --> 28:08:44,319
method is also available in deriving
37877
28:08:42,080 --> 28:08:46,800
class and you can set up feline
37878
28:08:44,320 --> 28:08:49,360
polymorphism if that makes sense for
37879
28:08:46,800 --> 28:08:51,760
your application following the same idea
37880
28:08:49,360 --> 28:08:54,160
you can also set up a virtual method in
37881
28:08:51,759 --> 28:08:56,551
the bird class and you can have that
37882
28:08:54,160 --> 28:08:59,512
method overridden in downstream
37883
28:08:56,551 --> 28:09:02,319
inheritance classes like pigeon and crow
37884
28:08:59,512 --> 28:09:04,960
and you can set up bird polymorphism in
37885
28:09:02,320 --> 28:09:07,040
your c plus plus program if that makes
37886
28:09:04,960 --> 28:09:09,832
sense of course you can still use animal
37887
28:09:07,039 --> 28:09:12,079
polymorphism if you want to do that and
37888
28:09:09,831 --> 28:09:14,399
that's going to work as well this is the
37889
28:09:12,080 --> 28:09:17,040
idea we're going to explore here okay so
37890
28:09:14,399 --> 28:09:20,159
with that inheritance hierarchy in mind
37891
28:09:17,039 --> 28:09:22,551
we can create animal polymorphism and
37892
28:09:20,160 --> 28:09:25,192
animal polymorphism is just going
37893
28:09:22,551 --> 28:09:28,399
through the animal base pointer and
37894
28:09:25,191 --> 28:09:30,399
using that to manage derived objects for
37895
28:09:28,399 --> 28:09:32,551
example here we have a dog we have a cat
37896
28:09:30,399 --> 28:09:35,279
we have a pigeon we have a crow we can
37897
28:09:32,551 --> 28:09:37,039
do animal polymorphism and storing any
37898
28:09:35,279 --> 28:09:39,360
kind of animal we have here you see we
37899
28:09:37,039 --> 28:09:41,279
are putting in a dog we are putting in a
37900
28:09:39,360 --> 28:09:42,960
cat we are putting in a pigeon and we
37901
28:09:42,960 --> 28:09:48,320
and if we do animal polymorphism and
37902
28:09:45,679 --> 28:09:49,759
call the breathe method which exists in
37903
28:09:48,320 --> 28:09:52,320
any kind of animal we have in our
37904
28:09:49,759 --> 28:09:55,039
program this is going to call the most
37905
28:09:52,320 --> 28:09:56,552
specific breathe method on each animal
37906
28:09:55,039 --> 28:09:59,191
and this is going to work really well
37907
28:09:56,551 --> 28:10:01,039
this is going to do animal polymorphism
37908
28:09:59,191 --> 28:10:04,080
following the same idea we can also do
37909
28:10:01,039 --> 28:10:06,799
feline polymorphism and in this case
37910
28:10:04,080 --> 28:10:09,440
feline is going to be acting as our base
37911
28:10:06,800 --> 28:10:11,832
pointer so again we have our dog we have
37912
28:10:09,440 --> 28:10:14,479
our cat we have our pigeon if we do
37913
28:10:11,831 --> 28:10:17,279
feline polymorphism we will have to put
37914
28:10:14,479 --> 28:10:19,440
in all kinds of crazy felines we have in
37915
28:10:17,279 --> 28:10:21,679
our program for example we can put in
37916
28:10:19,440 --> 28:10:23,832
dog and cat and this is going to work if
37917
28:10:21,679 --> 28:10:26,959
you do fill out a polymorphism like we
37918
28:10:23,831 --> 28:10:29,439
are doing here and put in an animal this
37919
28:10:26,960 --> 28:10:32,872
is not going to work because the animal
37920
28:10:29,440 --> 28:10:34,551
top level class is probably not going to
37921
28:10:34,551 --> 28:10:39,039
virtual method we are interested in here
37922
28:10:37,279 --> 28:10:41,360
for example here we are calling the run
37923
28:10:39,039 --> 28:10:43,911
method and the run method is not set up
37924
28:10:41,360 --> 28:10:46,479
at the animal level let's go back and
37925
28:10:43,911 --> 28:10:49,039
look at our inheritance hierarchy here
37926
28:10:46,479 --> 28:10:51,191
you see this is our animal class our
37927
28:10:49,039 --> 28:10:53,119
virtual method is going to be breathed
37928
28:10:51,191 --> 28:10:55,831
because any kind of animal we have is
37929
28:10:53,119 --> 28:10:59,119
going to need to breathe but the run
37930
28:10:55,831 --> 28:11:02,799
method is set up at the feline level so
37931
28:10:59,119 --> 28:11:06,080
if we try and store an an animal in a
37932
28:11:02,800 --> 28:11:08,000
setup that uses filing polymorphism the
37933
28:11:06,080 --> 28:11:09,600
run method is not going to be available
37934
28:11:08,000 --> 28:11:11,440
and we're going to get a compiler error
37935
28:11:09,600 --> 28:11:13,512
so i want you to know this but we will
37936
28:11:11,440 --> 28:11:15,512
also see this in a minute when we hit
37937
28:11:13,512 --> 28:11:18,400
visual studio code to really play with
37938
28:11:15,512 --> 28:11:20,479
us okay we can also do bird polymorphism
37939
28:11:18,399 --> 28:11:23,039
and here you see we have two objects one
37940
28:11:20,479 --> 28:11:25,360
is a pigeon the other is a crow
37941
28:11:23,039 --> 28:11:28,399
and we're going to do bird polymorphism
37942
28:11:25,360 --> 28:11:31,440
here and what that means is that we will
37943
28:11:28,399 --> 28:11:33,439
use a bird pointer to manage all kinds
37944
28:11:31,440 --> 28:11:35,832
of crazy birds in our c plus plus
37945
28:11:33,440 --> 28:11:37,600
program for example we can use that to
37946
28:11:35,831 --> 28:11:40,231
manage a pigeon we can use that to
37947
28:11:37,600 --> 28:11:43,512
manage a crow and if we loop through our
37948
28:11:40,232 --> 28:11:45,680
birds and call the fly method the most
37949
28:11:43,512 --> 28:11:47,832
specific fly method is going to be
37950
28:11:45,679 --> 28:11:49,511
called in this case at the first
37951
28:11:47,831 --> 28:11:52,159
iteration we're going to call the fly
37952
28:11:49,512 --> 28:11:53,911
method on our pigeon object at the
37953
28:11:52,160 --> 28:11:57,360
second iteration we're going to call the
37954
28:11:53,911 --> 28:11:59,512
fly method on our crawl object here and
37955
28:11:57,360 --> 28:12:01,039
this is going to work now that you know
37956
28:11:59,512 --> 28:12:02,872
this we're going to head over to visual
37957
28:12:01,039 --> 28:12:06,000
studio code and play with this a little
37958
28:12:02,872 --> 28:12:08,800
more here we are in our working folder
37959
28:12:06,000 --> 28:12:11,360
the current project is polymorphism at
37960
28:12:08,800 --> 28:12:13,512
different levels we're going to grab our
37961
28:12:11,360 --> 28:12:16,000
template files let's grab it all we're
37962
28:12:13,512 --> 28:12:17,760
going to copy this and put this in our
37963
28:12:17,759 --> 28:12:22,080
and we're going to open this little guy
37964
28:12:19,512 --> 28:12:24,551
in visual studio code like we always do
37965
28:12:22,080 --> 28:12:27,040
and before we open this up i am going to
37966
28:12:24,551 --> 28:12:29,679
put in the classes i have lying around
37967
28:12:27,039 --> 28:12:32,479
on my drive and these are going to be
37968
28:12:29,679 --> 28:12:36,159
the classes making up our inheritance
37969
28:12:32,479 --> 28:12:38,159
hierarchy here to make things go faster
37970
28:12:36,160 --> 28:12:40,720
if you want you can grab these classes
37971
28:12:38,160 --> 28:12:42,639
from the attached resource section on
37972
28:12:40,720 --> 28:12:44,479
this lecture you're going to find all
37973
28:12:42,639 --> 28:12:46,720
these files you can download them and
37974
28:12:44,479 --> 28:12:48,551
put them in your project and use that as
37975
28:12:46,720 --> 28:12:50,320
a starting point because you don't
37976
28:12:48,551 --> 28:12:52,720
really want to be creating all these
37977
28:12:50,320 --> 28:12:55,040
classes this is going to just waste your
37978
28:12:52,720 --> 28:12:58,080
time the basic idea i wanted to expose
37979
28:12:55,039 --> 28:13:00,231
here is doing polymorphism at different
37980
28:12:58,080 --> 28:13:02,000
levels so we're going to open this up in
37981
28:13:00,232 --> 28:13:04,160
visual studio code by dragging and
37982
28:13:02,000 --> 28:13:06,720
dropping here this is going to give us
37983
28:13:04,160 --> 28:13:09,120
our good starting point you see we have
37984
28:13:06,720 --> 28:13:11,440
a bunch of classes in here but all these
37985
28:13:09,119 --> 28:13:14,000
classes are really trying to set up the
37986
28:13:11,440 --> 28:13:15,832
inheritance hierarchy we have here the
37987
28:13:14,000 --> 28:13:16,800
top class is going to be the animal
37988
28:13:16,800 --> 28:13:20,720
we can derive from animal and create a
37989
28:13:20,720 --> 28:13:26,000
and we can derive from animal and also
37990
28:13:23,039 --> 28:13:28,079
create a bird class we can derive from
37991
28:13:26,000 --> 28:13:30,080
feline and create a dark we can derive
37992
28:13:28,080 --> 28:13:32,400
from feline and create a cat
37993
28:13:30,080 --> 28:13:34,960
and we can also derive from bird create
37994
28:13:32,399 --> 28:13:38,159
a pigeon we can also derive from bird
37995
28:13:34,960 --> 28:13:39,912
and create a crowd class and at each
37996
28:13:38,160 --> 28:13:41,680
level we're going to have a virtual
37997
28:13:41,679 --> 28:13:47,439
that other deriving classes can call
37998
28:13:45,191 --> 28:13:49,679
through polymorphism for example if we
37999
28:13:47,440 --> 28:13:52,551
do animal polymorphism we will get the
38000
28:13:49,679 --> 28:13:55,279
correct breathe method called regardless
38001
28:13:52,551 --> 28:13:57,279
of the actual object we are managing
38002
28:13:57,279 --> 28:14:02,399
if we do feline polymorphism we can
38003
28:14:00,000 --> 28:14:05,191
manage our objects through feline
38004
28:14:02,399 --> 28:14:07,911
pointers but we will get the correct run
38005
28:14:05,191 --> 28:14:10,399
method called regardless of which kind
38006
28:14:07,911 --> 28:14:13,039
of object we are calling this method on
38007
28:14:10,399 --> 28:14:15,759
so if we call the run method on a base
38008
28:14:13,039 --> 28:14:18,000
pointer managing a dog object we will
38009
28:14:15,759 --> 28:14:20,231
get the run method called on the dog
38010
28:14:18,000 --> 28:14:22,320
object this is what we mean here okay so
38011
28:14:20,232 --> 28:14:25,440
we have our classes here let's take a
38012
28:14:22,320 --> 28:14:27,760
closer look at our animal class it is
38013
28:14:25,440 --> 28:14:30,080
our top level class and it is going to
38014
28:14:27,759 --> 28:14:32,639
have a virtual method which is called
38015
28:14:30,080 --> 28:14:35,600
breathe it is caused because it is not
38016
28:14:32,639 --> 28:14:37,679
modifying our class here notice that we
38017
28:14:35,600 --> 28:14:40,232
don't have a virtual destructor because
38018
28:14:37,679 --> 28:14:42,959
i wanted to keep this simple but in your
38019
28:14:40,232 --> 28:14:45,600
practical object you should make your
38020
28:14:42,960 --> 28:14:47,680
destructors virtual if you happen to
38021
28:14:45,600 --> 28:14:49,832
have a virtual function in your class
38022
28:14:47,679 --> 28:14:51,679
here so for example we can even do that
38023
28:14:49,831 --> 28:14:53,759
let's make this virtual this is not
38024
28:14:54,551 --> 28:14:59,039
this is going to be our top class we
38025
28:14:56,720 --> 28:15:01,191
cannot look at the implementation file
38026
28:14:59,039 --> 28:15:03,439
it is not going to do anything special
38027
28:15:01,191 --> 28:15:05,679
it is just going to forward whatever
38028
28:15:03,440 --> 28:15:07,911
parameter we pass and use that to
38029
28:15:05,679 --> 28:15:10,551
initialize our member variable i think
38030
28:15:07,911 --> 28:15:13,279
we can also go in and change our
38031
28:15:10,551 --> 28:15:16,551
parameter to a string view so we can do
38032
28:15:13,279 --> 28:15:18,639
that hdd string view let's go in the cpp
38033
28:15:16,551 --> 28:15:21,191
file and also change that pretty quick
38034
28:15:18,639 --> 28:15:23,440
we're going to say std string view here
38035
28:15:21,191 --> 28:15:26,720
and this is our animal class we're going
38036
28:15:23,440 --> 28:15:28,720
to go in our feline class because that's
38037
28:15:28,720 --> 28:15:34,000
feline is going to be inheriting from
38038
28:15:30,639 --> 28:15:35,600
animal publicly just as we see here
38039
28:15:34,000 --> 28:15:37,279
we're not going to really do anything
38040
28:15:35,600 --> 28:15:39,680
special we're going to set up a member
38041
28:15:39,679 --> 28:15:43,511
and we're going to forward the data from
38042
28:15:41,679 --> 28:15:46,231
our constructor and use that to
38043
28:15:43,512 --> 28:15:48,639
initialize stuff in our class here our
38044
28:15:46,232 --> 28:15:51,680
parameters are also going to be passed
38045
28:15:48,639 --> 28:15:54,551
as std string view types so let's do
38046
28:15:51,679 --> 28:15:57,191
that here and this is in place we also
38047
28:15:54,551 --> 28:16:00,080
have a virtual method which is called
38048
28:15:57,191 --> 28:16:02,319
run and inside we are just printing
38049
28:16:00,080 --> 28:16:05,191
which kind of object we have
38050
28:16:02,320 --> 28:16:06,960
and uh giving a hint on the method that
38051
28:16:05,191 --> 28:16:09,512
is being called here this is what we
38052
28:16:06,960 --> 28:16:12,720
just do here and we don't intend to
38053
28:16:09,512 --> 28:16:15,760
create feline objects directly that's
38054
28:16:12,720 --> 28:16:18,160
why we're not setting up any overrides
38055
28:16:15,759 --> 28:16:20,551
of the top that's why we are not setting
38056
28:16:20,551 --> 28:16:24,551
overrides for these methods but we will
38057
28:16:22,639 --> 28:16:26,551
do that in downstream classes for
38058
28:16:24,551 --> 28:16:28,959
example dog and cat because that's going
38059
28:16:26,551 --> 28:16:31,679
to make sense there let's go in the cpp
38060
28:16:28,960 --> 28:16:33,680
file for feline and also change things a
38061
28:16:31,679 --> 28:16:35,911
little bit we're going to use std string
38062
28:16:33,679 --> 28:16:38,399
view parameters let's do that for the
38063
28:16:35,911 --> 28:16:41,191
second parameter as well and this is our
38064
28:16:38,399 --> 28:16:43,911
filling class so we can go in and look
38065
28:16:41,191 --> 28:16:46,479
at our dog class let's see if we can
38066
28:16:43,911 --> 28:16:48,720
find it and i don't think we made our
38067
28:16:46,479 --> 28:16:51,512
destructor in feline a virtual so let's
38068
28:16:48,720 --> 28:16:53,360
do that and look at our delta class
38069
28:16:51,512 --> 28:16:56,320
pretty quick here we have our dog it's
38070
28:16:53,360 --> 28:16:59,680
going to have no member variable at all
38071
28:16:56,320 --> 28:17:02,872
and it will just forward this data to
38072
28:16:59,679 --> 28:17:05,279
upstream classes but we can override our
38073
28:17:02,872 --> 28:17:08,320
breathe method we get from the animal
38074
28:17:05,279 --> 28:17:11,119
class we can do that and we are going to
38075
28:17:08,320 --> 28:17:13,360
say we can grab this entire thing and
38076
28:17:11,119 --> 28:17:14,871
we're going to go in dark we can do that
38077
28:17:13,360 --> 28:17:16,960
if we want we're going to put this
38078
28:17:14,872 --> 28:17:18,800
method down below here and we're going
38079
28:17:16,960 --> 28:17:21,832
to say breathe we're going to say that
38080
28:17:18,800 --> 28:17:23,911
this is overriding what we have on top
38081
28:17:21,831 --> 28:17:26,399
and we're going to say dog breathe
38082
28:17:23,911 --> 28:17:29,440
called this is going to do and we also
38083
28:17:26,399 --> 28:17:32,319
need to change our parameters to hdd
38084
28:17:29,440 --> 28:17:34,400
strength view let's do that this is
38085
28:17:32,320 --> 28:17:37,440
going to make things work better because
38086
28:17:34,399 --> 28:17:40,000
we will avoid unnecessary copies and we
38087
28:17:37,440 --> 28:17:42,400
will be able to pass string literals as
38088
28:17:40,000 --> 28:17:44,800
parameters to this constructor here this
38089
28:17:42,399 --> 28:17:47,831
is what we want to achieve with us we
38090
28:17:44,800 --> 28:17:48,960
can hit the cpp file for a dog class and
38091
28:17:48,960 --> 28:17:54,080
change the parameters again std string
38092
28:17:51,679 --> 28:17:55,911
view and we're going to say std string
38093
28:17:54,080 --> 28:17:58,000
view as well here and we're going to go
38094
28:17:55,911 --> 28:18:00,160
to the header file again and make sure
38095
28:17:58,000 --> 28:18:02,479
we have a virtual destructor here
38096
28:18:00,160 --> 28:18:04,639
because this is good practice if you are
38097
28:18:02,479 --> 28:18:06,800
using virtual functions like we are
38098
28:18:04,639 --> 28:18:09,831
doing here we can grab our breathe
38099
28:18:06,800 --> 28:18:12,400
method and hop over to our cat class
38100
28:18:09,831 --> 28:18:15,191
again remember the inheritance hierarchy
38101
28:18:12,399 --> 28:18:17,511
we are going after is what we have here
38102
28:18:15,191 --> 28:18:18,959
so if you are confused please come back
38103
28:18:17,512 --> 28:18:20,960
and look at this you're going to really
38104
28:18:18,960 --> 28:18:22,720
understand what we are doing here we're
38105
28:18:20,960 --> 28:18:25,192
going to go to the dog class and make
38106
28:18:22,720 --> 28:18:28,160
sure it is working as we want so we just
38107
28:18:25,191 --> 28:18:30,319
did the dog class and we just made sure
38108
28:18:28,160 --> 28:18:32,872
it works like we want now we're going to
38109
28:18:30,320 --> 28:18:34,720
hop over to cat and make sure it is now
38110
28:18:32,872 --> 28:18:37,760
we're going to hop over to the cat class
38111
28:18:34,720 --> 28:18:40,399
and make sure it is overriding the brief
38112
28:18:37,759 --> 28:18:42,231
method to make sure the correct method
38113
28:18:40,399 --> 28:18:44,959
is called okay so let's do that we're
38114
28:18:42,232 --> 28:18:46,080
going to hop over to our cat class it is
38115
28:18:46,080 --> 28:18:52,080
have its own meow method but it can also
38116
28:18:49,360 --> 28:18:54,479
override the breathe method we get from
38117
28:18:52,080 --> 28:18:55,600
the animal class so let's do that we can
38118
28:18:55,600 --> 28:19:00,080
and we can go to our cat class let's do
38119
28:18:58,479 --> 28:19:02,319
that we're going to put in our virtual
38120
28:19:00,080 --> 28:19:05,360
method and we're going to say cat
38121
28:19:02,320 --> 28:19:08,232
breathe and this is really all we also
38122
28:19:05,360 --> 28:19:11,360
need to set up our parameters correctly
38123
28:19:08,232 --> 28:19:14,320
using std string view let's do this std
38124
28:19:11,360 --> 28:19:16,720
string view and this is really all we
38125
28:19:14,320 --> 28:19:18,800
need to do here we can also make our
38126
28:19:16,720 --> 28:19:21,600
destructor virtual because this is good
38127
28:19:18,800 --> 28:19:24,479
practice we hop over in the cpp file and
38128
28:19:21,600 --> 28:19:27,120
change our parameters to be of type std
38129
28:19:24,479 --> 28:19:28,872
string view let's do this and this is
38130
28:19:27,119 --> 28:19:31,039
done we can really work with this
38131
28:19:28,872 --> 28:19:34,160
inheritance hierarchy here we're going
38132
28:19:31,039 --> 28:19:36,959
to also go pretty fast and work on the
38133
28:19:34,160 --> 28:19:39,440
other side of our inheritance hierarchy
38134
28:19:36,960 --> 28:19:41,760
we're going to work on birds let's look
38135
28:19:39,440 --> 28:19:44,000
at the bird class it is going to inherit
38136
28:19:41,759 --> 28:19:45,911
from animal it is not going to do
38137
28:19:44,000 --> 28:19:48,160
anything special really but we just want
38138
28:19:45,911 --> 28:19:50,720
to change the type of our parameters to
38139
28:19:48,160 --> 28:19:53,279
std string view and i'm going to do that
38140
28:19:50,720 --> 28:19:55,512
on the second parameter and we are going
38141
28:19:53,279 --> 28:19:57,440
to hop over in the cpp file and change
38142
28:19:55,512 --> 28:20:00,000
these things here let's do that we're
38143
28:19:57,440 --> 28:20:04,080
going to say std string view and do the
38144
28:20:00,000 --> 28:20:06,960
same thing here std string view and bird
38145
28:20:04,080 --> 28:20:09,279
is done we can grab our breathe method
38146
28:20:06,960 --> 28:20:12,000
for example let's go back to the top and
38147
28:20:09,279 --> 28:20:14,399
grab that from our animal class and
38148
28:20:12,000 --> 28:20:16,720
we're going to hop over to one kind of
38149
28:20:14,399 --> 28:20:17,759
bird we have in our program we can look
38150
28:20:17,759 --> 28:20:21,439
pigeon for example the last class here
38151
28:20:19,911 --> 28:20:24,080
we're going to override the breathe
38152
28:20:21,440 --> 28:20:26,232
method and i'm going to say pigeon
38153
28:20:24,080 --> 28:20:28,720
breathe and we are going to change the
38154
28:20:26,232 --> 28:20:30,960
type of our parameters here to std
38155
28:20:28,720 --> 28:20:34,080
string view and i'm going to do the same
38156
28:20:30,960 --> 28:20:36,960
here and let's hop over to the cpp file
38157
28:20:34,080 --> 28:20:38,872
and change the type of our parameter
38158
28:20:36,960 --> 28:20:41,680
let's do that for the second parameter
38159
28:20:38,872 --> 28:20:44,872
here this is done let's look at the
38160
28:20:41,679 --> 28:20:48,479
second kind of bird we have i think we
38161
28:20:44,872 --> 28:20:50,479
have the crow class we also want to
38162
28:20:48,479 --> 28:20:54,639
override the breathe method we're going
38163
28:20:50,479 --> 28:20:57,759
to say crow breathe and we can go up and
38164
28:20:54,639 --> 28:20:59,759
change our parameter to be of type std
38165
28:20:57,759 --> 28:21:02,159
string view and we're going to do that
38166
28:20:59,759 --> 28:21:04,639
here again if you are not interested in
38167
28:21:02,160 --> 28:21:06,000
these changes you can just grab the code
38168
28:21:04,639 --> 28:21:08,399
and you're going to have all these
38169
28:21:06,000 --> 28:21:10,720
classes ready for use i just wanted to
38170
28:21:08,399 --> 28:21:13,119
correct this little problem i had in my
38171
28:21:10,720 --> 28:21:15,759
classes on my drive because this is not
38172
28:21:13,119 --> 28:21:17,759
good to design in modern c plus plus we
38173
28:21:15,759 --> 28:21:19,911
wanted to do things proper because we
38174
28:21:17,759 --> 28:21:22,639
are really learning about modern c plus
38175
28:21:19,911 --> 28:21:24,639
plus here let's hop over to the cpp file
38176
28:21:22,639 --> 28:21:28,080
and finish this up we're going to change
38177
28:21:24,639 --> 28:21:30,639
the type to hdd stream view and uh let's
38178
28:21:28,080 --> 28:21:32,960
use view correctly and we're going to
38179
28:21:30,639 --> 28:21:35,440
say std string view on the second
38180
28:21:32,960 --> 28:21:37,832
parameter and this is done now we have
38181
28:21:35,440 --> 28:21:40,400
our inheritance hierarchy and we're
38182
28:21:37,831 --> 28:21:42,959
going to start by looking at animal
38183
28:21:40,399 --> 28:21:45,439
polymorphism again we just set up this
38184
28:21:42,960 --> 28:21:48,872
inheritance hierarchy now we are going
38185
28:21:45,440 --> 28:21:50,720
to try and do animal polymorphism okay
38186
28:21:48,872 --> 28:21:53,512
so now we're going to hop over to the
38187
28:21:50,720 --> 28:21:55,680
main cpp file and we are going to clean
38188
28:21:53,512 --> 28:21:58,720
it up a little bit remove whatever it is
38189
28:21:55,679 --> 28:22:00,719
we don't need we are going to put in our
38190
28:21:58,720 --> 28:22:04,080
includes we're going to include all of
38191
28:22:00,720 --> 28:22:06,479
the fans in our file here animal feline
38192
28:22:04,080 --> 28:22:09,440
dog cat bird pigeon and crow we're going
38193
28:22:06,479 --> 28:22:12,479
to include all this and we just want to
38194
28:22:09,440 --> 28:22:14,479
play with animal polymorphism here we
38195
28:22:12,479 --> 28:22:17,039
are going to set up a bunch of objects
38196
28:22:14,479 --> 28:22:19,831
and we're going to put in dog cat pigeon
38197
28:22:17,039 --> 28:22:21,911
and crow all kinds of crazy animals we
38198
28:22:19,831 --> 28:22:24,479
can create in our c plus plus program
38199
28:22:21,911 --> 28:22:27,279
and we're going to put them in an array
38200
28:22:24,479 --> 28:22:29,679
that is storing animal pointer and this
38201
28:22:29,679 --> 28:22:35,911
enable polymorphism for our objects that
38202
28:22:32,800 --> 28:22:38,232
we have in here remember animal sets up
38203
28:22:35,911 --> 28:22:40,551
a virtual method called draw if we go
38204
28:22:38,232 --> 28:22:43,040
back we're going to find that and we
38205
28:22:40,551 --> 28:22:45,599
made sure to override this method in all
38206
28:22:43,039 --> 28:22:47,831
kinds of crazy animals we can create for
38207
28:22:45,600 --> 28:22:50,960
example in our cat we have a breathe
38208
28:22:47,831 --> 28:22:53,191
method overridden in our dog class we
38209
28:22:50,960 --> 28:22:56,160
have the breathe method overridden and
38210
28:22:53,191 --> 28:22:59,679
what we want to achieve in our main cpp
38211
28:22:56,160 --> 28:23:02,552
file let's go there if i can find it we
38212
28:22:59,679 --> 28:23:04,000
want to achieve a setup so that if we
38213
28:23:02,551 --> 28:23:06,872
call the breathe method we're going to
38214
28:23:04,000 --> 28:23:09,279
call the most specific breathe method on
38215
28:23:06,872 --> 28:23:11,600
our animal pointer here even if we are
38216
28:23:09,279 --> 28:23:13,759
calling that method on a base pointer
38217
28:23:11,600 --> 28:23:16,160
this is what we want to achieve this is
38218
28:23:13,759 --> 28:23:19,279
going to be animal polymorphism because
38219
28:23:16,160 --> 28:23:21,680
the base pointer is of animal type this
38220
28:23:19,279 --> 28:23:23,911
is what we mean here let's try and build
38221
28:23:21,679 --> 28:23:25,511
this program so if we look and call the
38222
28:23:23,911 --> 28:23:27,679
breathe method the correct breathe
38223
28:23:25,512 --> 28:23:29,832
method is going to be called and what we
38224
28:23:27,679 --> 28:23:31,911
expect for the first object which is a
38225
28:23:29,831 --> 28:23:34,159
dark object we're going to get the dark
38226
28:23:31,911 --> 28:23:36,000
breathe method called for the second
38227
28:23:34,160 --> 28:23:38,639
iteration the category breathe method is
38228
28:23:36,000 --> 28:23:41,440
going to be called for the third
38229
28:23:38,639 --> 28:23:43,360
for the third iteration the pigeon
38230
28:23:41,440 --> 28:23:45,512
breath method is going to be called for
38231
28:23:45,512 --> 28:23:49,680
crow breathe method is going to be
38232
28:23:47,360 --> 28:23:52,000
called this is what we expect to see
38233
28:23:49,679 --> 28:23:53,831
if we run this program here so let's do
38234
28:23:52,000 --> 28:23:57,191
this we're going to pass this through
38235
28:23:53,831 --> 28:23:59,911
gcc our favorite compiler we can use any
38236
28:23:57,191 --> 28:24:02,080
compiler we want but gcc is going to do
38237
28:23:59,911 --> 28:24:04,479
in this case okay the build is good we
38238
28:24:02,080 --> 28:24:06,872
can bring up a powershell window to play
38239
28:24:04,479 --> 28:24:09,039
with and we're going to run rooster our
38240
28:24:06,872 --> 28:24:11,760
program and if we run this you're going
38241
28:24:09,039 --> 28:24:13,911
to see that in our loop the first
38242
28:24:11,759 --> 28:24:16,080
iteration is going to call dog breathe
38243
28:24:13,911 --> 28:24:18,080
because the first object is a dog the
38244
28:24:16,080 --> 28:24:19,911
second iteration is going to call cat
38245
28:24:18,080 --> 28:24:20,720
breathe because the second object is a
38246
28:24:20,720 --> 28:24:24,639
the third iteration is going to call
38247
28:24:22,399 --> 28:24:26,799
pigeon breathe because the third object
38248
28:24:24,639 --> 28:24:29,119
is a pigeon and the last iteration is
38249
28:24:26,800 --> 28:24:31,911
going to call crow breathe because the
38250
28:24:29,119 --> 28:24:34,080
last object is a crow and notice that we
38251
28:24:31,911 --> 28:24:36,679
are calling the breathe method through a
38252
28:24:34,080 --> 28:24:39,191
base animal pointer and this is what
38253
28:24:36,679 --> 28:24:41,679
polymorphism is all about and what we
38254
28:24:39,191 --> 28:24:44,231
are doing here is animal polymorphism
38255
28:24:41,679 --> 28:24:46,551
but this is not what we are really after
38256
28:24:44,232 --> 28:24:48,080
in this lecture we want to see that we
38257
28:24:50,399 --> 28:24:55,039
bird polymorphism in our inheritance
38258
28:24:52,960 --> 28:24:58,320
hierarchy so we're going to put in a
38259
28:24:55,039 --> 28:25:00,871
separator let's do sddc out and put in a
38260
28:24:58,320 --> 28:25:02,800
bunch of dashes here or hyphens some
38261
28:25:00,872 --> 28:25:05,279
people call them like that doesn't
38262
28:25:02,800 --> 28:25:08,160
really matter and we're going to play
38263
28:25:05,279 --> 28:25:10,479
with feline polymorphism let's do this
38264
28:25:08,160 --> 28:25:12,552
we are going to go down and put in a
38265
28:25:10,479 --> 28:25:15,119
simple piece of coat that we're going to
38266
28:25:12,551 --> 28:25:16,720
be using to play with things here and
38267
28:25:15,119 --> 28:25:18,871
we're going to set up a bunch of objects
38268
28:25:16,720 --> 28:25:22,399
we have a dog we have a cat we have a
38269
28:25:18,872 --> 28:25:26,160
pigeon and we are going to use a feline
38270
28:25:22,399 --> 28:25:27,759
pointer to manage feline derived objects
38271
28:25:26,160 --> 28:25:30,000
for example we're going to use this
38272
28:25:27,759 --> 28:25:31,759
pointer to manage a dog and a cat but
38273
28:25:30,000 --> 28:25:34,000
one thing i want you to see is that if
38274
28:25:31,759 --> 28:25:36,720
you put in a pigeon for example this is
38275
28:25:34,000 --> 28:25:39,119
not going to work because a pigeon is
38276
28:25:36,720 --> 28:25:41,119
not a feline so the compiler is going to
38277
28:25:39,119 --> 28:25:43,191
give you a compiler error let's try and
38278
28:25:41,119 --> 28:25:46,159
do that we're going to try and put in
38279
28:25:43,191 --> 28:25:47,831
pigeon here pigeon 2 you can select this
38280
28:25:46,160 --> 28:25:50,232
and if we do that you're going to see
38281
28:25:47,831 --> 28:25:51,911
that we get a squeaky line this is the
38282
28:25:50,232 --> 28:25:53,120
sign that this is going to go wrong
38283
28:25:53,119 --> 28:25:58,959
we are storing in felines and the pigeon
38284
28:25:55,679 --> 28:26:01,279
is really not a feline even by our
38285
28:25:58,960 --> 28:26:02,872
inheritance hierarchy so the compiler is
38286
28:26:01,279 --> 28:26:04,959
going to give us a compiler error let's
38287
28:26:02,872 --> 28:26:07,440
try and weld to show you the compiler
38288
28:26:04,960 --> 28:26:09,192
error okay the world finished with
38289
28:26:07,440 --> 28:26:12,479
errors and if we go and we're going to
38290
28:26:09,191 --> 28:26:14,799
find that cannot convert pigeon to feed
38291
28:26:12,479 --> 28:26:16,872
line pointer so this is the error here
38292
28:26:14,800 --> 28:26:19,040
you can't do something like this even if
38293
28:26:16,872 --> 28:26:21,600
you create an animal object let's say
38294
28:26:19,039 --> 28:26:23,911
that we're going to go in and create
38295
28:26:21,600 --> 28:26:25,760
animal and we're going to say animal one
38296
28:26:23,911 --> 28:26:27,679
we can do that and we're going to pass
38297
28:26:25,759 --> 28:26:30,000
in the description i think we can do
38298
28:26:27,679 --> 28:26:32,231
that we can do something like this and
38299
28:26:30,000 --> 28:26:34,551
if we try and pass in the address of
38300
28:26:32,232 --> 28:26:36,872
animal one let's do that this is also
38301
28:26:34,551 --> 28:26:40,399
going to give us a compiler error
38302
28:26:36,872 --> 28:26:42,720
because animal is not a feline again if
38303
28:26:40,399 --> 28:26:45,279
you get confused come back and look at
38304
28:26:42,720 --> 28:26:47,512
our inheritance hierarchy here
38305
28:26:45,279 --> 28:26:50,639
what we are setting up in our code we
38306
28:26:47,512 --> 28:26:53,680
are using feline polymorphism but we
38307
28:26:50,639 --> 28:26:56,479
want to store an animal in a raid that
38308
28:26:53,679 --> 28:26:59,039
is storing felines and this is going to
38309
28:26:56,479 --> 28:27:01,279
be a problem because the compiler isn't
38310
28:26:59,039 --> 28:27:03,439
really going to be able to process this
38311
28:27:01,279 --> 28:27:06,000
our base pointer is a feline and we
38312
28:27:03,440 --> 28:27:09,040
should really be able to only store in
38313
28:27:06,000 --> 28:27:11,679
derived types from feline but we are
38314
28:27:09,039 --> 28:27:13,279
putting in a superclass or a parent
38315
28:27:13,279 --> 28:27:19,039
which will not be able to have these
38316
28:27:16,679 --> 28:27:20,799
specializations that feline is doing so
38317
28:27:19,039 --> 28:27:22,871
the compiler is really saying this is
38318
28:27:20,800 --> 28:27:24,800
crazy i can't do this i am going to
38319
28:27:22,872 --> 28:27:26,872
throw a compiler error this is the
38320
28:27:24,800 --> 28:27:28,551
behavior we get here okay so this is
38321
28:27:26,872 --> 28:27:30,320
going to give us a compiler error and
38322
28:27:28,551 --> 28:27:32,872
let's run and see that we're going to
38323
28:27:30,320 --> 28:27:34,960
use gcc the book is going to finish with
38324
28:27:32,872 --> 28:27:37,440
an error and we are going to see that we
38325
28:27:34,960 --> 28:27:39,600
have an invalid conversion from animal
38326
28:27:37,440 --> 28:27:41,600
pointer to filament pointer this is what
38327
28:27:39,600 --> 28:27:45,440
we want to do here we want to convert an
38328
28:27:41,600 --> 28:27:48,400
animal pointer and store that in a slot
38329
28:27:45,440 --> 28:27:50,639
that is only supposed to store feline
38330
28:27:48,399 --> 28:27:52,959
pointers so this is not going to work
38331
28:27:50,639 --> 28:27:54,160
but if you do everything right and only
38332
28:27:54,160 --> 28:27:59,120
derived types of feline you're going to
38333
28:27:56,320 --> 28:28:02,080
get the correct length to work and let's
38334
28:27:59,119 --> 28:28:04,399
look at our dog class let's open it
38335
28:28:02,080 --> 28:28:07,512
again we're going to look at dog and
38336
28:28:04,399 --> 28:28:10,399
we're going to have a run method but we
38337
28:28:07,512 --> 28:28:12,160
don't have that set up for our dog class
38338
28:28:10,399 --> 28:28:14,079
but we can do that pretty quick let's
38339
28:28:12,160 --> 28:28:16,872
look at cat and see if we have a run
38340
28:28:14,080 --> 28:28:19,600
method we don't but we can set that up
38341
28:28:16,872 --> 28:28:21,760
let's go to feline and copy our virtual
38342
28:28:21,759 --> 28:28:26,479
and we are going to go in dog
38343
28:28:24,320 --> 28:28:28,160
and set up another virtual method which
38344
28:28:28,160 --> 28:28:33,279
run and this is going to be an override
38345
28:28:30,800 --> 28:28:35,600
of what we have in our inheritance
38346
28:28:33,279 --> 28:28:38,080
hierarchy so this is an override method
38347
28:28:35,600 --> 28:28:40,320
we are also going to do the same but
38348
28:28:38,080 --> 28:28:42,800
before we go let's say that this is the
38349
28:28:40,320 --> 28:28:44,960
dog class we are doing thanks from
38350
28:28:42,800 --> 28:28:46,960
we are going to grab this method again
38351
28:28:44,960 --> 28:28:49,440
and go in cat because that's another
38352
28:28:46,960 --> 28:28:51,192
feline we have in our program we can do
38353
28:28:49,440 --> 28:28:53,040
something like this and we're going to
38354
28:28:53,039 --> 28:28:58,159
okay so now let's come back to maine
38355
28:28:56,080 --> 28:29:00,639
and we're going to weld again we're
38356
28:28:58,160 --> 28:29:03,279
going to pass this through gcc and we
38357
28:29:00,639 --> 28:29:05,440
still have a pigeon in here so this is
38358
28:29:03,279 --> 28:29:07,831
not good let's check this out
38359
28:29:05,440 --> 28:29:10,551
make sure that we only have a few lines
38360
28:29:07,831 --> 28:29:12,479
in this array here let's build again
38361
28:29:10,551 --> 28:29:14,231
okay you see the bolt is good
38362
28:29:14,232 --> 28:29:18,160
and run rooster we're going to have our
38363
28:29:16,080 --> 28:29:20,872
separator here and you're going to see
38364
28:29:18,160 --> 28:29:22,639
that we are calling our dog method at
38365
28:29:20,872 --> 28:29:26,000
the first iteration because the first
38366
28:29:22,639 --> 28:29:28,639
object is a dog and we are calling a cat
38367
28:29:26,000 --> 28:29:32,080
running method because the second object
38368
28:29:28,639 --> 28:29:34,319
is a cat and this is filing polymorphism
38369
28:29:32,080 --> 28:29:37,279
in action hopefully this proves to you
38370
28:29:34,320 --> 28:29:39,600
that we can do polymorphism at different
38371
28:29:37,279 --> 28:29:42,479
levels depending on what we want to
38372
28:29:39,600 --> 28:29:44,400
achieve in our c plus plus program to
38373
28:29:42,479 --> 28:29:47,119
close off this lecture we are also going
38374
28:29:44,399 --> 28:29:49,119
to set up bird polymorphism let's do
38375
28:29:47,119 --> 28:29:51,679
that we're going to put in a separator
38376
28:29:49,119 --> 28:29:53,911
and we're going to say vertical demod
38377
28:29:51,679 --> 28:29:56,551
present and we are going to put in a
38378
28:29:53,911 --> 28:29:57,599
bunch of objects and set up a base
38379
28:29:57,600 --> 28:30:01,192
array which is going to be a bird
38380
28:29:59,512 --> 28:30:03,832
pointer array in this case and we're
38381
28:30:01,191 --> 28:30:06,720
going to be storing in derived objects
38382
28:30:03,831 --> 28:30:08,799
of the base pointer type so we are going
38383
28:30:06,720 --> 28:30:11,360
to be storing any derived objects of
38384
28:30:08,800 --> 28:30:13,680
bird and we have a pigeon and a crow and
38385
28:30:11,360 --> 28:30:17,039
this is the setup we want here now let's
38386
28:30:13,679 --> 28:30:19,279
go and look at the setup we have in our
38387
28:30:17,039 --> 28:30:21,279
pigeon for example we don't have a fly
38388
28:30:19,279 --> 28:30:23,279
method we just have a cool method
38389
28:30:23,279 --> 28:30:27,911
if we go in our crow we're going to see
38390
28:30:27,911 --> 28:30:32,720
fly method we're just having the cow
38391
28:30:30,320 --> 28:30:36,400
method because the crowd calls
38392
28:30:32,720 --> 28:30:38,800
but if we call our fly method because we
38393
28:30:36,399 --> 28:30:41,191
don't have this method overridden in any
38394
28:30:43,759 --> 28:30:48,080
version of the fly method called so we
38395
28:30:48,080 --> 28:30:52,800
called i want you to see this let's hop
38396
28:30:50,551 --> 28:30:54,872
over to the main cpp file and make sure
38397
28:30:52,800 --> 28:30:56,551
we have the correct setup looks like
38398
28:30:54,872 --> 28:30:59,040
this is what we want we're going to
38399
28:30:56,551 --> 28:31:01,831
build this with gcc the book is going to
38400
28:30:59,039 --> 28:31:04,639
be good as we see here and we're going
38401
28:31:01,831 --> 28:31:07,679
to run now we're going to see bird fly
38402
28:31:04,639 --> 28:31:11,440
bird fly for pigeon one and crow one
38403
28:31:07,679 --> 28:31:14,319
but this is not using any derived method
38404
28:31:14,320 --> 28:31:18,400
and a pigeon class if you want you can
38405
28:31:18,399 --> 28:31:22,871
fly method and you're going to get that
38406
28:31:20,232 --> 28:31:25,192
called let's actually do that because
38407
28:31:22,872 --> 28:31:26,872
i'd like to show you things directly so
38408
28:31:25,191 --> 28:31:29,360
that you can really see with your own
38409
28:31:26,872 --> 28:31:31,512
eyes so we're going to go in bird and
38410
28:31:29,360 --> 28:31:34,551
grab the fly method and we're going to
38411
28:31:31,512 --> 28:31:37,760
override this in pigeon we can do that
38412
28:31:34,551 --> 28:31:40,720
and we're going to override here and we
38413
28:31:37,759 --> 28:31:43,759
are going to say pigeon here and we can
38414
28:31:40,720 --> 28:31:46,960
grab this and i put this method also in
38415
28:31:43,759 --> 28:31:49,759
the crowd class can do that and we're
38416
28:31:46,960 --> 28:31:51,192
going to say crow here now if we run
38417
28:31:51,191 --> 28:31:55,191
using what we have in the main cpp file
38418
28:31:53,679 --> 28:31:57,679
for the first iteration we're going to
38419
28:31:55,191 --> 28:31:59,512
call the fly method on the pigeon object
38420
28:31:57,679 --> 28:32:02,079
because we have the fly method
38421
28:31:59,512 --> 28:32:03,832
overwritten at the pigeon level
38422
28:32:02,080 --> 28:32:05,512
as we see here this is right here
38423
28:32:03,831 --> 28:32:08,080
beneath our eyes and we're going to see
38424
28:32:05,512 --> 28:32:10,000
this in action if we run this program
38425
28:32:08,080 --> 28:32:13,440
here the same is going to happen for the
38426
28:32:10,000 --> 28:32:15,119
crow object here let's build with gcc to
38427
28:32:13,440 --> 28:32:17,191
really prove this the builder is going
38428
28:32:15,119 --> 28:32:18,871
to go through we can clear and run
38429
28:32:17,191 --> 28:32:21,759
rooster and we're going to see pigeon
38430
28:32:18,872 --> 28:32:23,832
fly crowd fly this is proving what we
38431
28:32:21,759 --> 28:32:25,759
set up in this lecture here this is
38432
28:32:23,831 --> 28:32:27,759
really all i had to share i hope you
38433
28:32:25,759 --> 28:32:30,639
found this interesting the main message
38434
28:32:27,759 --> 28:32:32,871
is that you can set up polymorphism at
38435
28:32:30,639 --> 28:32:35,191
different levels in your inheritance
38436
28:32:32,872 --> 28:32:37,512
hierarchy depending on what you want to
38437
28:32:35,191 --> 28:32:39,679
achieve in your c plus plus program we
38438
28:32:37,512 --> 28:32:41,600
saw that we could do the usual thing and
38439
28:32:41,600 --> 28:32:47,040
as the driver for our polymorphism and
38440
28:32:44,320 --> 28:32:49,440
we did animal polymorphism here but
38441
28:32:47,039 --> 28:32:52,871
nothing prevents you from doing feline
38442
28:32:49,440 --> 28:32:55,191
polymorphism or bird polymorphism as we
38443
28:32:52,872 --> 28:32:56,720
saw in this lecture we are going to stop
38444
28:32:55,191 --> 28:32:59,279
here in this one in the next one we're
38445
28:32:56,720 --> 28:33:01,119
going to see how we can do polymorphism
38446
28:33:01,119 --> 28:33:05,119
go ahead and finish up here and make me
38447
28:33:03,279 --> 28:33:08,959
there in this lecture we're going to
38448
28:33:05,119 --> 28:33:11,679
explore how inheritance and polymorphism
38449
28:33:08,960 --> 28:33:14,639
play out with static members that we
38450
28:33:11,679 --> 28:33:17,119
have in our classes and we're going to
38451
28:33:14,639 --> 28:33:18,639
be using this inheritance hierarchy here
38452
28:33:17,119 --> 28:33:21,039
our base class is going to be shape
38453
28:33:18,639 --> 28:33:23,911
we're going to inherit from that and
38454
28:33:21,039 --> 28:33:25,759
create an ellipse class let's look at
38455
28:33:23,911 --> 28:33:28,720
some code here so we're going to set up
38456
28:33:25,759 --> 28:33:31,119
our base class as shape as we said and
38457
28:33:28,720 --> 28:33:33,040
we're going to have one member variable
38458
28:33:31,119 --> 28:33:35,191
which is going to be our description
38459
28:33:33,039 --> 28:33:36,799
here we're going to have a constructor
38460
28:33:36,800 --> 28:33:39,192
and we're going to have a default
38461
28:33:37,911 --> 28:33:41,911
constructor which is really not
38462
28:33:39,191 --> 28:33:45,191
important here but notice that we have a
38463
28:33:41,911 --> 28:33:47,191
static member which is called m count
38464
28:33:45,191 --> 28:33:48,319
and if you remember a static member
38465
28:33:48,320 --> 28:33:53,760
is a kind of variable which is
38466
28:33:50,551 --> 28:33:56,080
associated with the type itself it's not
38467
28:33:53,759 --> 28:33:58,639
associated with any object that you
38468
28:33:56,080 --> 28:34:01,119
create if you forgot this please go back
38469
28:33:58,639 --> 28:34:03,191
to our chapter on classes or user
38470
28:34:01,119 --> 28:34:05,911
defined types you're going to learn all
38471
28:34:03,191 --> 28:34:08,159
about static variables here we are just
38472
28:34:05,911 --> 28:34:11,279
exploring how they play out with
38473
28:34:08,160 --> 28:34:13,760
inheritance and polymorphism now we have
38474
28:34:11,279 --> 28:34:16,160
a shape class if we inherit from it and
38475
28:34:13,759 --> 28:34:18,639
create an ellipse class for example
38476
28:34:16,160 --> 28:34:21,440
we're going to have all the data that
38477
28:34:18,639 --> 28:34:23,679
was public in our base class to be
38478
28:34:21,440 --> 28:34:25,760
public in this class as well so by that
38479
28:34:23,679 --> 28:34:27,831
logic we are also going to get this
38480
28:34:25,759 --> 28:34:30,159
static variable inherited and we're
38481
28:34:27,831 --> 28:34:32,871
going to be able to access it from
38482
28:34:30,160 --> 28:34:34,872
ellipse objects let's try and use this
38483
28:34:32,872 --> 28:34:37,120
in code here to really drive the point
38484
28:34:34,872 --> 28:34:39,911
home here we are creating a batch of
38485
28:34:37,119 --> 28:34:42,080
shape objects here is our first shape we
38486
28:34:39,911 --> 28:34:44,080
print our static variable through this
38487
28:34:42,080 --> 28:34:46,160
syntax here because it is public we can
38488
28:34:44,080 --> 28:34:48,872
do this we're going to get a one because
38489
28:34:46,160 --> 28:34:50,639
we just have one shape here we create a
38490
28:34:48,872 --> 28:34:52,551
second shape and we print the count
38491
28:34:50,639 --> 28:34:55,191
we're going to get two because we just
38492
28:34:52,551 --> 28:34:57,360
have two shapes in here we create our
38493
28:34:55,191 --> 28:34:59,119
third shape and we try and print the
38494
28:34:57,360 --> 28:35:01,600
count we're going to get three and if
38495
28:34:59,119 --> 28:35:04,000
you wonder how we are incrementing this
38496
28:35:01,600 --> 28:35:05,600
static variable we may do this in our
38497
28:35:04,000 --> 28:35:07,759
constructor we're going to see how this
38498
28:35:05,600 --> 28:35:09,760
works exactly once we hit visual studio
38499
28:35:07,759 --> 28:35:11,360
code in a minute but note that every
38500
28:35:09,759 --> 28:35:13,679
time we create an object we're going to
38501
28:35:11,360 --> 28:35:16,232
be incrementing our static variable
38502
28:35:13,679 --> 28:35:18,639
that's why we see one two three as we
38503
28:35:16,232 --> 28:35:21,192
created these objects here this is the
38504
28:35:18,639 --> 28:35:23,831
logic now we have three shapes here we
38505
28:35:21,191 --> 28:35:26,399
go down and create a new object which is
38506
28:35:23,831 --> 28:35:28,399
of ellipse type if we print the shape
38507
28:35:26,399 --> 28:35:31,039
count we're going to get four because an
38508
28:35:28,399 --> 28:35:33,599
ellipse is a shape and ellipse is
38509
28:35:31,039 --> 28:35:35,911
inheriting the static variable from
38510
28:35:33,600 --> 28:35:39,120
shape so we're going to get a 4 printed
38511
28:35:35,911 --> 28:35:41,191
out here but if we also print ellipse
38512
28:35:39,119 --> 28:35:44,231
count we're going to get a 4
38513
28:35:41,191 --> 28:35:46,959
even if we really just have one ellipse
38514
28:35:44,232 --> 28:35:49,512
so the static variable from shape is
38515
28:35:46,960 --> 28:35:52,080
being inherited and used in our ellipse
38516
28:35:53,759 --> 28:35:57,759
the problem here is that the static
38517
28:35:55,679 --> 28:36:00,159
variable we are using in shape and
38518
28:35:57,759 --> 28:36:03,119
ellipse are the same because the one we
38519
28:36:00,160 --> 28:36:05,279
have in ellipse was inherited from shape
38520
28:36:03,119 --> 28:36:08,159
that's why we have these results here
38521
28:36:05,279 --> 28:36:11,279
but sometimes we just want to have
38522
28:36:08,160 --> 28:36:13,600
ellipse count to b1 here because in
38523
28:36:11,279 --> 28:36:16,160
reality we really have one ellipse so
38524
28:36:13,600 --> 28:36:18,160
how do we do that to get that behavior
38525
28:36:16,160 --> 28:36:20,960
you can also set up another static
38526
28:36:18,160 --> 28:36:23,279
variable named exactly the same way at
38527
28:36:20,960 --> 28:36:25,600
the ellipse level and you can do that
38528
28:36:23,279 --> 28:36:28,000
like this you can also override the gate
38529
28:36:25,600 --> 28:36:30,400
count method to return the current count
38530
28:36:28,000 --> 28:36:32,800
in ellipse this is going to work through
38531
28:36:30,399 --> 28:36:34,551
polymorphism because the getcount method
38532
28:36:34,551 --> 28:36:38,800
if you call this method through a
38533
28:36:36,551 --> 28:36:40,800
basepointer you will get the correct one
38534
28:36:38,800 --> 28:36:43,512
called which is going to be the most
38535
28:36:40,800 --> 28:36:45,600
specific one through polymorphism but
38536
28:36:43,512 --> 28:36:47,360
what we want to see is how
38537
28:36:45,600 --> 28:36:50,080
things are going to work now that we
38538
28:36:47,360 --> 28:36:53,279
have a static variable which is named
38539
28:36:50,080 --> 28:36:56,080
exactly the same as the one we have in
38540
28:36:53,279 --> 28:36:58,720
our base class here the one in shape is
38541
28:36:56,080 --> 28:37:01,680
exactly named m count it is a static
38542
28:36:58,720 --> 28:37:04,232
variable of type and the one we have in
38543
28:37:01,679 --> 28:37:07,511
ellipse is also the same it is a static
38544
28:37:04,232 --> 28:37:08,480
variable called m count of type and but
38545
28:37:08,479 --> 28:37:12,639
ellipse is going to maintain its own
38546
28:37:10,232 --> 28:37:15,360
static variable and shape is going to
38547
28:37:12,639 --> 28:37:17,679
maintain its own static variable now we
38548
28:37:15,360 --> 28:37:20,160
are going to get this kind of behavior
38549
28:37:17,679 --> 28:37:22,399
we are going to see that if we try and
38550
28:37:20,160 --> 28:37:24,960
print the count of shapes we have we're
38551
28:37:22,399 --> 28:37:27,039
going to get a four here but now if we
38552
28:37:24,960 --> 28:37:28,552
try and print the count from ellipse
38553
28:37:27,039 --> 28:37:31,511
we're going to get a one because we
38554
28:37:28,551 --> 28:37:33,440
already have one ellipse and this is
38555
28:37:31,512 --> 28:37:35,360
working because ellipse is going to
38556
28:37:35,360 --> 28:37:39,600
static variable and this is going to
38557
28:37:37,039 --> 28:37:42,319
give you this behavior if it is what we
38558
28:37:39,600 --> 28:37:44,552
are after in our c plus plus program now
38559
28:37:42,320 --> 28:37:46,720
we can also go on and create a bunch of
38560
28:37:44,551 --> 28:37:48,720
other objects here we are going to store
38561
28:37:46,720 --> 28:37:51,911
them in this array which is going to be
38562
28:37:48,720 --> 28:37:53,680
storing shared pointers to shape
38563
28:37:51,911 --> 28:37:55,759
and we're going to store in derived
38564
28:37:53,679 --> 28:37:58,079
objects this is the syntax we can use to
38565
28:37:55,759 --> 28:38:01,191
do this and at the moment we do this
38566
28:37:58,080 --> 28:38:03,911
we're going to get six shapes because
38567
28:38:01,191 --> 28:38:05,759
in total we already have six shapes but
38568
28:38:03,911 --> 28:38:07,831
three of those shapes are going to be
38569
28:38:05,759 --> 28:38:09,831
ellipses and if we try to print the
38570
28:38:07,831 --> 28:38:12,639
ellipse count we're going to see that we
38571
28:38:09,831 --> 28:38:14,551
have three ellipses in our c plus plus
38572
28:38:12,639 --> 28:38:16,639
program and this is going to do
38573
28:38:14,551 --> 28:38:20,000
what we want another thing you could do
38574
28:38:16,639 --> 28:38:22,000
is also do shape polymorphism and call
38575
28:38:20,000 --> 28:38:24,160
the gatecount method and you're going to
38576
28:38:22,000 --> 28:38:27,279
get the correct getcount method and
38577
28:38:24,160 --> 28:38:29,440
print the most specific account if we
38578
28:38:27,279 --> 28:38:31,191
are calling that method on an ellipse
38579
28:38:29,440 --> 28:38:33,680
object for example we're going to print
38580
28:38:31,191 --> 28:38:35,279
three if we call that on a shape object
38581
28:38:33,679 --> 28:38:37,319
we're going to get sex and that's the
38582
28:38:35,279 --> 28:38:39,600
behavior we could achieve with
38583
28:38:37,320 --> 28:38:41,512
polymorphism with static member
38584
28:38:39,600 --> 28:38:43,600
variables and i really want you to be
38585
28:38:41,512 --> 28:38:44,872
aware of this now that you know this
38586
28:38:43,600 --> 28:38:46,720
we're going to head over to visual
38587
28:38:44,872 --> 28:38:49,600
studio code and play with us a little
38588
28:38:46,720 --> 28:38:52,080
more here we are in our working folder
38589
28:38:49,600 --> 28:38:54,720
the current project is inheritance and
38590
28:38:52,080 --> 28:38:57,191
polymorphism with static members we're
38591
28:38:54,720 --> 28:39:00,160
going to grab our template files and put
38592
28:38:57,191 --> 28:39:03,279
them in place and i am going to grab our
38593
28:39:00,160 --> 28:39:05,512
classes from my drive and use this as
38594
28:39:03,279 --> 28:39:08,080
the starting point again if you don't
38595
28:39:05,512 --> 28:39:10,320
want to type or create these classes you
38596
28:39:08,080 --> 28:39:12,400
can use the files provided in the
38597
28:39:10,320 --> 28:39:14,320
resource section of this lecture you can
38598
28:39:12,399 --> 28:39:16,231
download them and use them directly
38599
28:39:14,320 --> 28:39:18,640
without having to create them because we
38600
28:39:16,232 --> 28:39:22,000
are really interested in how static
38601
28:39:18,639 --> 28:39:24,551
members behave with our inheritance
38602
28:39:22,000 --> 28:39:26,232
hierarchy which happens to be setting up
38603
28:39:24,551 --> 28:39:28,479
polymorphism this is what we want to
38604
28:39:26,232 --> 28:39:30,232
learn about here i am going to open this
38605
28:39:28,479 --> 28:39:32,872
up in visual studio code and we're going
38606
28:39:30,232 --> 28:39:34,800
to take a good look at our classes the
38607
28:39:32,872 --> 28:39:37,120
base class is going to be shape which is
38608
28:39:34,800 --> 28:39:39,832
what we have here it's going to have a
38609
28:39:37,119 --> 28:39:42,959
virtual method which is get count here
38610
28:39:39,831 --> 28:39:44,319
and we have a static member which is of
38611
28:39:44,320 --> 28:39:48,400
i am going to change my parameter here
38612
28:39:48,399 --> 28:39:52,871
because that's what we should do in
38613
28:39:50,000 --> 28:39:55,191
modern c plus plus let's look at the cpp
38614
28:39:52,872 --> 28:39:57,120
file for this and we're going to fix
38615
28:39:55,191 --> 28:39:59,191
this a little bit and we're going to hop
38616
28:39:57,119 --> 28:40:01,191
over back to the header file and look at
38617
28:39:59,191 --> 28:40:03,279
what we have we have a virtual method
38618
28:40:01,191 --> 28:40:05,039
which is going to return this count here
38619
28:40:03,279 --> 28:40:07,279
it is a const method because it's really
38620
28:40:05,039 --> 28:40:09,191
not going to modify it's just going to
38621
28:40:07,279 --> 28:40:10,872
return a copy of the count member
38622
28:40:10,872 --> 28:40:16,160
and this is a static member variable
38623
28:40:12,960 --> 28:40:18,872
notice that it is not in line so we will
38624
28:40:16,160 --> 28:40:21,512
need to define this in the cpp file
38625
28:40:18,872 --> 28:40:24,000
somewhere because this is a declaration
38626
28:40:21,512 --> 28:40:26,160
we need to put in a definition which is
38627
28:40:24,000 --> 28:40:28,639
what we have in our cpp file here
38628
28:40:26,160 --> 28:40:31,192
because we are doing thanks in the older
38629
28:40:28,639 --> 28:40:34,080
c plus plus way we are going to
38630
28:40:31,191 --> 28:40:36,720
increment our account member variable in
38631
28:40:34,080 --> 28:40:39,279
our constructor and this is going to
38632
28:40:36,720 --> 28:40:41,680
achieve the behavior we really want to
38633
28:40:39,279 --> 28:40:43,831
have the m count member variable which
38634
28:40:41,679 --> 28:40:46,479
is static incremented each time we'll
38635
28:40:43,831 --> 28:40:49,191
create a shape object here let's go back
38636
28:40:46,479 --> 28:40:51,759
and look at our destructor and make sure
38637
28:40:49,191 --> 28:40:53,599
that it is virtual because we have
38638
28:40:51,759 --> 28:40:55,911
virtual functions in this class and this
38639
28:40:53,600 --> 28:40:58,000
is the setup we have let's look at
38640
28:40:55,911 --> 28:41:00,479
ellipse and we're going to take out this
38641
28:40:58,000 --> 28:41:03,279
static member variable because
38642
28:41:00,479 --> 28:41:05,831
we don't want to set it up as of now we
38643
28:41:03,279 --> 28:41:07,759
will enable it in a minute let's make
38644
28:41:08,960 --> 28:41:13,760
let's remove this because i don't want
38645
28:41:10,872 --> 28:41:16,000
this and now we can try to create
38646
28:41:13,759 --> 28:41:19,039
objects of our classes and see how these
38647
28:41:16,000 --> 28:41:22,639
guys play out we can also go in ellipse
38648
28:41:19,039 --> 28:41:25,279
and make sure the constructor is taken
38649
28:41:22,639 --> 28:41:28,080
std string views where we are needing
38650
28:41:25,279 --> 28:41:31,360
strings you can do that and hop over to
38651
28:41:28,080 --> 28:41:33,191
the cpp file and do that std string view
38652
28:41:31,360 --> 28:41:35,360
i think this is going to make a visual
38653
28:41:35,360 --> 28:41:40,551
we can hop over to the main cpp file and
38654
28:41:37,831 --> 28:41:42,000
clean it up a little bit and we are
38655
28:41:42,000 --> 28:41:47,191
include ellipse and in our main function
38656
28:41:45,360 --> 28:41:49,279
we're going to create a bunch of objects
38657
28:41:47,191 --> 28:41:51,360
let's close the left sidebar here
38658
28:41:49,279 --> 28:41:53,279
because we don't really need that
38659
28:41:51,360 --> 28:41:54,800
anymore we're going to grab a shape
38660
28:41:53,279 --> 28:41:56,872
object and we're going to print the
38661
28:41:54,800 --> 28:41:59,192
shape count we expect to get a one
38662
28:41:56,872 --> 28:42:01,192
because we just have one shape at this
38663
28:41:59,191 --> 28:42:03,512
moment we're going to create a second
38664
28:42:01,191 --> 28:42:05,279
shape here and if we print the count
38665
28:42:03,512 --> 28:42:07,760
we're going to get two because we have
38666
28:42:05,279 --> 28:42:09,360
two shapes this is what we expect we
38667
28:42:07,759 --> 28:42:11,119
create another shape which is going to
38668
28:42:09,360 --> 28:42:12,800
be shape three here we print the count
38669
28:42:11,119 --> 28:42:14,720
we're going to get a three but the
38670
28:42:12,800 --> 28:42:17,040
problem is going to come when we create
38671
28:42:14,720 --> 28:42:18,720
an ellipse here if we create an ellipse
38672
28:42:17,039 --> 28:42:21,039
and print the count we're going to get a
38673
28:42:18,720 --> 28:42:23,831
four because we have four shapes in our
38674
28:42:21,039 --> 28:42:26,159
c plus plus program but if we print the
38675
28:42:23,831 --> 28:42:28,159
ellipse count here we expect to get a
38676
28:42:26,160 --> 28:42:30,800
one but that's not what we're going to
38677
28:42:28,160 --> 28:42:34,080
get we're going to get a 4 because the m
38678
28:42:30,800 --> 28:42:36,232
count variable in ellipse is inherited
38679
28:42:34,080 --> 28:42:38,400
from our shape class so it is going to
38680
28:42:36,232 --> 28:42:39,832
be the same thing we have in shape here
38681
28:42:38,399 --> 28:42:42,479
because if you go back you're going to
38682
28:42:39,831 --> 28:42:45,191
see that at this point ellipse doesn't
38683
28:42:42,479 --> 28:42:47,512
have a static variable m count of its
38684
28:42:45,191 --> 28:42:50,319
own so it's going to use the one it is
38685
28:42:47,512 --> 28:42:52,639
inheritance from the shape class this is
38686
28:42:50,320 --> 28:42:54,480
the behavior we're going to get here and
38687
28:42:52,639 --> 28:42:56,720
i want you to be aware of this if this
38688
28:42:54,479 --> 28:42:58,959
is what you want this is fine but in
38689
28:42:56,720 --> 28:43:01,512
most cases you will want this to be
38690
28:42:58,960 --> 28:43:04,000
different because you want very clear
38691
28:43:01,512 --> 28:43:05,440
information about how many objects of
38692
28:43:04,000 --> 28:43:08,160
each type you have created in your
38693
28:43:05,440 --> 28:43:10,160
z-plus plus program if it is just shaped
38694
28:43:08,160 --> 28:43:12,480
this is going to be really vague because
38695
28:43:10,160 --> 28:43:14,720
you want to know if it is an ellipse if
38696
28:43:12,479 --> 28:43:16,639
it is a rectangle if it is a triangle
38697
28:43:14,720 --> 28:43:18,160
this is not going to be super clear so
38698
28:43:16,639 --> 28:43:19,759
let's weld and really show you the
38699
28:43:18,160 --> 28:43:22,400
problem here we're going to pass this
38700
28:43:19,759 --> 28:43:24,319
through gcc our favorite compiler we can
38701
28:43:22,399 --> 28:43:26,231
also bring up the left sidebar no
38702
28:43:24,320 --> 28:43:28,720
problem here and we're going to bring up
38703
28:43:26,232 --> 28:43:30,080
a terminal window or a powershell window
38704
28:43:31,679 --> 28:43:36,319
and run rooster you're going to see that
38705
28:43:33,911 --> 28:43:37,119
the shape count is going to be one two
38706
28:43:39,512 --> 28:43:44,872
because we are also incrementing the m
38707
28:43:42,399 --> 28:43:47,279
count variable in our derived class so
38708
28:43:44,872 --> 28:43:50,000
we are incrementing twice if we create
38709
28:43:47,279 --> 28:43:52,720
an ellipse object let's show you this in
38710
28:43:50,000 --> 28:43:55,191
ellipse cpp we are incrementing the m
38711
28:43:52,720 --> 28:43:58,080
count member variable but in the base
38712
28:43:55,191 --> 28:44:00,959
class we are also implementing that in
38713
28:43:58,080 --> 28:44:03,360
the cpp file that's what we have here
38714
28:44:00,960 --> 28:44:06,400
and notice that the derived class is
38715
28:44:06,399 --> 28:44:10,639
through our initializer lust here so
38716
28:44:08,800 --> 28:44:13,360
this is the behavior we have we
38717
28:44:10,639 --> 28:44:15,759
shouldn't be incrementing this because
38718
28:44:13,360 --> 28:44:18,080
ellipse doesn't have its own static
38719
28:44:15,759 --> 28:44:20,799
variable as of now now we're going to
38720
28:44:18,080 --> 28:44:22,479
build and really solve this problem now
38721
28:44:20,800 --> 28:44:24,872
you see the kinds of problems you can
38722
28:44:22,479 --> 28:44:27,119
run into if you have a static variable
38723
28:44:24,872 --> 28:44:29,440
that is named exactly the same way and
38724
28:44:27,119 --> 28:44:31,679
you have an inheritance hierarchy
38725
28:44:29,440 --> 28:44:34,551
really weird problems can pop up and you
38726
28:44:31,679 --> 28:44:36,079
need to be aware of this let's build and
38727
28:44:34,551 --> 28:44:38,479
see that the problem actually
38728
28:44:36,080 --> 28:44:39,759
disappeared okay the bolt is good we can
38729
28:44:39,759 --> 28:44:43,911
and run rooster we're going to see that
38730
28:44:41,440 --> 28:44:46,000
now this is what we expect one two three
38731
28:44:43,911 --> 28:44:48,319
because we have three shapes created up
38732
28:44:46,000 --> 28:44:50,000
to this point here if we create an
38733
28:44:48,320 --> 28:44:51,600
ellipse that's going to be another shape
38734
28:44:50,000 --> 28:44:54,399
if we get the shape count we're going to
38735
28:44:51,600 --> 28:44:57,120
get a 4 but ellipse count is also giving
38736
28:44:54,399 --> 28:44:59,279
us a 4 because ellipse doesn't have its
38737
28:44:57,119 --> 28:45:01,279
own static variable to solve this
38738
28:44:59,279 --> 28:45:03,831
problem we can go to ellipse and set up
38739
28:45:01,279 --> 28:45:06,800
our own member variable at the ellipse
38740
28:45:03,831 --> 28:45:08,399
level so we can enable this and
38741
28:45:06,800 --> 28:45:10,232
uncomment it we're going to go to the
38742
28:45:10,232 --> 28:45:15,279
incrementing to get the correct count
38743
28:45:12,800 --> 28:45:17,192
incremented here i think this is all we
38744
28:45:15,279 --> 28:45:19,831
need to do we are also going to
38745
28:45:17,191 --> 28:45:22,080
initialize the static variable we have
38746
28:45:19,831 --> 28:45:24,959
at the ellipse level this is going to do
38747
28:45:22,080 --> 28:45:27,191
what we want and we can build again now
38748
28:45:24,960 --> 28:45:29,440
we're going to get the behavior we want
38749
28:45:27,191 --> 28:45:30,871
because at this point we are going to
38750
28:45:30,872 --> 28:45:35,360
for the ellipse count and this really
38751
28:45:32,960 --> 28:45:38,232
makes sense because we have one ellipse
38752
28:45:35,360 --> 28:45:40,720
even if we have four shapes in total so
38753
28:45:40,720 --> 28:45:46,160
makes more sense in our c plus plus
38754
28:45:43,911 --> 28:45:48,720
program here we are going to build this
38755
28:45:46,160 --> 28:45:51,040
again and pass this through gcc the
38756
28:45:48,720 --> 28:45:52,960
builder is going to be good we can clear
38757
28:45:51,039 --> 28:45:55,439
and run rooster now we're going to see
38758
28:45:52,960 --> 28:45:57,680
that we have four shapes and one ellipse
38759
28:45:55,440 --> 28:45:59,832
this is what we want now that we have
38760
28:45:57,679 --> 28:46:01,439
this we can really do all kinds of crazy
38761
28:45:59,831 --> 28:46:04,551
things hopefully you can see that the
38762
28:46:01,440 --> 28:46:06,551
static variable is working exactly as we
38763
28:46:04,551 --> 28:46:08,800
want we can print the ellipse count we
38764
28:46:06,551 --> 28:46:11,191
can print the shape count if that's what
38765
28:46:08,800 --> 28:46:12,832
we want in our c plus plus program but
38766
28:46:12,831 --> 28:46:18,319
polymorphism and get the correct get
38767
28:46:15,512 --> 28:46:20,872
count method called in our c plus first
38768
28:46:18,320 --> 28:46:23,120
program for example if we call the
38769
28:46:20,872 --> 28:46:25,440
getcount method on the basepointer that
38770
28:46:23,119 --> 28:46:27,512
is managing a shape we're going to get
38771
28:46:25,440 --> 28:46:29,279
this one called if we have a best
38772
28:46:27,512 --> 28:46:30,960
pointer that is managing an ellipse
38773
28:46:29,279 --> 28:46:33,191
we're going to get to this one called
38774
28:46:30,960 --> 28:46:35,512
this is going to be super cool let's go
38775
28:46:33,191 --> 28:46:37,759
up in our program and set this up we're
38776
28:46:35,512 --> 28:46:40,000
going to do this on the fly let's say
38777
28:46:37,759 --> 28:46:42,720
shape polymorphism and we're going to
38778
28:46:40,000 --> 28:46:45,039
say shift pointer and it is going to be
38779
28:46:42,720 --> 28:46:46,720
an array let's say shapes this is going
38780
28:46:45,039 --> 28:46:48,959
to do and it is going to be just an
38781
28:46:46,720 --> 28:46:51,360
array and we're going to initialize this
38782
28:46:48,960 --> 28:46:54,320
and store in a bunch of objects let's
38783
28:46:51,360 --> 28:46:56,232
put in a closing brace here let's go up
38784
28:46:54,320 --> 28:46:59,192
and see what we have for example we have
38785
28:46:56,232 --> 28:47:00,872
shape one and ellipse one we can use
38786
28:46:59,191 --> 28:47:02,720
these we're going to put in the address
38787
28:47:00,872 --> 28:47:04,639
of shape one and we're going to put in
38788
28:47:02,720 --> 28:47:05,680
the address of ellipse one this is going
38789
28:47:05,679 --> 28:47:09,599
and we can loop through these guys and
38790
28:47:07,512 --> 28:47:12,400
call the get count method so let's do
38791
28:47:09,600 --> 28:47:14,400
this we're going to say for auto s
38792
28:47:12,399 --> 28:47:17,360
and let's do a reference because we
38793
28:47:14,399 --> 28:47:19,511
don't want copies and we're going to say
38794
28:47:17,360 --> 28:47:21,911
in shapes and we're going to call the
38795
28:47:19,512 --> 28:47:24,639
gatecount method we're going to say s
38796
28:47:21,911 --> 28:47:26,479
and say getcount this is going to
38797
28:47:24,639 --> 28:47:29,191
give us the count and we can print this
38798
28:47:26,479 --> 28:47:31,279
out if we want we can say sddc out and
38799
28:47:31,279 --> 28:47:35,679
put a new line character here to
38800
28:47:37,279 --> 28:47:41,440
put a separator here we can copy what we
38801
28:47:39,440 --> 28:47:43,832
just used in our c plus plus program
38802
28:47:41,440 --> 28:47:46,320
here just to make sure this is super
38803
28:47:43,831 --> 28:47:47,911
clear when we print things on the
38804
28:47:46,320 --> 28:47:51,040
terminal here we're going to build our
38805
28:47:47,911 --> 28:47:52,959
program and see if it actually works the
38806
28:47:51,039 --> 28:47:55,439
body is going to be good we can clear
38807
28:47:52,960 --> 28:47:57,600
and run rooster we're going to see that
38808
28:47:55,440 --> 28:47:59,040
the count is going to be 4 for the first
38809
28:47:57,600 --> 28:48:01,760
iteration because we're going to be
38810
28:47:59,039 --> 28:48:04,959
calling the get count method from
38811
28:48:01,759 --> 28:48:06,231
shape because that's our base pointer so
38812
28:48:04,960 --> 28:48:08,400
this is what we're going to get we're
38813
28:48:06,232 --> 28:48:10,720
going to print the m count member
38814
28:48:08,399 --> 28:48:13,279
variable from the base class that's why
38815
28:48:10,720 --> 28:48:16,551
we have a four but on the second
38816
28:48:13,279 --> 28:48:18,551
iteration the object is ellipse and we
38817
28:48:16,551 --> 28:48:20,800
are using polymorphism because we are
38818
28:48:18,551 --> 28:48:23,119
going through a base pointer and this
38819
28:48:20,800 --> 28:48:25,760
base pointer happens to support the
38820
28:48:23,119 --> 28:48:28,551
virtual method get count we will get the
38821
28:48:25,759 --> 28:48:31,679
most specific one called on the current
38822
28:48:28,551 --> 28:48:33,599
object that our base pointer is managing
38823
28:48:31,679 --> 28:48:35,039
here and this happens to be an ellipse
38824
28:48:33,600 --> 28:48:37,832
so we're going to call the ellipse
38825
28:48:35,039 --> 28:48:40,000
version of our virtual function here and
38826
28:48:37,831 --> 28:48:42,551
we will get a one because we really have
38827
28:48:40,000 --> 28:48:44,800
one ellipse in our c plus plus program
38828
28:48:42,551 --> 28:48:47,039
this is what we see here this is really
38829
28:48:44,800 --> 28:48:48,400
all i wanted you to see in this lecture
38830
28:48:48,399 --> 28:48:53,191
static member variables with inheritance
38831
28:48:50,872 --> 28:48:55,279
and polymorphism and you need to be
38832
28:48:53,191 --> 28:48:57,831
aware of these little things that can
38833
28:48:55,279 --> 28:48:59,911
really be confusing especially for
38834
28:48:57,831 --> 28:49:01,679
beginners we are going to stop here in
38835
28:48:59,911 --> 28:49:04,639
this lecture the next one we're going to
38836
28:49:01,679 --> 28:49:07,831
learn about the final specification we
38837
28:49:04,639 --> 28:49:09,911
can use in our inheritance hierarchy go
38838
28:49:07,831 --> 28:49:11,119
ahead and finish up here and meet me
38839
28:49:11,119 --> 28:49:14,959
go ahead and finish up here and meet me
38840
28:49:13,279 --> 28:49:18,959
there in this lecture we're going to
38841
28:49:14,960 --> 28:49:21,512
learn about the final specifier used in
38842
28:49:18,960 --> 28:49:24,480
inheritance hierarchies this is going to
38843
28:49:21,512 --> 28:49:26,800
allow you to do one of two things you
38844
28:49:24,479 --> 28:49:30,000
will either be able to restrict how you
38845
28:49:26,800 --> 28:49:32,720
override methods in the derived classes
38846
28:49:30,000 --> 28:49:35,512
or you can restrict how you can derive
38847
28:49:32,720 --> 28:49:37,040
from base classes i know this is in the
38848
28:49:35,512 --> 28:49:39,040
air but we're going to look at a few
38849
28:49:37,039 --> 28:49:41,511
examples to really drive this home
38850
28:49:39,039 --> 28:49:43,439
suppose we have an inheritance hierarchy
38851
28:49:41,512 --> 28:49:45,760
like we see here the top class is animal
38852
28:49:43,440 --> 28:49:47,760
we can derive from this and have feline
38853
28:49:45,759 --> 28:49:50,080
you can have bird as a derived class
38854
28:49:47,759 --> 28:49:52,720
feline can be inherited to have a dog
38855
28:49:50,080 --> 28:49:55,119
and cat and you can derive from cat for
38856
28:49:52,720 --> 28:49:57,191
example to have wild cat and bulldog
38857
28:49:55,119 --> 28:49:59,512
from dog you can do all these things
38858
28:49:57,191 --> 28:50:01,512
here and this is inheritance hierarchy
38859
28:49:59,512 --> 28:50:04,080
we're going to be using to learn about
38860
28:50:01,512 --> 28:50:06,000
these things now here is a possible
38861
28:50:04,080 --> 28:50:08,320
implementation for the dog class which
38862
28:50:06,000 --> 28:50:11,039
is going to be inherited from feline
38863
28:50:08,320 --> 28:50:13,680
publicly as we see here but take a look
38864
28:50:11,039 --> 28:50:17,360
at the run method we are setting up in
38865
28:50:13,679 --> 28:50:20,319
dag we are appending a final specifier
38866
28:50:17,360 --> 28:50:23,831
and what this is going to mean is that
38867
28:50:20,320 --> 28:50:26,080
no downstream inheritance class will be
38868
28:50:23,831 --> 28:50:28,231
able to override the random method
38869
28:50:26,080 --> 28:50:30,960
further this is what we can achieve so
38870
28:50:28,232 --> 28:50:32,720
if we don't want our derived classes to
38871
28:50:32,720 --> 28:50:37,512
virtual method we can mark that method
38872
28:50:35,512 --> 28:50:40,000
as final in our class and we are
38873
28:50:37,512 --> 28:50:42,720
basically saying i am going to put in my
38874
28:50:40,000 --> 28:50:46,399
implementation but i don't want any
38875
28:50:42,720 --> 28:50:48,720
deriving downstream class to override
38876
28:50:46,399 --> 28:50:50,399
this method further if they do that they
38877
28:50:48,720 --> 28:50:52,720
are going to get a compiler error and
38878
28:50:50,399 --> 28:50:55,759
this is something we can achieve using
38879
28:50:52,720 --> 28:50:57,911
the final specifier in our inheritance
38880
28:50:55,759 --> 28:51:00,479
hierarchy again in this case we are
38881
28:51:00,479 --> 28:51:06,959
how people can override our own virtual
38882
28:51:04,000 --> 28:51:08,800
method in downstream classes or i
38883
28:51:06,960 --> 28:51:11,440
shouldn't really say our own method
38884
28:51:08,800 --> 28:51:13,832
because it may be coming from upstream
38885
28:51:11,440 --> 28:51:16,551
but you are restricting people from
38886
28:51:13,831 --> 28:51:18,871
overriding that method further in
38887
28:51:16,551 --> 28:51:21,512
downstream classes here okay so this is
38888
28:51:18,872 --> 28:51:24,232
the first use we have for the final
38889
28:51:21,512 --> 28:51:27,760
specifier but we can also restrict
38890
28:51:24,232 --> 28:51:29,600
people from inheriting altogether so
38891
28:51:27,759 --> 28:51:32,159
here we have a simple example to drive
38892
28:51:29,600 --> 28:51:34,552
this home we have our cat class it is
38893
28:51:32,160 --> 28:51:37,760
going to be inheriting from feline but
38894
28:51:34,551 --> 28:51:40,080
we are marking our cat class as final
38895
28:51:37,759 --> 28:51:43,360
and what this is going to mean if
38896
28:51:40,080 --> 28:51:45,831
anybody tries to inherit or derive from
38897
28:51:43,360 --> 28:51:47,512
cat in any way they are going to get a
38898
28:51:45,831 --> 28:51:50,720
compiler error and this is what we can
38899
28:51:47,512 --> 28:51:52,479
achieve with the final specifier again
38900
28:51:50,720 --> 28:51:55,279
there are two things you can restrict
38901
28:51:52,479 --> 28:51:58,000
how people override your virtual methods
38902
28:51:55,279 --> 28:52:00,800
if you want to restrict that from the
38903
28:51:58,000 --> 28:52:03,279
current class you can mark your virtual
38904
28:52:00,800 --> 28:52:05,600
method as final you can also restrict
38905
28:52:03,279 --> 28:52:07,831
how people inherit all together from
38906
28:52:05,600 --> 28:52:11,040
your class and if you want that behavior
38907
28:52:07,831 --> 28:52:13,119
you can mark your class as final using
38908
28:52:11,039 --> 28:52:15,439
the syntax we just saw in the slides
38909
28:52:13,119 --> 28:52:17,679
here okay now that you know these things
38910
28:52:15,440 --> 28:52:20,160
let's look at a few things that may be
38911
28:52:17,679 --> 28:52:22,159
interesting for example here is a simple
38912
28:52:20,160 --> 28:52:25,440
fact that you can create a class right
38913
28:52:22,160 --> 28:52:28,480
away in market as final and when you do
38914
28:52:25,440 --> 28:52:30,800
this nobody will be able to ever inherit
38915
28:52:28,479 --> 28:52:33,119
from this class in your program and if
38916
28:52:30,800 --> 28:52:35,600
we do this we will get a compiler error
38917
28:52:33,119 --> 28:52:37,911
for example this is one thing i find
38918
28:52:35,600 --> 28:52:40,000
interesting and i really wanted you to
38919
28:52:37,911 --> 28:52:42,399
know this another thing is that it is
38920
28:52:40,000 --> 28:52:45,360
possible to introduce useless virtual
38921
28:52:42,399 --> 28:52:48,079
methods in your inheritance hierarchy
38922
28:52:45,360 --> 28:52:50,960
for example if our cat class is marked
38923
28:52:48,080 --> 28:52:53,512
as final what this means is that nobody
38924
28:52:50,960 --> 28:52:55,600
will ever be able to inherit from this
38925
28:52:53,512 --> 28:52:57,680
class but we are going further in
38926
28:52:55,600 --> 28:53:00,400
setting up a virtual method which is
38927
28:52:57,679 --> 28:53:02,719
meant to be inherited or overwritten in
38928
28:53:00,399 --> 28:53:05,039
downstream classes but how do we get a
38929
28:53:02,720 --> 28:53:07,119
downstream class if we can't inherit
38930
28:53:05,039 --> 28:53:10,319
from the cat class which is marked final
38931
28:53:07,119 --> 28:53:12,319
so so we have conflicting ideas here on
38932
28:53:10,320 --> 28:53:15,192
one hand we are saying we can never
38933
28:53:12,320 --> 28:53:17,280
inherit from this grant class but on the
38934
28:53:15,191 --> 28:53:20,231
other hand we are setting up a method
38935
28:53:17,279 --> 28:53:22,639
that is meant to be used or specialized
38936
28:53:20,232 --> 28:53:24,720
in derived classes so this is something
38937
28:53:22,639 --> 28:53:27,759
that is interesting this code is going
38938
28:53:24,720 --> 28:53:29,680
to compile and i think maybe in future
38939
28:53:27,759 --> 28:53:31,911
standards of c plus plus they are going
38940
28:53:29,679 --> 28:53:33,511
to fix this problem and maybe give you a
38941
28:53:31,911 --> 28:53:35,440
compiler error if you try to do
38942
28:53:33,512 --> 28:53:37,279
something like this but at this point
38943
28:53:35,440 --> 28:53:39,040
you're not going to get a compiler error
38944
28:53:37,279 --> 28:53:41,679
this is just going to be valid c plus
38945
28:53:39,039 --> 28:53:44,319
plus syntax even if this is really weird
38946
28:53:41,679 --> 28:53:47,039
we have conflicting ideas here okay one
38947
28:53:44,320 --> 28:53:49,192
thing you should know though is that we
38948
28:53:47,039 --> 28:53:50,719
can override in a final class and this
38949
28:53:49,191 --> 28:53:53,440
is going to make sense because for
38950
28:53:50,720 --> 28:53:55,191
example the run method is coming from
38951
28:53:55,191 --> 28:54:00,479
and here we are just specializing that
38952
28:53:57,759 --> 28:54:03,039
so we are marking that as an override
38953
28:54:00,479 --> 28:54:05,512
here even if this is the final class so
38954
28:54:03,039 --> 28:54:07,679
be careful this is valid c plus plus
38955
28:54:05,512 --> 28:54:09,512
syntax this is going to work just fine
38956
28:54:07,679 --> 28:54:11,911
another thing you can do which is pretty
38957
28:54:09,512 --> 28:54:14,720
useless in your c plus plus program is
38958
28:54:11,911 --> 28:54:18,872
to introduce a virtual method and mark
38959
28:54:14,720 --> 28:54:21,911
it as final right away so again this is
38960
28:54:18,872 --> 28:54:24,551
really weird we have two ideas that are
38961
28:54:21,911 --> 28:54:27,039
conflicting the virtual keyword means
38962
28:54:24,551 --> 28:54:29,679
that we want this to be visualized in
38963
28:54:27,039 --> 28:54:32,399
the downstream classes but again we are
38964
28:54:29,679 --> 28:54:34,639
saying this method is final so no
38965
28:54:32,399 --> 28:54:36,079
downstream class will override this if
38966
28:54:34,639 --> 28:54:38,319
they try to do that they are going to
38967
28:54:36,080 --> 28:54:40,960
get a compiler error so this is again a
38968
28:54:38,320 --> 28:54:42,640
bunch of conflicting ideas c plus plus
38969
28:54:40,960 --> 28:54:44,552
is going to allow this syntax this is
38970
28:54:42,639 --> 28:54:46,720
not going to give you a compiler error
38971
28:54:44,551 --> 28:54:48,720
but this is weird and you need to be
38972
28:54:46,720 --> 28:54:50,479
aware of this okay now that you know
38973
28:54:48,720 --> 28:54:53,191
these ideas we're going to head over to
38974
28:54:50,479 --> 28:54:55,831
visual studio code and play with the
38975
28:54:53,191 --> 28:54:57,911
final specifier in our inheritance
38976
28:54:55,831 --> 28:55:00,319
hierarchy we will be setting up this
38977
28:54:57,911 --> 28:55:02,399
kind of inheritance hierarchy and we
38978
28:55:00,320 --> 28:55:04,960
will set up a bunch of virtual methods
38979
28:55:02,399 --> 28:55:07,511
and mark them as final i think we will
38980
28:55:04,960 --> 28:55:10,160
do that in the dog class and we will
38981
28:55:07,512 --> 28:55:12,551
mark a bunch of classes as final and see
38982
28:55:10,160 --> 28:55:14,720
that if we inherit from them we're going
38983
28:55:12,551 --> 28:55:17,759
to get a bunch of compiler errors so
38984
28:55:14,720 --> 28:55:21,119
let's do this here we are in our working
38985
28:55:17,759 --> 28:55:23,360
folder the current project is final and
38986
28:55:21,119 --> 28:55:24,871
we are going to bring in our template
38987
28:55:23,360 --> 28:55:27,440
files pretty quick we're going to use
38988
28:55:24,872 --> 28:55:29,600
this as our starting point we're going
38989
28:55:29,600 --> 28:55:34,000
and i am going to put in a bunch of
38990
28:55:31,600 --> 28:55:36,400
classes i have lying around on my system
38991
28:55:34,000 --> 28:55:38,320
because i don't want to set up these
38992
28:55:36,399 --> 28:55:40,799
classes that would be a waste of your
38993
28:55:38,320 --> 28:55:43,280
time just know that we are trying to set
38994
28:55:40,800 --> 28:55:45,760
up this kind of inheritance hierarchy
38995
28:55:43,279 --> 28:55:47,600
animal is going to be our top dog or
38996
28:55:45,759 --> 28:55:50,231
animal is going to be our top class and
38997
28:55:47,600 --> 28:55:52,480
we will be inheriting from this creating
38998
28:55:50,232 --> 28:55:55,040
an inheritance hierarchy we can play
38999
28:55:52,479 --> 28:55:57,279
with in our code here okay so we are
39000
28:55:55,039 --> 28:55:59,191
going to open this up in visual studio
39001
28:55:57,279 --> 28:56:01,600
code so let's do that by dragging and
39002
28:55:59,191 --> 28:56:04,080
dropping here this is going to give us
39003
28:56:01,600 --> 28:56:06,400
all these crazy classes we have
39004
28:56:04,080 --> 28:56:08,400
the top class is going to be animal and
39005
28:56:06,399 --> 28:56:10,159
it is going to be defining the features
39006
28:56:08,399 --> 28:56:12,231
any kind of animal we support you know c
39007
28:56:10,160 --> 28:56:14,720
plus plus program is going to have for
39008
28:56:12,232 --> 28:56:17,832
example any kind of animal will need to
39009
28:56:14,720 --> 28:56:19,191
breathe and we will set up this virtual
39010
28:56:19,191 --> 28:56:24,000
and we will be inheriting from this
39011
28:56:21,279 --> 28:56:26,232
animal class to create a feline class
39012
28:56:24,000 --> 28:56:28,399
and a bird class this is something we
39013
28:56:26,232 --> 28:56:30,160
did in a few previous lectures and we
39014
28:56:28,399 --> 28:56:32,159
are just reusing this inheritance
39015
28:56:30,160 --> 28:56:34,000
hierarchy here let's look at the feline
39016
28:56:32,160 --> 28:56:36,720
class the filament class is going to set
39017
28:56:34,000 --> 28:56:39,039
up a virtual method which is called run
39018
28:56:36,720 --> 28:56:41,119
and the method is going to be overridden
39019
28:56:41,119 --> 28:56:47,360
we can override the run method but
39020
28:56:43,759 --> 28:56:50,231
notice that we are marking that as final
39021
28:56:47,360 --> 28:56:52,479
okay so look at this the method is final
39022
28:56:50,232 --> 28:56:55,360
and what this means is that
39023
28:56:52,479 --> 28:56:58,551
no downstream classes inheriting from
39024
28:56:55,360 --> 28:57:01,279
doug will ever be able to specialize or
39025
28:56:58,551 --> 28:57:03,279
override this method further if they try
39026
28:57:01,279 --> 28:57:05,911
to do that they will get a compiler
39027
28:57:03,279 --> 28:57:08,000
error notice that this may be our method
39028
28:57:05,911 --> 28:57:10,479
or it may be a method coming from
39029
28:57:08,000 --> 28:57:13,039
upstream classes in this case the run
39030
28:57:10,479 --> 28:57:16,231
method was introduced at the feline
39031
28:57:13,039 --> 28:57:18,959
level you see it was introduced here and
39032
28:57:16,232 --> 28:57:21,040
doug happens to be overriding this
39033
28:57:18,960 --> 28:57:23,280
method here that's why we have the
39034
28:57:23,279 --> 28:57:26,639
at the same time we are going to mark it
39035
28:57:29,191 --> 28:57:35,360
downstream classes from overriding this
39036
28:57:31,911 --> 28:57:37,911
method further if we look at our bulldog
39037
28:57:35,360 --> 28:57:42,160
class we're going to find the class to
39038
28:57:37,911 --> 28:57:44,479
inherit from dark we have our run method
39039
28:57:42,160 --> 28:57:46,400
here it is commented out at this moment
39040
28:57:44,479 --> 28:57:48,872
i just want you to see that our code is
39041
28:57:46,399 --> 28:57:50,000
just going to compile if we compile it
39042
28:57:50,000 --> 28:57:54,000
let's do this we're going to pass this
39043
28:57:51,512 --> 28:57:56,232
through gcc okay you see the bolt is
39044
28:57:54,000 --> 28:57:57,759
good and we have generated our binary
39045
28:57:56,232 --> 28:58:00,232
which is really not doing anything
39046
28:57:57,759 --> 28:58:02,639
because our main function is just some
39047
28:58:00,232 --> 28:58:05,040
dummy code we have here to make sure it
39048
28:58:02,639 --> 28:58:06,399
works with c plus plus 20 but what i
39049
28:58:06,399 --> 28:58:12,639
is that if you go in bulldog let's go in
39050
28:58:09,440 --> 28:58:15,512
our bulldog class and uncomment
39051
28:58:12,639 --> 28:58:16,639
this class here or this virtual method
39052
28:58:15,512 --> 28:58:18,320
we're going to see that we're going to
39053
28:58:16,639 --> 28:58:21,119
get a compiler error we have a squiggly
39054
28:58:18,320 --> 28:58:23,760
line meaning that we did something wrong
39055
28:58:21,119 --> 28:58:26,159
and well let's look at the problems tab
39056
28:58:23,759 --> 28:58:29,119
from visual studio code here cannot
39057
28:58:26,160 --> 28:58:31,120
override find a function dog run this is
39058
28:58:31,119 --> 28:58:36,080
the dog class if we try to override it
39059
28:58:33,831 --> 28:58:38,399
further we will get a compiler error
39060
28:58:36,080 --> 28:58:41,911
this is something we can achieve by
39061
28:58:38,399 --> 28:58:44,551
marking our virtual method as final as
39062
28:58:41,911 --> 28:58:46,000
we are doing here now if we try to build
39063
28:58:44,551 --> 28:58:48,231
this program we're going to get a
39064
28:58:46,000 --> 28:58:51,600
compiler error let's pass this through
39065
28:58:48,232 --> 28:58:54,872
gcc and let you see this okay you see we
39066
28:58:51,600 --> 28:58:57,912
get a compiler error and uh the error is
39067
28:58:54,872 --> 28:59:02,479
that we are overriding let's go up and
39068
28:58:57,911 --> 28:59:05,279
see the error here error and on line 12
39069
28:59:02,479 --> 28:59:08,319
in bulldog h we see that we are
39070
28:59:05,279 --> 28:59:11,600
overriding a final method virtual
39071
28:59:08,320 --> 28:59:14,000
void bulldog is a final function and we
39072
28:59:11,600 --> 28:59:15,680
are overriding this and this is going to
39073
28:59:14,000 --> 28:59:17,679
give us a compiler error this is the
39074
28:59:15,679 --> 28:59:19,911
behavior we get so the message here is
39075
28:59:17,679 --> 28:59:22,319
that you can go in your inheritance
39076
28:59:19,911 --> 28:59:25,360
hierarchy at any level and mark a
39077
28:59:22,320 --> 28:59:27,440
virtual method as final and prevent
39078
28:59:25,360 --> 28:59:30,232
download stream classes from
39079
28:59:27,440 --> 28:59:32,400
specializing or overriding that method
39080
28:59:30,232 --> 28:59:34,480
further and if they do that they will
39081
28:59:32,399 --> 28:59:36,079
get a compiler error this is something
39082
28:59:34,479 --> 28:59:38,080
we can achieve in our c plus plus
39083
28:59:36,080 --> 28:59:40,720
program another thing you can do with
39084
28:59:38,080 --> 28:59:43,680
the final specifier is that you can
39085
28:59:40,720 --> 28:59:47,119
prevent people from inheriting from your
39086
28:59:43,679 --> 28:59:49,039
class altogether let's go to our cat
39087
28:59:47,119 --> 28:59:52,000
class i think that's the example that
39088
28:59:49,039 --> 28:59:54,551
sets that up we have a cat class it is
39089
28:59:52,000 --> 28:59:57,279
going to be inheriting from feline but
39090
28:59:54,551 --> 28:59:59,512
the class is marked as final
39091
28:59:57,279 --> 29:00:01,600
now what this is going to do
39092
28:59:59,512 --> 29:00:04,160
it's going to throw a compiler error
39093
29:00:01,600 --> 29:00:06,232
anytime somebody tries to derive or
39094
29:00:04,160 --> 29:00:09,040
inherit from this class here so if
39095
29:00:06,232 --> 29:00:11,832
somebody tries to inherit from cat as we
39096
29:00:09,039 --> 29:00:13,679
are doing here create a wildcat from a
39097
29:00:11,831 --> 29:00:16,159
cat we are going to get a compiler error
39098
29:00:13,679 --> 29:00:18,639
because we can't inherit from cat
39099
29:00:16,160 --> 29:00:22,160
altogether it is a final class at this
39100
29:00:18,639 --> 29:00:24,639
moment okay so let's look at our wildcat
39101
29:00:25,831 --> 29:00:31,439
derive from cat we can do something like
39102
29:00:29,191 --> 29:00:33,279
this we can remove our comments here and
39103
29:00:31,440 --> 29:00:35,191
if we try to do this we will get a
39104
29:00:33,279 --> 29:00:37,440
compiler arrow let's look at the cpp
39105
29:00:35,191 --> 29:00:39,911
file and see what we have it has nothing
39106
29:00:37,440 --> 29:00:42,800
special but if we try to do that and
39107
29:00:39,911 --> 29:00:45,360
inherit from cat we will get a compiler
39108
29:00:42,800 --> 29:00:47,680
error because the cat class is final and
39109
29:00:45,360 --> 29:00:49,440
you cannot derive from it if you do that
39110
29:00:47,679 --> 29:00:52,000
you will get a compiler error because
39111
29:00:49,440 --> 29:00:54,320
the cat class is final this is what i
39112
29:00:52,000 --> 29:00:55,831
want you to see here let's try and build
39113
29:00:54,320 --> 29:00:58,320
our program again we're going to pass
39114
29:00:55,831 --> 29:01:00,551
this through gcc and we will see our
39115
29:00:58,320 --> 29:01:03,120
compiler error okay the world is
39116
29:01:00,551 --> 29:01:06,399
finished with errors if we go up we will
39117
29:01:03,119 --> 29:01:08,639
see that we cannot derive from a final
39118
29:01:06,399 --> 29:01:10,551
base class if we do that we will get a
39119
29:01:08,639 --> 29:01:12,551
compiler error and this is what i want
39120
29:01:10,551 --> 29:01:14,720
you to see here okay now that we notice
39121
29:01:12,551 --> 29:01:17,279
we're going to take this back
39122
29:01:14,720 --> 29:01:19,360
and take out the compiler error here
39123
29:01:17,279 --> 29:01:21,512
because we want our code to compile
39124
29:01:19,360 --> 29:01:23,831
we're going to make sure it is compiling
39125
29:01:21,512 --> 29:01:25,832
fine okay now the code is compiling
39126
29:01:23,831 --> 29:01:29,279
because we are no longer trying to
39127
29:01:25,831 --> 29:01:32,319
inherit from cat and i want you to now
39128
29:01:29,279 --> 29:01:35,119
see a few interesting facts about the
39129
29:01:32,320 --> 29:01:37,512
final specifier when it works together
39130
29:01:35,119 --> 29:01:40,000
with virtual functions let's go to the
39131
29:01:37,512 --> 29:01:42,232
main cpp file and show you the first
39132
29:01:40,000 --> 29:01:45,360
fact and that's that you can create a
39133
29:01:42,232 --> 29:01:48,160
class right away and mark that as vinyl
39134
29:01:45,360 --> 29:01:50,320
as you create it as we do here if you do
39135
29:01:48,160 --> 29:01:52,800
that this class is going to not be
39136
29:01:50,320 --> 29:01:54,640
inheritable and if you try to inherit
39137
29:01:52,800 --> 29:01:56,872
from it you will get a compiler error
39138
29:01:54,639 --> 29:01:59,279
let's take out everything we have here
39139
29:01:56,872 --> 29:02:00,960
and just say hello in our main function
39140
29:01:59,279 --> 29:02:02,551
this is going to do just to have
39141
29:02:00,960 --> 29:02:04,720
something this is going to give us a
39142
29:02:02,551 --> 29:02:07,119
compiler error because we can't inherit
39143
29:02:04,720 --> 29:02:09,831
from a final class let's build and show
39144
29:02:07,119 --> 29:02:12,159
you the compiler error this is going to
39145
29:02:09,831 --> 29:02:14,959
go through gcc and the world is going to
39146
29:02:12,160 --> 29:02:18,160
finish with errors and that we have our
39147
29:02:14,960 --> 29:02:21,280
message here and we don't have the error
39148
29:02:18,160 --> 29:02:23,040
we expected because we forgot to put our
39149
29:02:21,279 --> 29:02:25,360
closing semicolon on our class
39150
29:02:23,039 --> 29:02:28,000
definition here but we can build again
39151
29:02:25,360 --> 29:02:29,911
and get our error okay the world is
39152
29:02:29,911 --> 29:02:34,319
and the error is going to be that we
39153
29:02:32,080 --> 29:02:36,551
cannot derive from a final class this is
39154
29:02:34,320 --> 29:02:38,800
what we expect here let's comment this
39155
29:02:36,551 --> 29:02:41,599
out because i just wanted you to see
39156
29:02:38,800 --> 29:02:44,000
this fact another interesting thing c
39157
29:02:44,000 --> 29:02:50,080
is to set up a new virtual method in a
39158
29:02:47,759 --> 29:02:52,720
final class let's first build and make
39159
29:02:50,080 --> 29:02:54,720
sure the compiler error here goes away
39160
29:02:52,720 --> 29:02:57,119
and i am going to show you that okay the
39161
29:02:54,720 --> 29:02:59,360
build is good let's go back in our final
39162
29:02:57,119 --> 29:03:02,159
class which is the cat class
39163
29:02:59,360 --> 29:03:04,800
if i remember correctly this is a final
39164
29:03:02,160 --> 29:03:06,960
class we can't derive from this class
39165
29:03:04,800 --> 29:03:07,911
but we can set up a virtual method for
39166
29:03:07,911 --> 29:03:12,000
the virtual method here called meow is
39167
29:03:12,000 --> 29:03:16,479
why is it useless it is a virtual and
39168
29:03:14,479 --> 29:03:19,039
marking it virtual means that
39169
29:03:16,479 --> 29:03:21,512
you at least want people inheriting from
39170
29:03:19,039 --> 29:03:23,360
this class to inherit it and use it or
39171
29:03:21,512 --> 29:03:25,512
even better you want them to have the
39172
29:03:25,512 --> 29:03:30,720
or override this method and make it to
39173
29:03:27,911 --> 29:03:32,720
do more specialized things but you can't
39174
29:03:30,720 --> 29:03:35,040
really do that because you can't derive
39175
29:03:32,720 --> 29:03:37,279
from this class all together so this is
39176
29:03:35,039 --> 29:03:39,599
something that c plus plus allows us to
39177
29:03:37,279 --> 29:03:42,319
do but this is a useless method which
39178
29:03:39,600 --> 29:03:43,912
will never be used in any way so this is
39179
29:03:42,320 --> 29:03:45,760
something i want you to be aware of but
39180
29:03:43,911 --> 29:03:47,831
this is going to compile again let's
39181
29:03:45,759 --> 29:03:49,439
pass this through gcc you're going to
39182
29:03:47,831 --> 29:03:51,279
see that this is going to compile and
39183
29:03:49,440 --> 29:03:53,440
work even if this method is really
39184
29:03:51,279 --> 29:03:55,360
useless i want you to be aware of this
39185
29:03:53,440 --> 29:03:58,800
okay so the build is good here okay so
39186
29:03:55,360 --> 29:04:01,831
this is our interesting fact number two
39187
29:03:58,800 --> 29:04:05,360
okay even if this method is useless
39188
29:04:01,831 --> 29:04:07,831
it is possible to specialize a method
39189
29:04:05,360 --> 29:04:10,639
coming from upstream classes from your
39190
29:04:07,831 --> 29:04:11,759
final class for example in feline we
39191
29:04:11,759 --> 29:04:17,360
a method called run which was introduced
39192
29:04:14,720 --> 29:04:19,759
there i think we can override this
39193
29:04:17,360 --> 29:04:21,831
method in our final class which is the
39194
29:04:19,759 --> 29:04:24,039
cat class here so this method is going
39195
29:04:21,831 --> 29:04:26,479
to be useless because it will be
39196
29:04:24,039 --> 29:04:28,871
specializing what we get from our
39197
29:04:26,479 --> 29:04:31,279
upstream class this is going to work
39198
29:04:28,872 --> 29:04:33,440
okay so since we are looking at a few
39199
29:04:31,279 --> 29:04:35,191
useless things you can do with final
39200
29:04:35,191 --> 29:04:40,399
virtual mechanisms in c plus plus i want
39201
29:04:38,232 --> 29:04:44,080
you to see that it is possible to set up
39202
29:04:40,399 --> 29:04:46,231
a virtual method and mark it as a final
39203
29:04:44,080 --> 29:04:48,160
in the same declaration and we're going
39204
29:04:46,232 --> 29:04:49,911
to go to the bird class and really show
39205
29:04:49,911 --> 29:04:55,831
we have a virtual method which is called
39206
29:04:52,551 --> 29:04:57,512
fly but this is marked final the moment
39207
29:04:55,831 --> 29:04:59,831
we declare it and this is going to be
39208
29:04:57,512 --> 29:05:02,400
contradicted for example the virtual
39209
29:04:59,831 --> 29:05:04,399
keyword means that people downstream
39210
29:05:02,399 --> 29:05:07,511
will be able to specialize this or
39211
29:05:04,399 --> 29:05:09,679
inherit this but at the same time we are
39212
29:05:07,512 --> 29:05:12,720
marking this guy as final so we are
39213
29:05:09,679 --> 29:05:14,871
saying nobody downstream will be able to
39214
29:05:12,720 --> 29:05:17,600
override this method if they do that
39215
29:05:14,872 --> 29:05:19,832
they will get a compiler error now which
39216
29:05:17,600 --> 29:05:21,832
one is going to win virtual or final
39217
29:05:19,831 --> 29:05:24,159
final is going to win because if you try
39218
29:05:21,831 --> 29:05:26,399
to override this method in downstream
39219
29:05:24,160 --> 29:05:29,440
classes you will get a compiler error
39220
29:05:26,399 --> 29:05:31,911
let's go down and look at one bird we
39221
29:05:29,440 --> 29:05:34,000
might have in our program for example we
39222
29:05:31,911 --> 29:05:35,679
might have a pigeon let's grab this
39223
29:05:34,000 --> 29:05:37,119
method and try to override it you're
39224
29:05:35,679 --> 29:05:39,439
going to see that we get a compiler
39225
29:05:37,119 --> 29:05:41,911
error we're going to go in pidgin and
39226
29:05:39,440 --> 29:05:44,160
put in the fly method and uh for example
39227
29:05:41,911 --> 29:05:46,080
we're going to say pigeon fly here and
39228
29:05:44,160 --> 29:05:48,080
we're going to say override we are
39229
29:05:46,080 --> 29:05:49,680
trying to override this method but we're
39230
29:05:48,080 --> 29:05:51,512
going to get a compiler error you see we
39231
29:05:49,679 --> 29:05:53,911
have a squiggly line because this is a
39232
29:05:51,512 --> 29:05:57,119
final method and we are trying to
39233
29:05:53,911 --> 29:06:00,080
override this in a downstream class
39234
29:05:57,119 --> 29:06:03,360
and this class is a downstream class
39235
29:06:00,080 --> 29:06:05,440
from bird and in bird we map this method
39236
29:06:03,360 --> 29:06:07,440
as final so this is not going to work
39237
29:06:05,440 --> 29:06:10,232
even if this is virtual you want to be
39238
29:06:07,440 --> 29:06:12,551
able to really use the virtual mechanism
39239
29:06:10,232 --> 29:06:15,192
because this is final if we try to
39240
29:06:12,551 --> 29:06:17,360
inherit from this if we try to override
39241
29:06:15,191 --> 29:06:19,512
this like we are doing in pigeon here we
39242
29:06:17,360 --> 29:06:21,600
will get the compiler error let's try
39243
29:06:19,512 --> 29:06:24,160
and build our program and we will see
39244
29:06:21,600 --> 29:06:25,760
that we get our trusty compiler error
39245
29:06:24,160 --> 29:06:28,400
the bullet is going to finish with
39246
29:06:25,759 --> 29:06:30,959
errors and if we go up we're going to
39247
29:06:28,399 --> 29:06:33,911
find our error we're going to say
39248
29:06:30,960 --> 29:06:36,800
virtual function fly overriding final
39249
29:06:33,911 --> 29:06:39,039
function we are overriding a final
39250
29:06:36,800 --> 29:06:40,960
virtual method and this is going to give
39251
29:06:39,039 --> 29:06:42,799
us a compiler error we can't do this
39252
29:06:40,960 --> 29:06:44,800
this is something you can do in your c
39253
29:06:42,800 --> 29:06:47,512
plus plus program so this is really
39254
29:06:44,800 --> 29:06:49,512
confusing because in bird the virtual
39255
29:06:47,512 --> 29:06:52,000
keyword suggests that you can really
39256
29:06:49,512 --> 29:06:54,320
specialize this in downstream class but
39257
29:06:52,000 --> 29:06:55,911
this is contradictant and c plus plus
39258
29:06:54,320 --> 29:06:58,000
allows you to do this you need to be
39259
29:06:55,911 --> 29:07:00,080
aware of this again if we don't override
39260
29:06:58,000 --> 29:07:02,960
this and leave this in the code is going
39261
29:07:00,080 --> 29:07:05,119
to compile but in my opinion this is
39262
29:07:02,960 --> 29:07:06,720
really confusing and you need to be
39263
29:07:05,119 --> 29:07:08,399
aware of this that's the whole point of
39264
29:07:06,720 --> 29:07:10,800
this lecture here let's make sure the
39265
29:07:08,399 --> 29:07:13,119
code is building and this is really all
39266
29:07:10,800 --> 29:07:15,360
i had to share in this lecture
39267
29:07:13,119 --> 29:07:17,831
introducing the final keyword to you you
39268
29:07:15,360 --> 29:07:20,872
can use it to restrict how people
39269
29:07:17,831 --> 29:07:22,959
override your virtual function or you
39270
29:07:22,960 --> 29:07:28,080
people from inheriting from your class
39271
29:07:25,440 --> 29:07:30,551
altogether and use these things if they
39272
29:07:28,080 --> 29:07:33,440
make sense for whatever application you
39273
29:07:30,551 --> 29:07:35,279
are designing with c plus plus we are
39274
29:07:33,440 --> 29:07:37,191
going to stop here in this lecture and
39275
29:07:35,279 --> 29:07:39,831
the next one i am going to show you a
39276
29:07:37,191 --> 29:07:42,000
secret you probably didn't know so go
39277
29:07:39,831 --> 29:07:43,831
ahead and finish up here and meet me
39278
29:07:42,000 --> 29:07:46,320
there in this lecture we're going to
39279
29:07:43,831 --> 29:07:48,959
explore how virtual functions or
39280
29:07:46,320 --> 29:07:51,280
polymorphism plays with default
39281
29:07:48,960 --> 29:07:53,680
arguments and when we say default
39282
29:07:51,279 --> 29:07:55,679
arguments we mean a setup like this we
39283
29:07:53,679 --> 29:07:58,399
have a virtual function here which is
39284
29:07:55,679 --> 29:07:59,759
called add it is going to return double
39285
29:07:59,759 --> 29:08:05,360
default parameters here for a and b and
39286
29:08:02,639 --> 29:08:07,759
the value is five here in our derived
39287
29:08:05,360 --> 29:08:10,320
class we also have the same function we
39288
29:08:07,759 --> 29:08:13,511
are overriding that and we have a
39289
29:08:10,320 --> 29:08:15,832
different set of values acting as our
39290
29:08:13,512 --> 29:08:19,040
default parameter here we are using 10
39291
29:08:15,831 --> 29:08:21,831
for a and b here and we want to see how
39292
29:08:19,039 --> 29:08:24,159
this plays with polymorphism now please
39293
29:08:21,831 --> 29:08:26,159
note that with polymorphism if we go
39294
29:08:24,160 --> 29:08:29,512
through a base pointer to manage a
39295
29:08:26,160 --> 29:08:32,320
derived class object what we want is to
39296
29:08:29,512 --> 29:08:34,720
call the most specific implementation of
39297
29:08:32,320 --> 29:08:37,592
the virtual function here for example if
39298
29:08:34,720 --> 29:08:40,551
we have a base pointer managing a
39299
29:08:37,592 --> 29:08:43,279
derived object and we call the add
39300
29:08:40,551 --> 29:08:46,159
method from a base pointer we will get
39301
29:08:43,279 --> 29:08:48,720
the most specific method here called
39302
29:08:46,160 --> 29:08:51,279
but what you get with these default
39303
29:08:48,720 --> 29:08:54,639
arguments is that the compiler is going
39304
29:08:51,279 --> 29:08:56,399
to use static binding to decide which
39305
29:08:54,639 --> 29:08:58,872
default parameters to pass to your
39306
29:08:56,399 --> 29:09:01,439
function so even if you will get this
39307
29:08:58,872 --> 29:09:04,320
method here called the compiler will
39308
29:09:01,440 --> 29:09:06,720
still use the default arguments we have
39309
29:09:04,320 --> 29:09:09,040
in our base class so we will call this
39310
29:09:06,720 --> 29:09:11,759
method here but we will use the default
39311
29:09:09,039 --> 29:09:13,591
arguments coming from the base class and
39312
29:09:11,759 --> 29:09:15,911
this is the behavior you need to be
39313
29:09:13,592 --> 29:09:18,800
aware of okay so another way to put this
39314
29:09:15,911 --> 29:09:21,191
is that default arguments are handled at
39315
29:09:18,800 --> 29:09:23,512
compile time the compiler is going to
39316
29:09:21,191 --> 29:09:25,759
wire these things at compile time where
39317
29:09:23,512 --> 29:09:28,232
you are building your application
39318
29:09:25,759 --> 29:09:31,279
and the virtual functions are called at
39319
29:09:28,232 --> 29:09:33,440
run time with polymorphism so if you use
39320
29:09:31,279 --> 29:09:35,831
default arguments with virtual functions
39321
29:09:33,440 --> 29:09:38,160
you might get weird results with
39322
29:09:35,831 --> 29:09:40,399
polymorphism because the default
39323
29:09:38,160 --> 29:09:43,592
arguments you will be using are going to
39324
29:09:40,399 --> 29:09:45,511
be decided by static binding but the
39325
29:09:43,592 --> 29:09:48,400
actual function that you get called is
39326
29:09:45,512 --> 29:09:50,800
going to be decided by dynamic binding
39327
29:09:48,399 --> 29:09:53,279
so we will call the virtual function in
39328
29:09:50,800 --> 29:09:55,512
our derived class but we will be using
39329
29:09:53,279 --> 29:09:57,592
the default arguments from the base
39330
29:09:55,512 --> 29:09:59,760
class this is the behavior we'll get you
39331
29:09:57,592 --> 29:10:02,232
need to be aware of this and make sure
39332
29:09:59,759 --> 29:10:04,319
this is what you desire my personal
39333
29:10:02,232 --> 29:10:06,480
preference is to not use default
39334
29:10:04,320 --> 29:10:08,552
parameters or default arguments with
39335
29:10:06,479 --> 29:10:10,551
virtual functions because this is really
39336
29:10:08,551 --> 29:10:13,119
going to make my code hard to follow and
39337
29:10:10,551 --> 29:10:15,279
hard to understand especially for other
39338
29:10:13,119 --> 29:10:17,911
developers that might have to work on my
39339
29:10:15,279 --> 29:10:20,000
code base in the future okay here is a
39340
29:10:17,911 --> 29:10:22,232
simple example we have a base pointer
39341
29:10:20,000 --> 29:10:25,119
which is going to be managing a derived
39342
29:10:22,232 --> 29:10:27,592
object and we will call the add function
39343
29:10:25,119 --> 29:10:29,759
here what do we expect to get well
39344
29:10:27,592 --> 29:10:32,400
because we have polymorphism here we
39345
29:10:29,759 --> 29:10:34,551
will call the most specific add function
39346
29:10:32,399 --> 29:10:37,759
here and that's going to be the add
39347
29:10:34,551 --> 29:10:40,159
function from our derived class
39348
29:10:37,759 --> 29:10:42,720
but the default argument we pass are not
39349
29:10:40,160 --> 29:10:44,400
going to be decided by the derived class
39350
29:10:42,720 --> 29:10:47,040
the default arguments are going to be
39351
29:10:44,399 --> 29:10:49,831
plugged in at compile time using static
39352
29:10:47,039 --> 29:10:52,231
binding so because the base pointer is a
39353
29:10:49,831 --> 29:10:54,159
base object we will be using the default
39354
29:10:52,232 --> 29:10:56,480
arguments from the base implementation
39355
29:10:54,160 --> 29:10:59,192
of the add method so we will just plug
39356
29:10:56,479 --> 29:11:02,231
in five and five so we will add five to
39357
29:10:59,191 --> 29:11:04,399
five and add a two that's why we get a
39358
29:11:04,399 --> 29:11:09,279
and if we go through these references we
39359
29:11:06,872 --> 29:11:12,720
will get the same result because this is
39360
29:11:09,279 --> 29:11:15,911
going to enable or trigger polymorphic
39361
29:11:12,720 --> 29:11:18,551
behavior in our c-plus programs if we go
39362
29:11:15,911 --> 29:11:21,039
through direct objects we will be doing
39363
29:11:18,551 --> 29:11:23,360
static binding and we will use the
39364
29:11:21,039 --> 29:11:25,679
default arguments or device parameters
39365
29:11:23,360 --> 29:11:27,680
from our derived object and remember
39366
29:11:25,679 --> 29:11:30,159
that we use the value of 10 in there so
39367
29:11:27,679 --> 29:11:32,479
we are going to add 10 to 10 and add a 2
39368
29:11:30,160 --> 29:11:35,440
and we are going to get a 22 as you see
39369
29:11:32,479 --> 29:11:38,551
here through static binding if we do
39370
29:11:35,440 --> 29:11:41,279
slicing by assigning a derived object to
39371
29:11:38,551 --> 29:11:44,159
a base object the derived information is
39372
29:11:41,279 --> 29:11:46,479
going to be sliced off and if we add we
39373
29:11:44,160 --> 29:11:48,639
will use the default parameters from the
39374
29:11:46,479 --> 29:11:51,039
base class and we will use the
39375
29:11:48,639 --> 29:11:53,759
implementation in the base class so if
39376
29:11:51,039 --> 29:11:55,759
we come back to our code here we will
39377
29:11:53,759 --> 29:11:57,759
use the default arguments from the base
39378
29:11:55,759 --> 29:11:59,679
class and that's a five and a five we're
39379
29:11:57,759 --> 29:12:02,080
going to add them up because the body is
39380
29:11:59,679 --> 29:12:04,079
going to be from the base class remember
39381
29:12:02,080 --> 29:12:07,119
the derived information has been
39382
29:12:04,080 --> 29:12:09,040
completely sliced off so we are going to
39383
29:12:07,119 --> 29:12:11,360
add a five and a five and a one and
39384
29:12:09,039 --> 29:12:14,479
we're going to get 11 printed out if we
39385
29:12:11,360 --> 29:12:16,639
do slicing and that's the result we get
39386
29:12:14,479 --> 29:12:19,119
right here as a closing note before we
39387
29:12:16,639 --> 29:12:21,191
head over to visual studio code again
39388
29:12:19,119 --> 29:12:23,440
default arguments with virtual functions
39389
29:12:21,191 --> 29:12:25,679
can be very confusing they are best
39390
29:12:23,440 --> 29:12:28,320
avoided because they really are going to
39391
29:12:25,679 --> 29:12:30,231
give a hard time to anybody that is
39392
29:12:28,320 --> 29:12:31,832
going to be working on your code in the
39393
29:12:30,232 --> 29:12:33,832
future now that you know this we're
39394
29:12:31,831 --> 29:12:35,439
going to head over to visual studio code
39395
29:12:33,831 --> 29:12:38,080
and play with this a little more here we
39396
29:12:35,440 --> 29:12:40,551
are in our working folder the current
39397
29:12:38,080 --> 29:12:42,400
project is virtual functions with
39398
29:12:40,551 --> 29:12:45,039
default arguments we're going to grab
39399
29:12:42,399 --> 29:12:47,039
the code from our template project we're
39400
29:12:45,039 --> 29:12:49,679
going to copy this and put this in the
39401
29:12:47,039 --> 29:12:52,231
current project and i am going to grab
39402
29:12:49,679 --> 29:12:54,639
my classes base and derived that we are
39403
29:12:52,232 --> 29:12:56,800
going to be using here if you don't want
39404
29:12:54,639 --> 29:12:59,039
to type along you can grab the source
39405
29:12:56,800 --> 29:13:00,000
code from the resource section of the
39406
29:13:00,000 --> 29:13:04,160
if you don't want to type all these
39407
29:13:01,679 --> 29:13:07,191
classes or create them you can grab the
39408
29:13:04,160 --> 29:13:08,552
source code from the resource section on
39409
29:13:07,191 --> 29:13:10,551
this lecture you're going to download
39410
29:13:08,551 --> 29:13:12,720
this and use this you don't have to
39411
29:13:10,551 --> 29:13:15,119
waste time typing these things because
39412
29:13:12,720 --> 29:13:17,279
many of these things are already
39413
29:13:15,119 --> 29:13:19,039
familiar to you we're going to open this
39414
29:13:17,279 --> 29:13:21,360
in visual studio code and we're going to
39415
29:13:19,039 --> 29:13:23,439
have our classes here we have a base
39416
29:13:21,360 --> 29:13:24,551
class which is going to have a virtual
39417
29:13:25,440 --> 29:13:31,191
a pair of default arguments here we are
39418
29:13:33,119 --> 29:13:38,000
and if we go and derived it is going to
39419
29:13:35,440 --> 29:13:40,232
derive publicly from base and it is
39420
29:13:40,232 --> 29:13:45,040
virtual function here but notice that it
39421
29:13:45,039 --> 29:13:49,039
default parameters so if we do
39422
29:13:49,039 --> 29:13:53,439
and use the base pointer to call the add
39423
29:13:51,191 --> 29:13:56,871
method here we will get the most
39424
29:13:53,440 --> 29:13:58,960
specific or the most specialized version
39425
29:13:56,872 --> 29:14:01,040
of the add method called and this is
39426
29:13:58,960 --> 29:14:03,592
going to call this body here
39427
29:14:01,039 --> 29:14:06,399
but the parameters are going to be
39428
29:14:03,592 --> 29:14:08,960
decided by static binding so because we
39429
29:14:06,399 --> 29:14:11,191
will be going through a base pointer we
39430
29:14:08,960 --> 29:14:13,832
will use the default arguments from the
39431
29:14:11,191 --> 29:14:15,119
base class that's going to be five five
39432
29:14:13,831 --> 29:14:17,191
and we're going to play with this and
39433
29:14:15,119 --> 29:14:19,911
see what this is going to give us in the
39434
29:14:17,191 --> 29:14:21,119
main cpp file here let's clean up a
39435
29:14:19,911 --> 29:14:23,191
little bit we're going to remove
39436
29:14:23,191 --> 29:14:28,159
and we are going to include our derived
39437
29:14:25,679 --> 29:14:30,551
class we can do that we are going to put
39438
29:14:28,160 --> 29:14:32,552
in our code to really play with us let's
39439
29:14:30,551 --> 29:14:34,720
remove these spaces because we don't
39440
29:14:32,551 --> 29:14:37,440
need them we are going to go through a
39441
29:14:34,720 --> 29:14:39,759
base pointer to manage a derived object
39442
29:14:37,440 --> 29:14:41,832
and this is a setup we can use to put
39443
29:14:39,759 --> 29:14:44,159
things in place here we are going to
39444
29:14:41,831 --> 29:14:46,720
call the add method notice that we are
39445
29:14:44,160 --> 29:14:48,960
not passing in any parameter because we
39446
29:14:46,720 --> 29:14:51,080
are going through a base pointer and the
39447
29:14:51,080 --> 29:14:55,680
polymorphism will kick in and we will
39448
29:14:55,679 --> 29:15:02,000
of our add function code so we will call
39449
29:15:02,000 --> 29:15:06,872
be careful because we want to be using
39450
29:15:04,232 --> 29:15:10,320
these default parameters here if we did
39451
29:15:06,872 --> 29:15:12,720
we would add a 10 to a 10 and get to 22
39452
29:15:10,320 --> 29:15:14,960
in our main function here but that's not
39453
29:15:12,720 --> 29:15:17,512
going to be the case the compiler is
39454
29:15:14,960 --> 29:15:20,080
going to use static binding to decide
39455
29:15:17,512 --> 29:15:22,080
which default parameters to use either
39456
29:15:20,080 --> 29:15:24,479
those in the base class or those in the
39457
29:15:22,080 --> 29:15:26,872
derived class and notice that if we
39458
29:15:24,479 --> 29:15:29,360
hover over this add function you see
39459
29:15:26,872 --> 29:15:31,279
that the compiler has plugged down those
39460
29:15:29,360 --> 29:15:32,800
from the base class and that's what the
39461
29:15:31,279 --> 29:15:35,279
compiler is going to do so it is going
39462
29:15:32,800 --> 29:15:37,279
to add a five to a five and it is going
39463
29:15:35,279 --> 29:15:40,551
to add two to that i think that's what
39464
29:15:37,279 --> 29:15:43,191
we are doing in our derived version and
39465
29:15:40,551 --> 29:15:45,512
we are going to get to 12 printed out
39466
29:15:43,191 --> 29:15:46,871
let's build and see if this is actually
39467
29:15:45,512 --> 29:15:48,551
the case we're going to pass this
39468
29:15:48,551 --> 29:15:53,191
and that's the compiler that is our
39469
29:15:51,039 --> 29:15:55,679
favorite now the book is going to be
39470
29:15:53,191 --> 29:15:58,720
good we can close this and bring up a
39471
29:15:55,679 --> 29:16:00,799
powershell window and if we run rooster
39472
29:15:58,720 --> 29:16:03,680
we're going to see that the arrived ad
39473
29:16:00,800 --> 29:16:05,760
was called and the result was 12 here
39474
29:16:05,759 --> 29:16:11,511
the compiler is going to call the most
39475
29:16:08,080 --> 29:16:14,320
specialized virtual function override
39476
29:16:11,512 --> 29:16:16,400
here but it is going to use the default
39477
29:16:14,320 --> 29:16:18,872
parameters from the base class you
39478
29:16:16,399 --> 29:16:20,959
should really note this and this can
39479
29:16:18,872 --> 29:16:24,639
really be confusing especially if you
39480
29:16:20,960 --> 29:16:27,040
are a beginner to polymorphism if we go
39481
29:16:24,639 --> 29:16:29,360
through a base reference we will also
39482
29:16:29,360 --> 29:16:34,232
so if we have a derived object and we
39483
29:16:31,759 --> 29:16:36,639
set up a reference to that which is of
39484
29:16:34,232 --> 29:16:38,720
type base and we go through that base
39485
29:16:36,639 --> 29:16:40,639
reference and called the add method we
39486
29:16:38,720 --> 29:16:42,479
will get the most specialized add
39487
29:16:40,639 --> 29:16:46,551
version called so that's going to be
39488
29:16:42,479 --> 29:16:48,872
derived and but we will use the default
39489
29:16:46,551 --> 29:16:50,872
parameters from the base class because
39490
29:16:48,872 --> 29:16:54,160
which default arguments we use is
39491
29:16:50,872 --> 29:16:56,160
decided by using static binding that's
39492
29:16:54,160 --> 29:16:58,160
what we get here and official studio
39493
29:16:56,160 --> 29:17:00,232
code is really helpful here because if
39494
29:16:58,160 --> 29:17:02,480
we hover over the add function we're
39495
29:17:00,232 --> 29:17:04,639
going to see which default parameters
39496
29:17:02,479 --> 29:17:06,959
were plugged in by the compiler and you
39497
29:17:04,639 --> 29:17:09,119
see that they are those from the base
39498
29:17:06,960 --> 29:17:11,360
class so we are again going to add five
39499
29:17:09,119 --> 29:17:14,479
to a five and we are going to add a two
39500
29:17:11,360 --> 29:17:16,320
and we will get 12 printed out here if
39501
29:17:14,479 --> 29:17:18,800
we boil and run we're going to see that
39502
29:17:16,320 --> 29:17:20,000
this is the case the build is good we
39503
29:17:20,000 --> 29:17:23,679
and run rooster we're going to see that
39504
29:17:21,911 --> 29:17:26,872
with a base reference we're also going
39505
29:17:23,679 --> 29:17:28,231
to get a 12. we will get the most
39506
29:17:28,232 --> 29:17:33,832
implementation of the add method called
39507
29:17:31,360 --> 29:17:35,911
but we will plug in the default
39508
29:17:33,831 --> 29:17:38,871
parameters from the base class i really
39509
29:17:35,911 --> 29:17:40,720
wanted this to be super clear if you set
39510
29:17:38,872 --> 29:17:43,360
up things in a way that you are going to
39511
29:17:40,720 --> 29:17:45,831
get static binding then if you are going
39512
29:17:43,360 --> 29:17:48,080
through a base object you will call the
39513
29:17:45,831 --> 29:17:50,231
base version of the add method and you
39514
29:17:48,080 --> 29:17:52,080
will use the default parameters from the
39515
29:17:50,232 --> 29:17:54,960
base class if you happen to be
39516
29:17:52,080 --> 29:17:57,279
manipulating a derived object you will
39517
29:17:54,960 --> 29:17:59,512
use the information in the derived class
39518
29:17:57,279 --> 29:18:01,279
the derived version of the add method is
39519
29:17:59,512 --> 29:18:03,680
going to be called and we are going to
39520
29:18:01,279 --> 29:18:06,959
use the default argument from the
39521
29:18:03,679 --> 29:18:09,191
derived class so if we set up another
39522
29:18:06,960 --> 29:18:11,592
example here we can set up a base object
39523
29:18:09,191 --> 29:18:13,039
for example we're going to say base and
39524
29:18:13,039 --> 29:18:19,119
3 we can do that and we try to call the
39525
29:18:16,232 --> 29:18:21,192
add method we can say base 3 and say add
39526
29:18:19,119 --> 29:18:23,360
we can try and store this in our
39527
29:18:21,191 --> 29:18:26,080
research variable and we can print this
39528
29:18:23,360 --> 29:18:28,479
out we're going to say sdbcl row
39529
29:18:26,080 --> 29:18:30,551
research we can say something like this
39530
29:18:28,479 --> 29:18:32,479
and we're going to print out the result
39531
29:18:30,551 --> 29:18:34,479
here if we build and run we're going to
39532
29:18:32,479 --> 29:18:36,800
see that this is going to call
39533
29:18:34,479 --> 29:18:38,231
the base version of the add method and
39534
29:18:36,800 --> 29:18:40,960
it is going to use the default
39535
29:18:38,232 --> 29:18:42,720
parameters from the base if we go back
39536
29:18:40,960 --> 29:18:46,000
to base we're going to see that we are
39537
29:18:42,720 --> 29:18:49,040
going to add a 5 to a 5 and we will get
39538
29:18:46,000 --> 29:18:51,512
11 because we will plug in a 1 and
39539
29:18:49,039 --> 29:18:53,591
return the result here let's build and
39540
29:18:51,512 --> 29:18:55,832
run and see that this is actually the
39541
29:18:53,592 --> 29:18:58,800
case so this is going to be completely
39542
29:18:55,831 --> 29:19:00,399
doing static binding let's clear and run
39543
29:18:58,800 --> 29:19:02,160
you see that the world is good we're
39544
29:19:00,399 --> 29:19:04,399
going to run restaurant and we will get
39545
29:19:02,160 --> 29:19:07,680
11 printed out here hopefully you can
39546
29:19:04,399 --> 29:19:08,551
see this if you assign a derived object
39547
29:19:08,551 --> 29:19:14,000
a base object you will get slicing
39548
29:19:11,679 --> 29:19:16,799
let's see that we can actually do this
39549
29:19:14,000 --> 29:19:19,039
but before we do that i also want you to
39550
29:19:19,039 --> 29:19:24,000
row direct objects of derived classes if
39551
29:19:24,000 --> 29:19:28,232
get the information from the derived
39552
29:19:26,320 --> 29:19:30,872
class we will use the body from the
39553
29:19:28,232 --> 29:19:32,639
derived class and we will use the
39554
29:19:30,872 --> 29:19:35,680
default parameters from the derived
39555
29:19:32,639 --> 29:19:37,831
class so we will take 10 and add a 10
39556
29:19:35,679 --> 29:19:40,799
and we will add the 2 to that and we
39557
29:19:37,831 --> 29:19:42,479
will get a 22 printed out i think we can
39558
29:19:43,279 --> 29:19:47,831
let's put in a separator because that's
39559
29:19:45,759 --> 29:19:50,159
going to make it easier to follow these
39560
29:19:47,831 --> 29:19:52,639
lengths and we're going to build with
39561
29:19:50,160 --> 29:19:53,832
the gcc the both is going to be good
39562
29:19:53,831 --> 29:19:58,080
the bulk is good we can clear
39563
29:19:56,160 --> 29:20:01,512
and run rooster and we're going to see
39564
29:19:58,080 --> 29:20:04,551
that we get a 22 here if we assign a
39565
29:20:01,512 --> 29:20:06,639
derived object to a base object directly
39566
29:20:04,551 --> 29:20:09,039
by doing something like this event we
39567
29:20:09,039 --> 29:20:15,039
we can remove this we have a base object
39568
29:20:12,399 --> 29:20:17,511
that we are setting up here and we are
39569
29:20:15,039 --> 29:20:18,799
assigning a derived object to this base
39570
29:20:18,800 --> 29:20:24,080
if we call the add method we will get
39571
29:20:21,440 --> 29:20:26,479
the version from the base class because
39572
29:20:24,080 --> 29:20:29,119
mind your steps this is going to slice
39573
29:20:26,479 --> 29:20:31,039
off all the derived information because
39574
29:20:29,119 --> 29:20:32,959
we are not going through any kind of
39575
29:20:31,039 --> 29:20:35,679
base or reference so this is going to
39576
29:20:32,960 --> 29:20:37,192
slice off all the information we have in
39577
29:20:37,191 --> 29:20:42,551
object here and we will be left with the
39578
29:20:39,759 --> 29:20:44,720
base information and if we call the add
39579
29:20:42,551 --> 29:20:46,479
function here you see that we are using
39580
29:20:44,720 --> 29:20:49,680
the default parameters from the base
39581
29:20:46,479 --> 29:20:51,911
class and we will use the body of the
39582
29:20:49,679 --> 29:20:54,871
base class implementation here so we
39583
29:20:51,911 --> 29:20:57,591
will add a 5 to a 5 and we will add 1 to
39584
29:20:54,872 --> 29:20:59,680
that and we will get 11 printed out as
39585
29:20:57,592 --> 29:21:01,120
we see here let's build and actually
39586
29:20:59,679 --> 29:21:02,959
prove this we're going to pass this
39587
29:21:01,119 --> 29:21:05,512
through gcc the world is going to be
39588
29:21:02,960 --> 29:21:07,760
good we can clear and run rooster and we
39589
29:21:05,512 --> 29:21:11,040
are going to see that the result is
39590
29:21:07,759 --> 29:21:12,959
irreverent if we do row object
39591
29:21:11,039 --> 29:21:15,360
assignment here this is really all i
39592
29:21:12,960 --> 29:21:17,440
wanted you to see in this lecture that
39593
29:21:15,360 --> 29:21:19,440
you should really be careful if you are
39594
29:21:19,440 --> 29:21:24,232
mixed up with default arguments the
39595
29:21:22,000 --> 29:21:26,639
compiler is not going to do dynamic
39596
29:21:24,232 --> 29:21:29,360
binding on the default parameters it is
39597
29:21:26,639 --> 29:21:32,960
going to decide which default parameters
39598
29:21:29,360 --> 29:21:34,720
to plug in at compile time using static
39599
29:21:32,960 --> 29:21:36,960
binding so the compiler is basically
39600
29:21:34,720 --> 29:21:39,592
going to look at the type of the pointer
39601
29:21:36,960 --> 29:21:41,760
or object that you have and it is going
39602
29:21:39,592 --> 29:21:44,552
to use that to decide which default
39603
29:21:41,759 --> 29:21:46,551
parameters to plug in so at this example
39604
29:21:44,551 --> 29:21:49,039
here for example at line 7 it is going
39605
29:21:46,551 --> 29:21:50,959
to see what kind of pointer do i have i
39606
29:21:49,039 --> 29:21:53,360
have a base pointer so i am going to use
39607
29:21:50,960 --> 29:21:55,440
the default parameters from the base
39608
29:21:53,360 --> 29:21:56,720
implementation and if you hover over
39609
29:21:55,440 --> 29:21:59,040
here you're going to see that it is
39610
29:21:56,720 --> 29:22:01,279
going to plug in a 5 and a 5. even if we
39611
29:21:59,039 --> 29:22:04,159
are using the most specialized add
39612
29:22:01,279 --> 29:22:06,000
version in our inheritance hierarchy the
39613
29:22:04,160 --> 29:22:08,232
compiler is going to still use the
39614
29:22:06,000 --> 29:22:11,039
default argument from the base
39615
29:22:08,232 --> 29:22:13,120
implementation down here on line 16 the
39616
29:22:11,039 --> 29:22:15,039
compiler is going to say which kind of
39617
29:22:13,119 --> 29:22:17,279
reference do i have it's going to say
39618
29:22:15,039 --> 29:22:18,719
base because that's what we have here so
39619
29:22:17,279 --> 29:22:21,279
it is going to use the default
39620
29:22:18,720 --> 29:22:23,279
parameters from base and that's what it
39621
29:22:21,279 --> 29:22:25,512
is going to plug in here 5 and 5 and
39622
29:22:23,279 --> 29:22:28,232
we're going to get this result here
39623
29:22:25,512 --> 29:22:30,160
down here on line 25 the compiler is
39624
29:22:28,232 --> 29:22:32,872
going to see which kind of object do i
39625
29:22:30,160 --> 29:22:35,120
have here this three is a base so i am
39626
29:22:32,872 --> 29:22:36,160
going to use the default parameters from
39627
29:22:36,160 --> 29:22:40,552
down below on line 31 the compiler is
39628
29:22:40,551 --> 29:22:45,759
which kind of object do i have here the
39629
29:22:42,800 --> 29:22:48,000
object is derived so i will plug in the
39630
29:22:45,759 --> 29:22:49,439
default parameters for it derived again
39631
29:22:48,000 --> 29:22:52,160
this is really what the compiler is
39632
29:22:49,440 --> 29:22:54,720
going to do with default parameters the
39633
29:22:52,160 --> 29:22:56,800
compiler is never going to do dynamic
39634
29:22:54,720 --> 29:23:00,160
binding and this is going to make your
39635
29:22:56,800 --> 29:23:03,440
code really confusing again my advice is
39636
29:23:00,160 --> 29:23:06,800
to avoid default arguments or devote
39637
29:23:03,440 --> 29:23:09,512
parameters if you are using polymorphism
39638
29:23:06,800 --> 29:23:11,592
in your inheritance hierarchy we are
39639
29:23:09,512 --> 29:23:13,440
going to stop here in this lecture and
39640
29:23:11,592 --> 29:23:15,512
the next one we're going to learn about
39641
29:23:15,512 --> 29:23:19,832
go ahead and finish up here and meet me
39642
29:23:17,831 --> 29:23:23,191
there in this lecture we are going to
39643
29:23:19,831 --> 29:23:25,831
explore virtual destructors and these
39644
29:23:23,191 --> 29:23:27,039
are destructor methods you might want to
39645
29:23:27,039 --> 29:23:31,591
using dynamic binding or polymorphic
39646
29:23:31,592 --> 29:23:34,800
we are going to be using this
39647
29:23:33,039 --> 29:23:36,399
inheritance hierarchy to play with
39648
29:23:34,800 --> 29:23:38,551
thanks so the animal class is going to
39649
29:23:36,399 --> 29:23:41,039
be our base class we are going to derive
39650
29:23:38,551 --> 29:23:43,831
from that publicly and have a feline
39651
29:23:41,039 --> 29:23:46,551
class and we are going to derive from
39652
29:23:43,831 --> 29:23:49,279
feline and have a dog class this is the
39653
29:23:46,551 --> 29:23:51,591
setup we are going to be using here
39654
29:23:49,279 --> 29:23:53,759
now let's look at some code we are going
39655
29:23:51,592 --> 29:23:56,232
to set up our animal class like there's
39656
29:23:53,759 --> 29:23:58,399
nothing really special here notice that
39657
29:23:56,232 --> 29:23:59,512
the destructor is a regular destructor
39658
29:23:59,512 --> 29:24:05,440
we will derive from animal and create a
39659
29:24:03,191 --> 29:24:07,279
feline class which is going to set up
39660
29:24:05,440 --> 29:24:10,160
its own virtual function which is going
39661
29:24:07,279 --> 29:24:12,160
to be run if you want you can override
39662
29:24:10,160 --> 29:24:14,480
the breathe method but we don't want to
39663
29:24:12,160 --> 29:24:15,512
do that here because we just want to
39664
29:24:15,512 --> 29:24:20,960
on the destructors here and the order in
39665
29:24:18,639 --> 29:24:23,831
which they are going to be called we are
39666
29:24:20,960 --> 29:24:26,552
going to derive from feline and set up a
39667
29:24:23,831 --> 29:24:29,039
dog class and this dog class is going to
39668
29:24:26,551 --> 29:24:31,119
set up its own virtual function and
39669
29:24:29,039 --> 29:24:33,679
notice that it has a destructor which is
39670
29:24:31,119 --> 29:24:36,159
really a regular destructor now once we
39671
29:24:33,679 --> 29:24:38,479
have this inheritance hierarchy set up
39672
29:24:36,160 --> 29:24:40,552
we might want to do something like this
39673
29:24:38,479 --> 29:24:43,512
we can create a dark object
39674
29:24:40,551 --> 29:24:46,639
and when it is time for this object to
39675
29:24:43,512 --> 29:24:48,551
be destroyed i want you to focus on the
39676
29:24:46,639 --> 29:24:50,800
order in which the destructors are going
39677
29:24:48,551 --> 29:24:53,191
to be called we have seen this before
39678
29:24:50,800 --> 29:24:56,639
the destructors are going to be called
39679
29:24:53,191 --> 29:24:58,871
from the specialized to the most base
39680
29:24:56,639 --> 29:25:01,440
implementation of the destructor so the
39681
29:24:58,872 --> 29:25:03,192
destructor for doug will be called first
39682
29:25:01,440 --> 29:25:05,760
then we will call the destructor for
39683
29:25:03,191 --> 29:25:08,319
feline then we will call the destructor
39684
29:25:05,759 --> 29:25:11,191
for animal now a problem is going to pop
39685
29:25:08,320 --> 29:25:14,480
up if we are using a base pointer to
39686
29:25:11,191 --> 29:25:16,720
manage a derived object with polymorphic
39687
29:25:14,479 --> 29:25:18,959
behavior that we might want for our
39688
29:25:16,720 --> 29:25:21,191
inheritance hierarchy here so we are
39689
29:25:18,960 --> 29:25:23,680
going to use an animal pointer to manage
39690
29:25:21,191 --> 29:25:25,512
a dark object like this and when it is
39691
29:25:23,679 --> 29:25:26,719
time to release the memory for this
39692
29:25:26,720 --> 29:25:33,040
we may be tempted to call the delete
39693
29:25:29,911 --> 29:25:34,720
operator on our animal pointer here but
39694
29:25:33,039 --> 29:25:36,000
this is only going to call the
39695
29:25:36,000 --> 29:25:41,039
for the base class and hopefully you can
39696
29:25:38,800 --> 29:25:44,232
see the problem here because our
39697
29:25:41,039 --> 29:25:46,719
destructors are not virtual the compiler
39698
29:25:44,232 --> 29:25:48,960
is going to use static binding to decide
39699
29:25:46,720 --> 29:25:50,872
which destructor to call so it is going
39700
29:25:48,960 --> 29:25:52,232
to look at the type of a pointer it is
39701
29:25:50,872 --> 29:25:54,000
going to see that it is an animal
39702
29:25:52,232 --> 29:25:56,872
pointer and it is going to decide to
39703
29:25:54,000 --> 29:25:59,119
call the destructor for animal here
39704
29:25:56,872 --> 29:26:01,440
that's why we get this reserve we are
39705
29:25:59,119 --> 29:26:04,159
managing an object which is not just an
39706
29:26:01,440 --> 29:26:06,800
animal it has derived information in it
39707
29:26:04,160 --> 29:26:09,592
but we are only calling the destructor
39708
29:26:06,800 --> 29:26:11,680
for the base part of this stun so any
39709
29:26:09,592 --> 29:26:14,800
piece of dynamic memory we might have
39710
29:26:11,679 --> 29:26:17,511
allocated in the constructors for feline
39711
29:26:14,800 --> 29:26:20,479
or dog is going to be leaked out because
39712
29:26:17,512 --> 29:26:22,551
remember even if this is a dark object
39713
29:26:20,479 --> 29:26:24,551
it is made up of base parts the
39714
29:26:22,551 --> 29:26:26,800
foundation for this is going to be
39715
29:26:24,551 --> 29:26:29,440
animal and on top of that we are going
39716
29:26:26,800 --> 29:26:31,911
to build a feline level and on top of
39717
29:26:29,440 --> 29:26:34,160
that we are going to build a dog level
39718
29:26:31,911 --> 29:26:37,512
in this case only the destructor for dog
39719
29:26:34,160 --> 29:26:40,232
is going to be called and any dynamic
39720
29:26:37,512 --> 29:26:43,512
memory that might have been allocated at
39721
29:26:40,232 --> 29:26:45,279
the feline and dog level is going to be
39722
29:26:43,512 --> 29:26:47,191
leaked out and this is something we
39723
29:26:45,279 --> 29:26:49,512
don't want you really need to keep your
39724
29:26:47,191 --> 29:26:51,360
eye out on this and this is something
39725
29:26:49,512 --> 29:26:53,832
really bad you really need to keep your
39726
29:26:51,360 --> 29:26:55,911
eye out for this so this is really a big
39727
29:26:53,831 --> 29:26:58,399
problem and to solve it we need the
39728
29:26:55,911 --> 29:27:01,279
destructors to be called using
39729
29:26:58,399 --> 29:27:04,639
polymorphism and you can set that up by
39730
29:27:01,279 --> 29:27:06,872
marking your destructors as a virtual if
39731
29:27:04,639 --> 29:27:08,872
you do this the compiler will know
39732
29:27:06,872 --> 29:27:11,592
that if you are going through a base
39733
29:27:08,872 --> 29:27:13,592
pointer to manage a derived object when
39734
29:27:11,592 --> 29:27:15,512
the time comes for the memory to be
39735
29:27:13,592 --> 29:27:17,912
released and you release the memory
39736
29:27:15,512 --> 29:27:19,911
through a base pointer the compiler is
39737
29:27:17,911 --> 29:27:22,319
going to call the most specific
39738
29:27:19,911 --> 29:27:24,800
destructor it can find and this is going
39739
29:27:22,320 --> 29:27:27,192
to solve our problem then we will reuse
39740
29:27:24,800 --> 29:27:29,911
the order we are familiar with the most
39741
29:27:27,191 --> 29:27:32,159
derived destructor will be called and it
39742
29:27:29,911 --> 29:27:34,000
will call its best destructor and that's
39743
29:27:32,160 --> 29:27:36,720
going to happen until we hit the most
39744
29:27:34,000 --> 29:27:38,479
base class in our inheritance hierarchy
39745
29:27:36,720 --> 29:27:40,639
and the memory is going to be released
39746
29:27:38,479 --> 29:27:42,000
exactly as we would want now that you
39747
29:27:40,639 --> 29:27:43,831
know this we're going to head over to
39748
29:27:42,000 --> 29:27:46,551
visual studio code and play with us a
39749
29:27:43,831 --> 29:27:48,231
little more here we are in our working
39750
29:27:46,551 --> 29:27:50,720
folder we are going to learn about
39751
29:27:48,232 --> 29:27:52,720
virtual destructors and before we do
39752
29:27:50,720 --> 29:27:55,279
that we're going to grab our template
39753
29:27:52,720 --> 29:27:57,279
files and put them in place let's do
39754
29:27:55,279 --> 29:27:59,679
that and i am going to put in the
39755
29:27:57,279 --> 29:28:02,000
classes that make up our inheritance
39756
29:27:59,679 --> 29:28:04,551
hierarchy our most based class is going
39757
29:28:02,000 --> 29:28:06,479
to be base our most based class is going
39758
29:28:04,551 --> 29:28:08,720
to be animal after that we're going to
39759
29:28:06,479 --> 29:28:11,191
derive we are going to derive from that
39760
29:28:08,720 --> 29:28:13,592
and create the feline class and we are
39761
29:28:11,191 --> 29:28:16,159
going to derive from feline and create a
39762
29:28:13,592 --> 29:28:18,552
dog class here this is the inheritance
39763
29:28:16,160 --> 29:28:20,400
hierarchy we talked about in our slides
39764
29:28:18,551 --> 29:28:22,639
okay we are going to open this up in
39765
29:28:20,399 --> 29:28:25,360
visual studio code and this is going to
39766
29:28:22,639 --> 29:28:27,440
give us our classes here and we are
39767
29:28:25,360 --> 29:28:29,191
going to remove these virtual keywords
39768
29:28:29,191 --> 29:28:34,399
what would happen if you don't mark your
39769
29:28:31,911 --> 29:28:36,232
destructors as a virtual we're going to
39770
29:28:34,399 --> 29:28:38,479
do that for feline we're going to do
39771
29:28:36,232 --> 29:28:40,639
that for doug let's remove the virtual
39772
29:28:38,479 --> 29:28:42,479
keyword here we're going to remove that
39773
29:28:40,639 --> 29:28:44,800
and we're going to remove that for the
39774
29:28:42,479 --> 29:28:47,191
animal class and we want to see the
39775
29:28:44,800 --> 29:28:49,512
implementations for our destructors for
39776
29:28:47,191 --> 29:28:52,159
animal we are just going to say that the
39777
29:28:49,512 --> 29:28:53,911
destructor for animal was called for
39778
29:28:52,160 --> 29:28:56,000
feline we're going to say the same thing
39779
29:28:53,911 --> 29:28:57,679
feline destructor called for doubt we're
39780
29:28:56,000 --> 29:29:00,800
going to say the same thing we're going
39781
29:28:57,679 --> 29:29:04,639
to say destructor for dog called here
39782
29:29:00,800 --> 29:29:07,040
we are using strengths as our parameters
39783
29:29:04,639 --> 29:29:09,191
here so i think it is a good idea to
39784
29:29:07,039 --> 29:29:10,399
change these guys to use string view i
39785
29:29:10,399 --> 29:29:15,279
and come back when this is done
39786
29:29:12,551 --> 29:29:18,551
okay this is done all our parameters are
39787
29:29:15,279 --> 29:29:20,872
of std string view type and now that we
39788
29:29:18,551 --> 29:29:23,679
have this inheritance hierarchy let's
39789
29:29:20,872 --> 29:29:26,232
make sure none of the destructors is
39790
29:29:23,679 --> 29:29:29,591
virtual this is the case here we can
39791
29:29:26,232 --> 29:29:31,760
head over to the main cpp file and use
39792
29:29:29,592 --> 29:29:34,160
this inheritance hierarchy here we're
39793
29:29:31,759 --> 29:29:36,639
going to crack it open and remove
39794
29:29:36,639 --> 29:29:42,872
we are going to include our dog class
39795
29:29:40,000 --> 29:29:44,800
which is going to implicitly include or
39796
29:29:42,872 --> 29:29:47,592
its parent classes so we're going to
39797
29:29:44,800 --> 29:29:50,160
include dog.h here and we are going to
39798
29:29:47,592 --> 29:29:52,400
create a row.object by default here
39799
29:29:50,160 --> 29:29:55,040
we're going to say dog and let's say dog
39800
29:29:52,399 --> 29:29:57,511
one we can do that and we might not even
39801
29:29:55,039 --> 29:29:59,511
give it any parameter this is going to
39802
29:29:57,512 --> 29:30:01,911
call the default constructor and if we
39803
29:29:59,512 --> 29:30:04,160
go to doug we're going to see that it is
39804
29:30:01,911 --> 29:30:06,551
possible to specify information here
39805
29:30:04,160 --> 29:30:09,680
first style description but we're going
39806
29:30:06,551 --> 29:30:12,639
to ignore this and we just want to see
39807
29:30:09,679 --> 29:30:15,191
which order in which the destructors are
39808
29:30:12,639 --> 29:30:17,440
called let's build and run this program
39809
29:30:15,191 --> 29:30:19,679
we're going to pass this through gcc the
39810
29:30:17,440 --> 29:30:21,832
book is going to be good if we clear
39811
29:30:19,679 --> 29:30:23,831
let's bring up a powershell window to do
39812
29:30:23,831 --> 29:30:28,551
and run rooster you're going to see that
39813
29:30:26,160 --> 29:30:30,720
dog destructor was called feline
39814
29:30:28,551 --> 29:30:32,479
destructor was called animal destructor
39815
29:30:30,720 --> 29:30:36,000
was called and this is really cool this
39816
29:30:32,479 --> 29:30:38,639
is the order we expect by default but if
39817
29:30:36,000 --> 29:30:41,831
we don't do something like this and say
39818
29:30:38,639 --> 29:30:44,872
animal pointer and say p animal to mean
39819
29:30:41,831 --> 29:30:46,959
a pointer to animal and we say new dog
39820
29:30:44,872 --> 29:30:48,960
we're going to allocate a dog on the
39821
29:30:46,960 --> 29:30:53,040
heap and we're going to manage that
39822
29:30:48,960 --> 29:30:54,872
using a base pointer and if we try to
39823
29:30:53,039 --> 29:30:57,360
release the memory here let's do that
39824
29:30:54,872 --> 29:31:00,080
we're going to say delete p animal let's
39825
29:30:57,360 --> 29:31:02,080
see which destructor gets called here
39826
29:31:00,080 --> 29:31:06,160
because notice we are using a base
39827
29:31:02,080 --> 29:31:08,639
pointer to manage a must specific object
39828
29:31:06,160 --> 29:31:11,360
here which is a derived class of dog
39829
29:31:08,639 --> 29:31:14,551
indirectly and we will see that we don't
39830
29:31:11,360 --> 29:31:16,800
get the destructors called in the order
39831
29:31:14,551 --> 29:31:18,959
that we expect let's build and run this
39832
29:31:16,800 --> 29:31:21,040
program to really see this we're going
39833
29:31:21,039 --> 29:31:25,439
the world is going to be good as you see
39834
29:31:25,440 --> 29:31:31,592
and run rooster now you see that only
39835
29:31:28,232 --> 29:31:34,480
the destructor for animal is called even
39836
29:31:31,592 --> 29:31:36,320
if we are really managing a dog object
39837
29:31:34,479 --> 29:31:38,479
for things to work really well we would
39838
29:31:36,320 --> 29:31:40,640
expect the destructor for duck to be
39839
29:31:38,479 --> 29:31:42,639
called and then the destructor for a
39840
29:31:40,639 --> 29:31:45,911
feline and then the destructor for
39841
29:31:42,639 --> 29:31:48,639
animal to release or the memory that
39842
29:31:45,911 --> 29:31:51,440
might have been allocated by these
39843
29:31:48,639 --> 29:31:53,831
parent classes for our dog class if you
39844
29:31:51,440 --> 29:31:55,592
go back in the cpp file for example for
39845
29:31:53,831 --> 29:31:57,511
each of these classes you're going to
39846
29:31:55,592 --> 29:31:58,400
see that the compiler is going to be
39847
29:31:58,399 --> 29:32:02,871
each base class of the current level
39848
29:32:00,479 --> 29:32:05,440
that we are at in doug cpp we are going
39849
29:32:02,872 --> 29:32:07,120
to call the constructor for feline the
39850
29:32:05,440 --> 29:32:09,512
constructor for feline is going to be
39851
29:32:07,119 --> 29:32:11,360
called if it is doing any dynamic memory
39852
29:32:09,512 --> 29:32:13,680
allocation we need to release this
39853
29:32:11,360 --> 29:32:15,680
memory constructor for feline is also
39854
29:32:13,679 --> 29:32:18,000
going to call the constructor for animal
39855
29:32:15,679 --> 29:32:19,831
and if animal is doing any dynamic
39856
29:32:18,000 --> 29:32:22,232
memory allocation this is going to need
39857
29:32:19,831 --> 29:32:25,191
to be called but notice that we are just
39858
29:32:22,232 --> 29:32:27,512
colon the destructor for animal and if
39859
29:32:25,191 --> 29:32:29,440
we only call this destructor all of the
39860
29:32:27,512 --> 29:32:31,592
memory that was allocated by the filing
39861
29:32:29,440 --> 29:32:33,592
constructor is going to be leaked out
39862
29:32:31,592 --> 29:32:35,120
because only the animal destructor is
39863
29:32:33,592 --> 29:32:37,512
going to be called hopefully you can see
39864
29:32:35,119 --> 29:32:39,911
the problem here but this is not the
39865
29:32:37,512 --> 29:32:42,080
only problem the c plus plus standard
39866
29:32:39,911 --> 29:32:45,512
says that if you do something like we
39867
29:32:42,080 --> 29:32:47,759
are doing here and call a destructor
39868
29:32:45,512 --> 29:32:49,832
using a pointer to the base class but
39869
29:32:47,759 --> 29:32:52,231
that pointer happens to be managing a
39870
29:32:49,831 --> 29:32:54,000
derived object this is going to give you
39871
29:32:52,232 --> 29:32:56,400
undefined behavior so you're not
39872
29:32:54,000 --> 29:32:58,160
guaranteed to get to the same behavior
39873
29:32:56,399 --> 29:33:00,159
on different compilers on different
39874
29:32:58,160 --> 29:33:02,552
operating systems so this is something
39875
29:33:00,160 --> 29:33:05,192
really bad we want all the destructors
39876
29:33:02,551 --> 29:33:08,319
in our inheritance hierarchy to be
39877
29:33:05,191 --> 29:33:10,319
called to properly release the memory
39878
29:33:08,320 --> 29:33:12,872
that would potentially be dynamically
39879
29:33:10,320 --> 29:33:14,872
allocated by each level in our
39880
29:33:12,872 --> 29:33:17,192
constructor calls the fix for this is
39881
29:33:14,872 --> 29:33:20,080
really simple all you have to do is mark
39882
29:33:17,191 --> 29:33:23,039
your destructors as virtual and the
39883
29:33:20,080 --> 29:33:24,232
compiler will call the most specific
39884
29:33:24,232 --> 29:33:29,760
for your classes so all we need to do is
39885
29:33:27,191 --> 29:33:31,911
go in and mark these guys as virtual so
39886
29:33:29,759 --> 29:33:33,759
we're going to do that the base class
39887
29:33:31,911 --> 29:33:35,831
destructor is going to be marked as
39888
29:33:33,759 --> 29:33:37,360
virtual we're going to go to feline and
39889
29:33:35,831 --> 29:33:39,591
do the same thing we're going to mark
39890
29:33:37,360 --> 29:33:40,479
that as virtual and we're going to go to
39891
29:33:40,479 --> 29:33:45,759
and mark its destructor as virtual we're
39892
29:33:43,512 --> 29:33:48,000
going to do something like this and now
39893
29:33:45,759 --> 29:33:49,679
notice we don't need to change any other
39894
29:33:48,000 --> 29:33:52,232
thing if we build our program we're
39895
29:33:49,679 --> 29:33:54,871
going to pass it through gcc it is going
39896
29:33:52,232 --> 29:33:57,760
to do exactly what we want because
39897
29:33:54,872 --> 29:34:00,000
now the compiler will resolve the calls
39898
29:33:57,759 --> 29:34:01,679
to the destructors polymorphically
39899
29:34:00,000 --> 29:34:03,831
because we are going through a base
39900
29:34:01,679 --> 29:34:05,831
pointer the compiler will call the most
39901
29:34:03,831 --> 29:34:07,911
specific implementation for this
39902
29:34:05,831 --> 29:34:10,159
structure because we are going through a
39903
29:34:07,911 --> 29:34:12,399
base pointer to call the destructor here
39904
29:34:12,399 --> 29:34:16,871
the most specialized destructor we can
39905
29:34:15,440 --> 29:34:19,512
find and it is going to find the
39906
29:34:16,872 --> 29:34:21,760
destructor for duck which is going to be
39907
29:34:19,512 --> 29:34:24,479
the most specialized destructor we can
39908
29:34:21,759 --> 29:34:26,639
find in our inheritance hierarchy it is
39909
29:34:24,479 --> 29:34:29,512
going to call the dog destructor that's
39910
29:34:26,639 --> 29:34:32,000
going to go the destructor for feline in
39911
29:34:29,512 --> 29:34:34,400
turn and then that's going to call the
39912
29:34:32,000 --> 29:34:36,479
destructor for animal and our memory is
39913
29:34:34,399 --> 29:34:38,399
going to be released properly that's
39914
29:34:36,479 --> 29:34:40,800
what we're going to see here let's make
39915
29:34:38,399 --> 29:34:43,679
sure we weld this again because i'm not
39916
29:34:40,800 --> 29:34:45,192
sure if i actually built this the body
39917
29:34:43,679 --> 29:34:48,000
is going to be good anyway so we're
39918
29:34:45,191 --> 29:34:49,911
going to clear and run rooster now you
39919
29:34:48,000 --> 29:34:51,911
see that the duct destructor is called
39920
29:34:49,911 --> 29:34:53,679
the vlan destructor is called the animal
39921
29:34:51,911 --> 29:34:56,399
destructor is gold and everything is
39922
29:34:53,679 --> 29:34:58,799
just going to fall in place so my advice
39923
29:34:56,399 --> 29:35:01,759
if you are using virtual functions in
39924
29:34:58,800 --> 29:35:04,872
your inheritance hierarchy make sure you
39925
29:35:01,759 --> 29:35:06,799
also mark your destructors as virtual
39926
29:35:04,872 --> 29:35:09,592
this is going to save you future
39927
29:35:06,800 --> 29:35:11,440
headaches you might come in contact with
39928
29:35:09,592 --> 29:35:13,760
if you are using a base pointer to
39929
29:35:11,440 --> 29:35:15,760
manage a derived object and you are
39930
29:35:13,759 --> 29:35:18,231
doing some kind of dynamic memory
39931
29:35:15,759 --> 29:35:20,871
allocations in your constructors that's
39932
29:35:18,232 --> 29:35:23,360
going to release the memory properly if
39933
29:35:20,872 --> 29:35:26,160
you are releasing the memory through a
39934
29:35:23,360 --> 29:35:28,080
base pointer like we are doing on line 8
39935
29:35:26,160 --> 29:35:29,592
here this is really all i had to share
39936
29:35:28,080 --> 29:35:31,680
in this lecture i hope you found it
39937
29:35:29,592 --> 29:35:33,360
interesting we are going to stop here in
39938
29:35:31,679 --> 29:35:36,159
this one in the next one we're going to
39939
29:35:36,160 --> 29:35:40,232
go ahead and finish up here and meet me
39940
29:35:38,399 --> 29:35:43,039
there in this lecture we're going to
39941
29:35:40,232 --> 29:35:45,680
learn about dynamic casts and the
39942
29:35:43,039 --> 29:35:47,119
dynamic casts are a facility we have in
39943
29:35:47,119 --> 29:35:54,000
to do downstream transformations
39944
29:35:54,000 --> 29:35:59,440
so if we have a base planer for example
39945
29:35:56,399 --> 29:36:01,759
we can transform it to a derived type
39946
29:35:59,440 --> 29:36:04,479
and be able to use it like we use any
39947
29:36:01,759 --> 29:36:06,479
row object for example if we do this
39948
29:36:04,479 --> 29:36:09,191
kind of transformation we will be able
39949
29:36:06,479 --> 29:36:12,800
to call non-polymorphic functions and
39950
29:36:09,191 --> 29:36:14,720
this may come in handy sometimes
39951
29:36:12,800 --> 29:36:17,440
this is the hierarchy we will be using
39952
29:36:14,720 --> 29:36:19,592
our top class will be animal here we
39953
29:36:17,440 --> 29:36:21,760
will derive from this and create our
39954
29:36:19,592 --> 29:36:25,360
feline class and we will be live from
39955
29:36:21,759 --> 29:36:27,511
feline and create our dog class here if
39956
29:36:25,360 --> 29:36:29,911
we have a base pointer pointing to a
39957
29:36:27,512 --> 29:36:32,232
dark object for example the most
39958
29:36:29,911 --> 29:36:35,360
specialized class we can have in our
39959
29:36:32,232 --> 29:36:39,120
inheritance hierarchy sometimes we might
39960
29:36:35,360 --> 29:36:42,399
want to transform from this base pointer
39961
29:36:39,119 --> 29:36:45,440
to the most derived object here and get
39962
29:36:42,399 --> 29:36:47,591
to the direct most derived object that
39963
29:36:45,440 --> 29:36:50,080
we can really call anything on if you
39964
29:36:47,592 --> 29:36:52,800
remember with a base planer like animal
39965
29:36:50,080 --> 29:36:53,680
here the only thing we can do is really
39966
29:36:53,679 --> 29:36:58,799
polymorphic or virtual functions but
39967
29:36:56,720 --> 29:37:01,040
sometimes we want to do much more than
39968
29:36:58,800 --> 29:37:03,040
this for example if we want to call
39969
29:37:01,039 --> 29:37:04,871
non-polymorphic functions this is not
39970
29:37:03,039 --> 29:37:07,279
going to work because the best pointer
39971
29:37:04,872 --> 29:37:09,911
has no knowledge of those functions so
39972
29:37:07,279 --> 29:37:12,319
if we need to do that explicitly
39973
29:37:09,911 --> 29:37:14,551
transforming from a base pointer to a
39974
29:37:12,320 --> 29:37:17,512
derived pointer is going to give us that
39975
29:37:14,551 --> 29:37:20,551
capability if the actual object we are
39976
29:37:17,512 --> 29:37:22,551
pointing at happens to have that method
39977
29:37:20,551 --> 29:37:24,231
okay so this is what we are after in
39978
29:37:22,551 --> 29:37:27,360
this lecture we want to be able to
39979
29:37:24,232 --> 29:37:30,080
transform from a base class pointer
39980
29:37:27,360 --> 29:37:32,639
or reference to a derived class pointer
39981
29:37:30,080 --> 29:37:34,872
or reference at runtime another way you
39982
29:37:32,639 --> 29:37:37,759
can text this is to think of the base
39983
29:37:34,872 --> 29:37:40,232
class pointer or reference as input and
39984
29:37:37,759 --> 29:37:43,191
we want to get a derived class pointer
39985
29:37:40,232 --> 29:37:45,592
or reference as output in our c plus
39986
29:37:43,191 --> 29:37:47,551
plus program and the main benefit of
39987
29:37:45,592 --> 29:37:50,400
this is to be able to call
39988
29:37:47,551 --> 29:37:52,551
non-polymorphic methods on derived
39989
29:37:50,399 --> 29:37:55,511
pointers or references this is going to
39990
29:37:52,551 --> 29:37:58,399
be super cool in some cases okay so
39991
29:37:55,512 --> 29:38:00,400
let's look at our inheritance hierarchy
39992
29:37:58,399 --> 29:38:02,551
here the top class is going to be animal
39993
29:38:00,399 --> 29:38:04,959
as you see here it's going to have a
39994
29:38:02,551 --> 29:38:06,959
single virtual method it's going to also
39995
29:38:04,960 --> 29:38:09,360
have a virtual disruptor because we know
39996
29:38:06,960 --> 29:38:11,680
how to do this now we can derive from
39997
29:38:09,360 --> 29:38:12,872
this and create our filling class which
39998
29:38:12,872 --> 29:38:17,192
inheriting publicly it's going to have
39999
29:38:15,039 --> 29:38:19,831
its own run method and it's going to
40000
29:38:17,191 --> 29:38:22,159
declare its own other method which is
40001
29:38:19,831 --> 29:38:25,191
not virtual we can also derive from
40002
29:38:22,160 --> 29:38:27,440
feline and create a dog class this is
40003
29:38:25,191 --> 29:38:29,759
how we do this and we're going to set up
40004
29:38:27,440 --> 29:38:31,760
our own virtual method in dog which is
40005
29:38:29,759 --> 29:38:34,080
going to be bark and we can really do
40006
29:38:31,759 --> 29:38:35,759
anything we want with this inheritance
40007
29:38:34,080 --> 29:38:38,160
hierarchy okay what we're going to be
40008
29:38:35,759 --> 29:38:40,479
using as input is a base class pointer
40009
29:38:38,160 --> 29:38:43,512
or a base class reference and we set
40010
29:38:40,479 --> 29:38:45,759
them up here this is our base pointer
40011
29:38:43,512 --> 29:38:48,720
this is our base reference and we want
40012
29:38:45,759 --> 29:38:51,279
to go from these and create a derived
40013
29:38:48,720 --> 29:38:52,960
class pointer or reference that we can
40014
29:38:52,960 --> 29:38:58,232
non-polymorphic functions and we can
40015
29:38:55,360 --> 29:38:59,911
achieve that using dynamic casts here
40016
29:38:58,232 --> 29:39:02,639
we're going to show you how you can cast
40017
29:38:59,911 --> 29:39:06,551
pointers again our animal base pointer
40018
29:39:02,639 --> 29:39:08,639
is going to act as our input and the
40019
29:39:06,551 --> 29:39:11,119
output is going to be what we want to
40020
29:39:08,639 --> 29:39:13,759
get out of this transformation
40021
29:39:11,119 --> 29:39:17,191
and all we do is say dynamic cast we
40022
29:39:13,759 --> 29:39:18,871
specify a pair of angle brackets inside
40023
29:39:17,191 --> 29:39:21,191
we're going to specify the output we
40024
29:39:18,872 --> 29:39:24,000
want to get and this is usually going to
40025
29:39:21,191 --> 29:39:25,911
be a derived class pointer so the base
40026
29:39:24,000 --> 29:39:28,000
class pointer is going to be within this
40027
29:39:25,911 --> 29:39:29,831
parenthesis and and it's going to be our
40028
29:39:28,000 --> 29:39:31,679
output and this is going to do the
40029
29:39:29,831 --> 29:39:34,231
transformation and it's going to give us
40030
29:39:31,679 --> 29:39:37,439
a result that we're going to be storing
40031
29:39:34,232 --> 29:39:41,192
in our feline pointer here and if this
40032
29:39:37,440 --> 29:39:44,040
succeeds we will have a valid feline
40033
29:39:41,191 --> 29:39:47,440
pointer here and we can use it to call
40034
29:39:44,039 --> 29:39:49,439
non-polymorphic or non-virtual functions
40035
29:39:47,440 --> 29:39:51,512
like we are doing here and this is super
40036
29:39:49,440 --> 29:39:53,911
cool another thing you can do with this
40037
29:39:51,512 --> 29:39:56,479
is use the result of this transformation
40038
29:39:53,911 --> 29:39:58,800
in a pointer check for example we can
40039
29:39:56,479 --> 29:40:01,039
check and see if this pointer is not a
40040
29:39:58,800 --> 29:40:03,592
null pointer if it's not a null pointer
40041
29:40:01,039 --> 29:40:06,399
we can call our non-polymorphic function
40042
29:40:03,592 --> 29:40:08,960
to it the result was successful but if
40043
29:40:06,399 --> 29:40:11,191
it's no pointer we're going to fail and
40044
29:40:08,960 --> 29:40:14,400
fall down here and we can say that we
40045
29:40:11,191 --> 29:40:16,231
couldn't cast to a feeling pointer and
40046
29:40:16,232 --> 29:40:22,872
how can this transformation fail well if
40047
29:40:19,440 --> 29:40:25,191
we go back to our code here we have an
40048
29:40:22,872 --> 29:40:28,551
animal base pointer which is really
40049
29:40:25,191 --> 29:40:31,360
pointing to a feline object in memory
40050
29:40:28,551 --> 29:40:32,720
if we try and cast this animal pointer
40051
29:40:32,720 --> 29:40:37,119
suppose we want to do this kind of
40052
29:40:34,831 --> 29:40:38,799
transformation try to think about this
40053
29:40:37,119 --> 29:40:41,039
this is not going to work because we
40054
29:40:38,800 --> 29:40:43,512
really have no dog information in this
40055
29:40:41,039 --> 29:40:45,911
villain object and if we try to cast
40056
29:40:43,512 --> 29:40:47,680
this to dog the compiler will really
40057
29:40:45,911 --> 29:40:50,639
have no way to do this and the
40058
29:40:47,679 --> 29:40:53,911
transformation through dynamic cast will
40059
29:40:50,639 --> 29:40:55,279
fail and we will say the message here
40060
29:40:53,911 --> 29:40:58,080
meaning that we couldn't do the
40061
29:40:55,279 --> 29:41:00,232
transformation the user asked for so
40062
29:40:58,080 --> 29:41:02,720
here we can do the transformation and
40063
29:41:00,232 --> 29:41:04,960
transform from a base pointer to a
40064
29:41:02,720 --> 29:41:07,592
derived pointer but we can also
40065
29:41:04,960 --> 29:41:09,592
transform to a derived reference and i
40066
29:41:07,592 --> 29:41:11,592
am going to show you the syntax to do
40067
29:41:09,592 --> 29:41:14,552
that and it is super simple we say
40068
29:41:11,592 --> 29:41:15,680
dynamic cast and we specify our input
40069
29:41:15,679 --> 29:41:20,639
notice that this is a reference you have
40070
29:41:17,440 --> 29:41:23,680
to put it it's not a pointer and you
40071
29:41:20,639 --> 29:41:26,000
specify the output within this angle
40072
29:41:23,679 --> 29:41:28,231
brackets here once you do this the
40073
29:41:26,000 --> 29:41:30,399
output of this is going to be a derived
40074
29:41:28,232 --> 29:41:33,760
reference and we're going to store this
40075
29:41:30,399 --> 29:41:35,191
in our feline reference here once we do
40076
29:41:35,191 --> 29:41:39,119
transformation is successful we're going
40077
29:41:36,960 --> 29:41:41,512
to be able to call our non-polymorphic
40078
29:41:39,119 --> 29:41:43,679
function this is going to work but with
40079
29:41:41,512 --> 29:41:45,512
references we don't have the luxury to
40080
29:41:43,679 --> 29:41:47,911
do something like a pointer check
40081
29:41:45,512 --> 29:41:50,400
because there is no such thing as a null
40082
29:41:47,911 --> 29:41:51,759
reference a reference is always pointing
40083
29:41:51,759 --> 29:41:56,720
and if the transformation fails we will
40084
29:41:54,080 --> 29:41:58,720
have some kind of invalid reference and
40085
29:41:56,720 --> 29:42:01,360
if this fails it is probably going to
40086
29:41:58,720 --> 29:42:03,831
blow up and give us undefined behavior
40087
29:42:01,360 --> 29:42:06,399
so you don't really want to do this i
40088
29:42:06,399 --> 29:42:10,799
doing this kind of transformation with
40089
29:42:08,551 --> 29:42:12,959
references unless you know
40090
29:42:10,800 --> 29:42:15,760
that the transformation is possible
40091
29:42:12,960 --> 29:42:16,800
beforehand what i usually recommend is
40092
29:42:16,800 --> 29:42:21,360
pass through pointers and it is even
40093
29:42:18,960 --> 29:42:24,552
possible to transform a base reference
40094
29:42:21,360 --> 29:42:27,191
into a derived pointer and the syntax to
40095
29:42:24,551 --> 29:42:30,479
do that is what you see here okay and uh
40096
29:42:27,191 --> 29:42:32,399
once we do a transformation to a pointer
40097
29:42:30,479 --> 29:42:34,080
if the transformation is successful
40098
29:42:32,399 --> 29:42:36,399
we're going to have a valid pointer in
40099
29:42:34,080 --> 29:42:38,400
here if the transformation fails we're
40100
29:42:36,399 --> 29:42:40,959
going to have a null pointer and the
40101
29:42:38,399 --> 29:42:43,279
check is going to draw us here and we're
40102
29:42:40,960 --> 29:42:45,680
going to print this message to say that
40103
29:42:43,279 --> 29:42:48,551
we can't do the transformation here okay
40104
29:42:45,679 --> 29:42:50,719
again the cast may fail if it fails
40105
29:42:48,551 --> 29:42:52,800
while we are trying to transform it to a
40106
29:42:50,720 --> 29:42:55,592
dog pointer we are going to fall down
40107
29:42:52,800 --> 29:42:56,960
here and say that the cast failed we can
40108
29:42:55,592 --> 29:42:59,120
also do the same thing through
40109
29:42:56,960 --> 29:43:01,120
references for example if we want to
40110
29:42:59,119 --> 29:43:02,871
transform this base reference to a
40111
29:43:02,872 --> 29:43:06,800
and this fails we're going to follow
40112
29:43:04,720 --> 29:43:08,720
here because of the check we are doing
40113
29:43:06,800 --> 29:43:11,512
here we can do something like this to
40114
29:43:08,720 --> 29:43:13,191
make our code much safer to work with
40115
29:43:11,512 --> 29:43:15,440
and another thing i should really point
40116
29:43:15,440 --> 29:43:20,720
casting like this is usually done in
40117
29:43:17,911 --> 29:43:22,831
functions where you are passing a base
40118
29:43:20,720 --> 29:43:25,831
pointer or a base reference as a
40119
29:43:22,831 --> 29:43:28,551
parameter and in this function you
40120
29:43:25,831 --> 29:43:30,479
somehow need to call a non-polymorphic
40121
29:43:28,551 --> 29:43:32,231
function so you might do something like
40122
29:43:30,479 --> 29:43:34,639
this and take the pointer and turn that
40123
29:43:32,232 --> 29:43:36,080
into a derived pointer and if the
40124
29:43:34,639 --> 29:43:37,911
transformation is successful you're
40125
29:43:36,080 --> 29:43:39,680
going to call your method and if the
40126
29:43:37,911 --> 29:43:42,000
check fails you're going to follow here
40127
29:43:39,679 --> 29:43:44,319
and print an error message you can do
40128
29:43:42,000 --> 29:43:46,720
something like this with pointers and we
40129
29:43:44,320 --> 29:43:48,872
can do exactly the same thing with
40130
29:43:46,720 --> 29:43:51,119
references but here because we want to
40131
29:43:48,872 --> 29:43:53,512
do this check we're going to transform
40132
29:43:51,119 --> 29:43:55,911
our base reference into a derived
40133
29:43:53,512 --> 29:43:58,080
pointer and call our method on the
40134
29:43:55,911 --> 29:44:00,232
derived pointer instead this is going to
40135
29:43:58,080 --> 29:44:03,119
give us the ability to do this kind of
40136
29:44:00,232 --> 29:44:05,360
check to make our code much safer to
40137
29:44:03,119 --> 29:44:08,399
work with a word of caution here
40138
29:44:05,360 --> 29:44:10,872
overusing down casting is a sign of bad
40139
29:44:08,399 --> 29:44:12,639
design if you find yourself doing this
40140
29:44:10,872 --> 29:44:15,192
kind of thing a lot to call
40141
29:44:12,639 --> 29:44:16,960
non-polymorphic function that's maybe a
40142
29:44:15,191 --> 29:44:18,959
sign that you should make that
40143
29:44:18,960 --> 29:44:22,400
polymorphic because that's going to save
40144
29:44:22,399 --> 29:44:27,911
transformations a lot just make sure you
40145
29:44:24,720 --> 29:44:30,160
don't overuse this and do it in a few
40146
29:44:27,911 --> 29:44:31,679
cases where you really need to do this
40147
29:44:30,160 --> 29:44:33,040
kind of thing now that you know this
40148
29:44:31,679 --> 29:44:34,871
we're going to head over to visual
40149
29:44:33,039 --> 29:44:37,679
studio code and play with us a little
40150
29:44:34,872 --> 29:44:40,080
more here we are in our working folder
40151
29:44:37,679 --> 29:44:43,191
the current project is dynamic casts
40152
29:44:40,080 --> 29:44:44,639
we're going to grab our template files
40153
29:44:43,191 --> 29:44:46,871
and we're going to put them in place
40154
29:44:44,639 --> 29:44:49,440
let's do that and we are going to grab
40155
29:44:46,872 --> 29:44:51,592
the files that make up our inheritance
40156
29:44:49,440 --> 29:44:54,720
hierarchy we're going to put those in we
40157
29:44:51,592 --> 29:44:56,872
have animal dog and feline and this is
40158
29:44:54,720 --> 29:44:59,191
going to make up our inheritance
40159
29:44:56,872 --> 29:45:00,872
hierarchy here once we have this in
40160
29:44:59,191 --> 29:45:02,720
place we can open this up in visual
40161
29:45:00,872 --> 29:45:04,960
studio code by dragging and dropping
40162
29:45:02,720 --> 29:45:07,759
here and this is going to give us our
40163
29:45:04,960 --> 29:45:10,080
files okay we have our files in here we
40164
29:45:07,759 --> 29:45:12,319
can open up the animal class which is
40165
29:45:10,080 --> 29:45:14,000
our base class we can see that it is
40166
29:45:12,320 --> 29:45:16,160
really simple it's just going to have
40167
29:45:14,000 --> 29:45:18,399
one virtual method which is brief it's
40168
29:45:16,160 --> 29:45:20,720
going to have a single member variable
40169
29:45:18,399 --> 29:45:22,720
which is description here we can derive
40170
29:45:20,720 --> 29:45:24,960
from this and create our feline class
40171
29:45:22,720 --> 29:45:28,320
which is going to inherit publicly from
40172
29:45:24,960 --> 29:45:30,400
animal feline is going to set up its own
40173
29:45:30,399 --> 29:45:34,799
and we will have a virtual method called
40174
29:45:32,399 --> 29:45:37,191
run we can override in downstream
40175
29:45:34,800 --> 29:45:39,680
classes if we want to do that and let's
40176
29:45:37,191 --> 29:45:41,679
look at the implementation for feline
40177
29:45:39,679 --> 29:45:43,359
cpp if you want to do that you can take
40178
29:45:41,679 --> 29:45:46,479
a look it's just going to forward the
40179
29:45:43,360 --> 29:45:48,551
construction to the base class to build
40180
29:45:48,551 --> 29:45:52,399
let's look at dog dog is going to
40181
29:45:50,399 --> 29:45:55,039
inherit from feline and it is going to
40182
29:45:52,399 --> 29:45:56,799
set up a simple virtual function called
40183
29:45:55,039 --> 29:45:58,479
work and it's going to have a virtual
40184
29:45:56,800 --> 29:45:59,760
destructor now we know that we should
40185
29:45:59,759 --> 29:46:04,959
virtual disruptors if we happen to even
40186
29:46:02,232 --> 29:46:06,800
have a single virtual method in our
40187
29:46:04,960 --> 29:46:09,680
inheritance hierarchy because that's
40188
29:46:06,800 --> 29:46:12,720
going to make events easier now we want
40189
29:46:09,679 --> 29:46:14,871
to go to the main cpp file and play with
40190
29:46:12,720 --> 29:46:17,040
dynamic casts we're going to remove
40191
29:46:14,872 --> 29:46:19,440
whatever it is we don't need here and
40192
29:46:17,039 --> 29:46:22,399
that we can include our most derived
40193
29:46:19,440 --> 29:46:24,720
class let's include doug here this is
40194
29:46:24,720 --> 29:46:30,000
both feline and animal because this
40195
29:46:27,592 --> 29:46:32,160
header is going to include its parent
40196
29:46:30,000 --> 29:46:34,872
and its parent is going to include its
40197
29:46:32,160 --> 29:46:37,832
own parent this is the logic here we are
40198
29:46:34,872 --> 29:46:39,680
going to start out by using a simple
40199
29:46:37,831 --> 29:46:42,959
example here and show you that you can't
40200
29:46:39,679 --> 29:46:45,439
really call non-polymorphic functions
40201
29:46:42,960 --> 29:46:48,400
from a base pointer that is managing the
40202
29:46:45,440 --> 29:46:51,119
derived object and here we have an
40203
29:46:48,399 --> 29:46:54,799
animal pointer it is a base pointer and
40204
29:46:51,119 --> 29:46:57,279
it is managing a real feline object in
40205
29:46:54,800 --> 29:46:59,512
memory but if we try and call a
40206
29:46:57,279 --> 29:47:01,911
non-virtual function through this base
40207
29:46:59,512 --> 29:47:04,320
pointer this is going to blow up this is
40208
29:47:04,320 --> 29:47:08,800
we can't really call a non-polymorphic
40209
29:47:06,479 --> 29:47:10,800
function through a base pointer because
40210
29:47:08,800 --> 29:47:12,800
that's not a virtual function the
40211
29:47:10,800 --> 29:47:15,760
requirement to be able to do this is for
40212
29:47:12,800 --> 29:47:18,639
the function to be virtual and do some
40213
29:47:15,759 --> 29:47:20,959
feeling thingy is not a virtual function
40214
29:47:18,639 --> 29:47:22,960
that we know at the base level so this
40215
29:47:20,960 --> 29:47:24,552
is not going to work by default and if
40216
29:47:22,960 --> 29:47:26,080
we're trying to build code like this
40217
29:47:24,551 --> 29:47:28,872
this is going to give us a compiler
40218
29:47:26,080 --> 29:47:31,191
error let's pass this through gcc we're
40219
29:47:28,872 --> 29:47:33,192
going to do that we are going to finish
40220
29:47:31,191 --> 29:47:35,512
the world with errors and if we go up
40221
29:47:33,191 --> 29:47:38,000
we're going to find that class animal
40222
29:47:35,512 --> 29:47:39,911
has no member name to do some feline
40223
29:47:38,000 --> 29:47:42,232
thingy so this is the compiler error
40224
29:47:39,911 --> 29:47:44,232
here this is not going to work if we
40225
29:47:42,232 --> 29:47:47,192
need to do something like this one
40226
29:47:44,232 --> 29:47:48,960
solution might be to do dynamic casts
40227
29:47:47,191 --> 29:47:51,039
that we are learning about in this
40228
29:47:48,960 --> 29:47:53,832
lecture here and the syntax is
40229
29:47:51,039 --> 29:47:56,399
ridiculously simple so we can go down
40230
29:47:53,831 --> 29:47:58,720
here and put in a simple separator to be
40231
29:47:56,399 --> 29:48:00,959
able to follow this lens on our
40232
29:47:58,720 --> 29:48:03,440
powershell window you can do this if you
40233
29:48:00,960 --> 29:48:06,552
want and we're going to do our dynamic
40234
29:48:03,440 --> 29:48:09,360
cast for example if we wanted to do a
40235
29:48:06,551 --> 29:48:12,319
transformation and transform this to a
40236
29:48:09,360 --> 29:48:14,160
dark object this would give us a problem
40237
29:48:12,320 --> 29:48:16,720
and let's try and look at this again we
40238
29:48:14,160 --> 29:48:19,192
have a feline object here and we are
40239
29:48:16,720 --> 29:48:21,279
managing this through a base pointer and
40240
29:48:19,191 --> 29:48:23,679
what we want to do is to take this space
40241
29:48:23,679 --> 29:48:28,079
a dog object if you look at this
40242
29:48:26,232 --> 29:48:30,400
remember that we don't really have any
40243
29:48:28,080 --> 29:48:32,479
dog information in our feline object
40244
29:48:30,399 --> 29:48:35,191
this is going to just go up to the level
40245
29:48:32,479 --> 29:48:37,591
of feline but we want to transform this
40246
29:48:35,191 --> 29:48:40,551
to a dog to make this super clear let's
40247
29:48:37,592 --> 29:48:43,279
look at our inheritance hierarchy again
40248
29:48:40,551 --> 29:48:45,360
what we have is a feline object and the
40249
29:48:43,279 --> 29:48:46,399
information we have really goes up to
40250
29:48:46,399 --> 29:48:50,799
and we are managing our feeling object
40251
29:48:48,551 --> 29:48:52,639
through a base pointer this is the setup
40252
29:48:50,800 --> 29:48:54,720
we have but we want to do the
40253
29:48:52,639 --> 29:48:57,831
transformation and turn this base
40254
29:48:54,720 --> 29:49:00,080
pointer into a dog object and this is
40255
29:48:57,831 --> 29:49:02,639
going to blow up especially if we have
40256
29:49:00,080 --> 29:49:04,232
any dog specific member variables this
40257
29:49:02,639 --> 29:49:06,960
is going to blow up this is not going to
40258
29:49:04,232 --> 29:49:07,832
work if we try to access dog information
40259
29:49:07,831 --> 29:49:11,911
what we get through the transformation
40260
29:49:09,831 --> 29:49:13,439
to animal to dog we're going to get a
40261
29:49:11,911 --> 29:49:15,279
crush because we have no such
40262
29:49:13,440 --> 29:49:17,592
information and we're going to look at a
40263
29:49:15,279 --> 29:49:19,592
simple example to really drive this home
40264
29:49:17,592 --> 29:49:21,592
so what we're going to do is go back to
40265
29:49:19,592 --> 29:49:23,440
our dog class and we're going to put in
40266
29:49:21,592 --> 29:49:26,000
a sample member variable we're going to
40267
29:49:23,440 --> 29:49:28,400
make it private and for example we can
40268
29:49:26,000 --> 29:49:30,399
make this a member variable to keep
40269
29:49:28,399 --> 29:49:32,551
track of the speed for the dock we can
40270
29:49:30,399 --> 29:49:34,399
do this and we're going to initialize
40271
29:49:32,551 --> 29:49:36,800
this to 0 by default and we're going to
40272
29:49:34,399 --> 29:49:39,511
set up a function which is going to
40273
29:49:36,800 --> 29:49:42,080
print some dog information let's go back
40274
29:49:39,512 --> 29:49:44,639
to feline and copy the do some feline
40275
29:49:42,080 --> 29:49:47,119
thingy method and we're going to do some
40276
29:49:44,639 --> 29:49:48,960
dog thingy that's what we're going to do
40277
29:49:47,119 --> 29:49:51,039
here i am going to put in this method
40278
29:49:48,960 --> 29:49:53,760
and adapt it a little bit we're going to
40279
29:49:51,039 --> 29:49:56,551
do some dog thingy and we're going to
40280
29:49:53,759 --> 29:49:58,551
account for that in the body but we also
40281
29:49:56,551 --> 29:50:00,639
want to print the speed for this dog
40282
29:49:58,551 --> 29:50:03,039
here so we're going to say speed and
40283
29:50:00,639 --> 29:50:05,039
we're going to print this out suppose we
40284
29:50:03,039 --> 29:50:07,831
have this kind of setup in our
40285
29:50:05,039 --> 29:50:10,079
inheritance hierarchy here a dark object
40286
29:50:07,831 --> 29:50:12,080
has some doubt specific information it
40287
29:50:10,080 --> 29:50:14,400
has an additional member variable which
40288
29:50:12,080 --> 29:50:16,320
is m speed here we won't worry about
40289
29:50:14,399 --> 29:50:17,911
initializing this from the constructor
40290
29:50:16,320 --> 29:50:21,360
you can do that if you want all we
40291
29:50:17,911 --> 29:50:23,360
really want is to add some extra data at
40292
29:50:21,360 --> 29:50:25,759
the dog level and we're going to see
40293
29:50:23,360 --> 29:50:27,911
that if we try to transform to doug this
40294
29:50:25,759 --> 29:50:30,720
is going to give us a few problems so
40295
29:50:27,911 --> 29:50:33,279
what we want is to turn this animal base
40296
29:50:30,720 --> 29:50:34,399
pointer into a dark object let's do this
40297
29:50:34,399 --> 29:50:39,679
change this to dog and the result object
40298
29:50:37,279 --> 29:50:41,759
we get is going to be a dog pointer and
40299
29:50:43,911 --> 29:50:48,551
method on the pointer we get as a result
40300
29:50:46,479 --> 29:50:50,159
of this transformation here let's see
40301
29:50:48,551 --> 29:50:51,679
what happens you're going to see that
40302
29:50:50,160 --> 29:50:53,760
this is not going to give us any
40303
29:50:51,679 --> 29:50:56,319
indication that we are doing something
40304
29:50:53,759 --> 29:50:59,191
wrong but if the transformation here
40305
29:50:56,320 --> 29:51:01,912
fails this is going to silently fail and
40306
29:50:59,191 --> 29:51:04,000
store junk data in our feline pointer
40307
29:51:01,911 --> 29:51:07,191
here and here we're going to try and
40308
29:51:04,000 --> 29:51:10,000
call a method that is going to possibly
40309
29:51:07,191 --> 29:51:12,231
use some dog stuff on the feline object
40310
29:51:10,000 --> 29:51:14,320
this is going to blow up again we don't
40311
29:51:12,232 --> 29:51:16,639
have dog information in this feline
40312
29:51:14,320 --> 29:51:18,552
object and the do some dog thinking
40313
29:51:16,639 --> 29:51:21,039
method is going to try and print the
40314
29:51:18,551 --> 29:51:23,360
speed of the dog that we don't really
40315
29:51:21,039 --> 29:51:26,159
have we don't have any dog information
40316
29:51:23,360 --> 29:51:28,232
so we have no business accessing dog
40317
29:51:26,160 --> 29:51:30,160
information from this object to start
40318
29:51:28,232 --> 29:51:32,160
with so this is going to blow up and
40319
29:51:30,160 --> 29:51:34,080
it's probably going to give us a crash
40320
29:51:32,160 --> 29:51:35,760
let's try and build and see what happens
40321
29:51:34,080 --> 29:51:37,759
we're going to pass this through gcc
40322
29:51:35,759 --> 29:51:40,000
like we always do the boat is going to
40323
29:51:37,759 --> 29:51:43,360
go through you see that this is going to
40324
29:51:40,000 --> 29:51:45,440
even blow up at run time when users are
40325
29:51:43,360 --> 29:51:48,080
actually using your application this is
40326
29:51:45,440 --> 29:51:50,080
super dangerous we're going to run this
40327
29:51:48,080 --> 29:51:51,911
and see what happens you see doing some
40328
29:51:50,080 --> 29:51:54,160
dug thingy and it's going to try and
40329
29:51:51,911 --> 29:51:56,232
print the speed the compiler is really
40330
29:51:54,160 --> 29:51:59,440
trying its best but this is really going
40331
29:51:56,232 --> 29:52:02,480
to fail and we are crashing our program
40332
29:51:59,440 --> 29:52:05,119
if you go down here and say done to make
40333
29:52:02,479 --> 29:52:07,191
sure we know when the program is done
40334
29:52:05,119 --> 29:52:09,279
and we try and run our program again
40335
29:52:07,191 --> 29:52:11,679
let's pass this through gcc to take into
40336
29:52:09,279 --> 29:52:12,959
account this thing we have on line 20.
40337
29:52:11,679 --> 29:52:14,871
the book is going to be good you're
40338
29:52:12,960 --> 29:52:16,800
going to see that the computer is going
40339
29:52:14,872 --> 29:52:18,320
to try and really run this but it's
40340
29:52:16,800 --> 29:52:20,872
going to see that it doesn't really have
40341
29:52:18,320 --> 29:52:22,552
any dog information and the computer is
40342
29:52:20,872 --> 29:52:24,800
not going to succeed because we are
40343
29:52:22,551 --> 29:52:27,831
trying to access this dub specific
40344
29:52:24,800 --> 29:52:29,592
information really on a feline object so
40345
29:52:27,831 --> 29:52:30,399
we are going to get a crash again the
40346
29:52:30,399 --> 29:52:35,911
is that this dynamic casts can fail
40347
29:52:33,592 --> 29:52:38,800
and we need a better way to do some kind
40348
29:52:35,911 --> 29:52:41,360
of checks before we call our methods
40349
29:52:38,800 --> 29:52:43,192
here and we can do this by just using
40350
29:52:41,360 --> 29:52:45,512
the pointer we get from this
40351
29:52:43,191 --> 29:52:48,080
transformation here so we can say if
40352
29:52:45,512 --> 29:52:50,639
feline pointer and check and see if we
40353
29:52:48,080 --> 29:52:52,551
have some valid data in this villain
40354
29:52:50,639 --> 29:52:54,720
pointer and if that's the case we're
40355
29:52:52,551 --> 29:52:57,191
going to do whatever we want to do with
40356
29:52:54,720 --> 29:52:58,720
this pointer here okay so this is
40357
29:52:58,720 --> 29:53:03,512
and if the transformation fails we're
40358
29:53:01,191 --> 29:53:05,759
going to fall in this else block and we
40359
29:53:03,512 --> 29:53:08,479
can put some nice message here instead
40360
29:53:05,759 --> 29:53:11,191
of letting the user crash at runtime
40361
29:53:08,479 --> 29:53:13,119
this is much better in my opinion so
40362
29:53:11,191 --> 29:53:16,319
we're going to say couldn't do the
40363
29:53:13,119 --> 29:53:18,319
transformation from animal pointer to
40364
29:53:16,320 --> 29:53:20,640
dog pointer because we really have no
40365
29:53:18,320 --> 29:53:22,552
dog information and this base pointer
40366
29:53:20,639 --> 29:53:24,479
that we have here this is something we
40367
29:53:22,551 --> 29:53:27,679
can do so we're going to say sddc out
40368
29:53:24,479 --> 29:53:30,159
i'm going to say stdendl here and we're
40369
29:53:27,679 --> 29:53:31,511
going to see what happens let's build
40370
29:53:30,160 --> 29:53:33,440
hopefully we're not going to get the
40371
29:53:31,512 --> 29:53:35,832
crash because we are doing something
40372
29:53:33,440 --> 29:53:37,832
smarter now we are checking to see
40373
29:53:35,831 --> 29:53:40,479
if we have any dog information in this
40374
29:53:37,831 --> 29:53:42,720
pointer before we call some doubt
40375
29:53:40,479 --> 29:53:44,872
specific method on this pointer here
40376
29:53:42,720 --> 29:53:47,440
this is the beauty of this we're going
40377
29:53:44,872 --> 29:53:49,120
to clear and run rooster now you see
40378
29:53:47,440 --> 29:53:52,232
couldn't do the transformation from
40379
29:53:49,119 --> 29:53:54,959
animal to dog and our program is no
40380
29:53:52,232 --> 29:53:56,872
longer crashing it is ending properly
40381
29:53:54,960 --> 29:53:59,040
and this is much better this is what you
40382
29:53:56,872 --> 29:54:01,360
should aim for so again the
40383
29:53:59,039 --> 29:54:02,159
transformations here may fail
40384
29:54:02,160 --> 29:54:07,120
if we turn this back to doing v-line
40385
29:54:04,800 --> 29:54:08,639
transformation let's do feline pointer
40386
29:54:07,119 --> 29:54:11,512
we're going to change this to fill in
40387
29:54:08,639 --> 29:54:13,759
pointer again and we're going to do some
40388
29:54:11,512 --> 29:54:15,440
feline thing now we're going to bolt
40389
29:54:15,440 --> 29:54:18,800
we're going to bolt again and this is
40390
29:54:16,960 --> 29:54:20,872
going to build successfully and it is
40391
29:54:18,800 --> 29:54:23,360
going to probably do some filament
40392
29:54:20,872 --> 29:54:25,279
thingy the build is good we can clear
40393
29:54:23,360 --> 29:54:27,191
and run rooster this is going to work
40394
29:54:25,279 --> 29:54:30,160
just fine and our program is going to
40395
29:54:27,191 --> 29:54:32,159
end properly so here we just saw that we
40396
29:54:30,160 --> 29:54:35,040
could do a transformation from a base
40397
29:54:32,160 --> 29:54:37,279
pointer to a derived pointer and this is
40398
29:54:35,039 --> 29:54:40,000
going to work just fine we can also do
40399
29:54:37,279 --> 29:54:42,479
the transformation for references let's
40400
29:54:40,000 --> 29:54:44,479
say that here and we're going to go down
40401
29:54:42,479 --> 29:54:46,231
and put in a simple example to drive
40402
29:54:44,479 --> 29:54:48,319
this home we're going to have a feline
40403
29:54:46,232 --> 29:54:51,040
object we're going to set up a reference
40404
29:54:48,320 --> 29:54:52,960
to it and if we try and call a
40405
29:54:51,039 --> 29:54:55,039
non-virtual method on this base
40406
29:54:52,960 --> 29:54:56,232
reference this is going to blow up
40407
29:54:56,232 --> 29:55:01,279
the base class has no information about
40408
29:54:58,479 --> 29:55:03,119
this non-virtual method that we declare
40409
29:55:01,279 --> 29:55:05,512
at the feline level this is going to
40410
29:55:03,119 --> 29:55:06,639
blow up if we try to build our program
40411
29:55:05,512 --> 29:55:09,832
we're going to see that we get a
40412
29:55:06,639 --> 29:55:10,720
compiler error saying no such method
40413
29:55:10,720 --> 29:55:15,119
do some feeling thing we're going to see
40414
29:55:15,119 --> 29:55:20,799
this way at the animal level
40415
29:55:18,551 --> 29:55:24,080
this is the compiler error we get if we
40416
29:55:20,800 --> 29:55:26,320
try to call a non-virtual method through
40417
29:55:24,080 --> 29:55:29,440
a base reference that we have here this
40418
29:55:26,320 --> 29:55:32,320
is not going to work but we can also do
40419
29:55:29,440 --> 29:55:33,680
a dynamic cast and transform from a base
40420
29:55:33,679 --> 29:55:38,079
a derived reference and the syntax to do
40421
29:55:35,911 --> 29:55:39,039
that is really here we're going to set
40422
29:55:39,039 --> 29:55:43,119
derived reference in this case it's
40423
29:55:41,039 --> 29:55:45,191
going to be a feedline reference we're
40424
29:55:43,119 --> 29:55:47,759
going to initialize this with a dynamic
40425
29:55:45,191 --> 29:55:49,512
cast transformation and the result of
40426
29:55:47,759 --> 29:55:51,831
the cast is going to be used to
40427
29:55:49,512 --> 29:55:53,512
initialize this reference here and we're
40428
29:55:53,512 --> 29:55:58,160
a base reference and turning that into a
40429
29:55:56,399 --> 29:56:00,720
derived reference here this is the
40430
29:55:58,160 --> 29:56:03,440
syntax the output you desire is going to
40431
29:56:00,720 --> 29:56:05,279
be within this angle brackets and the
40432
29:56:03,440 --> 29:56:07,680
input is going to be through this
40433
29:56:05,279 --> 29:56:10,000
parenthesis here if this succeeds we
40434
29:56:07,679 --> 29:56:12,000
will be able to call our method here and
40435
29:56:10,000 --> 29:56:13,512
this is going to work just fine let's
40436
29:56:13,512 --> 29:56:18,872
we are going to put in a separator to be
40437
29:56:16,479 --> 29:56:22,872
able to follow these things let's put
40438
29:56:18,872 --> 29:56:24,400
that at line 24 here this is going to do
40439
29:56:22,872 --> 29:56:26,320
and we're going to try and build our
40440
29:56:24,399 --> 29:56:29,119
program we're going to pass this through
40441
29:56:26,320 --> 29:56:31,680
gcc the boat is good we can clear and
40442
29:56:29,119 --> 29:56:34,639
run rooster now we're going to see that
40443
29:56:31,679 --> 29:56:36,639
we are doing some filling thingy through
40444
29:56:34,639 --> 29:56:38,319
a reference and this is super cool we
40445
29:56:36,639 --> 29:56:40,960
can do this you can do this kind of
40446
29:56:38,320 --> 29:56:43,192
transformation here and at the end you
40447
29:56:40,960 --> 29:56:45,760
see that we are calling our destructors
40448
29:56:43,191 --> 29:56:48,319
on our objects and this is a good
40449
29:56:45,759 --> 29:56:50,720
reminder that we didn't properly release
40450
29:56:48,320 --> 29:56:51,760
the memory on this animal pointer that
40451
29:56:51,759 --> 29:56:56,551
so we are going to go down at the end of
40452
29:56:54,320 --> 29:56:58,872
the program and release that memory this
40453
29:56:56,551 --> 29:57:02,080
is good practice and hopefully you can
40454
29:56:58,872 --> 29:57:04,551
see how easy it is to forget to release
40455
29:57:02,080 --> 29:57:06,720
some memory that you allocate for
40456
29:57:04,551 --> 29:57:08,959
with the new operator this is a good
40457
29:57:06,720 --> 29:57:10,720
learning experience here but this is a
40458
29:57:08,960 --> 29:57:12,232
good learning experience here but we're
40459
29:57:10,720 --> 29:57:13,911
going to fix this problem we're going to
40460
29:57:12,232 --> 29:57:16,320
say animal one and we're going to
40461
29:57:13,911 --> 29:57:18,080
release the memory now if we run the
40462
29:57:16,320 --> 29:57:21,680
program we're going to see that we are
40463
29:57:18,080 --> 29:57:23,911
releasing two objects when the program
40464
29:57:21,679 --> 29:57:25,759
ends we're going to clear and run
40465
29:57:23,911 --> 29:57:28,720
rooster and the destructor is going to
40466
29:57:25,759 --> 29:57:30,871
be called two times once for this guy
40467
29:57:28,720 --> 29:57:33,680
and a second for this guy this is what
40468
29:57:30,872 --> 29:57:36,400
we want and you see that because we have
40469
29:57:33,679 --> 29:57:39,191
virtual destructors in our classes we
40470
29:57:36,399 --> 29:57:41,591
are destroying at each level so here we
40471
29:57:39,191 --> 29:57:43,759
are destroying at the feline level and
40472
29:57:41,592 --> 29:57:46,080
we are destroying at the animal level
40473
29:57:43,759 --> 29:57:48,399
and this is going to properly release
40474
29:57:46,080 --> 29:57:50,479
the memory from our inheritance
40475
29:57:48,399 --> 29:57:52,959
hierarchy here so now you know that you
40476
29:57:50,479 --> 29:57:54,959
can do a transformation of references
40477
29:57:54,960 --> 29:58:00,000
but with dynamic cast we have no way to
40478
29:57:57,592 --> 29:58:03,040
check and see if the transformation was
40479
29:58:00,000 --> 29:58:05,440
successful again if we try to turn this
40480
29:58:03,039 --> 29:58:07,511
into a dark reference we can do that and
40481
29:58:05,440 --> 29:58:10,551
we're going to say dog reference here
40482
29:58:07,512 --> 29:58:13,119
and we will try and call the do some
40483
29:58:10,551 --> 29:58:14,872
duck thingy method this is not going to
40484
29:58:13,119 --> 29:58:17,119
give us an indication of a problem but
40485
29:58:14,872 --> 29:58:18,800
this is going to crash at runtime
40486
29:58:17,119 --> 29:58:20,399
because we don't really have any dog
40487
29:58:20,399 --> 29:58:25,759
original feline object here so if you
40488
29:58:23,360 --> 29:58:28,080
try and transform this reference into a
40489
29:58:25,759 --> 29:58:29,911
dog reference this is obviously not
40490
29:58:28,080 --> 29:58:32,232
going to work because we have no dog
40491
29:58:29,911 --> 29:58:34,800
information in this to start with let's
40492
29:58:32,232 --> 29:58:37,120
boil and show you the problem the book
40493
29:58:34,800 --> 29:58:39,680
is going to be good so we can clear
40494
29:58:37,119 --> 29:58:41,831
and run rooster you're going to see that
40495
29:58:39,679 --> 29:58:44,319
we are going to terminate our program
40496
29:58:41,831 --> 29:58:46,231
with the band cast and this is going to
40497
29:58:44,320 --> 29:58:48,960
crush you see that we don't get to the
40498
29:58:46,232 --> 29:58:50,639
point where we print done and we are not
40499
29:58:48,960 --> 29:58:52,480
even going to get a chance to release
40500
29:58:50,639 --> 29:58:54,720
the memory that we have allocated in
40501
29:58:52,479 --> 29:58:56,872
this main function hopefully you can see
40502
29:58:54,720 --> 29:58:59,279
that this is really bad so with
40503
29:58:59,279 --> 29:59:04,800
to check and see if the transformation
40504
29:59:01,512 --> 29:59:07,279
was successful and this is a limitation
40505
29:59:04,800 --> 29:59:10,080
that's why in most cases i usually do my
40506
29:59:07,279 --> 29:59:12,000
transformations through pointers and
40507
29:59:10,080 --> 29:59:14,872
there is a way you can even turn this
40508
29:59:12,000 --> 29:59:16,960
base reference into a base pointer and i
40509
29:59:14,872 --> 29:59:19,512
am going to show you how you can do that
40510
29:59:16,960 --> 29:59:21,280
so we are going to go down here and try
40511
29:59:19,512 --> 29:59:23,440
to change things a little bit we are
40512
29:59:21,279 --> 29:59:25,592
going to say doing proper checks with
40513
29:59:23,440 --> 29:59:28,000
references and we're going to put in a
40514
29:59:25,592 --> 29:59:29,592
piece of code to play with us and what
40515
29:59:28,000 --> 29:59:30,551
we're going to do we're going to take
40516
29:59:30,551 --> 29:59:35,759
base reference and turn that into a base
40517
29:59:33,592 --> 29:59:38,400
pointer this is the syntax here again
40518
29:59:35,759 --> 29:59:40,639
the input is the base reference but the
40519
29:59:38,399 --> 29:59:43,279
output we desire is a base pointer and
40520
29:59:40,639 --> 29:59:45,440
this is possible in c plus plus this is
40521
29:59:43,279 --> 29:59:47,279
going to work just fine now we are going
40522
29:59:45,440 --> 29:59:49,760
to go on top and comment this
40523
29:59:47,279 --> 29:59:51,512
problematic transformation we just tried
40524
29:59:49,759 --> 29:59:53,911
to do and we're going to try and build
40525
29:59:51,512 --> 29:59:56,080
and see if this is actually working
40526
29:59:53,911 --> 29:59:58,399
if this transformation succeeds we're
40527
29:59:56,080 --> 30:00:00,160
going to do some villain thingy if it
40528
29:59:58,399 --> 30:00:02,079
fails we're going to say couldn't cast
40529
30:00:00,160 --> 30:00:04,232
to feline reference and we're going to
40530
30:00:02,080 --> 30:00:06,639
say that we are sorry this is a good
40531
30:00:04,232 --> 30:00:08,639
output message if we get something wrong
40532
30:00:06,639 --> 30:00:11,191
we're going to build this with gcc and
40533
30:00:08,639 --> 30:00:12,872
see if this actually works the world is
40534
30:00:12,872 --> 30:00:17,279
and run rooster you see that this is
40535
30:00:15,512 --> 30:00:19,119
working just fine we're going to hit the
40536
30:00:17,279 --> 30:00:21,440
end of the program and we are going to
40537
30:00:19,119 --> 30:00:22,319
destroy our objects here this is super
40538
30:00:23,279 --> 30:00:27,911
if we try and do the transformation and
40539
30:00:25,279 --> 30:00:29,592
transform it to a dark object even if we
40540
30:00:27,911 --> 30:00:32,232
know that we don't have any dog
40541
30:00:29,592 --> 30:00:34,800
information in this object that we are
40542
30:00:32,232 --> 30:00:37,440
referencing to start with we hope that
40543
30:00:34,800 --> 30:00:39,120
we're going to get a good message and
40544
30:00:37,440 --> 30:00:41,440
the program is going to end properly
40545
30:00:39,119 --> 30:00:43,440
we're not going to get a crush so let's
40546
30:00:41,440 --> 30:00:45,119
make sure we are transforming to dog
40547
30:00:43,440 --> 30:00:47,680
here we're going to pass a dog pointer
40548
30:00:45,119 --> 30:00:49,759
as our output and we're going to store
40549
30:00:47,679 --> 30:00:52,399
this as a dog pointer even if the name
40550
30:00:49,759 --> 30:00:54,551
is still vlan pointer hopefully this is
40551
30:00:52,399 --> 30:00:56,720
not going to confuse you even if this is
40552
30:00:54,551 --> 30:00:59,279
named feline pointer it is a dot pointer
40553
30:00:56,720 --> 30:01:01,512
here because we just want to see
40554
30:00:59,279 --> 30:01:03,831
if we get the error message that we have
40555
30:01:01,512 --> 30:01:06,960
here so we are turning this reference
40556
30:01:03,831 --> 30:01:09,679
into a pointer and the benefit of this
40557
30:01:09,679 --> 30:01:14,399
null pointers and we can use this to our
40558
30:01:12,160 --> 30:01:16,800
advantage to check and see if the
40559
30:01:14,399 --> 30:01:19,191
transformation here was successful if it
40560
30:01:16,800 --> 30:01:22,232
was successful we will call some dog
40561
30:01:19,191 --> 30:01:23,759
thank method let's say that here and if
40562
30:01:22,232 --> 30:01:26,552
this fails we're going to say that we
40563
30:01:23,759 --> 30:01:28,959
couldn't transform to doug and this is
40564
30:01:26,551 --> 30:01:30,959
going to give us a nice message and our
40565
30:01:28,960 --> 30:01:33,440
program is not going to crash we're
40566
30:01:30,960 --> 30:01:35,360
going to build this again with gcc what
40567
30:01:33,440 --> 30:01:37,760
is going to be good as you see here
40568
30:01:35,360 --> 30:01:39,512
we're going to clear and run rooster now
40569
30:01:37,759 --> 30:01:41,679
you see that we are saying we couldn't
40570
30:01:39,512 --> 30:01:44,080
catch the dog reference and our program
40571
30:01:41,679 --> 30:01:46,231
is not crashing so if you have a
40572
30:01:44,080 --> 30:01:48,639
reference to start with and you want to
40573
30:01:46,232 --> 30:01:51,192
do some proper checks after you do the
40574
30:01:48,639 --> 30:01:53,440
transformation to a derived pointer or a
40575
30:01:51,191 --> 30:01:55,119
derived reference this is the best of
40576
30:01:53,440 --> 30:01:57,191
both worlds you can do something like
40577
30:01:55,119 --> 30:01:59,440
this and your program is going to be
40578
30:01:57,191 --> 30:02:02,399
much safer the last thing i want you to
40579
30:01:59,440 --> 30:02:05,040
see is that these kinds of dynamic casts
40580
30:02:02,399 --> 30:02:07,279
are really useful if you are passing
40581
30:02:05,039 --> 30:02:10,719
base pointer or base references into
40582
30:02:07,279 --> 30:02:12,800
functions and here i am going to put in
40583
30:02:10,720 --> 30:02:14,960
a bunch of functions the first one is
40584
30:02:12,800 --> 30:02:16,720
going to take a base pointer the second
40585
30:02:14,960 --> 30:02:18,552
one is going to take a base reference
40586
30:02:16,720 --> 30:02:20,720
and it is going to say do something with
40587
30:02:18,551 --> 30:02:22,551
animal pointer and do something with
40588
30:02:20,720 --> 30:02:24,160
animal reference and inside we're going
40589
30:02:22,551 --> 30:02:25,831
to do our thing here we're going to take
40590
30:02:24,160 --> 30:02:27,760
the animal pointer turn that into a
40591
30:02:25,831 --> 30:02:29,279
feline pointer and we're going to do our
40592
30:02:27,759 --> 30:02:31,679
proper check and we're going to do some
40593
30:02:29,279 --> 30:02:33,831
feline thingy if the transformation was
40594
30:02:31,679 --> 30:02:36,159
successful we can do something like this
40595
30:02:33,831 --> 30:02:37,911
we can also do exactly the same thing
40596
30:02:36,160 --> 30:02:39,911
with references we're going to take our
40597
30:02:37,911 --> 30:02:42,319
input reference we're going to turn that
40598
30:02:39,911 --> 30:02:44,551
into a derived object and we can call
40599
30:02:42,320 --> 30:02:46,480
our method on this pointer and we're
40600
30:02:44,551 --> 30:02:49,119
going to do proper chats because we have
40601
30:02:46,479 --> 30:02:51,119
a pointer which has a concept of node
40602
30:02:51,119 --> 30:02:56,159
transformation here fails this is the
40603
30:02:53,440 --> 30:02:58,000
setup we can use in our c plus programs
40604
30:02:56,160 --> 30:03:00,480
and we can use these methods to get
40605
30:02:58,000 --> 30:03:02,551
derived pointers that we can call even
40606
30:03:00,479 --> 30:03:05,119
non-polymorphic functions on and this is
40607
30:03:02,551 --> 30:03:08,319
going to work really well so we can go
40608
30:03:05,119 --> 30:03:11,119
down and comment out everything i guess
40609
30:03:08,320 --> 30:03:12,480
to make this super easy to follow but i
40610
30:03:11,119 --> 30:03:14,319
don't think we need to comment out
40611
30:03:12,479 --> 30:03:16,159
everything we can just comment out what
40612
30:03:14,320 --> 30:03:19,040
we just did here and we're going to be
40613
30:03:16,160 --> 30:03:21,040
reusing the reference we have here and
40614
30:03:19,039 --> 30:03:23,191
the pointer we have all the way to the
40615
30:03:21,039 --> 30:03:25,360
top so we're going to go down and put in
40616
30:03:23,191 --> 30:03:27,279
a separator here we can do that and
40617
30:03:25,360 --> 30:03:30,080
because of this separator i don't think
40618
30:03:27,279 --> 30:03:31,592
we even need to comment things out we
40619
30:03:30,080 --> 30:03:34,000
can remove our comment and leave the
40620
30:03:31,592 --> 30:03:36,552
code in because i want you to see that
40621
30:03:34,000 --> 30:03:37,831
super easily and we're going to call our
40622
30:03:36,551 --> 30:03:40,000
functions here we're going to say do
40623
30:03:37,831 --> 30:03:42,080
something with animal pointer and we're
40624
30:03:40,000 --> 30:03:43,679
going to pass an animal one which is a
40625
30:03:42,080 --> 30:03:46,080
pointer and we're going to say do
40626
30:03:46,080 --> 30:03:50,479
we can do something like this and we're
40627
30:03:50,479 --> 30:03:54,159
ref we have this reference here and we
40628
30:03:52,320 --> 30:03:56,800
can do something like this you're going
40629
30:03:54,160 --> 30:03:58,480
to see that this is not going to give us
40630
30:03:56,800 --> 30:04:00,232
any kind of problem and it is going to
40631
30:03:58,479 --> 30:04:02,319
work just fine that's world we're going
40632
30:04:00,232 --> 30:04:04,400
to pass this through gcc the photo is
40633
30:04:02,320 --> 30:04:06,552
going to be good we can clear and run
40634
30:04:04,399 --> 30:04:08,720
rooster and down here you see that in
40635
30:04:06,551 --> 30:04:11,191
function taking base pointer doing some
40636
30:04:08,720 --> 30:04:13,512
feline thingy in function taking some
40637
30:04:11,191 --> 30:04:15,591
biz reference doing some feeling thingy
40638
30:04:13,512 --> 30:04:18,479
and this is working really fine this is
40639
30:04:15,592 --> 30:04:20,400
what we want in our c plus plus programs
40640
30:04:18,479 --> 30:04:22,080
this is really all i wanted you to see
40641
30:04:20,399 --> 30:04:24,479
in this lecture hopefully you didn't
40642
30:04:22,080 --> 30:04:27,040
find it confusing again the message is
40643
30:04:24,479 --> 30:04:29,440
that you can do dynamic casts to
40644
30:04:27,039 --> 30:04:32,639
transform from a base pointer to a
40645
30:04:29,440 --> 30:04:35,440
derived pointer or to transform from a
40646
30:04:32,639 --> 30:04:36,551
base reference to a derived reference as
40647
30:04:36,551 --> 30:04:42,639
right here but transforming to a derived
40648
30:04:39,440 --> 30:04:45,040
reference has a drawback in that you
40649
30:04:42,639 --> 30:04:47,512
don't have a way to check and see
40650
30:04:45,039 --> 30:04:49,360
if the transformation was successful so
40651
30:04:47,512 --> 30:04:51,191
if you want to be able to do chats you
40652
30:04:49,360 --> 30:04:53,759
can do something like this and turn a
40653
30:04:51,191 --> 30:04:55,911
base reference into a derived pointer
40654
30:04:53,759 --> 30:04:58,000
and then we can check and see if the
40655
30:04:55,911 --> 30:04:59,440
pointer is not a node pointer if it's a
40656
30:04:58,000 --> 30:05:01,512
no pointer we will know that the
40657
30:04:59,440 --> 30:05:03,360
transformation failed and we will print
40658
30:05:01,512 --> 30:05:05,191
a good error message if the
40659
30:05:03,360 --> 30:05:07,680
transformation was successful we will
40660
30:05:05,191 --> 30:05:10,871
have a valid pointer in here and we will
40661
30:05:07,679 --> 30:05:13,119
call our derived non-polymorphic method
40662
30:05:10,872 --> 30:05:14,960
on our pointer this is going to work
40663
30:05:13,119 --> 30:05:17,679
really fine the last thing i want you to
40664
30:05:14,960 --> 30:05:20,552
see before we wrap up this lecture is
40665
30:05:17,679 --> 30:05:23,279
that dynamic casts are only going to
40666
30:05:20,551 --> 30:05:26,231
work with polymorphic inheritance
40667
30:05:23,279 --> 30:05:29,679
hierarchies so for example if we try and
40668
30:05:26,232 --> 30:05:31,040
turn a double into a string obviously
40669
30:05:29,679 --> 30:05:33,279
that's not going to work with the
40670
30:05:31,039 --> 30:05:34,959
dynamic cast but let's try and do that
40671
30:05:33,279 --> 30:05:36,800
to really show you that this is going to
40672
30:05:34,960 --> 30:05:38,720
give us a problem we're going to say
40673
30:05:36,800 --> 30:05:40,800
sddc out and we're going to put in a
40674
30:05:38,720 --> 30:05:42,960
separator here and we're going to set up
40675
30:05:40,800 --> 30:05:44,639
two variables one is going to be a net
40676
30:05:42,960 --> 30:05:47,680
for example and we're going to say data
40677
30:05:44,639 --> 30:05:50,232
we're going to put in a 45 and if we do
40678
30:05:47,679 --> 30:05:52,319
a dynamic cast to an sdd string for
40679
30:05:50,232 --> 30:05:56,160
example that's not going to work we're
40680
30:05:52,320 --> 30:05:58,400
going to say std string yana str meaning
40681
30:05:56,160 --> 30:06:00,800
that this is a string we're going to say
40682
30:05:58,399 --> 30:06:03,591
dynamic cast let's say we want to turn
40683
30:06:00,800 --> 30:06:05,440
this into an sdd string for example and
40684
30:06:03,592 --> 30:06:06,872
the input is going to be our data if
40685
30:06:05,440 --> 30:06:08,479
you're trying to do something like this
40686
30:06:06,872 --> 30:06:10,320
this is going to blow up you see that
40687
30:06:08,479 --> 30:06:12,319
even visual studio code is giving us a
40688
30:06:10,320 --> 30:06:16,160
squiggly line so this is not going to
40689
30:06:12,320 --> 30:06:19,120
work just make sure you use dynamic cast
40690
30:06:16,160 --> 30:06:22,320
in an inheritance hierarchy that
40691
30:06:19,119 --> 30:06:25,679
supports virtual functions this is the
40692
30:06:22,320 --> 30:06:28,552
design purpose for the dynamic cast if
40693
30:06:25,679 --> 30:06:30,799
you use this outside this context you're
40694
30:06:28,551 --> 30:06:33,039
going to get undefined behavior or even
40695
30:06:30,800 --> 30:06:34,479
compiler errors if you are lucky let's
40696
30:06:33,039 --> 30:06:36,719
try and weld and show you this we're
40697
30:06:34,479 --> 30:06:38,399
going to pass this through gcc and we're
40698
30:06:36,720 --> 30:06:41,360
probably going to get an error saying
40699
30:06:38,399 --> 30:06:43,511
that we can't transform from an integer
40700
30:06:41,360 --> 30:06:46,479
to a string for example let's go here
40701
30:06:43,512 --> 30:06:49,512
cannot dynamic cast so basically it is
40702
30:06:46,479 --> 30:06:52,399
saying dynamic casts are meant to work
40703
30:06:49,512 --> 30:06:55,832
only with pointers or references but
40704
30:06:52,399 --> 30:06:58,551
even then let's see if we can transform
40705
30:06:55,831 --> 30:07:01,119
from an end pointer to a string pointer
40706
30:06:58,551 --> 30:07:04,399
let's try and do that let's say we want
40707
30:07:01,119 --> 30:07:06,639
to turn the address of data or let's set
40708
30:07:04,399 --> 30:07:09,279
up a pointer to be explicit we're going
40709
30:07:06,639 --> 30:07:11,759
to say data ptr and we're going to
40710
30:07:09,279 --> 30:07:13,592
initialize this with the address of data
40711
30:07:11,759 --> 30:07:17,039
we can do something like this and we're
40712
30:07:13,592 --> 30:07:18,960
going to cast data ptr to an std
40713
30:07:17,039 --> 30:07:21,511
strength pointer let's see if we can do
40714
30:07:18,960 --> 30:07:23,592
this because it is meant to cast
40715
30:07:21,512 --> 30:07:26,160
between pointers and references but you
40716
30:07:23,592 --> 30:07:28,000
see that this is even not going to work
40717
30:07:26,160 --> 30:07:31,279
so you shouldn't really do something
40718
30:07:28,000 --> 30:07:33,679
like this if your input and output are
40719
30:07:31,279 --> 30:07:36,160
not part of the same polymorphic
40720
30:07:33,679 --> 30:07:38,231
inheritance hierarchy again dynamic
40721
30:07:38,232 --> 30:07:43,680
from base information to derived
40722
30:07:40,639 --> 30:07:46,960
information and the input and output
40723
30:07:43,679 --> 30:07:49,039
must be part of the same polymorphic
40724
30:07:46,960 --> 30:07:51,440
inheritance hierarchy this is the
40725
30:07:49,039 --> 30:07:53,360
information i am trying to convey here
40726
30:07:51,440 --> 30:07:55,040
so this is bad don't do something like
40727
30:07:53,360 --> 30:07:57,191
this if you do this you're going to get
40728
30:07:55,039 --> 30:07:59,360
undefined behavior or you're even going
40729
30:07:57,191 --> 30:08:01,679
to get a bunch of compiler errors if you
40730
30:07:59,360 --> 30:08:03,592
are lucky this is really all we set up
40731
30:08:01,679 --> 30:08:06,231
to do in this lecture showing you that
40732
30:08:03,592 --> 30:08:08,232
you can use dynamic casts we are going
40733
30:08:06,232 --> 30:08:10,639
to stop here in this lecture the next
40734
30:08:08,232 --> 30:08:12,872
one we're going to show you what happens
40735
30:08:10,639 --> 30:08:15,440
if you try to call a polymorphic
40736
30:08:15,440 --> 30:08:19,911
go ahead and finish up here and meet me
40737
30:08:17,592 --> 30:08:23,512
there in this lecture i am going to give
40738
30:08:19,911 --> 30:08:26,639
you a warning and that is to never call
40739
30:08:23,512 --> 30:08:29,191
virtual functions from constructors or
40740
30:08:26,639 --> 30:08:32,080
destructors i am going to repeat this
40741
30:08:29,191 --> 30:08:34,720
never never call virtual or polymorphic
40742
30:08:32,080 --> 30:08:36,800
functions either from constructors or
40743
30:08:34,720 --> 30:08:38,479
destructors and we're going to explore
40744
30:08:36,800 --> 30:08:39,911
why we're going to be using this
40745
30:08:38,479 --> 30:08:42,159
inheritance hierarchy we're going to
40746
30:08:39,911 --> 30:08:44,399
have a base class called base how
40747
30:08:42,160 --> 30:08:47,040
creative we're going to inherit from
40748
30:08:44,399 --> 30:08:49,439
base and create derived which is our
40749
30:08:47,039 --> 30:08:51,911
inherited class and we're going to be
40750
30:08:49,440 --> 30:08:54,320
using this to explore why we can't call
40751
30:08:51,911 --> 30:08:55,679
virtual functions from constructors and
40752
30:08:55,679 --> 30:09:00,079
this is what our code is going to look
40753
30:08:57,512 --> 30:09:02,232
like the base class is going to have a
40754
30:09:00,080 --> 30:09:04,479
protected member variable it's going to
40755
30:09:02,232 --> 30:09:07,120
have a bunch of virtual functions
40756
30:09:04,479 --> 30:09:09,191
we will have a virtual function to set
40757
30:09:07,119 --> 30:09:11,911
things up and it is just going to set
40758
30:09:09,191 --> 30:09:13,279
the value of our member variable to 10
40759
30:09:11,911 --> 30:09:15,279
and we're going to have a virtual
40760
30:09:13,279 --> 30:09:17,512
function called cleanup which is going
40761
30:09:15,279 --> 30:09:20,080
to maybe do some cleanup we're going to
40762
30:09:17,512 --> 30:09:22,000
see how this works out we also have a
40763
30:09:20,080 --> 30:09:24,160
method to get the value but i don't
40764
30:09:22,000 --> 30:09:26,800
think we will use this but you can keep
40765
30:09:24,160 --> 30:09:29,192
this and if you want notice that we are
40766
30:09:26,800 --> 30:09:30,720
trying to call the setup method from the
40767
30:09:30,720 --> 30:09:34,551
and you see that we have a comment that
40768
30:09:32,872 --> 30:09:36,320
says that this is going to do static
40769
30:09:34,551 --> 30:09:38,872
binding but we're going to see why in a
40770
30:09:36,320 --> 30:09:41,120
minute so this is our base class we can
40771
30:09:38,872 --> 30:09:42,960
derive from this class and create our
40772
30:09:41,119 --> 30:09:44,159
derived class we're going to inherit
40773
30:09:44,160 --> 30:09:49,120
and we are going to override the methods
40774
30:09:46,872 --> 30:09:51,192
we have in the base class we're going to
40775
30:09:49,119 --> 30:09:52,871
override the setup method as you see
40776
30:09:51,191 --> 30:09:54,799
here we're going to override the cleanup
40777
30:09:54,800 --> 30:09:58,872
our destructor is also going to be
40778
30:09:56,639 --> 30:10:01,440
virtual because we are good c plus plus
40779
30:09:58,872 --> 30:10:03,512
citizens and this is the setup we have
40780
30:10:01,440 --> 30:10:05,360
once you have your inheritance hierarchy
40781
30:10:03,512 --> 30:10:07,440
set up you're going to do something like
40782
30:10:05,360 --> 30:10:09,440
this because you want polymorphic
40783
30:10:07,440 --> 30:10:11,191
behavior you're going to set up the base
40784
30:10:09,440 --> 30:10:13,911
pointer and you're going to use that to
40785
30:10:11,191 --> 30:10:16,080
manage a derived object and you can do
40786
30:10:16,080 --> 30:10:20,720
considering this statement here i want
40787
30:10:18,160 --> 30:10:22,960
you to think about the order in which
40788
30:10:20,720 --> 30:10:25,119
constructors and destructors are going
40789
30:10:22,960 --> 30:10:27,832
to be called we have touched on this
40790
30:10:25,119 --> 30:10:29,759
subject before and we are going to
40791
30:10:27,831 --> 30:10:30,959
revisit this because it is really
40792
30:10:30,960 --> 30:10:35,832
in terms of calling virtual functions in
40793
30:10:33,592 --> 30:10:37,832
destructors and destructors
40794
30:10:35,831 --> 30:10:40,231
so when we do something like this the
40795
30:10:37,831 --> 30:10:42,551
base part of this object is going to be
40796
30:10:40,232 --> 30:10:44,320
wealth first so we are going to call the
40797
30:10:42,551 --> 30:10:46,800
base constructor first we're going to
40798
30:10:44,320 --> 30:10:48,872
set up the best part of us after that
40799
30:10:46,800 --> 30:10:50,400
we're going to set up the derived part
40800
30:10:48,872 --> 30:10:52,160
of us and we're going to call the
40801
30:10:52,160 --> 30:10:57,512
and after the derived part of us is set
40802
30:10:54,960 --> 30:10:59,832
up we can use our object like we do
40803
30:10:57,512 --> 30:11:02,080
always so we're going to use our object
40804
30:10:59,831 --> 30:11:04,720
to do whatever it is we want to do when
40805
30:11:02,080 --> 30:11:07,119
the time comes for this object to be
40806
30:11:04,720 --> 30:11:09,512
destroyed we're going to destroy the
40807
30:11:09,512 --> 30:11:13,440
and then we're going to destroy the base
40808
30:11:13,440 --> 30:11:17,512
now that we have considered this order
40809
30:11:15,759 --> 30:11:20,080
try to think about the setup when we
40810
30:11:20,080 --> 30:11:23,512
from a constructor that's what we're
40811
30:11:21,759 --> 30:11:25,591
going to look at first the best
40812
30:11:23,512 --> 30:11:27,760
constructor is going to be called but
40813
30:11:25,592 --> 30:11:30,639
notice that by the time we call the base
40814
30:11:27,759 --> 30:11:33,911
constructor the derived part of us won't
40815
30:11:30,639 --> 30:11:36,960
be set up yet so if we try to call a
40816
30:11:33,911 --> 30:11:39,759
virtual function in the base constructor
40817
30:11:36,960 --> 30:11:42,720
there won't be a derived part to call
40818
30:11:39,759 --> 30:11:44,639
the most specialized method for so the
40819
30:11:42,720 --> 30:11:47,040
compiler will notice that we don't have
40820
30:11:44,639 --> 30:11:49,592
a derived part yet we will be at this
40821
30:11:47,039 --> 30:11:52,000
stage building the base part and if we
40822
30:11:49,592 --> 30:11:54,000
call a virtual polymorphic function we
40823
30:11:52,000 --> 30:11:56,639
want the most specific parts to be
40824
30:11:54,000 --> 30:11:58,720
called which should live in the derived
40825
30:11:56,639 --> 30:12:01,279
part but we haven't done the derived
40826
30:11:58,720 --> 30:12:03,040
part yet we are still building the base
40827
30:12:01,279 --> 30:12:05,191
part of us so the compiler is going to
40828
30:12:03,039 --> 30:12:07,119
notice that we don't have a derived part
40829
30:12:05,191 --> 30:12:09,191
and it is going to call the base version
40830
30:12:07,119 --> 30:12:11,440
of our virtual function that's why we
40831
30:12:09,191 --> 30:12:13,759
said that if you call a virtual function
40832
30:12:11,440 --> 30:12:15,360
from a constructor or a destructor
40833
30:12:13,759 --> 30:12:17,591
you're going to get static binding
40834
30:12:15,360 --> 30:12:19,512
results if you call a virtual function
40835
30:12:17,592 --> 30:12:22,160
you want the most specific version
40836
30:12:19,512 --> 30:12:24,872
called but we don't have that yet in the
40837
30:12:22,160 --> 30:12:26,872
base part because the derived part
40838
30:12:24,872 --> 30:12:29,040
haven't been set up that's why we get
40839
30:12:26,872 --> 30:12:30,800
static binding results i hope this makes
40840
30:12:29,039 --> 30:12:32,799
sense and we're going to get to the same
40841
30:12:30,800 --> 30:12:35,680
result if you try to call a virtual
40842
30:12:32,800 --> 30:12:37,680
function from a destructor if we get to
40843
30:12:35,679 --> 30:12:39,591
the point where our object needs to be
40844
30:12:37,679 --> 30:12:41,679
destroyed the derived part is going to
40845
30:12:39,592 --> 30:12:43,440
be wiped out first we're going to be
40846
30:12:41,679 --> 30:12:46,000
left with the base destructor and when
40847
30:12:43,440 --> 30:12:47,512
we hit this base destructor and call a
40848
30:12:47,512 --> 30:12:50,639
that would mean to call the most
40849
30:12:50,639 --> 30:12:56,319
version of that method but the derived
40850
30:12:54,080 --> 30:12:59,119
part of our object has been already
40851
30:12:56,320 --> 30:13:00,800
wiped down so this is no longer existent
40852
30:12:59,119 --> 30:13:02,551
and we are trying to call the method on
40853
30:13:00,800 --> 30:13:04,639
this so the compiler is going to do the
40854
30:13:02,551 --> 30:13:06,551
next best thing it can do it is going to
40855
30:13:04,639 --> 30:13:08,720
call the best version of our virtual
40856
30:13:06,551 --> 30:13:11,831
function and again we are going to get
40857
30:13:08,720 --> 30:13:13,680
static binding results that's why it
40858
30:13:11,831 --> 30:13:16,319
isn't really wise to call a virtual
40859
30:13:13,679 --> 30:13:18,231
function either from a constructor or a
40860
30:13:16,320 --> 30:13:20,960
destructor now some of you must be
40861
30:13:18,232 --> 30:13:22,872
asking what if i really need to do setup
40862
30:13:20,960 --> 30:13:25,280
and clean up in the way that we set up
40863
30:13:22,872 --> 30:13:27,040
these things in our classes what if this
40864
30:13:25,279 --> 30:13:28,319
method is really useful maybe it is
40865
30:13:27,039 --> 30:13:30,479
setting up things we're going to be
40866
30:13:28,320 --> 30:13:33,192
using in our application we really need
40867
30:13:30,479 --> 30:13:35,440
this and the most logical point to call
40868
30:13:33,191 --> 30:13:36,871
this is the base constructor well you
40869
30:13:35,440 --> 30:13:39,592
shouldn't really put these in a
40870
30:13:36,872 --> 30:13:42,639
constructor what you could do
40871
30:13:39,592 --> 30:13:45,592
is maybe call this virtual method on
40872
30:13:42,639 --> 30:13:47,512
your object directly when the object has
40873
30:13:45,592 --> 30:13:49,832
finished being a constructor that's
40874
30:13:47,512 --> 30:13:52,872
going to be a better place to do this
40875
30:13:49,831 --> 30:13:54,871
because if you put that in a constructor
40876
30:13:52,872 --> 30:13:56,872
or a destructor you're not going to get
40877
30:13:54,872 --> 30:13:59,832
dynamic binding results and that's going
40878
30:13:56,872 --> 30:14:01,192
to be really bad so to sum up calling a
40879
30:14:01,191 --> 30:14:05,831
from a constructor or a destructor want
40880
30:14:03,440 --> 30:14:08,400
to give you polymorphic or dynamic
40881
30:14:05,831 --> 30:14:10,319
binding results the call will never go
40882
30:14:08,399 --> 30:14:12,399
to a more derived class than the
40883
30:14:10,320 --> 30:14:13,680
currently executing constructor or
40884
30:14:13,679 --> 30:14:18,719
and we will get static binding results
40885
30:14:15,911 --> 30:14:21,591
this is the idea i want to convey here
40886
30:14:18,720 --> 30:14:23,759
and as a guideline you should never call
40887
30:14:21,592 --> 30:14:26,080
virtual functions or polymorphic
40888
30:14:23,759 --> 30:14:28,319
functions from constructors or
40889
30:14:26,080 --> 30:14:31,440
disruptors if you really need this the
40890
30:14:28,320 --> 30:14:33,760
next best thing you can do is to call
40891
30:14:31,440 --> 30:14:36,400
your virtual functions directly on your
40892
30:14:33,759 --> 30:14:37,439
object after the object has been
40893
30:14:37,440 --> 30:14:41,680
set up we can do something like this and
40894
30:14:39,440 --> 30:14:43,512
call our setup method and then we can
40895
30:14:41,679 --> 30:14:46,000
call cleanup when we think that we need
40896
30:14:43,512 --> 30:14:48,160
to clean up and you call cleanup after
40897
30:14:46,000 --> 30:14:50,479
you construct the object and you call
40898
30:14:48,160 --> 30:14:52,872
delete after you clean up your object
40899
30:14:50,479 --> 30:14:54,800
this is going to do whatever it is you
40900
30:14:52,872 --> 30:14:57,120
want to do with your polymorphic
40901
30:14:54,800 --> 30:14:59,192
functions and the calls to these virtual
40902
30:14:57,119 --> 30:15:01,279
functions want to be leaving inside a
40903
30:14:59,191 --> 30:15:03,039
constructor or a disruptor and this is
40904
30:15:01,279 --> 30:15:04,399
going to work really well now that you
40905
30:15:03,039 --> 30:15:06,159
know this we're going to head over to
40906
30:15:04,399 --> 30:15:08,959
visual studio code and play with us a
40907
30:15:06,160 --> 30:15:10,720
little more here we are in our working
40908
30:15:08,960 --> 30:15:13,192
folder the current project is
40909
30:15:10,720 --> 30:15:15,360
polymorphic functions and the structures
40910
30:15:13,191 --> 30:15:17,440
we should really say with constructors
40911
30:15:15,360 --> 30:15:20,160
and instructors but this is going to do
40912
30:15:17,440 --> 30:15:22,479
we're going to grab our template files
40913
30:15:20,160 --> 30:15:24,400
and we're going to put them in place and
40914
30:15:22,479 --> 30:15:26,080
we are going to open this little guy in
40915
30:15:24,399 --> 30:15:28,231
visual studio code by dragging and
40916
30:15:26,080 --> 30:15:30,800
dropping here this is going to give us
40917
30:15:28,232 --> 30:15:32,552
our main cpp file we can clean up a
40918
30:15:30,800 --> 30:15:35,192
little bit remove whatever it is we
40919
30:15:32,551 --> 30:15:37,591
don't need and i am just going to put in
40920
30:15:35,191 --> 30:15:40,000
my classes i am going to do that in the
40921
30:15:37,592 --> 30:15:42,872
main cpp file because that's going to be
40922
30:15:40,000 --> 30:15:44,960
much easier to follow we have our base
40923
30:15:42,872 --> 30:15:47,440
class it is going to have a single
40924
30:15:44,960 --> 30:15:50,552
member variable called m value and we
40925
30:15:47,440 --> 30:15:52,639
will have a virtual destructor
40926
30:15:50,551 --> 30:15:54,639
we will have a bunch of virtual
40927
30:15:52,639 --> 30:15:56,551
functions one is going to be setup which
40928
30:15:54,639 --> 30:15:58,319
is going to set our value the other is
40929
30:15:56,551 --> 30:16:00,720
going to be cleanup which is going to be
40930
30:15:58,320 --> 30:16:03,280
doing some cleanup here we will also
40931
30:16:00,720 --> 30:16:05,440
have a getvalue method which will get
40932
30:16:03,279 --> 30:16:08,000
this value and print it out if we want
40933
30:16:05,440 --> 30:16:10,080
but it is really not that useful here we
40934
30:16:08,000 --> 30:16:12,800
will also create a derived class which
40935
30:16:10,080 --> 30:16:14,720
is going to inherit publicly from base
40936
30:16:12,800 --> 30:16:17,040
it is not going to have its own member
40937
30:16:14,720 --> 30:16:19,512
variable all it's going to do is set up
40938
30:16:19,512 --> 30:16:23,760
the virtual functions we have in the
40939
30:16:21,360 --> 30:16:25,592
base class we're going to override setup
40940
30:16:23,759 --> 30:16:28,159
and in derived we're going to set our
40941
30:16:25,592 --> 30:16:30,080
value to 100 and we're going to clean up
40942
30:16:28,160 --> 30:16:32,480
and put a message that we are cleaning
40943
30:16:30,080 --> 30:16:34,872
up here once we have this set up we can
40944
30:16:32,479 --> 30:16:36,720
head over in the main function and set
40945
30:16:34,872 --> 30:16:39,832
up a base pointer which is going to be
40946
30:16:36,720 --> 30:16:41,911
managing a derived object a classic
40947
30:16:39,831 --> 30:16:44,159
setup for polymorphic behavior so we're
40948
30:16:41,911 --> 30:16:46,080
going to say base and i'm going to say p
40949
30:16:44,160 --> 30:16:48,872
bass and we're going to say equals new
40950
30:16:46,080 --> 30:16:51,040
derived this is going to give us our
40951
30:16:48,872 --> 30:16:53,192
object which is managed by a base
40952
30:16:51,039 --> 30:16:55,591
pointer and one thing i didn't show you
40953
30:16:53,191 --> 30:16:56,720
is that we are calling the setup virtual
40954
30:16:56,720 --> 30:17:01,512
from the base constructor this is what
40955
30:17:00,000 --> 30:17:04,399
we want to see we want to see what is
40956
30:17:01,512 --> 30:17:05,512
happening here now if we call this setup
40957
30:17:05,512 --> 30:17:10,320
we would expect polymorphism to kick in
40958
30:17:08,232 --> 30:17:12,639
because this is a virtual function
40959
30:17:10,320 --> 30:17:15,280
if the derived part is available we will
40960
30:17:12,639 --> 30:17:18,319
call the most specific setup function
40961
30:17:15,279 --> 30:17:21,039
and that would set up the value to be
40962
30:17:18,320 --> 30:17:23,120
100 here if we get the value that's what
40963
30:17:21,039 --> 30:17:25,279
we would get let's see what we get here
40964
30:17:25,279 --> 30:17:30,479
value that we have in this object here
40965
30:17:27,759 --> 30:17:33,511
so we will get auto value and we're
40966
30:17:30,479 --> 30:17:35,440
going to say p base get value we have
40967
30:17:33,512 --> 30:17:37,512
this function here and we will try to
40968
30:17:35,440 --> 30:17:40,080
print this out okay this is something we
40969
30:17:37,512 --> 30:17:41,592
can do in our c plus bus program and
40970
30:17:40,080 --> 30:17:43,512
we're going to see the value we get
40971
30:17:41,592 --> 30:17:45,912
because we are calling this virtual
40972
30:17:43,512 --> 30:17:48,479
function we expect polymorphism to kick
40973
30:17:45,911 --> 30:17:50,639
in and if polymorphism kicks in we're
40974
30:17:48,479 --> 30:17:52,800
going to call the most specialized
40975
30:17:50,639 --> 30:17:54,479
version of our virtual function here
40976
30:17:52,800 --> 30:17:57,040
that would be the override we have in
40977
30:17:54,479 --> 30:17:59,679
derived and that would give us 100. so
40978
30:17:57,039 --> 30:18:01,360
one would get to get 100 printed out
40979
30:17:59,679 --> 30:18:04,079
here but let's see what we get we're
40980
30:18:01,360 --> 30:18:05,831
going to run this through gcc our
40981
30:18:04,080 --> 30:18:08,479
favorite compiler the builder is going
40982
30:18:05,831 --> 30:18:10,720
to be good we can clear or bring up a
40983
30:18:08,479 --> 30:18:13,039
powershell window we're going to clear
40984
30:18:10,720 --> 30:18:14,960
now and run rooster we're going to see
40985
30:18:13,039 --> 30:18:17,191
that the base constructor is going to be
40986
30:18:14,960 --> 30:18:19,832
called base setup was called you see we
40987
30:18:17,191 --> 30:18:22,479
called the base version of this and the
40988
30:18:19,831 --> 30:18:24,231
derived constructor will be called and
40989
30:18:22,479 --> 30:18:26,959
we're going to see that the value
40990
30:18:24,232 --> 30:18:29,360
doesn't exist oh we didn't put the value
40991
30:18:26,960 --> 30:18:31,040
out let's do that my bad here we're
40992
30:18:29,360 --> 30:18:33,512
going to build again we're going to use
40993
30:18:31,039 --> 30:18:36,231
gcc to build and the world is good we
40994
30:18:33,512 --> 30:18:38,232
can clear and run rooster now we see
40995
30:18:36,232 --> 30:18:41,440
that the base setup method was called
40996
30:18:38,232 --> 30:18:43,680
and set the value to b10 and we are
40997
30:18:41,440 --> 30:18:46,080
really getting static binding results
40998
30:18:43,679 --> 30:18:48,399
because we are calling the setup
40999
30:18:46,080 --> 30:18:50,800
method from the base class and the base
41000
30:18:48,399 --> 30:18:54,000
version is being called so this is
41001
30:18:50,800 --> 30:18:56,720
classic static binding behavior but we
41002
30:18:54,000 --> 30:19:00,000
want polymorphic behavior to be working
41003
30:18:56,720 --> 30:19:02,639
here but we just saw the reason why this
41004
30:19:00,000 --> 30:19:05,360
is in the slides by the time we call
41005
30:19:02,639 --> 30:19:07,679
this virtual function we haven't set up
41006
30:19:07,679 --> 30:19:13,911
and we have no way to call this virtual
41007
30:19:11,039 --> 30:19:16,000
function which lives in the derived part
41008
30:19:13,911 --> 30:19:18,000
of us so the compiler is going to do the
41009
30:19:16,000 --> 30:19:20,080
next best thing it can do it's going to
41010
30:19:18,000 --> 30:19:22,479
call the best version of this method and
41011
30:19:20,080 --> 30:19:24,872
we are going to get static binding
41012
30:19:22,479 --> 30:19:27,279
results and we are going to get the same
41013
30:19:24,872 --> 30:19:30,080
results if we try to call a virtual
41014
30:19:27,279 --> 30:19:33,360
function from the destructor for example
41015
30:19:30,080 --> 30:19:35,040
if we go in our destructor here
41016
30:19:33,360 --> 30:19:36,960
let's see if we can find it we're going
41017
30:19:35,039 --> 30:19:39,119
to go in our instructor here and say
41018
30:19:36,960 --> 30:19:41,120
this and say cleanup can do something
41019
30:19:39,119 --> 30:19:43,512
like this and you're going to see that
41020
30:19:41,119 --> 30:19:45,279
the cleanup version we call is the base
41021
30:19:45,279 --> 30:19:49,911
and we don't really want to do something
41022
30:19:47,279 --> 30:19:51,831
like this we want the most derived
41023
30:19:49,911 --> 30:19:54,232
cleanup version to be called but we
41024
30:19:51,831 --> 30:19:57,279
won't get that because by the moment we
41025
30:19:54,232 --> 30:19:58,320
call this virtual function from our base
41026
30:19:58,320 --> 30:20:03,512
the derived part will already have been
41027
30:20:00,872 --> 30:20:06,479
wiped out so it won't be available and
41028
30:20:03,512 --> 30:20:08,639
the compiler will do the next best thing
41029
30:20:06,479 --> 30:20:10,551
it can do it is going to call the best
41030
30:20:08,639 --> 30:20:12,872
version of our cleanup function here i
41031
30:20:12,872 --> 30:20:17,192
again to really drive this home i
41032
30:20:14,872 --> 30:20:19,760
realize this can be confusing to many
41033
30:20:17,191 --> 30:20:21,279
people especially beginners if we are
41034
30:20:19,759 --> 30:20:23,759
calling a virtual function from a
41035
30:20:21,279 --> 30:20:25,440
constructor we will call that virtual
41036
30:20:23,759 --> 30:20:27,679
function when we hit the base
41037
30:20:25,440 --> 30:20:29,832
constructor but by the time we hit the
41038
30:20:27,679 --> 30:20:32,639
base constructor the derived part of us
41039
30:20:29,831 --> 30:20:34,959
hasn't been constructed yet so if we try
41040
30:20:32,639 --> 30:20:37,191
to call a polymorphic function needing
41041
30:20:34,960 --> 30:20:39,512
to hold the derived implementation that
41042
30:20:37,191 --> 30:20:42,080
won't be available and the compiler will
41043
30:20:39,512 --> 30:20:43,911
do the next best thing it can do it is
41044
30:20:42,080 --> 30:20:45,512
going to call the base version the same
41045
30:20:43,911 --> 30:20:48,232
phenomenon is going to happen in the
41046
30:20:45,512 --> 30:20:50,720
destructor when we are done using our
41047
30:20:48,232 --> 30:20:53,512
object we will destroy the derived part
41048
30:20:50,720 --> 30:20:55,440
information first and when we hit the
41049
30:20:53,512 --> 30:20:57,440
base destructor and call a virtual
41050
30:20:55,440 --> 30:20:59,760
function there won't be a most
41051
30:20:57,440 --> 30:21:02,160
specialized version of the virtual
41052
30:20:59,759 --> 30:21:04,159
function because the derived part has
41053
30:21:02,160 --> 30:21:06,800
been already destroyed and it doesn't
41054
30:21:04,160 --> 30:21:08,960
exist anymore so if we call a virtual
41055
30:21:06,800 --> 30:21:10,872
function from the base destructor we
41056
30:21:08,960 --> 30:21:13,040
will get the best version called and
41057
30:21:10,872 --> 30:21:15,040
this will give us static binding
41058
30:21:13,039 --> 30:21:17,911
behavior this is what we are
41059
30:21:15,039 --> 30:21:20,639
experiencing here okay so let's try and
41060
30:21:17,911 --> 30:21:22,479
run this program and see what we get we
41061
30:21:20,639 --> 30:21:25,039
will print out value here which is going
41062
30:21:22,479 --> 30:21:28,231
to give us static binding results but we
41063
30:21:25,039 --> 30:21:30,231
want to see which version of cleanup is
41064
30:21:28,232 --> 30:21:32,000
called this is what we want to see here
41065
30:21:30,232 --> 30:21:34,552
we're going to run the task to build
41066
30:21:32,000 --> 30:21:36,639
with gcc the world is going to be good
41067
30:21:34,551 --> 30:21:38,479
as usual we're going to clear and run
41068
30:21:36,639 --> 30:21:40,479
rooster and i'm going to see base
41069
30:21:38,479 --> 30:21:42,399
constructor called derived constructor
41070
30:21:40,479 --> 30:21:44,399
called and we're going to have a value
41071
30:21:42,399 --> 30:21:46,720
which is a junk value because we never
41072
30:21:44,399 --> 30:21:49,360
initialize this value but we don't see
41073
30:21:46,720 --> 30:21:50,479
our destructure is called what is going
41074
30:21:50,479 --> 30:21:55,679
let's investigate this a little more the
41075
30:21:53,039 --> 30:21:57,679
reason is we are not explicitly
41076
30:21:55,679 --> 30:21:59,359
releasing this memory here through the
41077
30:21:57,679 --> 30:22:02,231
base pointer let's do that we're going
41078
30:21:59,360 --> 30:22:05,191
to delete p base here and we're going to
41079
30:22:02,232 --> 30:22:07,680
run again we're going to weld with gcc
41080
30:22:05,191 --> 30:22:09,759
now our destructors should be called
41081
30:22:07,679 --> 30:22:11,439
we're going to run rooster and we are
41082
30:22:09,759 --> 30:22:13,360
going to see that the base cleanup
41083
30:22:11,440 --> 30:22:16,080
version was called and again this is
41084
30:22:13,360 --> 30:22:18,479
giving us static binding results you
41085
30:22:16,080 --> 30:22:19,592
don't want something like this so if you
41086
30:22:19,592 --> 30:22:24,480
get to this behavior i would advise not
41087
30:22:22,000 --> 30:22:27,191
to call the cleanup or setup functions
41088
30:22:24,479 --> 30:22:28,872
inside constructors or destructors and
41089
30:22:27,191 --> 30:22:30,959
that's the guideline i gave in the
41090
30:22:28,872 --> 30:22:32,960
slides you should really never call
41091
30:22:30,960 --> 30:22:35,912
virtual functions either from
41092
30:22:32,960 --> 30:22:38,720
constructors or disruptors especially if
41093
30:22:35,911 --> 30:22:41,759
you are doing this from a parent class
41094
30:22:38,720 --> 30:22:44,800
hoping to get the most specific virtual
41095
30:22:41,759 --> 30:22:46,959
function called through polymorphism if
41096
30:22:44,800 --> 30:22:49,832
you want to do that the best thing you
41097
30:22:46,960 --> 30:22:50,800
can do is to call the cleanup functions
41098
30:22:50,800 --> 30:22:54,872
is to call the setup and cleanup
41099
30:22:52,479 --> 30:22:57,512
functions after your object has been
41100
30:22:54,872 --> 30:23:00,320
properly constructed or before your
41101
30:22:57,512 --> 30:23:03,760
object gets to be destroyed so what you
41102
30:23:00,320 --> 30:23:06,720
can do here is call the setup method on
41103
30:23:03,759 --> 30:23:08,639
the pbes pointer here let's do that and
41104
30:23:06,720 --> 30:23:10,800
we're going to call setup this is going
41105
30:23:08,639 --> 30:23:13,119
to call our virtual function and we are
41106
30:23:10,800 --> 30:23:15,760
going to get polymorphic behavior this
41107
30:23:13,119 --> 30:23:17,591
is going to print a 100 as we expect
41108
30:23:17,592 --> 30:23:24,000
the derived version of setup here and
41109
30:23:20,872 --> 30:23:26,320
before we delete our object we will need
41110
30:23:24,000 --> 30:23:28,639
to call the cleanup function if we need
41111
30:23:26,320 --> 30:23:29,912
to do some custom cleanup here so i'm
41112
30:23:29,911 --> 30:23:35,119
base and call the cleanup function and
41113
30:23:32,639 --> 30:23:37,759
this is going to give us the behavior we
41114
30:23:35,119 --> 30:23:40,231
want we're going to build our program
41115
30:23:37,759 --> 30:23:42,319
pass this through gcc the both is going
41116
30:23:42,320 --> 30:23:47,120
and run rooster and we are going to see
41117
30:23:44,960 --> 30:23:49,440
that this constructor was called derived
41118
30:23:47,119 --> 30:23:51,591
constructor was called we will call the
41119
30:23:49,440 --> 30:23:54,551
derived version of setup our value will
41120
30:23:51,592 --> 30:23:57,120
be 100 and when we get to release or
41121
30:23:54,551 --> 30:23:59,679
clean up our memory the derived version
41122
30:23:57,119 --> 30:24:01,911
of cleanup will be called and then we
41123
30:23:59,679 --> 30:24:04,319
will destroy the derived part of us and
41124
30:24:01,911 --> 30:24:07,191
then we will destroy the base part of us
41125
30:24:04,320 --> 30:24:09,440
this is going to work in line with the
41126
30:24:07,191 --> 30:24:11,591
behavior we are familiar with with
41127
30:24:09,440 --> 30:24:13,592
polymorphism and this is really cool so
41128
30:24:11,592 --> 30:24:16,160
this is what you should do you should
41129
30:24:13,592 --> 30:24:18,160
never call virtual functions from
41130
30:24:16,160 --> 30:24:20,480
distractors and constructors because
41131
30:24:18,160 --> 30:24:22,400
that's going to give you static binding
41132
30:24:20,479 --> 30:24:23,440
results and what you want in this case
41133
30:24:23,440 --> 30:24:28,080
dynamic binding behavior this is really
41134
30:24:26,320 --> 30:24:30,320
all i have to share in this lecture i
41135
30:24:28,080 --> 30:24:32,400
hope you found it interesting we are
41136
30:24:30,320 --> 30:24:34,160
going to stop here in this one the next
41137
30:24:32,399 --> 30:24:37,679
one we're going to learn about the type
41138
30:24:34,160 --> 30:24:40,000
id operator that can come in handy
41139
30:24:37,679 --> 30:24:42,319
especially if you want to debug
41140
30:24:40,000 --> 30:24:45,119
polymorphic code in your c plus plus
41141
30:24:42,320 --> 30:24:47,040
program go ahead and finish up here and
41142
30:24:45,119 --> 30:24:48,720
meet me there in this lecture we're
41143
30:24:47,039 --> 30:24:52,231
going to learn about pure virtual
41144
30:24:48,720 --> 30:24:54,800
functions and abstract classes and pure
41145
30:24:52,232 --> 30:24:56,720
virtual functions are a mechanism we
41146
30:24:56,720 --> 30:25:01,592
to mean that the method isn't meant to
41147
30:25:03,831 --> 30:25:08,720
here we have a simple inheritance
41148
30:25:05,831 --> 30:25:11,119
hierarchy to try and drive this home the
41149
30:25:08,720 --> 30:25:13,759
base class is shape and we are deriving
41150
30:25:11,119 --> 30:25:16,159
from this class to create a circle class
41151
30:25:13,759 --> 30:25:18,799
and on the other side we are deriving to
41152
30:25:16,160 --> 30:25:20,552
create a rectangle class if we look in
41153
30:25:18,800 --> 30:25:22,232
the shape class we have two virtual
41154
30:25:20,551 --> 30:25:24,479
methods one is going to be used to
41155
30:25:22,232 --> 30:25:26,160
compute the perimeter of the shape
41156
30:25:24,479 --> 30:25:28,551
the other is going to be used to compute
41157
30:25:26,160 --> 30:25:30,960
the surface of the shape but if we go
41158
30:25:28,551 --> 30:25:32,319
down in our inheritance classes we're
41159
30:25:30,960 --> 30:25:34,639
going to see that we have the same
41160
30:25:32,320 --> 30:25:37,440
methods these are going to be overrides
41161
30:25:34,639 --> 30:25:39,119
of what we have in the base class
41162
30:25:37,440 --> 30:25:41,040
but the special thing about this
41163
30:25:41,039 --> 30:25:46,479
is that we don't have implementations
41164
30:25:43,360 --> 30:25:48,800
for these methods in the base class here
41165
30:25:46,479 --> 30:25:51,119
and this is by design if you think about
41166
30:25:48,800 --> 30:25:52,800
it this is an abstract shape we don't
41167
30:25:51,119 --> 30:25:54,551
know if it's a rectangle we don't know
41168
30:25:52,800 --> 30:25:57,440
if it's a circle we don't know if it is
41169
30:25:54,551 --> 30:25:59,759
a triangle so we don't really have
41170
30:25:57,440 --> 30:26:02,000
concrete information we can use
41171
30:25:59,759 --> 30:26:04,871
to properly compute its perimeter and
41172
30:26:02,000 --> 30:26:07,512
its surface so it makes sense to really
41173
30:26:04,872 --> 30:26:10,000
leave in the declaration for these
41174
30:26:07,512 --> 30:26:13,119
methods but leave the implementation
41175
30:26:10,000 --> 30:26:15,191
details to inheriting classes because
41176
30:26:13,119 --> 30:26:17,759
these classes are going to have concrete
41177
30:26:15,191 --> 30:26:19,759
information we can use to reliably
41178
30:26:17,759 --> 30:26:22,080
compute the perimeter and the surface
41179
30:26:19,759 --> 30:26:24,799
and we can get this information here
41180
30:26:22,080 --> 30:26:27,119
so in c plus plus we mean this kind of
41181
30:26:24,800 --> 30:26:29,360
design by setting up these methods as
41182
30:26:29,360 --> 30:26:33,512
and what this is going to tell the
41183
30:26:30,872 --> 30:26:36,400
compiler is these methods are not meant
41184
30:26:33,512 --> 30:26:37,911
to be implemented in the base class they
41185
30:26:37,911 --> 30:26:42,720
overridden and implemented by
41186
30:26:39,831 --> 30:26:45,360
inheritance classes and another side
41187
30:26:42,720 --> 30:26:47,279
effect of this is that the compiler is
41188
30:26:45,360 --> 30:26:50,000
going to prevent you from creating
41189
30:26:47,279 --> 30:26:52,080
objects of this class because it really
41190
30:26:50,000 --> 30:26:54,320
doesn't make sense to create an object
41191
30:26:54,320 --> 30:26:57,760
if you want to be able to compute its
41192
30:26:56,232 --> 30:26:59,911
perimeter if you want to be able to
41193
30:26:57,759 --> 30:27:02,000
compute its surface so why bother
41194
30:26:59,911 --> 30:27:04,232
creating an object that you won't really
41195
30:27:02,000 --> 30:27:06,399
be using in your c plus plus program the
41196
30:27:04,232 --> 30:27:10,232
meaning for this base class is just to
41197
30:27:06,399 --> 30:27:12,551
be a an idea or a representation of a
41198
30:27:10,232 --> 30:27:14,872
shape without really going into the
41199
30:27:12,551 --> 30:27:16,479
concrete implementation of how that
41200
30:27:16,479 --> 30:27:21,119
hopefully this makes sense so let's see
41201
30:27:18,720 --> 30:27:23,279
how we can do this in code here we have
41202
30:27:21,119 --> 30:27:26,551
a simple class which is going to be our
41203
30:27:23,279 --> 30:27:28,232
shape class we are going to have two
41204
30:27:26,551 --> 30:27:30,231
virtual functions we're going to have
41205
30:27:28,232 --> 30:27:31,760
the perimeter function we're going to
41206
30:27:30,232 --> 30:27:33,911
have the surface function these are
41207
30:27:31,759 --> 30:27:36,871
going to be virtual functions or virtual
41208
30:27:33,911 --> 30:27:38,399
member functions i should say but we are
41209
30:27:38,399 --> 30:27:43,039
pure virtual functions by using the
41210
30:27:41,039 --> 30:27:46,231
syntax you see here so we're going to
41211
30:27:43,039 --> 30:27:48,871
prepare an echo zero and this is going
41212
30:27:46,232 --> 30:27:51,279
to tell the compiler that these are pure
41213
30:27:48,872 --> 30:27:52,872
virtual functions once you set up these
41214
30:27:51,279 --> 30:27:55,679
functions a few things are going to
41215
30:27:52,872 --> 30:27:58,639
happen in your class this class is going
41216
30:27:55,679 --> 30:28:00,719
to become an abstract class in that
41217
30:27:58,639 --> 30:28:02,720
you want to be able to create objects of
41218
30:28:00,720 --> 30:28:04,960
this class anymore if you try to do that
41219
30:28:02,720 --> 30:28:07,191
you will get a compiler error another
41220
30:28:04,960 --> 30:28:09,440
thing is that you don't need to put in
41221
30:28:07,191 --> 30:28:12,871
implementations for these methods
41222
30:28:09,440 --> 30:28:14,960
because you marked them as pure virtual
41223
30:28:12,872 --> 30:28:17,440
and what this means is that the
41224
30:28:14,960 --> 30:28:20,639
implementations will be put in by
41225
30:28:17,440 --> 30:28:22,551
inheriting downstream classes because
41226
30:28:20,639 --> 30:28:25,191
they will have concrete information to
41227
30:28:22,551 --> 30:28:27,279
compute the perimeter or the surface as
41228
30:28:25,191 --> 30:28:29,279
we have here so we don't need to bother
41229
30:28:27,279 --> 30:28:31,119
with definitions for these functions
41230
30:28:29,279 --> 30:28:32,872
here if you even try to put in a
41231
30:28:31,119 --> 30:28:35,039
definition here you're going to get a
41232
30:28:32,872 --> 30:28:37,512
compiler error because this is a virtual
41233
30:28:35,039 --> 30:28:39,831
function we have no business putting an
41234
30:28:37,512 --> 30:28:42,160
implementation in the base class here
41235
30:28:39,831 --> 30:28:44,871
these are meant to be implemented by
41236
30:28:42,160 --> 30:28:47,192
downstream inheritance classes okay once
41237
30:28:44,872 --> 30:28:49,592
we have our ship class and our
41238
30:28:47,191 --> 30:28:52,399
inheritance hierarchy we can try to run
41239
30:28:49,592 --> 30:28:54,320
this in our code for example if we try
41240
30:28:52,399 --> 30:28:56,871
and create a shape object we're going to
41241
30:28:54,320 --> 30:28:58,800
get a compiler error because shape is an
41242
30:28:56,872 --> 30:29:01,360
abstract class so we can't create
41243
30:28:58,800 --> 30:29:03,911
objects of it and i don't think i made
41244
30:29:01,360 --> 30:29:06,872
this super clear once you set up at
41245
30:29:03,911 --> 30:29:09,512
least one pure virtual function in your
41246
30:29:06,872 --> 30:29:12,232
class the class is automatically going
41247
30:29:09,512 --> 30:29:14,080
to become an abstract class and what
41248
30:29:12,232 --> 30:29:16,639
that means is that you want to be able
41249
30:29:14,080 --> 30:29:19,680
to create objects of this class so this
41250
30:29:16,639 --> 30:29:22,399
is an abstract class we have here and if
41251
30:29:19,679 --> 30:29:24,959
we try to create an object of it as we
41252
30:29:22,399 --> 30:29:27,511
are doing on this line here this is
41253
30:29:24,960 --> 30:29:30,552
going to give us a compiler error but we
41254
30:29:27,512 --> 30:29:32,160
can still use a base pointer to manage a
41255
30:29:32,160 --> 30:29:36,080
a common setup we do with polymorphism
41256
30:29:34,551 --> 30:29:38,551
so for example here we can set up a
41257
30:29:36,080 --> 30:29:41,512
shape pointer and use this to manage a
41258
30:29:38,551 --> 30:29:44,231
rectangle object if we call the surface
41259
30:29:41,512 --> 30:29:46,960
member function on our base pointer this
41260
30:29:44,232 --> 30:29:49,279
is going to do a polymorphic call and we
41261
30:29:46,960 --> 30:29:50,800
will get the surface of the rectangle
41262
30:29:49,279 --> 30:29:52,080
and we're going to print this out here
41263
30:29:50,800 --> 30:29:54,232
you're going to see that this is going
41264
30:29:52,080 --> 30:29:56,639
to work we can also use the base pointer
41265
30:29:54,232 --> 30:29:58,552
to manage a circle object as we see here
41266
30:29:56,639 --> 30:30:00,872
if we call the surface method this is
41267
30:29:58,551 --> 30:30:03,440
going to do polymorphism and it is going
41268
30:30:00,872 --> 30:30:05,680
to call the surface version of the
41269
30:30:03,440 --> 30:30:07,592
circle class and we can see it printed
41270
30:30:05,679 --> 30:30:10,000
out here this is the design we can
41271
30:30:07,592 --> 30:30:12,800
achieve even if shape is an abstract
41272
30:30:10,000 --> 30:30:15,592
class we can't create direct objects of
41273
30:30:12,800 --> 30:30:18,720
shape as we are doing here but we can
41274
30:30:15,592 --> 30:30:21,040
use a base pointer or a shape pointer to
41275
30:30:18,720 --> 30:30:23,911
manage derived object through
41276
30:30:21,039 --> 30:30:26,079
polymorphism and you need to be aware of
41277
30:30:23,911 --> 30:30:28,720
this okay now that you have an idea
41278
30:30:26,080 --> 30:30:31,191
about what a pure virtual function is
41279
30:30:28,720 --> 30:30:33,831
and what an abstract class is
41280
30:30:31,191 --> 30:30:36,399
let's see a few ideas you need to keep
41281
30:30:33,831 --> 30:30:39,279
in mind if your class has at least one
41282
30:30:36,399 --> 30:30:41,511
pure virtual function it will become an
41283
30:30:39,279 --> 30:30:43,440
abstract class you already know this you
41284
30:30:41,512 --> 30:30:45,440
can't create objects of an abstract
41285
30:30:43,440 --> 30:30:47,760
class if you try to do that you will get
41286
30:30:45,440 --> 30:30:50,400
a compiler error another thing i don't
41287
30:30:47,759 --> 30:30:53,439
think amid super clear is that derived
41288
30:30:50,399 --> 30:30:56,871
classes from an abstract class must
41289
30:30:53,440 --> 30:30:59,279
explicitly override all the pure virtual
41290
30:30:56,872 --> 30:31:01,440
functions from the base class
41291
30:31:01,440 --> 30:31:06,639
pure virtual class that you don't put in
41292
30:31:03,831 --> 30:31:08,231
an implementation in for your derived
41293
30:31:06,639 --> 30:31:10,319
class is also going to become an
41294
30:31:08,232 --> 30:31:12,000
abstract class and you want to be able
41295
30:31:10,320 --> 30:31:13,760
to create objects of that you need to
41296
30:31:12,000 --> 30:31:16,720
keep this in mind another thing you
41297
30:31:13,759 --> 30:31:17,911
can't do you can't call the pure virtual
41298
30:31:17,911 --> 30:31:22,000
from the constructor of the abstract
41299
30:31:20,479 --> 30:31:24,159
class if you do this you're going to get
41300
30:31:22,000 --> 30:31:26,551
a compiler error because we don't have
41301
30:31:24,160 --> 30:31:28,800
implementations for these things so this
41302
30:31:26,551 --> 30:31:31,759
is not going to work the constructor of
41303
30:31:28,800 --> 30:31:34,479
our abstract class is used by deriving
41304
30:31:31,759 --> 30:31:37,119
classes to build the base part of our
41305
30:31:34,479 --> 30:31:39,759
derived objects but they are not meant
41306
30:31:37,119 --> 30:31:41,440
to be used from the outside because we
41307
30:31:39,759 --> 30:31:43,911
can't really create an object of an
41308
30:31:41,440 --> 30:31:45,191
abstract class so now that you notice
41309
30:31:43,911 --> 30:31:47,039
we're going to head over to visual
41310
30:31:45,191 --> 30:31:50,159
studio code and play with this a little
41311
30:31:47,039 --> 30:31:52,479
more here we are in our working folder
41312
30:31:50,160 --> 30:31:55,680
the current project is pure virtual
41313
30:31:52,479 --> 30:31:58,159
functions and abstract classes we are
41314
30:31:55,679 --> 30:32:00,231
going to grab our template files and put
41315
30:31:58,160 --> 30:32:03,040
them in place and we're going to paste
41316
30:32:00,232 --> 30:32:05,592
them in this project here and we are
41317
30:32:03,039 --> 30:32:07,591
going to grab the files that make up our
41318
30:32:05,592 --> 30:32:09,512
inheritance hierarchy you are going to
41319
30:32:07,592 --> 30:32:11,440
get these files from the resource
41320
30:32:09,512 --> 30:32:13,592
section of the course if you want you
41321
30:32:11,440 --> 30:32:16,479
can download them and use them like i am
41322
30:32:13,592 --> 30:32:19,192
using them here or even better you can
41323
30:32:16,479 --> 30:32:21,191
type the code and see how these things
41324
30:32:19,191 --> 30:32:23,679
really work that's the best way to learn
41325
30:32:21,191 --> 30:32:25,831
i do recommend that but we want to save
41326
30:32:23,679 --> 30:32:28,479
on time here so i am just going to reuse
41327
30:32:25,831 --> 30:32:30,399
these glasses that i have lying on my
41328
30:32:28,479 --> 30:32:32,399
drive i am going to open this in visual
41329
30:32:30,399 --> 30:32:35,679
studio code by dragging and dropping
41330
30:32:32,399 --> 30:32:38,079
here we have our shape class here this
41331
30:32:35,679 --> 30:32:40,639
is going to be our base class you're
41332
30:32:38,080 --> 30:32:42,080
going to see that we have our member
41333
30:32:40,639 --> 30:32:45,039
variable which is going to be the
41334
30:32:42,080 --> 30:32:47,680
description for our shape we have a
41335
30:32:45,039 --> 30:32:50,231
bunch of constructors here but the most
41336
30:32:47,679 --> 30:32:53,191
important thing here is that we have a
41337
30:32:50,232 --> 30:32:54,872
bunch of pure virtual functions here and
41338
30:32:53,191 --> 30:32:56,080
if you go in the cpp file you're going
41339
30:32:56,080 --> 30:33:01,512
implementations then for the perimeter
41340
30:32:58,720 --> 30:33:03,360
and surface functions these are pure
41341
30:33:01,512 --> 30:33:05,911
virtual functions and we have no
41342
30:33:03,360 --> 30:33:08,320
business putting in an implementation in
41343
30:33:05,911 --> 30:33:11,119
the base class once we have these
41344
30:33:08,320 --> 30:33:14,400
virtual functions in and mark them as
41345
30:33:11,119 --> 30:33:16,799
pure virtual functions by prepending n
41346
30:33:14,399 --> 30:33:19,439
equals zero here this class here is
41347
30:33:16,800 --> 30:33:21,760
going to become an abstract class and
41348
30:33:19,440 --> 30:33:24,639
what that means is that we can't create
41349
30:33:21,759 --> 30:33:28,000
objects of this class it is meant ready
41350
30:33:24,639 --> 30:33:30,551
to be inherited from and downstream
41351
30:33:28,000 --> 30:33:32,000
inheritance classes are going to be
41352
30:33:32,000 --> 30:33:36,479
override these methods here otherwise
41353
30:33:34,399 --> 30:33:38,639
they are themselves going to become
41354
30:33:36,479 --> 30:33:40,800
abstract classes we're going to have a
41355
30:33:38,639 --> 30:33:42,639
chance to look at this here we also have
41356
30:33:40,800 --> 30:33:44,960
our rectangle class which is going to be
41357
30:33:42,639 --> 30:33:47,191
inheriting from shape it is going to
41358
30:33:44,960 --> 30:33:49,040
override our two methods we're going to
41359
30:33:47,191 --> 30:33:50,959
override the perimeter function we're
41360
30:33:49,039 --> 30:33:53,279
going to override the surface function
41361
30:33:50,960 --> 30:33:55,760
for rectangle the perimeter is computed
41362
30:33:53,279 --> 30:33:58,720
this way we're going to multiply
41363
30:33:55,759 --> 30:34:00,799
the width by two and the height by two
41364
30:33:58,720 --> 30:34:02,720
and we're going to add these two things
41365
30:34:00,800 --> 30:34:04,960
up we're going to compute the surface by
41366
30:34:02,720 --> 30:34:06,872
multiplying width and height and this is
41367
30:34:04,960 --> 30:34:08,960
going to give us the data we want we can
41368
30:34:06,872 --> 30:34:10,960
look at circle it is going to also
41369
30:34:08,960 --> 30:34:13,360
inherit from shape and it is going to
41370
30:34:10,960 --> 30:34:16,800
override our methods here if we want we
41371
30:34:13,360 --> 30:34:19,680
can even put in a radius and a variable
41372
30:34:16,800 --> 30:34:21,760
to keep track of pi we can do this you
41373
30:34:19,679 --> 30:34:23,679
can really do this however you want this
41374
30:34:21,759 --> 30:34:26,080
is just going to allow us to compute the
41375
30:34:23,679 --> 30:34:28,231
surface relatively easily in this class
41376
30:34:26,080 --> 30:34:30,400
here let's look at the implementation
41377
30:34:28,232 --> 30:34:32,720
nothing special here this is just going
41378
30:34:30,399 --> 30:34:34,479
to forward the construction of the base
41379
30:34:34,479 --> 30:34:38,959
base constructor and this is going to do
41380
30:34:36,639 --> 30:34:40,960
whatever it is we want to do here let's
41381
30:34:38,960 --> 30:34:43,040
head over to the main cpp file and
41382
30:34:43,039 --> 30:34:49,119
we are going to include circle and
41383
30:34:46,000 --> 30:34:51,759
rectangle let's do that circle dot h and
41384
30:34:49,119 --> 30:34:54,319
we're going to put in rectangle that h
41385
30:34:51,759 --> 30:34:56,720
and we're going to first try and create
41386
30:34:54,320 --> 30:34:59,912
a shape object let's do that we're going
41387
30:34:56,720 --> 30:35:02,399
to say shape and say shape pointer and
41388
30:34:59,911 --> 30:35:04,639
this is going to be new shape we can use
41389
30:35:02,399 --> 30:35:05,911
a default constructor and if we do
41390
30:35:04,639 --> 30:35:07,759
something like this you're going to see
41391
30:35:05,911 --> 30:35:10,000
that we're going to have a compiler
41392
30:35:07,759 --> 30:35:12,959
error here we have a squiggly line but
41393
30:35:10,000 --> 30:35:15,440
if we bring up a terminal window and
41394
30:35:12,960 --> 30:35:18,400
look at the problems tab we're going to
41395
30:35:15,440 --> 30:35:20,800
see that object of abstract class type
41396
30:35:18,399 --> 30:35:22,799
shape is not allowed so shape is an
41397
30:35:22,800 --> 30:35:28,160
and why is it an abstract class because
41398
30:35:25,039 --> 30:35:30,479
we have an at least one pure virtual
41399
30:35:28,160 --> 30:35:32,960
function here we actually have two and
41400
30:35:30,479 --> 30:35:35,512
this is going to make our shape class an
41401
30:35:32,960 --> 30:35:37,912
abstract class what that means is that
41402
30:35:35,512 --> 30:35:39,360
we can't create objects of this class
41403
30:35:37,911 --> 30:35:41,831
and if we do that we're going to get a
41404
30:35:39,360 --> 30:35:43,512
compiler error let's try and build this
41405
30:35:41,831 --> 30:35:46,231
program we're going to pass this through
41406
30:35:43,512 --> 30:35:48,000
gcc our favorite compiler we are going
41407
30:35:46,232 --> 30:35:50,000
to see that the bolt is going to fail
41408
30:35:48,000 --> 30:35:53,360
we're going to have a bunch of errors if
41409
30:35:50,000 --> 30:35:56,551
we go up and look at the error we have
41410
30:35:53,360 --> 30:35:58,320
invalid new expression of abstract class
41411
30:35:58,320 --> 30:36:03,040
so we can't really create an object of
41412
30:36:00,639 --> 30:36:05,759
this let's go down and see what these
41413
30:36:03,039 --> 30:36:07,759
errors are saying note because the
41414
30:36:05,759 --> 30:36:10,231
following virtual functions are pure
41415
30:36:07,759 --> 30:36:12,551
within shape and they are going to try
41416
30:36:10,232 --> 30:36:15,040
and really be helpful in the errors that
41417
30:36:12,551 --> 30:36:17,512
they give here and all they are saying
41418
30:36:15,039 --> 30:36:19,759
is that we can't create objects of this
41419
30:36:17,512 --> 30:36:22,160
class because we have pure virtual
41420
30:36:19,759 --> 30:36:24,799
functions inside okay now you know this
41421
30:36:22,160 --> 30:36:27,360
if a class is abstract you can't create
41422
30:36:24,800 --> 30:36:29,911
objects of that class but you can still
41423
30:36:27,360 --> 30:36:32,800
use a base pointer to manage derived
41424
30:36:29,911 --> 30:36:35,191
objects of that class so let's comment
41425
30:36:32,800 --> 30:36:37,592
this out because this is going to make
41426
30:36:35,191 --> 30:36:39,039
our code not compile and we're going to
41427
30:36:37,592 --> 30:36:41,440
say that this is going to give us a
41428
30:36:39,039 --> 30:36:43,591
compiler error and we're going to try
41429
30:36:41,440 --> 30:36:46,160
and use the base pointer to manage a
41430
30:36:43,592 --> 30:36:48,480
rectangle object we can do this so we're
41431
30:36:46,160 --> 30:36:50,552
going to set up a shape pointer and it
41432
30:36:48,479 --> 30:36:52,639
is going to be managing the memory of a
41433
30:36:50,551 --> 30:36:54,399
rectangle object we're going to go
41434
30:36:52,639 --> 30:36:56,800
through the base pointer and call the
41435
30:36:54,399 --> 30:36:59,119
surface method and this is going to call
41436
30:36:56,800 --> 30:37:01,040
the implementation in rectangle because
41437
30:36:59,119 --> 30:37:03,360
our base pointer is really managing the
41438
30:37:01,039 --> 30:37:06,159
rectangle object if you want you can
41439
30:37:03,360 --> 30:37:08,720
even use the type id operator to print
41440
30:37:06,160 --> 30:37:10,160
the dynamic type of this shape rect
41441
30:37:08,720 --> 30:37:12,080
pointer you're going to see that it is
41442
30:37:10,160 --> 30:37:13,592
managing a rectangle you can actually do
41443
30:37:12,080 --> 30:37:15,831
this because we learned about that in
41444
30:37:13,592 --> 30:37:18,480
the last lecture so let's practice that
41445
30:37:15,831 --> 30:37:21,511
we're going to say dynamic type of shape
41446
30:37:18,479 --> 30:37:23,279
wrap and we're going to say type id and
41447
30:37:21,512 --> 30:37:25,040
we're going to de-reference the pointer
41448
30:37:23,279 --> 30:37:27,039
we're going to say shipwrecked and we're
41449
30:37:25,039 --> 30:37:29,511
going to print the name of this and
41450
30:37:27,039 --> 30:37:31,831
we're going to see it print out on our
41451
30:37:29,512 --> 30:37:33,911
powershell window and after this we are
41452
30:37:31,831 --> 30:37:36,551
going to print the surface that we got
41453
30:37:33,911 --> 30:37:39,119
from this call here and we're going to
41454
30:37:36,551 --> 30:37:40,872
see what this gives us let's try and
41455
30:37:39,119 --> 30:37:43,679
build this program we're going to pass
41456
30:37:40,872 --> 30:37:45,192
it through gcc our favorite compiler the
41457
30:37:43,679 --> 30:37:47,359
bullet is going to be good we're going
41458
30:37:45,191 --> 30:37:50,000
to clear and run rooster we're going to
41459
30:37:47,360 --> 30:37:52,232
see that the dynamic type is rectangle
41460
30:37:50,000 --> 30:37:54,800
you can see that right here so the base
41461
30:37:52,232 --> 30:37:57,592
pointer is really managing a rectangle
41462
30:37:54,800 --> 30:37:59,911
object and this is what we have here and
41463
30:37:57,592 --> 30:38:03,279
if we call the surface method we will be
41464
30:37:59,911 --> 30:38:04,959
calling the method on the dynamic type
41465
30:38:03,279 --> 30:38:07,679
so we will be calling this surface
41466
30:38:04,960 --> 30:38:08,720
method on the rectangle class and we
41467
30:38:08,720 --> 30:38:13,512
using the implementation we have here so
41468
30:38:11,191 --> 30:38:16,479
the surface function that is going to be
41469
30:38:13,512 --> 30:38:18,720
called is what we have on line 20 in
41470
30:38:16,479 --> 30:38:21,360
rectangle here and this is going to just
41471
30:38:18,720 --> 30:38:24,080
be a multiplication of width and height
41472
30:38:21,360 --> 30:38:26,399
and we're going to get 100 here because
41473
30:38:24,080 --> 30:38:28,800
our width and height happen to be
41474
30:38:26,399 --> 30:38:31,679
10 and 10 so multiplying this is going
41475
30:38:28,800 --> 30:38:33,512
to give us 100 as we see here this is
41476
30:38:31,679 --> 30:38:36,159
really cool this is what we expect we
41477
30:38:33,512 --> 30:38:38,400
can even use our base pointer to manage
41478
30:38:36,160 --> 30:38:40,320
a circle object so let's do that we're
41479
30:38:38,399 --> 30:38:43,759
going to put in a separator to be able
41480
30:38:40,320 --> 30:38:46,232
to follow this easily and our output so
41481
30:38:43,759 --> 30:38:48,319
let's say stdndl here and we're going to
41482
30:38:46,232 --> 30:38:50,232
put in the code so we're going to set up
41483
30:38:48,320 --> 30:38:53,120
a base pointer which is really going to
41484
30:38:50,232 --> 30:38:55,680
be managing a circle object here and we
41485
30:38:53,119 --> 30:38:57,591
will call our surface method this is
41486
30:38:57,592 --> 30:39:00,960
polymorphically because surface is a
41487
30:39:00,960 --> 30:39:05,512
so we will get polymorphism here and we
41488
30:39:03,679 --> 30:39:07,831
will call the surface method on the
41489
30:39:05,512 --> 30:39:09,760
circle object which is really our
41490
30:39:07,831 --> 30:39:12,159
dynamic type if we print this out we're
41491
30:39:09,759 --> 30:39:14,959
going to see the surface printed out but
41492
30:39:12,160 --> 30:39:16,720
if we want we can even print the dynamic
41493
30:39:16,720 --> 30:39:20,720
base pointer here so we're going to do
41494
30:39:18,320 --> 30:39:23,592
the same thing we did for rectangle we
41495
30:39:20,720 --> 30:39:26,479
can use our type id operator to print
41496
30:39:23,592 --> 30:39:28,639
the dynamic type of shape circle and
41497
30:39:26,479 --> 30:39:31,119
we're going to say shape circle here and
41498
30:39:28,639 --> 30:39:32,872
this is going to do what we want let's
41499
30:39:31,119 --> 30:39:35,591
look at this we're going to be printing
41500
30:39:32,872 --> 30:39:37,592
the surface here this is exactly what we
41501
30:39:35,592 --> 30:39:40,000
want so let's build and run we're going
41502
30:39:37,592 --> 30:39:41,912
to pass this through gcc the bolt is
41503
30:39:40,000 --> 30:39:42,960
going to go through as you see here if
41504
30:39:42,960 --> 30:39:47,912
and run rooster we're going to see that
41505
30:39:45,360 --> 30:39:50,399
the dynamic type is now a circle so the
41506
30:39:47,911 --> 30:39:52,639
base pointer or the shape pointer we
41507
30:39:50,399 --> 30:39:55,511
have here is really managing
41508
30:39:52,639 --> 30:39:57,831
a circle object polymorphically so if we
41509
30:39:55,512 --> 30:39:59,911
call a virtual function on this base
41510
30:39:57,831 --> 30:40:01,119
pointer it is going to call
41511
30:40:01,119 --> 30:40:05,911
specific implementation of the surface
41512
30:40:03,592 --> 30:40:08,000
object we have and that happens to be
41513
30:40:05,911 --> 30:40:08,959
for this circle object here this is what
41514
30:40:08,960 --> 30:40:12,480
if we compute the surface we're going to
41515
30:40:10,720 --> 30:40:14,872
see that it is going to be using the
41516
30:40:12,479 --> 30:40:17,440
data we have here and we will get this
41517
30:40:14,872 --> 30:40:18,639
number as our surface if you plug this
41518
30:40:17,440 --> 30:40:21,040
in you're going to see that this is
41519
30:40:18,639 --> 30:40:23,592
really right so this is really all i had
41520
30:40:21,039 --> 30:40:26,639
to share in this lecture we can set up
41521
30:40:23,592 --> 30:40:28,400
pure virtual functions in a base class
41522
30:40:26,639 --> 30:40:31,759
and what that's going to do it is going
41523
30:40:28,399 --> 30:40:33,591
to make our class an abstract class but
41524
30:40:31,759 --> 30:40:35,679
we want also be able to put in
41525
30:40:35,679 --> 30:40:39,511
methods anymore in the base class
41526
30:40:37,592 --> 30:40:41,680
because they are meant to be
41527
30:40:39,512 --> 30:40:44,720
overwritten and implemented by
41528
30:40:41,679 --> 30:40:46,639
downstream inheritance classes so if you
41529
30:40:44,720 --> 30:40:49,191
go in here and try to put in an
41530
30:40:46,639 --> 30:40:50,960
implementation we will probably get a
41531
30:40:49,191 --> 30:40:53,119
compiler error because this is not
41532
30:40:50,960 --> 30:40:55,280
allowed you see we have a problem here
41533
30:40:53,119 --> 30:40:57,279
if we try to build we will get a weird
41534
30:40:55,279 --> 30:40:59,831
compiler error let's make sure we see
41535
30:40:57,279 --> 30:41:02,872
the compiler error so world finished
41536
30:40:59,831 --> 30:41:05,191
with errors and we are going to see
41537
30:41:02,872 --> 30:41:06,232
what's the problem here let's go up and
41538
30:41:06,232 --> 30:41:12,639
pure specifier on function definition so
41539
30:41:09,831 --> 30:41:15,591
this is not allowed so we are really
41540
30:41:12,639 --> 30:41:18,000
conflicting ourselves here we are
41541
30:41:15,592 --> 30:41:19,040
marking this function as a pure virtual
41542
30:41:19,039 --> 30:41:24,000
and what that means and a pure virtual
41543
30:41:22,320 --> 30:41:26,400
functions isn't meant to have a
41544
30:41:24,000 --> 30:41:28,000
definition but we are also putting in a
41545
30:41:26,399 --> 30:41:29,911
definition here so the compiler is going
41546
30:41:28,000 --> 30:41:32,160
to be confused this is not something we
41547
30:41:29,911 --> 30:41:34,800
should be doing another thing i want to
41548
30:41:32,160 --> 30:41:35,911
point out before we wrap up this lecture
41549
30:41:35,911 --> 30:41:42,160
downstream inheriting classes are forced
41550
30:41:39,679 --> 30:41:44,719
to override and implement all the pure
41551
30:41:42,160 --> 30:41:47,440
virtual functions from the class that
41552
30:41:44,720 --> 30:41:49,440
they inherit from if they don't do that
41553
30:41:47,440 --> 30:41:51,440
they are themselves going to become
41554
30:41:49,440 --> 30:41:54,232
abstract and we want to be able to
41555
30:41:51,440 --> 30:41:56,080
create objects of them so let's try and
41556
30:41:54,232 --> 30:41:58,232
for example comment out the surface
41557
30:41:56,080 --> 30:42:02,000
implementation here and that's going to
41558
30:41:58,232 --> 30:42:03,911
make our circle class an abstract class
41559
30:42:02,000 --> 30:42:06,000
and if we try to create an object with
41560
30:42:03,911 --> 30:42:08,639
circle we will get a compiler error
41561
30:42:06,000 --> 30:42:10,232
because now circle is an abstract class
41562
30:42:08,639 --> 30:42:12,479
let's try and build and show you the
41563
30:42:10,232 --> 30:42:15,279
compiler error and this can really be
41564
30:42:12,479 --> 30:42:17,759
confusing if you are a beginner on this
41565
30:42:15,279 --> 30:42:20,720
you will be wondering why you can't
41566
30:42:17,759 --> 30:42:23,831
create objects of your class even if you
41567
30:42:20,720 --> 30:42:26,232
didn't really explicitly put in any pure
41568
30:42:23,831 --> 30:42:29,360
virtual function the reason is we are
41569
30:42:26,232 --> 30:42:32,720
inheriting from an abstract class that
41570
30:42:29,360 --> 30:42:35,759
has two pure virtual functions but we
41571
30:42:32,720 --> 30:42:38,160
are only overriding one pure virtual
41572
30:42:35,759 --> 30:42:40,399
function we need to override all of them
41573
30:42:38,160 --> 30:42:42,720
otherwise our class is also going to be
41574
30:42:40,399 --> 30:42:44,639
an abstract class let's look at the
41575
30:42:42,720 --> 30:42:47,440
compiler error we are getting here let's
41576
30:42:44,639 --> 30:42:49,911
go up and see if we can find it we are
41577
30:42:47,440 --> 30:42:52,479
going to say in function in main
41578
30:42:49,911 --> 30:42:55,119
evaluate new expression of abstract
41579
30:42:52,479 --> 30:42:58,159
class type circle we are trying to
41580
30:42:55,119 --> 30:43:00,231
create an object from an abstract class
41581
30:42:58,160 --> 30:43:01,832
this is the error we have here and you
41582
30:43:01,831 --> 30:43:06,551
so let's go back and make sure we are
41583
30:43:04,399 --> 30:43:08,720
overriding all these stunts because we
41584
30:43:06,551 --> 30:43:11,512
need to do that to be able to create
41585
30:43:08,720 --> 30:43:14,080
objects of a circle and now this is
41586
30:43:11,512 --> 30:43:16,160
going to work exactly as it should let's
41587
30:43:14,080 --> 30:43:18,232
build and make sure of that the bullet
41588
30:43:16,160 --> 30:43:20,800
is going to be good we are fine this is
41589
30:43:18,232 --> 30:43:22,480
working exactly as we want this is
41590
30:43:20,800 --> 30:43:24,720
really all i wanted you to see in this
41591
30:43:22,479 --> 30:43:27,119
lecture i hope you found it interesting
41592
30:43:24,720 --> 30:43:28,960
we are going to stop here in this one
41593
30:43:27,119 --> 30:43:31,591
the next one we're going to learn about
41594
30:43:28,960 --> 30:43:33,440
interfaces in c plus plus and they are
41595
30:43:31,592 --> 30:43:35,360
going to be reusing the knowledge we
41596
30:43:33,440 --> 30:43:37,832
learned about in this lecture go ahead
41597
30:43:35,360 --> 30:43:39,360
and finish up here and meet me there in
41598
30:43:37,831 --> 30:43:43,119
this lecture we're going to see that we
41599
30:43:39,360 --> 30:43:45,592
can model interfaces in c plus plus
41600
30:43:45,592 --> 30:43:50,000
and now there's a lot of things that
41601
30:43:47,279 --> 30:43:52,479
might not make sense in what i just said
41602
30:43:50,000 --> 30:43:55,911
so let's break this apart an interface
41603
30:43:52,479 --> 30:43:59,440
can be thought of as an abstract class
41604
30:43:55,911 --> 30:44:02,080
with only pure virtual functions and no
41605
30:43:59,440 --> 30:44:03,832
member variable so if you have a setup
41606
30:44:02,080 --> 30:44:06,232
like that you can call that thing an
41607
30:44:03,831 --> 30:44:08,159
interface let's look at a simple example
41608
30:44:06,232 --> 30:44:10,232
here here we have a simple class called
41609
30:44:08,160 --> 30:44:12,872
stream insertable you see that it
41610
30:44:10,232 --> 30:44:16,232
doesn't have any member variable it only
41611
30:44:12,872 --> 30:44:18,232
has a pure virtual function here and a
41612
30:44:16,232 --> 30:44:20,400
helper function that we could set up to
41613
30:44:18,232 --> 30:44:23,832
help us do a few things the only
41614
30:44:20,399 --> 30:44:26,720
specification to make this an interface
41615
30:44:23,831 --> 30:44:29,511
is to have in only pure virtual
41616
30:44:26,720 --> 30:44:31,360
functions and no member variables if you
41617
30:44:29,512 --> 30:44:33,760
have in a member variable this is going
41618
30:44:31,360 --> 30:44:35,440
to stop becoming an interface in c plus
41619
30:44:33,759 --> 30:44:38,000
plus okay so you can think of an
41620
30:44:35,440 --> 30:44:40,960
interface as an abstract class
41621
30:44:38,000 --> 30:44:43,119
with at least one pure virtual function
41622
30:44:40,960 --> 30:44:45,440
and no member variable that's going to
41623
30:44:43,119 --> 30:44:48,159
make it an interface down here you see
41624
30:44:45,440 --> 30:44:51,119
that an interface can be thought of as a
41625
30:44:48,160 --> 30:44:54,080
specification of something that will be
41626
30:44:51,119 --> 30:44:56,551
fully implemented in a derived class
41627
30:44:54,080 --> 30:44:59,680
but the specification itself is going to
41628
30:44:56,551 --> 30:45:02,551
reside in the abstract class another way
41629
30:44:59,679 --> 30:45:05,039
to think about an interface is to treat
41630
30:45:05,039 --> 30:45:10,319
you can attach to your types to give
41631
30:45:07,279 --> 30:45:12,160
them superpowers for example this stream
41632
30:45:12,160 --> 30:45:17,911
has a single job and that's going to
41633
30:45:14,479 --> 30:45:20,872
allow our types to insert data into
41634
30:45:17,911 --> 30:45:22,800
output streams like sddc out this is the
41635
30:45:20,872 --> 30:45:25,440
only thing this interface is going to
41636
30:45:22,800 --> 30:45:27,360
add to our times so we can take this
41637
30:45:25,440 --> 30:45:29,360
interface and attach that to a point
41638
30:45:27,360 --> 30:45:31,759
class for example and we will
41639
30:45:29,360 --> 30:45:34,479
automatically be able to print point
41640
30:45:31,759 --> 30:45:37,039
objects to the output stream and we want
41641
30:45:34,479 --> 30:45:39,591
to need to overload the stream output
41642
30:45:37,039 --> 30:45:41,679
operator in the point class we can do
41643
30:45:39,592 --> 30:45:44,160
the same thing to our bird class we can
41644
30:45:41,679 --> 30:45:46,079
do the same thing to our dog class and
41645
30:45:44,160 --> 30:45:48,232
we will be able to print these things
41646
30:45:46,080 --> 30:45:50,400
without having to overload the stream
41647
30:45:48,232 --> 30:45:53,512
output operator hopefully you can see
41648
30:45:50,399 --> 30:45:55,679
how powerful this is if we manage to set
41649
30:45:53,512 --> 30:45:58,720
up this kind of relationship between our
41650
30:45:55,679 --> 30:46:00,799
type and our interfaces so again an
41651
30:45:58,720 --> 30:46:03,592
interface is something you can attach to
41652
30:46:00,800 --> 30:46:05,832
your types to give them powers or
41653
30:46:03,592 --> 30:46:07,912
features that they originally didn't
41654
30:46:05,831 --> 30:46:10,231
have and that's going to save you from
41655
30:46:07,911 --> 30:46:12,399
having to implement these features
41656
30:46:10,232 --> 30:46:14,400
separately in each class for real time
41657
30:46:12,399 --> 30:46:16,799
so this is a huge time saver now you
41658
30:46:14,399 --> 30:46:19,439
must be asking how do i take my
41659
30:46:16,800 --> 30:46:22,080
interface and attach it to my type well
41660
30:46:19,440 --> 30:46:25,760
the way c plus plus does this you have
41661
30:46:22,080 --> 30:46:28,160
to inherit from the interface from your
41662
30:46:25,759 --> 30:46:30,080
type to attach the interface to your
41663
30:46:28,160 --> 30:46:32,872
type so for example if we wanted to
41664
30:46:30,080 --> 30:46:34,720
attach this interface to our point class
41665
30:46:32,872 --> 30:46:37,440
what we would do is something like this
41666
30:46:34,720 --> 30:46:40,720
we would set up our point class
41667
30:46:37,440 --> 30:46:42,800
and inherit from our interface which is
41668
30:46:40,720 --> 30:46:44,720
stream insertable the moment we do this
41669
30:46:42,800 --> 30:46:47,192
our point is going to be able to print
41670
30:46:44,720 --> 30:46:49,512
thanks to the console through the stream
41671
30:46:47,191 --> 30:46:52,159
output operator but hopefully you can
41672
30:46:49,512 --> 30:46:55,040
see that something is missing how does
41673
30:46:52,160 --> 30:46:57,360
our point class know how to print stuff
41674
30:46:55,039 --> 30:46:59,591
if we go up and look at our stream
41675
30:46:57,360 --> 30:47:02,160
insertable interface we're going to see
41676
30:46:59,592 --> 30:47:05,040
that it is declaring a stream output
41677
30:47:02,160 --> 30:47:07,592
operator it is this thing that is used
41678
30:47:05,039 --> 30:47:09,679
to print data to the output stream you
41679
30:47:07,592 --> 30:47:12,960
see this is a regular output stream
41680
30:47:09,679 --> 30:47:16,000
operator we will be printing to sddo
41681
30:47:12,960 --> 30:47:18,160
stream and the object is named out here
41682
30:47:16,000 --> 30:47:20,080
and we will be printing whatever operand
41683
30:47:18,160 --> 30:47:22,400
that is passed as a second parameter
41684
30:47:22,399 --> 30:47:25,591
we will need to set up a virtual
41685
30:47:25,592 --> 30:47:31,680
that will need to be implemented by
41686
30:47:28,080 --> 30:47:34,080
whoever inherits from our interface here
41687
30:47:31,679 --> 30:47:36,159
and this is going to be super powerful
41688
30:47:34,080 --> 30:47:38,872
we are going to take over the job to
41689
30:47:36,160 --> 30:47:42,232
print to the output stream but we will
41690
30:47:38,872 --> 30:47:44,232
let inheriting download classes to
41691
30:47:42,232 --> 30:47:47,760
specify what we print and they are going
41692
30:47:44,232 --> 30:47:49,832
to specify that in this virtual method
41693
30:47:47,759 --> 30:47:52,639
let's look at our point class again and
41694
30:47:49,831 --> 30:47:55,279
really put the puzzles together here and
41695
30:47:52,639 --> 30:47:57,831
understand how this works okay this is
41696
30:47:55,279 --> 30:48:00,551
our point class and it is going to be
41697
30:47:57,831 --> 30:48:02,871
inheriting from our interface and it is
41698
30:48:00,551 --> 30:48:04,720
going to implement our virtual function
41699
30:48:02,872 --> 30:48:07,040
here we are going to set it up here and
41700
30:48:04,720 --> 30:48:09,279
we are going to mark it as an override
41701
30:48:07,039 --> 30:48:11,191
because it is overriding a method that
41702
30:48:09,279 --> 30:48:13,119
comes from our stream insertable
41703
30:48:11,191 --> 30:48:16,159
interface here and it is going to
41704
30:48:13,119 --> 30:48:18,159
specify which data we print to the
41705
30:48:16,160 --> 30:48:20,552
output stream and how the data is going
41706
30:48:18,160 --> 30:48:22,639
to be printed out you can specify
41707
30:48:20,551 --> 30:48:24,319
these things here we're going to format
41708
30:48:22,639 --> 30:48:27,039
the data in a point and we're going to
41709
30:48:24,320 --> 30:48:30,000
be using these square brackets to put mx
41710
30:48:27,039 --> 30:48:33,759
and my here and notice that this is an
41711
30:48:30,000 --> 30:48:36,000
override so the inheritance class has
41712
30:48:33,759 --> 30:48:38,551
all the information we need to put in
41713
30:48:36,000 --> 30:48:40,800
our output stream operator and we will
41714
30:48:38,551 --> 30:48:43,119
do that through our stream insert
41715
30:48:40,800 --> 30:48:46,551
override here now let's go back to our
41716
30:48:43,119 --> 30:48:48,959
stream insertable interface to see how
41717
30:48:46,551 --> 30:48:51,591
our output stream operator actually
41718
30:48:48,960 --> 30:48:53,512
works what we have here is what would be
41719
30:48:51,592 --> 30:48:55,760
a header and this is going to just put
41720
30:48:53,512 --> 30:48:58,400
in a declaration for this but we can
41721
30:48:55,759 --> 30:49:00,639
even look at its implementation the
41722
30:48:58,399 --> 30:49:02,720
implementation for our output stream
41723
30:49:00,639 --> 30:49:04,551
operator may look something like this we
41724
30:49:02,720 --> 30:49:06,872
are going to pass in the first operand
41725
30:49:04,551 --> 30:49:09,191
and the second operand here but notice
41726
30:49:06,872 --> 30:49:10,000
what we are doing here we are going to
41727
30:49:10,000 --> 30:49:16,399
the stream insert virtual function on
41728
30:49:13,191 --> 30:49:17,360
our operand here and this is going to
41729
30:49:17,360 --> 30:49:22,872
the most specific implementation we can
41730
30:49:20,320 --> 30:49:24,720
find for the stream insert if we are
41731
30:49:22,872 --> 30:49:27,592
trying to print a circle for example
41732
30:49:24,720 --> 30:49:30,320
this is going to call the stream insert
41733
30:49:27,592 --> 30:49:32,872
override on a circle object if we are
41734
30:49:30,320 --> 30:49:35,440
trying to print a point this is going to
41735
30:49:32,872 --> 30:49:37,512
call this method on our point object and
41736
30:49:35,440 --> 30:49:40,232
this is going to use polymorphism
41737
30:49:37,512 --> 30:49:42,479
because our second operand here is pass
41738
30:49:40,232 --> 30:49:44,480
by reference hopefully you can see how
41739
30:49:42,479 --> 30:49:46,551
this is super powerful i know this is
41740
30:49:44,479 --> 30:49:49,039
convoluted because we are jumping around
41741
30:49:46,551 --> 30:49:51,360
trying to explain this but i couldn't
41742
30:49:49,039 --> 30:49:54,159
really come up with an easier way to put
41743
30:49:51,360 --> 30:49:57,191
this we have to try this encode to
41744
30:49:54,160 --> 30:49:59,680
really see the power of this but this is
41745
30:49:57,191 --> 30:50:02,000
really the power of interfaces we can
41746
30:49:59,679 --> 30:50:04,479
design our features and wrap them in an
41747
30:50:02,000 --> 30:50:06,551
interface and we can really attach that
41748
30:50:04,479 --> 30:50:09,039
interface to any type we have in our c
41749
30:50:06,551 --> 30:50:11,512
plus plus program and that type is going
41750
30:50:09,039 --> 30:50:14,079
to automatically inherit the features
41751
30:50:11,512 --> 30:50:16,400
that we have set up in our interface for
41752
30:50:14,080 --> 30:50:19,279
example now that we have attached this
41753
30:50:16,399 --> 30:50:21,439
interface to our point here we can print
41754
30:50:19,279 --> 30:50:23,360
our points on the output stream and this
41755
30:50:21,440 --> 30:50:25,512
is going to work automatically you see
41756
30:50:23,360 --> 30:50:28,320
that we don't need to set up an output
41757
30:50:25,512 --> 30:50:30,800
stream operator on our class altogether
41758
30:50:28,320 --> 30:50:33,360
we can even go further and attach this
41759
30:50:30,800 --> 30:50:35,911
interface to a full inheritance
41760
30:50:33,360 --> 30:50:38,551
hierarchy for example if we have our
41761
30:50:35,911 --> 30:50:40,551
base class to be animal and we inherit
41762
30:50:38,551 --> 30:50:43,759
from this class to create all kinds of
41763
30:50:40,551 --> 30:50:46,479
crazy classes we can go on and attach
41764
30:50:43,759 --> 30:50:49,591
our interface to the base class here and
41765
30:50:46,479 --> 30:50:52,000
this is going to make all our classes in
41766
30:50:49,592 --> 30:50:54,480
our inheritance hierarchy have the
41767
30:50:52,000 --> 30:50:57,191
features that the interface has brought
41768
30:50:54,479 --> 30:50:59,759
to the base class so for example we can
41769
30:50:57,191 --> 30:51:02,479
attach our interface to the animal class
41770
30:50:59,759 --> 30:51:05,039
by inheriting from stream insertable
41771
30:51:02,479 --> 30:51:08,399
here and this is going to give our
41772
30:51:05,039 --> 30:51:10,871
animal the powers to be printed out to
41773
30:51:08,399 --> 30:51:13,119
output streams and this is going to be
41774
30:51:10,872 --> 30:51:15,592
powered by the virtual function that we
41775
30:51:15,592 --> 30:51:20,639
we are going to specify which data to
41776
30:51:18,479 --> 30:51:22,872
print in our animal class and how the
41777
30:51:20,639 --> 30:51:24,960
data is going to be printed out here and
41778
30:51:22,872 --> 30:51:27,040
we can do that in this override and this
41779
30:51:24,960 --> 30:51:28,960
is super powerful once we do this we're
41780
30:51:27,039 --> 30:51:31,679
going to go to each class in our
41781
30:51:28,960 --> 30:51:33,280
inheritance hierarchy and implement the
41782
30:51:33,279 --> 30:51:37,191
override because if we don't do that
41783
30:51:35,592 --> 30:51:40,000
this class is also going to become an
41784
30:51:37,191 --> 30:51:42,399
abstract class because it is inheriting
41785
30:51:40,000 --> 30:51:45,279
from a class that has a pure virtual
41786
30:51:42,399 --> 30:51:48,319
function remember if you inherit from a
41787
30:51:45,279 --> 30:51:51,119
class that has at least one pure virtual
41788
30:51:48,320 --> 30:51:54,000
function you will be forced to implement
41789
30:51:51,119 --> 30:51:55,831
all the pure virtual functions that come
41790
30:51:54,000 --> 30:51:58,232
from your parent class if you don't do
41791
30:51:55,831 --> 30:52:00,159
that you are going to become an abstract
41792
30:51:58,232 --> 30:52:02,639
class yourself and we don't really want
41793
30:52:00,160 --> 30:52:05,192
that that's why we are overriding the
41794
30:52:02,639 --> 30:52:07,279
stream insert override here and with
41795
30:52:05,191 --> 30:52:09,360
this we are going to specify which
41796
30:52:07,279 --> 30:52:11,592
information to print from our object
41797
30:52:09,360 --> 30:52:14,080
here and here we are going to put out
41798
30:52:11,592 --> 30:52:16,480
the description and the wing color and
41799
30:52:14,080 --> 30:52:18,800
this is the format we specify here and
41800
30:52:16,479 --> 30:52:21,191
this method is going to be called by our
41801
30:52:18,800 --> 30:52:24,232
output stream operator which is coming
41802
30:52:21,191 --> 30:52:26,231
from our stream insertable interface
41803
30:52:24,232 --> 30:52:28,000
hopefully you can see how this is super
41804
30:52:26,232 --> 30:52:29,360
powerful okay now that you know this
41805
30:52:28,000 --> 30:52:31,119
we're going to head over to visual
41806
30:52:29,360 --> 30:52:34,080
studio code and play with us a little
41807
30:52:31,119 --> 30:52:36,959
more here we are in our working folder
41808
30:52:34,080 --> 30:52:39,831
the current project is abstract classes
41809
30:52:36,960 --> 30:52:42,960
as interfaces we're going to grab our
41810
30:52:39,831 --> 30:52:45,039
template files and put the data in place
41811
30:52:42,960 --> 30:52:46,232
and i'm going to copy this and put that
41812
30:52:46,232 --> 30:52:50,480
we are going to put in the files we're
41813
30:52:48,160 --> 30:52:52,960
going to be using in our inheritance
41814
30:52:50,479 --> 30:52:55,512
hierarchy you see we have our animal
41815
30:52:52,960 --> 30:52:58,160
hierarchy here you can grab these files
41816
30:52:55,512 --> 30:53:00,080
from the resource section of this
41817
30:52:58,160 --> 30:53:02,480
lecture and you can reuse them like we
41818
30:53:00,080 --> 30:53:04,160
are using here or if you want you can
41819
30:53:02,479 --> 30:53:05,911
even type this but i don't really
41820
30:53:04,160 --> 30:53:07,911
recommend this because this is too much
41821
30:53:05,911 --> 30:53:10,080
typing we just want to learn about
41822
30:53:07,911 --> 30:53:11,831
interfaces here and that's what you
41823
30:53:10,080 --> 30:53:14,320
should focus on so we're going to open
41824
30:53:11,831 --> 30:53:16,551
this up in videos video code and this is
41825
30:53:14,320 --> 30:53:18,960
going to give us all the files we need
41826
30:53:16,551 --> 30:53:21,191
we're going to look at the top class and
41827
30:53:18,960 --> 30:53:24,400
we will see that it is inheriting from
41828
30:53:21,191 --> 30:53:27,119
our stream insertable interface so let's
41829
30:53:24,399 --> 30:53:29,039
look at our stream insertable interface
41830
30:53:27,119 --> 30:53:32,080
because this is the focus of this
41831
30:53:29,039 --> 30:53:33,831
lecture here so it is a regular class as
41832
30:53:32,080 --> 30:53:35,680
you see here it is class stream
41833
30:53:33,831 --> 30:53:38,399
insertable we're going to set up an
41834
30:53:35,679 --> 30:53:40,719
output stream operator and it is really
41835
30:53:38,399 --> 30:53:42,079
like any other output stream operator
41836
30:53:40,720 --> 30:53:44,639
you have seen we're going to pass the
41837
30:53:44,639 --> 30:53:49,512
and we are going to specify our pure
41838
30:53:47,279 --> 30:53:52,000
virtual function which is going to be
41839
30:53:49,512 --> 30:53:54,800
implemented by downstream inheriting
41840
30:53:52,000 --> 30:53:57,440
classes from this class here and this is
41841
30:53:54,800 --> 30:53:58,872
going to set up polymorphism and what
41842
30:53:58,872 --> 30:54:04,400
is if we call this method on our second
41843
30:54:02,000 --> 30:54:06,800
operand here we are going to call this
41844
30:54:04,399 --> 30:54:08,479
method polymorphically so if you are
41845
30:54:06,800 --> 30:54:10,551
trying to print a point we are going to
41846
30:54:08,479 --> 30:54:12,959
call this method on a point object and
41847
30:54:10,551 --> 30:54:15,360
we will print it out exactly how the
41848
30:54:12,960 --> 30:54:17,680
point wants to be printed if we are
41849
30:54:15,360 --> 30:54:20,080
printing a circle we will call this
41850
30:54:17,679 --> 30:54:22,719
stream insert method on the circle and
41851
30:54:20,080 --> 30:54:25,360
we will print a circle exactly how a
41852
30:54:22,720 --> 30:54:27,759
circle wants to be printed out let's
41853
30:54:25,360 --> 30:54:29,680
look at the implementation and it is
41854
30:54:27,759 --> 30:54:32,479
nothing really complicated we're going
41855
30:54:29,679 --> 30:54:34,871
to specify our output stream object as
41856
30:54:32,479 --> 30:54:37,039
the first parameter here and the second
41857
30:54:34,872 --> 30:54:39,192
parameter is what we want to print out
41858
30:54:37,039 --> 30:54:41,759
we will pass this by reference and this
41859
30:54:39,191 --> 30:54:43,591
is going to allow us to do polymorphism
41860
30:54:41,759 --> 30:54:45,759
remember that stream insertable is
41861
30:54:43,592 --> 30:54:48,872
really going to become our top base
41862
30:54:45,759 --> 30:54:51,591
class so we will basically be setting up
41863
30:54:48,872 --> 30:54:53,512
stream insertable polymorphism here you
41864
30:54:51,592 --> 30:54:56,552
need to keep this in mind we are going
41865
30:54:53,512 --> 30:54:58,160
to call our stream insert method on our
41866
30:54:56,551 --> 30:55:00,479
operand and we're going to pass the
41867
30:54:58,160 --> 30:55:02,960
stream output we want to print on and
41868
30:55:00,479 --> 30:55:05,512
we're going to return this output stream
41869
30:55:05,512 --> 30:55:11,512
like a regular output stream operator to
41870
30:55:08,551 --> 30:55:14,231
allow output chaining in our operator
41871
30:55:11,512 --> 30:55:16,400
here once we have this stream insertable
41872
30:55:14,232 --> 30:55:19,279
interface we can really use it however
41873
30:55:16,399 --> 30:55:22,079
we want let's head over to the main cpp
41874
30:55:19,279 --> 30:55:25,119
file and try to play with us so what we
41875
30:55:22,080 --> 30:55:27,279
are going to do is crack this open and
41876
30:55:25,119 --> 30:55:30,639
we are going to remove whatever it is we
41877
30:55:27,279 --> 30:55:32,639
don't need we are going to include our
41878
30:55:30,639 --> 30:55:35,232
interface so we're going to include
41879
30:55:32,639 --> 30:55:37,759
stream insertable let's do that
41880
30:55:35,232 --> 30:55:39,592
insertable.h i think this is the name
41881
30:55:37,759 --> 30:55:42,399
and we're going to set up a point class
41882
30:55:39,592 --> 30:55:44,720
which we wish to be printed out on the
41883
30:55:42,399 --> 30:55:47,360
output stream notice that we want to
41884
30:55:44,720 --> 30:55:50,000
inherit from stream insertable and what
41885
30:55:47,360 --> 30:55:52,872
this is really doing is attaching the
41886
30:55:50,000 --> 30:55:55,592
interface to the point class here and
41887
30:55:52,872 --> 30:55:58,551
because this stream insertable
41888
30:55:55,592 --> 30:56:00,000
interface has a pure virtual function
41889
30:56:00,000 --> 30:56:04,800
override this pure virtual function here
41890
30:56:02,872 --> 30:56:07,040
if we don't we want to be able to create
41891
30:56:04,800 --> 30:56:08,479
objects of our point here let's go down
41892
30:56:07,039 --> 30:56:11,039
and show you that we're going to get
41893
30:56:08,479 --> 30:56:12,800
that problem if we don't do that we're
41894
30:56:12,800 --> 30:56:16,872
and say p1 and for example put in 10 and
41895
30:56:16,872 --> 30:56:22,080
we will have a compiler error because
41896
30:56:19,191 --> 30:56:24,720
now the point class is an abstract class
41897
30:56:22,080 --> 30:56:27,279
because it is inherited from a class
41898
30:56:24,720 --> 30:56:29,680
that has a pure virtual function and it
41899
30:56:27,279 --> 30:56:30,639
is not overriding that pure virtual
41900
30:56:30,639 --> 30:56:37,191
so in other words this class still has a
41901
30:56:34,512 --> 30:56:38,800
non-implemented pure virtual function
41902
30:56:38,800 --> 30:56:43,440
an abstract class and we can't create an
41903
30:56:41,119 --> 30:56:45,191
object of it if we're trying to run this
41904
30:56:43,440 --> 30:56:48,320
code we're going to pass this through
41905
30:56:45,191 --> 30:56:50,231
gcc we will get a compiler okay we have
41906
30:56:48,320 --> 30:56:52,960
a compiler error here and we need to fix
41907
30:56:50,232 --> 30:56:55,832
this all we need to do is to implement
41908
30:56:52,960 --> 30:56:58,552
the interface that comes from our stream
41909
30:56:55,831 --> 30:57:01,511
insertable interface here so we can grab
41910
30:56:58,551 --> 30:57:05,279
our pure virtual function and implement
41911
30:57:01,512 --> 30:57:07,440
it in our main cpp file for the point
41912
30:57:05,279 --> 30:57:10,639
class we're going to put it in here and
41913
30:57:07,440 --> 30:57:12,551
we will remove the pure virtual function
41914
30:57:10,639 --> 30:57:15,039
specifier here and we will put in an
41915
30:57:12,551 --> 30:57:17,279
implementation we want to specify that
41916
30:57:15,039 --> 30:57:21,360
this is an override of a method that is
41917
30:57:17,279 --> 30:57:23,039
coming from our upstream parent class
41918
30:57:21,360 --> 30:57:25,680
and we are going to head over in the
41919
30:57:23,039 --> 30:57:27,759
body of our function and put in the
41920
30:57:25,679 --> 30:57:29,911
information we want to put out
41921
30:57:27,759 --> 30:57:33,591
this is a point object so we just want
41922
30:57:29,911 --> 30:57:36,080
to print the m x coordinate and the m y
41923
30:57:33,592 --> 30:57:39,592
coordinate here and this is the format
41924
30:57:36,080 --> 30:57:41,680
that we want and at this moment the job
41925
30:57:39,592 --> 30:57:44,720
of this function is really done
41926
30:57:41,679 --> 30:57:46,799
and it will be picked up polymorphically
41927
30:57:44,720 --> 30:57:49,360
if somebody tries to call this on a
41928
30:57:46,800 --> 30:57:50,960
point object through polymorphism and
41929
30:57:49,360 --> 30:57:53,191
this is going to work now that we have
41930
30:57:50,960 --> 30:57:55,512
this point we can try and build and make
41931
30:57:53,191 --> 30:57:57,759
sure this is working let's make sure we
41932
30:57:55,512 --> 30:57:59,911
don't have the compiler error anymore
41933
30:57:57,759 --> 30:58:02,399
the world finished successfully so we
41934
30:57:59,911 --> 30:58:04,399
are cool here but what we want to see is
41935
30:58:04,399 --> 30:58:09,591
point objects because that's the whole
41936
30:58:06,320 --> 30:58:11,680
point of attaching this interface to our
41937
30:58:09,592 --> 30:58:13,279
point class here so what we are going to
41938
30:58:11,679 --> 30:58:15,831
do is print this out we're going to say
41939
30:58:13,279 --> 30:58:18,551
sddc out we're going to say p1 and we're
41940
30:58:15,831 --> 30:58:21,039
going to say p1 here this is how we
41941
30:58:18,551 --> 30:58:22,800
would use our output stream operator you
41942
30:58:21,039 --> 30:58:25,039
see we don't have a compiler error this
41943
30:58:22,800 --> 30:58:27,279
is really magic some of you are going to
41944
30:58:25,039 --> 30:58:28,719
ask how is this even working somebody is
41945
30:58:27,279 --> 30:58:30,399
going to look at your class they are
41946
30:58:28,720 --> 30:58:32,720
going to look you don't have an output
41947
30:58:30,399 --> 30:58:35,511
stream operator but you can print your
41948
30:58:32,720 --> 30:58:37,279
objects so how is this working well this
41949
30:58:35,512 --> 30:58:40,000
is working through the magic of
41950
30:58:37,279 --> 30:58:43,119
interfaces we are attaching this
41951
30:58:40,000 --> 30:58:45,512
interface to our point class and this is
41952
30:58:43,119 --> 30:58:47,591
going to give our class the powers that
41953
30:58:45,512 --> 30:58:50,232
come from this interface and one of
41954
30:58:47,592 --> 30:58:52,552
those powers is to use the output stream
41955
30:58:50,232 --> 30:58:54,872
operator we get from this interface we
41956
30:58:52,551 --> 30:58:56,159
can use that directly and what this is
41957
30:58:54,872 --> 30:58:58,551
going to do let's look at the
41958
30:58:56,160 --> 30:59:01,512
implementation of this interface this is
41959
30:58:58,551 --> 30:59:04,479
going to just call the stream insert
41960
30:59:01,512 --> 30:59:07,040
virtual method on the object that we
41961
30:59:04,479 --> 30:59:09,512
pass as a second parameter in this
41962
30:59:07,039 --> 30:59:11,360
operator here and the second parameter
41963
30:59:09,512 --> 30:59:13,911
happens to be the point that we are
41964
30:59:11,360 --> 30:59:15,191
printing here so what this is really
41965
30:59:15,191 --> 30:59:19,679
is something like this we're going to
41966
30:59:17,360 --> 30:59:22,720
try and figure out what the compiler is
41967
30:59:19,679 --> 30:59:25,279
going to try and do we are going to say
41968
30:59:22,720 --> 30:59:27,440
p1 and we're going to say operator
41969
30:59:25,279 --> 30:59:30,232
stream output and we're going to say
41970
30:59:27,440 --> 30:59:32,080
stdc out that's the stream we want to be
41971
30:59:32,080 --> 30:59:36,232
and the point we want to print is p1
41972
30:59:34,551 --> 30:59:38,639
this is basically what the compiler is
41973
30:59:36,232 --> 30:59:41,040
going to do and it is going to print our
41974
30:59:38,639 --> 30:59:43,679
thumb and this method is available in
41975
30:59:41,039 --> 30:59:46,719
our stream insertable header and it is a
41976
30:59:43,679 --> 30:59:49,039
friend of our interface that's why we
41977
30:59:46,720 --> 30:59:51,360
are able to do something like this
41978
30:59:49,039 --> 30:59:52,871
accessing the data from our interface
41979
30:59:51,360 --> 30:59:54,232
let's build and actually show you that
41980
30:59:52,872 --> 30:59:57,120
this is going to work we're going to
41981
30:59:54,232 --> 30:59:58,800
pass this through our gcc compiler the
41982
30:59:57,119 --> 31:00:01,360
build is going to be good so we can
41983
30:59:58,800 --> 31:00:03,279
clear not clear we're going to control z
41984
31:00:01,360 --> 31:00:05,440
on this and we're going to bring up a
41985
31:00:03,279 --> 31:00:07,440
powershell window and we're going to
41986
31:00:05,440 --> 31:00:09,040
clear this time and run rooster you see
41987
31:00:07,440 --> 31:00:10,872
that we are creating our point here and
41988
31:00:09,039 --> 31:00:13,360
this is really cool we can even
41989
31:00:10,872 --> 31:00:15,760
uncomment this and we're going to use
41990
31:00:13,360 --> 31:00:18,232
sddc out because the compiler is going
41991
31:00:15,759 --> 31:00:21,360
to take this and turn that into this and
41992
31:00:18,232 --> 31:00:23,440
we have the ability to have code that is
41993
31:00:21,360 --> 31:00:25,592
much more readable by c plus plus
41994
31:00:23,440 --> 31:00:27,760
developers out there we're going to
41995
31:00:25,592 --> 31:00:30,160
build and run this again the build is
41996
31:00:27,759 --> 31:00:32,159
going to be good we can clear and run
41997
31:00:30,160 --> 31:00:34,872
rooster and this is going to print our
41998
31:00:32,160 --> 31:00:37,192
point here this is really cool but this
41999
31:00:34,872 --> 31:00:40,551
is not the end of our store we can even
42000
31:00:37,191 --> 31:00:43,759
print an entire inheritance hierarchy
42001
31:00:40,551 --> 31:00:47,039
look at what we did at our animal class
42002
31:00:43,759 --> 31:00:49,759
here we attached this interface to our
42003
31:00:47,039 --> 31:00:52,639
animal class and the moment we do that
42004
31:00:49,759 --> 31:00:53,591
we need to override the pure virtual
42005
31:00:53,592 --> 31:00:57,912
that comes with this interface and
42006
31:00:55,592 --> 31:01:00,552
that's what we did down here we have
42007
31:00:57,911 --> 31:01:02,000
overwritten the stream insert
42008
31:01:02,000 --> 31:01:06,399
and in the body we're going to specify
42009
31:01:04,232 --> 31:01:08,800
which data we want to print and how to
42010
31:01:06,399 --> 31:01:11,360
print that data that's the whole point
42011
31:01:08,800 --> 31:01:14,160
of this override we are doing here we
42012
31:01:11,360 --> 31:01:16,479
are going to do the same thing in each
42013
31:01:14,160 --> 31:01:18,400
inheritance class from animal for
42014
31:01:16,479 --> 31:01:20,720
example if we go to feline we're going
42015
31:01:18,399 --> 31:01:23,279
to do exactly the same thing we are
42016
31:01:20,720 --> 31:01:25,512
going to inherit from animal and this
42017
31:01:23,279 --> 31:01:26,872
will indirectly inherit from our
42018
31:01:28,872 --> 31:01:33,360
the pure virtual function that comes
42019
31:01:31,039 --> 31:01:35,191
with that interface and we do that here
42020
31:01:33,360 --> 31:01:36,551
we're going to specify which data we
42021
31:01:35,191 --> 31:01:39,279
want to print in this case we're going
42022
31:01:36,551 --> 31:01:42,231
to put the description out and the first
42023
31:01:39,279 --> 31:01:44,232
style and we are going to specify the
42024
31:01:42,232 --> 31:01:46,320
format in which we want the data to be
42025
31:01:44,232 --> 31:01:49,440
printed out again that's the whole point
42026
31:01:46,320 --> 31:01:51,360
of overriding this virtual function here
42027
31:01:49,440 --> 31:01:53,512
we're going to do the same thing on each
42028
31:01:51,360 --> 31:01:55,831
inheritance class in our inheritance
42029
31:01:53,512 --> 31:01:57,592
hierarchy for example we did the exact
42030
31:01:57,592 --> 31:02:02,400
we did the exact same thing for a cat
42031
31:02:00,399 --> 31:02:05,439
and we're going to do the same thing on
42032
31:02:02,399 --> 31:02:08,551
our bird classes that's exactly what we
42033
31:02:05,440 --> 31:02:10,400
do here specify which data to print out
42034
31:02:08,551 --> 31:02:13,911
and how the data is going to be printed
42035
31:02:10,399 --> 31:02:16,639
out and this stream insert override is
42036
31:02:13,911 --> 31:02:19,911
going to be picked up by our interface
42037
31:02:16,639 --> 31:02:22,160
when we get to call the output stream
42038
31:02:19,911 --> 31:02:24,639
operator here notice that we are calling
42039
31:02:22,160 --> 31:02:27,192
this thing polymorphically we are
42040
31:02:27,191 --> 31:02:32,551
method on a reference that we pass here
42041
31:02:30,399 --> 31:02:34,959
and this is going to resolve this using
42042
31:02:32,551 --> 31:02:37,279
dynamic binding this is going to work
42043
31:02:34,960 --> 31:02:39,592
really well now that we have this setup
42044
31:02:37,279 --> 31:02:42,080
we can head over to the main cpp file
42045
31:02:39,592 --> 31:02:44,800
and really do all kinds of crazy things
42046
31:02:42,080 --> 31:02:46,000
let's put in a separator here and we are
42047
31:02:46,000 --> 31:02:52,232
play with us we are going to include the
42048
31:02:49,119 --> 31:02:54,159
classes we need to set up our animals
42049
31:02:52,232 --> 31:02:56,800
and we are going to put them in here we
42050
31:02:54,160 --> 31:02:59,192
have animal feline dog cat bird pigeon
42051
31:02:56,800 --> 31:03:01,120
and crow the moment we do this we don't
42052
31:02:59,191 --> 31:03:02,871
need to put in this stream insertable
42053
31:03:01,119 --> 31:03:04,720
because it is coming in directly from
42054
31:03:02,872 --> 31:03:07,279
this but we don't need to worry about
42055
31:03:04,720 --> 31:03:09,592
this because we have include guards in
42056
31:03:07,279 --> 31:03:12,080
but we are going to be using smart
42057
31:03:09,592 --> 31:03:14,960
pointers so let's include the memory
42058
31:03:12,080 --> 31:03:16,800
header and we can set up an animal and
42059
31:03:14,960 --> 31:03:18,960
try to print it out we will be using
42060
31:03:16,800 --> 31:03:22,080
polymorphism so we will go through a
42061
31:03:18,960 --> 31:03:24,320
base pointer to animal and use that to
42062
31:03:22,080 --> 31:03:26,720
manage a dog object here we are just
42063
31:03:24,320 --> 31:03:29,680
going to pass in the data and we will
42064
31:03:26,720 --> 31:03:31,911
try to print this animal out notice that
42065
31:03:29,679 --> 31:03:34,079
we are going through a base pointer
42066
31:03:31,911 --> 31:03:35,911
calling the output stream operator so
42067
31:03:37,759 --> 31:03:42,871
polymorphically and it is going to print
42068
31:03:40,160 --> 31:03:45,512
this information at the dog level and
42069
31:03:42,872 --> 31:03:47,440
what i mean by that is that if we go in
42070
31:03:45,512 --> 31:03:49,360
dog we're going to find our stream
42071
31:03:47,440 --> 31:03:50,800
insert that's going to print this
42072
31:03:50,800 --> 31:03:55,592
like we want to print a dog and this is
42073
31:03:52,872 --> 31:03:57,512
super powerful hopefully you can see how
42074
31:03:55,592 --> 31:03:59,192
cool this is we're going to try and
42075
31:03:57,512 --> 31:04:01,440
build this program we're going to pass
42076
31:03:59,191 --> 31:04:03,911
this through gcc the boat is going to be
42077
31:04:01,440 --> 31:04:06,551
good we can clear and run rooster we're
42078
31:04:03,911 --> 31:04:08,959
going to see that we print this as a dog
42079
31:04:06,551 --> 31:04:11,512
even if we used a base pointer to try
42080
31:04:08,960 --> 31:04:14,400
and print this out how cool is this we
42081
31:04:11,512 --> 31:04:16,000
can even use this to set up a bird and
42082
31:04:14,399 --> 31:04:18,000
print it out we're going to set up a
42083
31:04:16,000 --> 31:04:20,232
base pointer that is going to be
42084
31:04:18,000 --> 31:04:21,831
managing a bird you can see that we are
42085
31:04:20,232 --> 31:04:23,832
using a unique pointer here you can
42086
31:04:21,831 --> 31:04:25,511
really use any kind of smart pointer you
42087
31:04:23,831 --> 31:04:28,159
want we're going to print this out and
42088
31:04:25,512 --> 31:04:30,160
this will be printed out like a bird
42089
31:04:28,160 --> 31:04:31,680
wants to be printed out and that's going
42090
31:04:31,679 --> 31:04:36,399
the override from our bird class and
42091
31:04:34,639 --> 31:04:38,160
that's going to say bird is going to put
42092
31:04:36,399 --> 31:04:39,591
out the description it's going to put
42093
31:04:38,160 --> 31:04:42,080
out the wing color and this is really
42094
31:04:39,592 --> 31:04:44,552
going to work really well we're going to
42095
31:04:42,080 --> 31:04:46,639
pass this through gcc again the world is
42096
31:04:44,551 --> 31:04:48,479
going to be good we can clear and run
42097
31:04:46,639 --> 31:04:51,759
rooster you see that we are printing out
42098
31:04:48,479 --> 31:04:54,959
bird here and this is using polymorphism
42099
31:04:51,759 --> 31:04:57,511
combined with interfaces and this can
42100
31:04:54,960 --> 31:04:59,760
come in handy if this helps your
42101
31:04:57,512 --> 31:05:02,000
application depending on what you want
42102
31:04:59,759 --> 31:05:05,039
to achieve with zipclose plus we can
42103
31:05:02,000 --> 31:05:07,440
even put our animal data in an array and
42104
31:05:05,039 --> 31:05:10,000
try to print that out so we're going to
42105
31:05:07,440 --> 31:05:13,760
put out a separator to be able to follow
42106
31:05:10,000 --> 31:05:15,911
this nicely in our output terminal this
42107
31:05:13,759 --> 31:05:17,831
is going to do and we're going to go
42108
31:05:15,911 --> 31:05:20,080
down and put in the code to play with us
42109
31:05:17,831 --> 31:05:22,231
we're going to share an array of shared
42110
31:05:20,080 --> 31:05:24,080
pointers this is how we do this and
42111
31:05:22,232 --> 31:05:26,232
we're going to initialize this with all
42112
31:05:24,080 --> 31:05:28,080
kinds of crazy animals we're going to
42113
31:05:26,232 --> 31:05:29,512
put in a dog we're going to put in a cat
42114
31:05:28,080 --> 31:05:32,479
we're going to put in a crow and a
42115
31:05:29,512 --> 31:05:34,479
pigeon and we will be managing this
42116
31:05:32,479 --> 31:05:37,039
through base pointers notice that this
42117
31:05:34,479 --> 31:05:39,512
is an array of base pointers
42118
31:05:37,039 --> 31:05:42,231
and we're going to be calling the output
42119
31:05:39,512 --> 31:05:44,160
stream operator polymorphically so for
42120
31:05:42,232 --> 31:05:47,040
the first element here we will print a
42121
31:05:44,160 --> 31:05:49,680
dog how a dog wants to be printed out so
42122
31:05:47,039 --> 31:05:51,831
we will be using the stream insert
42123
31:05:49,679 --> 31:05:53,039
override from the dog class if we go
42124
31:05:51,831 --> 31:05:56,000
there we're going to see that we're
42125
31:05:53,039 --> 31:05:57,591
going to prefix our data with dog if we
42126
31:05:56,000 --> 31:05:59,911
hit the second element we're going to
42127
31:05:57,592 --> 31:06:01,832
print this like a cat wants to be
42128
31:05:59,911 --> 31:06:04,319
printed down the third element is going
42129
31:06:01,831 --> 31:06:06,080
to be printed out as a crow the fourth
42130
31:06:04,320 --> 31:06:08,080
element is going to be printed out as a
42131
31:06:06,080 --> 31:06:08,872
pigeon and this is going to fall in and
42132
31:06:08,872 --> 31:06:13,360
right away down here you see that we are
42133
31:06:11,191 --> 31:06:14,799
looping calling our output stream
42134
31:06:13,360 --> 31:06:17,119
operator and this is going to work
42135
31:06:14,800 --> 31:06:18,800
really well let's try and build this
42136
31:06:17,119 --> 31:06:21,279
program we're going to pass this through
42137
31:06:18,800 --> 31:06:23,760
gcc the build is going to be good so we
42138
31:06:21,279 --> 31:06:25,759
can clear and run rooster and you're
42139
31:06:23,759 --> 31:06:27,439
going to see that we are printing our
42140
31:06:25,759 --> 31:06:30,000
information here the first thing is a
42141
31:06:27,440 --> 31:06:32,232
dog the second thing is a cat the third
42142
31:06:30,000 --> 31:06:34,720
thing is a crew the fourth fan is a
42143
31:06:32,232 --> 31:06:37,440
pigeon and this is working really well
42144
31:06:34,720 --> 31:06:40,399
hopefully you can see how interfaces can
42145
31:06:37,440 --> 31:06:42,551
be powerful in your c plus plus design
42146
31:06:40,399 --> 31:06:44,231
use this if it makes sense for whatever
42147
31:06:42,551 --> 31:06:46,800
application you are designing with z
42148
31:06:44,232 --> 31:06:50,232
plus plus my main goal here is to
42149
31:06:46,800 --> 31:06:52,639
introduce you to the idea of interfaces
42150
31:06:50,232 --> 31:06:54,480
and how powerful they can be again an
42151
31:06:52,639 --> 31:06:56,399
interface is something you can attach to
42152
31:06:56,399 --> 31:07:00,399
and at the moment you attach that
42153
31:06:58,160 --> 31:07:02,480
interface to your type your type is
42154
31:07:00,399 --> 31:07:05,360
going to have the powers that come with
42155
31:07:02,479 --> 31:07:08,159
that interface and all you need to do in
42156
31:07:05,360 --> 31:07:10,160
your deriving classes is to implement
42157
31:07:08,160 --> 31:07:12,800
the virtual functions that come with
42158
31:07:10,160 --> 31:07:14,800
that interface and the interface will
42159
31:07:12,800 --> 31:07:16,479
pick them up and use them to do whatever
42160
31:07:16,479 --> 31:07:21,119
polymorphically and that's going to be
42161
31:07:18,720 --> 31:07:23,360
really cool we are going to stop here in
42162
31:07:21,119 --> 31:07:26,319
this lecture this one we're going to try
42163
31:07:23,360 --> 31:07:28,639
and recap what we saw in this chapter
42164
31:07:26,320 --> 31:07:31,120
go ahead and finish up here and meet me
3168677
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.