Brought To You by
Brought To You by
com
Youll see some neat features of the language. Youll learn the right things to google. Youll find a list of useful books and web pages.
Its complicated, and youll learn by doing. But Ill give it my best shot, okay?
Basic syntax Compiling your program Argument passing Dynamic memory Object-oriented programming
#include <iostream> using namespace std; float c(float x) { return x*x*x; } int main() { float x; cin >> x; cout << c(x) << endl; return 0; }
Includes function definitions for console input and output. Function declaration. Function definition. Program starts here. Local variable declaration. Console input. Console output. Exit main function.
// This is main.cc #include <iostream> #include mymath.h using namespace std; int main() { // ...stuff... }
// This is mymath.h #ifndef MYMATH #define MYMATH float c(float x); float d(float x); #endif
Functions are declared in mymath.h, but not defined. They are implemented separately in mymath.cc.
main.o
mymath.o
mydraw.o
myprogram
// This is main.cc #include <GL/glut.h> #include <iostream> using namespace std; int main() { cout << Hello! << endl; glVertex3d(1,2,3); return 0; }
Include OpenGL functions. Include standard IO functions. Long and tedious explanation.
Separate interface from implementation. Promote modularity. The headers are a contract.
Technical reasons.
Only rebuild object files for modified source files. This is much more efficient for huge programs.
INCFLAGS = \ I/afs/csail/group/graphics/courses/6.837/public/includ e LINKFLAGS = \ -L/afs/csail/group/graphics/courses/6.837/public/lib \ -lglut -lvl CFLAGS = -g -Wall -ansi CC = g++ SRCS = main.cc parse.cc curve.cc surf.cc camera.cc OBJS = $(SRCS:.cc=.o) PROG = a1 all: $(SRCS) $(PROG) $(PROG): $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $@ $(LINKFLAGS) .cc.o: $(CC) $(CFLAGS) $< -c -o $@ $(INCFLAGS) depend: makedepend $(INCFLAGS) -Y $(SRCS) clean: rm $(OBJS) $(PROG) main.o: parse.h curve.h tuple.h # ... LOTS MORE ...
Most assignments include makefiles, which describe the files, dependencies, and steps for compilation.
#include <iostream> using namespace std; int main() { int n; cin >> n; float f[n]; for (int i=0; i<n; i++) f[i] = i; return 0; }
Arrays must have known sizes at compile time. This doesnt compile.
#include <iostream> using namespace std; int main() { int n; cin >> n; float *f = new float[n]; for (int i=0; i<n; i++) f[i] = i; delete [] f; return 0; }
Allocate the array during runtime using new. No garbage collection, so you have to delete. Dynamic memory is useful when you dont know how much space you need.
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<float> f(n); for (int i=0; i<n; i++) f[i] = i; return 0; }
STL vector is a resizable array with all dynamic memory handled for you. STL has other cool stuff, such as strings and sets. If you can, use the STL and avoid dynamic memory.
#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<float> f; for (int i=0; i<n; i++) f.push_back(i); return 0; }
An alternative method that does the same thing. Methods are called with the dot operator (same as Java).
vector is poorly named, its actually just an array.
float twice1(float x) { return 2*x; } void twice2(float x) { x = 2*x; } int main() { float x = 3; twice2(x); cout << x << endl; return 0; }
The variable is
unchanged.
vector<float> twice(vector<float> x) { int n = x.size(); for (int i=0; i<n; i++) x[i] = 2*x[i]; return x; } int main() { vector<float> y(9000000); y = twice(y); return 0; }
There is an incredible amount of overhead here. This copies a huge array two times. Its stupid.
Maybe the compilers smart. Maybe not. Why risk it?
void twice3(float *x) { (*x) = 2*(*x); } void twice4(float &x) { x = 2*x; } int main() { float x = 3; twice3(&x); twice4(x); return 0; }
Pass by reference.
Functions can modify objects without copying. To avoid copying objects (often const references).
Youve probably seen these in 6.170. C++ does things a little differently.
Show stuff weve seen, like dynamic memory. Introduce constructors, destructors, const, and operator overloading. Ill probably make mistakes, so some debugging too.
Live Demo!
Probably the most helpful, since youve all taken 6.170. http://www.cs.brown.edu/courses/cs123/javatoc.shtml