S1: Data Abstraction in C++: Class
- Textbook Chapters 1.2, 1.3 and 3.
- Goals
- Define and implement C++ Classes
- Class vs. Object
- Member functions
- Privacy issues
- Constructors
- Know about Common Errors
- C++ terms- structs vs. classes, objects, public, private,
- member functions, data members, scope resolution operator,
- constructor, default constructor, multiple constructor
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S2: 1.2 Data Abstraction, ADTs, Encapsulation
- Data Abstraction
- Abstract Data Type: list of attributes and operations
- Encapsulation
- Information Hiding: show interface (what), not implementation (how)
- ADTs in C++
- class: encapsulate ADT (data + operations) as a program unit
- template: parametric ADT
- to define a collection of related ADTs
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S3: C++ Class Declaration
- Class defines a user-defined data type
- sort-of like
struct point { float x, y; }; point p1; // type point, instance p1
- So what's new?
- privacy, =, member functions, ...
- Ex. 3.1 /pp 93 OR program 1-1 / pp. 10.
class Circle {
private: float radius; // privacy!
public: float Area(void) const; // member function
Circle(float r = 0); // default value of parameter = 0
};
- Objects = an instance of a class (i.e. a variable of the type class)
Circle C, Pool(5.0), C1 = Pool; // object declaration
C2 = C1; // object assignment
cout << C1.Area() ; // accessing object components
- Class is a template,/ type, Object is a concrete instance
- Objects Pool, C1 and C2 have
- data members (e.g. radius) & member functions (e.g. Area)
- Q? Find error in "cout << Circle.Area() ; // incorrect!"
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S4: Using Classes and Objects
- Q? Consider the list of things below:
- For each, Identify if classes can be used for them
- and if Objects can be used for them.
- Build Objects (Instances of Classes/ ADTs)
- As a Function parameter ?
- Representing ADTs
- As a Return value from a function ?
- Build other classes (Reuse)
- As Element type for an array ?
- Example in sections 3.3, 3.4 (pp 110-112)
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S5: Privacy Issues
- Interface vs. implementation os ADTs
- Interface visible to outside world
- Implementation hidden from outside world
- C++ keywords public: & private:
- public: accessible by world outside class
- private: not accessible by world outside
- accessible only by member/friend-of functions
- Can prefix any declaration inside class
- No ordering, can be used several times
- Default = private: in C++ "class"
- Ex. Class Circle on last slide
- Q? Identify public and private member of class Circle.
- Q? Find error in "cout << C1.radius" ; // incorrect!
- Q? Why is a class with no public: member useless?
- Q? Determine the default visibility (private/public)
- of data members of a "struct"?
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S6: Member Functions
- Member functions - represent operations on the ADT
- function prototype must be defined inside class{ ... }
- function body INside class { ... }
- are expanded inline = > memory vs. CPU trade-off
- function body OUTside class use scope resolution operator
- Member functions can access all data members
- Can have optional parameters (defaults values),
float Circle::Area(void) const
{ return PI * radius * radius ; } //body OUTside class
- A popular convention = > header file vs. .C file
- Class declaration in a header file (e.g. circle.h)
- Definition of member functions in a .C file (e.g. circle.C)
- using Scope resolution operator :: (body outside class)
- #include "circle.h" inside circle.C
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S7: Automatic Initialization: Constructors
- Problem: initialize instance objects
- Old way: explicit call to obj.initialize()
- Would be nice: automatic call
- Constructor: a member function for initialization
- Has same name as the class
- No return type, No return(...) inside body
- Automatically invoked at each instance creation
- i.e. object declarations call constructors implicitly
- Optional member initialization list of data-member(initial value)
Circle::Circle(float r): radius(r) { }; // constructor
Circle Pool(5.0); // declaration calls constructor
- Q? Should a class constructor be private?
- Extensions: default initialization, multiple initializers .
Circle C2; // Q. How to initialize C2 ?
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S8: More on Constructors
- Default Constructors - requires no parameters.
- i.e. either has no parameters, or has default values.
Baseball::Baseball(int num = -1, int atbats = 0, int hits = 0);
Baseball P; // P initialized with num = -1, ...
- Declaration may supply some but not all parameters
Baseball P1(34, 100, 288), P2(38, 105), P3(46);
- Multiple Constructors
- Provides alternative ways of initialization (Ex. Date)
- Other purposes e.g. copy, initialize, ...
- Issue of overloading and disambiguation
Class Date {
private: int month, day, year;
public:
Date(int m = 1, int d = 1, int y = 0);
Date(char *dstr); // accept notation like 10/4/95
void PrintDate (void);
};
Date day1(10, 4, 95);
Date day2;
Date day3("10/4/95");
- Copy constructors are needed for classes w/ dynamic data (Ch#8)
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S9: Common Mistakes
- Data Members
- Initialization of data members in declaration
- Changing data members in a "const" member function
- Changing a "const" parameter inside a member function
- Accessing private data member from outside class
- Member function
- No membership in definition outside body (:: operator)
- missing prefix class name, misspelling, missing prototype
- No membership in calls
- missing prefix object name (dot notation)
- Calling private member functions from outside class
- function calls - type mismatch for args or result
- Multiple constructors: ambiguous overloading
- Q? Find errors:
class Circle {
private: int radius = 1; float area; // 1 error
public: int Circle( int p); // 1 error
Circle(int q = 0); // 1 error
float Area(void) const;
} // 1 error
float Area(void) {area = PI*radius*radius; return area; } // 2 errors
float Circle::Perimeter(void) { return 2 * PI * radius ; } // 1 error
int Circle::Circle(int p) {radius=p; area=Area(); return p; } // 2 errors
main () { Circle a; float f; int i;
cout << a.radius << Area() << Circle.Area(); // 3 errors
}
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S10: Common Errors
- Q? Find errors in the following (Ex. 3.3, pp 127)
class X {
private int t; private int q;
public
int X ( int a, int b);
{ t = a; q = b; }
void printX(void);
}
- Semicolons
- Missing ";" after class definition
- Missing ";" after function prototype definition
- ";" after function implementation
- ";" between function header and function body
- Comma separator
- Missing "," between parameters of member functions
- Missing "," in members-initialization list in constructor
- Failure to include header file (e.g. circle.h in circle.C)
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S11: Exercise on Common Mistakes
Read the following C++ program with two classes Point and Circle.
Determine the syntax and semantic errors.
Note that some but not all errors are labelled in comments.
class Point {
float xcoord = 0.0, ycoord = 0.0; //error 1
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S12: Scope Resolution Operator ::
- Scope of an identifier = section of program in which
- the identifier is known/visible/legal.
- Four delimiters - block, function, file, class
- Block {...} is a hierarchical unit - e.g. global
- Functions for local variables
- Class - for data members and member functions
- Files for names declared outside functions and Classes
- :: Used for denoting the scope of an identifier
float Circle::Area(void) const { // member function Area()
return PI * radius * radius; // scope = class Circle{ ... }
}
- Compare . and ::
- Q? Which of the following are correct outside class Circle?
//Class Circle has public: int radius; float Area(void);
Circle C1;
cout << C1.radius << C1.Area();
cout << C1::radius << C1::Area();
float Circle::Area(void) const { /* ... */}
float Circle.Area(void) const { /* ... */}
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S13: Other Usage for Scope Resolution Operator ::
- Static Members, etc.
class Foo{
public:
class nestedFoo { /* .... */ } // a nested class
typedef int myInt; // a type definition
enum {RED BLUE, GREEN}; // enumeration constants
static int staticData; // data member for class object
static void staticFunction(); // member function for class object
int Data; // data member of instances
}
main() {
Foo::myInt globalInt = Foo::BLUE; // an integer initialized to 1
Foo::staticData = 5; // change class property
Foo.Data = 5; // error - WHY?
Foo F; F.Data = 5; // Data is a component of object F
}
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S14: Inheriting Constructor for Data Member (:)
- Circle::Circle(float radius) : radius(r) { } ://pp 10
- : operator calls basic constructor for data members
- radius(r) - calls constructor for float r
- Effect is probably same as r = radius
- Complex data members, constructors can do more
- General Meaning of :
- Inheritance
- Object oriented notion
- Let us wait till chapter 12.
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)
S15: Keyword "const" and C++ classes
- Constants and Variables
- Constant Values: 5, 'a', 4.3
- Variables
- Constant variables
- Value can't change after initialization
const int PI = 3.14;
- Constant Parameters to Functions
- Value can't change after initialization
int sqaure(const int & num) { return num* num; };// fixed parameter
int max( int par1, int& par2, const int& par2)
//par1 - value copied, function can't change actual parameter
//par2 - share storage, actual can be changed
//par3 - share storage, actual can't be changed
- Constant member functions
- Will not change data member values
class Circle {
float radius;
float Area(void) const; // function prototype
}
Copyright: S. Shekhar, C. S. Dept.,
University of Minnesota, Minneapolis, MN 55455. Csci,3321,Winter.(home)