820 likes | 1.02k Views
C++ Classes – A Quick Introduction. Many programming languages support OOP: SMALLTALK, CommonLisp Object System, C++ Advantages of C++: C++ provides a well-designed set of mechanisms to fully support OOP needs C++ is an extension of the already popular and standardized ANSI C. What is OOP?.
E N D
C++ Classes – A Quick Introduction • Many programming languages support OOP: SMALLTALK, CommonLisp Object System, C++ • Advantages of C++: • C++ provides a well-designed set of mechanisms to fully support OOP needs • C++ is an extension of the already popular and standardized ANSI C.
What is OOP? • The central idea is to build program using software objects • Object = data + operations = data members + methods
Traditional programming deals with bytes, variables, arrays, pointers, and other programming artifacts that are difficult to relate to the problem at hand. • Traditional programming focuses mainly on the step-by-step procedures, called algorithms to achieve the desired tasks. • In this sense, traditional programming is called procedure-oriented programming
The breakthrough concept of OOP is the attachment of program procedures to data items. This concept changes the traditional segregation between data and programs.
Class Declaration • Like declare structure in C++ • Ex • Class myClass{ int x; char y; }; //create an object of myClass myClass myObject;
A typical class has several data members • To Provide internal representation • Ex class intCell { public: intCell ( ) {storedValue=0;} intCell (int initialValue) {storedValue=initialValue;} int read ( ) (return storedValue;} void write (int x) (storedValue=x;} private: int storedValue; } • Explain intCell class
Public, private, protected • There are three statuses for class members • public: can be accessed anywhere • private: can be accessed by methods of the same class, or by friend functions to the class • protected: cannot be accessed outside the class, but protected members allow inheritance
Declaration format class myDog { public: myDog(); barkDog(); playDog(); protected: ownDog(); Private: char name[31]; char owner[31]; };
Ex. Class stack { private: char items[100]; int top; public: void init(); void push(char); char pop(); int empty(); int full(); };
void stack::init(){ top=-1; } void stack::push(char c){ if (full()) return; item[++top]=c; } void stack::pop(){ if (empty()) return ‘$’; //’$’ indicates empty return item[top--]; }
int stack::full(){ if (top+1==100) return 1; else return 0; } int stack::empty(){ if (top==-1) return -1; else return 0; }
Constructor • A constructor is a special class method that can automatically initialize all the data members in a class. That is, whenever an object is created, the constructor is automatically invoked to do the initialization • Advantages of having a constructor?
Ex. class stack{ private: char item[100]; int top; public: stack() {top=-1;} //constructor void push(char); void pop(); … }; //create a stack object Stack myStack; //initialization is automatic
A constructor’s name is the class’ name • A class may have more than one constructor • The default constructor is the one without parameters • Ex. class myColor{ private: float red, green, blue; public: myColor(){red=green=blue=0;} myColor(float, float, float); } myColor::myColor(float r, float g, float b){ red=r; green=g; blue=b; } myColor dog; myColor cat(1.0, 5.5, 6.4);
Default Parameters class stack{ private: char item[100]; int top; public: stack(int n=0) {top=n;} //constructor void push(char); void pop(); … }; //create stack objects Stack myStack; //initialization using default parameter Stack yourStack(100); //initialization using non-default parameter
Explicit Constructors • Ex class intCell { public: explicit intCell (int initialValue=0) {storedValue=initialValue;} int read ( ) {return storedValue;} void write (int x) {storedValue=x;} private: int storedValue; } • C++ has lenient rules allowing implicit type conversion for single parameter constructor, which is good in some cases but very bad at other cases. • Explicit constructor of single parameter is designed to prevent this kind of implicit type conversion. IntCell test; Test=10; //error. If the constructor is not explicit, then it is okay
Constructor Initialization: Three Styles • Style one: use assignment class A{ private: int intA; float floatA; public: A(int a, float b){ intA=a; floatA=b; } };
Style two: initialize in the header, body empty class B{ private: int intB; float floatB; public: B(int a, float b): intB(a), floatB(b){ } };
Style three: both header and body class C{ private: int intC; float floatC; public: C(int a, float b): intC(a){ floatC=b } };
How to choose a style? • If the data member is cosnt or object in the other class, then it must be initialized in the header.
Copy ConstructorA class C constructor can take a C reference parameter • Ex. class myColor{ private: float red, green, blue; public: myColor(){red=green=blue=0;} myColor(myColor &); }; myColor::myColor(myColor& t) { red=t.red; green=t.green; blue=t.blue; }
The purpose of a copy constructor is to initialize a new object using an existing object • Ex. myColor dog (1.2, 6.4, 10.8); myColor cat(dog); • Since the main job of a constructor is to initialize data members of a class, the constructor needs to dynamically allocate storage and then initialize the storage when a data member is a pointer type.
Ex. class C{ private: char *text; public: C(); … }; C::C(){ text=new char[40]; strcpy(text, “I like data structures.”); }
Destructor • A destructor is a special class method that destroys (or reallocate) memory storage allocated for a class object • Destructor name: ~class_name
Ex. class C{ private: char *text; … public: C(); ~C(){delete[] text;} … }; C::C(){ text=new char[40]; strcpy(text, “I like data structures.”); }
A destructor has no type, never returns a value, and have no arguments. • A class has only one destructor.
Operator Overloading-Redefine an Operator • Ex. class string{ private: char *str; public: string& operator=(const string&); string& operator+(const string) const; string(char*); }; string& string::operator+(const string s) const{ char * tmp; tmp=new char[strlen(str)+strlen(s.str)+1]; strcpy(tmp,str); strcat(tmp, s.str); return string(tmp); }
In the above case, we overload + operator. In general, we need to use “operator” to overload an operator like +. • “const string s” in the argument list means s cannot be changed. • “const” after the argument list means the object invoking the + operator cannot be changed.
C++ supports any operator overloading except the following operators: . //member selection .* //member dereference :: //scope resolution ?: //conditional operator sizeof //size in bytes • Operator overloading is not easy • Note: Java does not support general operator overloading except a few cases such as + for string concatenation
Operator vs. Function • An operator is in essence a function • Ex.s? • An overloaded operator is a user-defined function that retains the convenience of the operator syntax. • In other words, we may live without operator overloading at all, or just a little overloading.
definition of the overloaded assignment operator string& string::operator=(const string s){ //check whether object assigned to itself if (this !=&s){ delete[] str; str=new char[strlen(s.str)+1]; strcpy(str, s.str); } return *this; } • Note this.
Another Ex. class intCell{ public: intCell(){storedValue=0;} intCell(int a){storedValue=a;} int read(){return storedValue;} void write(int x){storedValue=x;} //overload assignment operator const intCell& operator=(cont intCell& rhs); private: int storedValue; }; //definition of the overloaded = const intCell& intCell::operator=(const intCell& rhs){ if (this !=&rhs) storedValue=rhs.storedValue; return *this; }
Friend Functions • A friend function of a class (or a few classes) is a normal function except: • It must be specified using “friend” in the public domain of the class (or classes). • It can access the private and protected members of the class (or classes).
Ex. class point; class pointStack{ private: point items[100]; … public: friend void printStack (pointStack); … }; class point{ private: int x, y; public: friend void printStack(pointStack); … }; void printStack(pointStack s){ for (int i=0; i<100; i++) cout<<s.items[i].x <<‘ ‘ <<s.items[i].y<<endl; }
Generic Classes Using Templates • Purpose: Use templates to construct a class without specifying particular data types. When an object is created, we can specify data types in the object by specifying the desired types in the template. • Advantage: Support code reusability; promote code correctness
Ex. A class using parameters for data types template<class typePara, int maxStack> class stack{ private: typePara items[maxStack]; int top; public: stack(); void push(typePara); typePara pop(); … };
template <class typePara, int maxStack> stack<typePara, maxStack>::stack(){ top=-1; } template <class typePara, int maxStack> void stack<typePara, maxStack>::push(typePara x) { items[++top]=x; } template <class typePara, int maxStack> typePara stack<typePara, maxStack>::pop(){ return items[top--]; } … stack<int, 100> myStack; stack<char,1000> yourStack; stack<char*, 10000> herStack;
Class parameters listed in the angle brackets must be either a type parameter or a function-style parameter. • A type parameter is preceded by the keyword “class”, it must be replaced by an actual type when a particular class is constructed. • A function-style parameter follows the same syntax as function parameters, and it must be replaced by a value when a particular class is constructed. • Templates are similar to parameterized macros and serve the same general purpose.
Generic class such as templates provides yet another level of abstraction for programmers. Just as a class is an abstraction of a collection of object, so is a generic class an abstraction for a collection of classes. • Ex. GenericStack Class IntStack charStack stringStack
Another Ex. //memoryCell template class interface //for simulate a memory cell template <class obj> class memoryCell{ public: memoryCell(const obj& initialValue=obj( )); const obj& read() const; void write(const obj& x); const memoryCell& operator=(cosnt memoryCell&); private: obj storedValue; }; template <class obj> const memoryCell<obj>& memoryCell<obj>::operator=(const memoryCell<obj>& rhs) { if (this != &rhs) storedValue=rhs.storedValue; return *this; } …
Function Templates • A function template is not an actual function, but instead is a pattern for what could become a function.
Ex. template <class typePara> const typePara& findMax(const vector<typePara>& a) { int maxIndex=0; for (int i=0; i<a.size(); i++) if (a[maxIndex]<a[i]) maxIndex=I; return a[maxIndex]; }
Inheritance • The key point about inheritance is that we use existing classes to define new classes. The new classes will share some (or all) of members in the existing classes.
Basic Concepts and Syntax • Base and derived classes Vehicle Class Base Class Ex. Car Class Derived Class
Vehicle Class • Direct and indirect inheritance • Multiple inheritance Car Class Toyota 4Runner Class Accessory Class Vehicle Class Car Class Truck Class
Member Accessibility • Private: Members may be accessed only by methods within its class or by friend functions • Protected: Members may be accessed only by methods within its certain class and within classes directly and indirectly derived from its own class, or by friend functions • Public: Members may be accessed globally
Inheritance • In C++, all data members and methods of the base class, except for the constructors, the destructor, and the overloaded assignment operator, are always automatically included in the derived class.
Syntax for deriving a class Class BaseClass{ … }; Class DerivedClass: accessSpecifier BaseClass{ … };
Access Specifier: Control the type of access provided to the data members and methods inherited by the derived class from the base class. • Three types of specifiers: • private • protected • public
Ex. class vehicle{ public: float mph, cost, weight; }; class car: public vehicle{ public: char maker[100], model[1000]; }; • You can add new members to the derived class. mph cost mph Vehicle car weight cost maker weight model