01 cpp classes
TRANSCRIPT
-
7/28/2019 01 Cpp Classes
1/10
1April 13
Classes in C++
C++ originally called "C with classes": Swedish connection: Bjarne Stoustrup borrowed from Simula (67)
Simulating classes of real world objects
C++ continues to evolve: Version 1.0 released by AT&T in 1986
Version 2.0 in 1990 (added multiple inheritance)
Version 3.0 in 1992 (templates)
ANSI standard in 1996 (exception handling, run time type info)
C++ became dominant OOPL in early 90's
Now Java and C# challenge
A class extends the C++ type system:class Account { //creates a new type
}; //Note: you need this semi-colon in C++
Account a1,a2; //define variables of type Account
-
7/28/2019 01 Cpp Classes
2/10
2April 13
C structs
A data structure for dates in C:struct Date {
int month, day, year;
};
int set(struct Date*, int m, int d, int y);int print(struct Date*);
Whats the problem?
No information hiding
No way to control access to data (obscure side effects) No way to prevent assigning an illegal value to month
Changing representation of Date breaks all client code
-
7/28/2019 01 Cpp Classes
3/10
3April 13
C++ structs
C++ provides for closer coupling of data and functions:struct Date {
int month, day, year;
void set(int m, int d, int y);
void print(); //implement elsewhere
};
Invoke functions with variable . memberFunction():Date today; //In C++, structs automatically define types
today.set(9,29,1953); today.print();
Now we have data abstraction: Procedural abstraction hides details of code in functions
Data abstraction couples data structure and functions
Still, no information hiding: today.set(50,-10,0);
-
7/28/2019 01 Cpp Classes
4/10
4April 13
C++ adds class
C++ adds new keywords to support information hiding:class Date {
int month, day, year;
public:
void set(int m, int d, int y);void print(); //implement elsewhere
};
Members afterpublic: are visible to clients:Date today; today.print();
today.month = 50; //is this legal? Members afterclass are by default private
-
7/28/2019 01 Cpp Classes
5/10
5April 13
Member functions
What can we add to Date to allow access to month?class Date {
int month, day, year;
public:
void set(int m, int d, int y);
void print(); //implement elsewhere
int getMonth() { return month; }};
cout = 1 && m
-
7/28/2019 01 Cpp Classes
6/10
6April 13
Inheritance
(class derivation)class Account generalizes many kinds of bankaccounts: checking, savings, etc.
C++ class derivation captures this generation:class Checking : public Account {
public:Checking(float balance);
Checking(); //default constructor
};
: denotes derivationChecking inherits from Account
publicderivation denotes subtype inheritance Accounts public methods accessible to instances ofChecking
Checking myChecking(200); //Checking constructor
myChecking.getBalance(); //Account function
-
7/28/2019 01 Cpp Classes
7/10
7April 13
OOP = Data abstraction
+ inheritance
+ dynamic bindingPolymorphism: a function can mean different things at runtime
Dynamic binding: defer function binding to a subtype until runtime
Suppose we want to draw a heterogeneous collection of shapes?
class Point { ... }; //a Point has x and y coordinates
class Shape {protected: //accessible to subclasses but otherwise private
Point center; //all Shapes have a center Point
public:
Point where() { return center; }
virtual void move(Point to) //virtual can be overridden{ center = to; draw(); } // by derived classes
virtual void draw()=0; //a "pure" virtual function
//draw() must be implemented by derived classes
//...
}
-
7/28/2019 01 Cpp Classes
8/10
8April 13
Subclasses override
virtual functionsclass Triangle: public Shape {
Point sw, se, top; //Three points define triangle
public:
Triangle(Point a, Point b, Point c) : sw(a), se(b), top(c) {}
draw() //implementing pure virtual function
{ put_line(sw,top); //draw line from sw to topput_line(top,se); //draw line from top to se
put_line(se,sw); //draw line from se to sw
}
};
class Circle : public Shape {
int radius;public:
Circle(Point a, int r) : center(a), radius(r) {}
draw(); //draw a circle using center and radius
};
-
7/28/2019 01 Cpp Classes
9/10
9April 13
Calling a virtual function
{ //Construct some shapes
Shape aShape; //illegal--why?
Circle c(Point(20,30),7); //legal--what does it do?
//Create an array of various shapes
Shape* shapes[10]; //Why is this legal?shapes[0] = new Circle(Point(20,30),7); //assign a Circle
shapes[1] = new Triangle(Point(50,50),Point(30,30),Point(40,40));
//... maybe assign other shapes, Rectangles, Squares, etc.
for (int i=0; i < 10; i++) //draw all the shapesshapes[i]->draw(); //each shape draws itself!
}
Why do we say that elements of shapes array are polymorphic?
How does polymorphic design support Open-Closed principle?
-
7/28/2019 01 Cpp Classes
10/10
10April 13
Why dynamic binding?
What kind of code does dynamic binding avoid?
Avoids lots of switch statements, e.g.:
switch (shapes[i]->isa)
//each Shape derived class has an isa data member{ case(triangle) Triangle::draw(); //test enumeration
case(circle) Circle::draw(); //run specific draw()
// ...
}
Why is the dynamic binding version better for
big, growing programs?