C++ Mini-Course - Best C++ Programing Book
C++ Mini-Course - Best C++ Programing Book
Part 1: Mechanics Part 2: Basics Part 3: References Part 4: Const Part 5: Inheritance Part 6: Libraries Part 7: Conclusion
C Rulez!
C++ Rulez!
C++ is a superset of C
New Features include
Classes (Object Oriented) Templates (Standard Template Library) Operator Overloading Slightly cleaner memory operations
Segment.cpp
#include Segment.h #include Point.h Segment::Segment() { m_p0 = new Point(0, 0); m_p1 = new Point(1, 1); } Segment::~Segment() { delete m_p0; delete m_p1; }
#include
#include Segment.h Insert header file at this point.
Header Guards
#ifndef __SEGMENT_HEADER__ #define __SEGMENT_HEADER__ // contents of Segment.h //... #endif To ensure it is safe to include a file more than once.
Header Guards
#ifndef __SEGMENT_HEADER__ If this #define __SEGMENT_HEADER__ variable is not defined // contents of segment.H //... Define it. #endif To ensure it is safe to include a file more than once. End of guarded area.
Circular Includes
gui.h
#include controller.h // define gui controller.h // ...
#include gui.h
class Controller { //... private: Gui* myGui; //... };
Forward Declarations
gui.h
//Forward Declaration class Controller; // define gui // ... //Forward declaration
controller.h
In header files, only include what you must. If only pointers to a class are used, use forward declarations.
class Gui;
class Controller { //... private: Gui* myGui; //... };
Compilation
Preprocessor
Inlines #includes etc.
Compiler
Translates to machine code Associates calls with functions
Object files
Executable
Linker
Associates functions with definitions
What is a pointer?
int x = 10; int *p; p = &x;
p 10 x
What is a pointer?
int x = 10; int *p; p = &x; *p = 20; *p is the value at the address p.
p 20 x
What is a pointer?
int x = 10; int *p = NULL; p = &x; *p = 20; * dereference operator gets value at p Declares a pointer to an integer & is address operator gets address of x
Initializes an array of 10 integers on the heap. C++ equivalent of the following C code
int* nums = (int*)malloc(x * sizeof(int));
Destructors
delete calls the objects destructor. delete frees space occupied by the object. A destructor cleans up after the object. Releases resources such as memory.
Destructors an Example
class Segment { public: Segment(); virtual ~Segment(); private: Point *m_p0, *m_p1; };
Destructors an Example
Segment::Segment() { m_p0 = new Point(0, 0); m_p1 = new Point(1, 1); } Segment::~Segment() { if (m_p0) delete m_p0; if (m_p1) delete m_p1; }
New vs Malloc
Never mix new/delete with malloc/free
Malloc
Standard C Function Used sparingly in C++; used frequently in C Only in C++
New
Operator (like ==, +=, etc.)
Used for allocating chunks of Used to allocate instances of memory of a given size without classes / structs / arrays and will respect to what will be stored in invoke an objects constructor that memory Returns void* and requires explicit casting Returns the proper type
Returns NULL when there is not Throws an exception when there enough memory is not enough memory Every malloc() should be matched with a free() Every new/new[] should be matched with a delete/delete[]
Classes vs Structs
Default access specifier for classes is private; for structs it is public Except for this difference, structs are functionally the same as classes, but the two are typically used differently: structs should be thought of as lightweight classes that contain mostly data and possibly convenience methods to manipulate that data and are hardly ever used polymorphically
struct Point { int x; int y; // convenience constructor Point(int a, int b) : x(a), y(b) { } // @returns distance to another point double distance(const Point &pnt) { int dx = m_x pnt.x; int dy = m_y pnt.y; return math.sqrt(dx*dx + dy*dy); } }; }; void Segment::setPoints(int x0, int y0, int x1, int y1) { m_p0 = new Point(x0, y0); m_p1 = new Point(x1, y1); } class Segment { public: Segment(); virtual ~Segment(); void setPoints(int x0, int y0, int x1, int y1); protected: Point *m_p0, *m_p1;
On the Stack /
Automatic allocation
drawStuff() { drawStuff() { Point *p = new Point(); Point p(); p->move(10,10); p.move(5,5); //... //... } }
Segment.h
#ifndef __SEGMENT_HEADER__ #define __SEGMENT_HEADER__ class Point; class Segment { public: Segment(); virtual ~Segment(); protected: Point *m_p0, *m_p1; }; #endif // __SEGMENT_HEADER__
Passing by value
void Math::square(int i) { i = i*i; } int main() { int i = 5; Math::square(i); cout << i << endl; }
Passing by reference
void Math::square(int &i) { i = i*i; } int main() { int i = 5; Math::square(i); cout << i << endl; }
What is a reference?
An alias another name for an object. int x = 5; int &y = x; // y is a // reference to x y = 10; What happened to x? What happened to y?
What is a reference?
An alias another name for an object. int x = 5; int &y = x; // y is a // reference to x y = 10; What happened to x? What happened to y? y is x.
Introducing: const
void Math::printSquare(const int &i){ Wont compile. i = i*i; cout << i << endl; } int main() { int i = 5; Math::printSquare(i); Math::printCube(i); }
virtual
In Java every method invocation is dynamically bound, meaning for every method invocation the program checks if a sub-class has overridden the method. You can disable this (somewhat) by using the keyword final in Java In C++ you have to declare the method virtual if you want this functionality. (So, virtual is the same thing as not final) Just like you rarely say things are final in Java, you should rarely not say things are virtual in C+ +
Resolving functions
In Java:
// Overriding methods public void overloaded(){ println(woohoo); super.overloaded(); } //constructor public Subclass(){ super(); }
In C++:
// Overriding methods void Subclass::overloaded(){ cout<<woohoo<<endl; Superclass::overloaded(); } //constructor public Subclass() : Superclass() { }
virtual
Basic advice: for now make every method virtual except the constructor Make you declare your destructors virtual; if you do not declare a destructor a nonvirtual one will be defined for you
Segment(); virtual ~Segment();
this is important
Namespaces
Namespaces are kind of like packages in Java Reduces naming conflicts Most standard C++ routines and classes and under the std namespace
Any standard C routines (malloc, printf, etc.) are defined in the global namespace because C doesnt have namespaces
using namespace
#include <iostream> ... std::string question = How do I prevent RSI?; std::cout << question << std::endl; using namespace std; string answer = Type less.; cout << answer << endl; Bad practice to do in header files!
STL
Standard Template Library Contains well-written, templated implementations of most data structures and algorithms
Templates are similar to generics in Java Allows you to easily store anything without writing a container yourself
Will give you the most hideous compile errors ever if you use them even slightly incorrectly!
STL example
#include <vector> using namespace std; typedef vector<Point> PointVector; typedef PointVector::iterator PointVectorIter; PointVector v; v.push_back(Point(3, 5)); PointVectorIter iter; for(iter = v.begin(); iter != v.end(); ++iter){ Point &curPoint = *iter; }
Other Resources
The Java To C++ tutorial on the website is probably your best source of information The big thick book by Stroustrop in the back of the Sun Lab is the ultimate C++ reference A CS 123 TA, or specifically your mentor TA if you have been assigned one