0% found this document useful (0 votes)
57 views27 pages

Classes and Data Abstraction: Andrew Davison Noppadon Kamolvilassatian

This document discusses classes and data abstraction in C++. It covers: 1. What are abstract data types and how they provide benefits like reusability and simplicity. 2. How C++ supports data abstraction through classes, which encapsulate data and functions. 3. An example using a struct to define a user-defined type for time, but it does not fully abstract the implementation. 4. A better example using a Time class that fully abstracts the implementation through private data members, member functions and a constructor.

Uploaded by

aasuran
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views27 pages

Classes and Data Abstraction: Andrew Davison Noppadon Kamolvilassatian

This document discusses classes and data abstraction in C++. It covers: 1. What are abstract data types and how they provide benefits like reusability and simplicity. 2. How C++ supports data abstraction through classes, which encapsulate data and functions. 3. An example using a struct to define a user-defined type for time, but it does not fully abstract the implementation. 4. A better example using a Time class that fully abstracts the implementation through private data members, member functions and a constructor.

Uploaded by

aasuran
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 27

Classes and Data Abstraction

Andrew Davison
Noppadon Kamolvilassatian
Department of Computer Engineering
Prince of Songkla University

Contents

1. What is Data Abstraction?


2. C++: Classes and Data Abstraction
3. Implementing a User-Defined Type Time with a
Struct
4. Implementing a Time Abstract Data Type with
a Class
5. Classes as User-Defined Types
6. Using Constructors
2

1. What is Data Abstraction?

Abstract Data Types (ADTs)


type implementation & operations
hidden implementation

types are central to problem solving

a weapon against complexity

built-in and user-defined types are ADTs


3

Clients and Manufacturers


client

Interface

ADT

Implementation

client

use

client

manufacturers
responsibility
4

Benefits

Manufacturer Benefits:
easy to modify, maintain
profitable
reusable

Client Benefits:

simple to use, understand


familiar
cheap
component-based
5

How Well are ADTs Supported in C?

Does C enforce the use of the ADTs interface and


the hiding of its implementation?

No

C++ (Chapters 15-21)

C++ is a superset of C, which has added


features to support object-oriented programmi
ng.

C++ supports classes.


things very like ADTs

2. C++: Classes and Data Abstraction

C++ supports Object-Oriented Programming


(OOP).

OOP models real-world objects with software


counterparts.

OOP encapsulates data (attributes) and functions


(behavior) into packages called objects.

Objects have the property of information hiding.


8

Objects communicate with one another across


interfaces.

The interdependencies between the classes are


identified

makes use of
a part of
a specialisation of
a generalisation of
etc

C and C++

C programmers concentrate on writing functions.

C++ programmers concentrate on creating their


own user-defined types called classes.

Classes in C++ are a natural evolution of the C


notion of struct.

10

3. Implementing a User-Defined Type


Time with a Struct
// FIG16_1.CPP
// Create a structure, set its members, and print
it.
#include <iostream.h>
struct
int
int
int
};

Time {
hour;
minute;
second;

//
//
//
//

structure definition
0-23
0-59
0-59

void printMilitary(const Time &);


void printStandard(const Time &);

// prototype
// prototype
11

main()
{
Time dinnerTime;
// set members to
dinnerTime.hour =
dinnerTime.minute
dinnerTime.second

// variable of new type Time


valid values
18;
= 30;
= 0;

cout << "Dinner will be held at ";


printMilitary(dinnerTime);
cout << " military time,\nwhich is ";
printStandard(dinnerTime);
cout << " standard time." << endl;

12

// set members to
dinnerTime.hour =
dinnerTime.minute
dinnerTime.second

invalid values
29;
= 73;
= 103;

cout << "\nTime with invalid values: ";


printMilitary(dinnerTime);
cout << endl;
return 0;
}

13

// Print the time in military format


void printMilitary(const Time &t)
{
cout << (t.hour < 10 ? "0" : "") << t.hour << ":"
<< (t.minute < 10 ? "0" : "") << t.minute << ":"
<< (t.second < 10 ? "0" : "") << t.second;
}

14

// Print the time in standard format


void printStandard(const Time &t)
{
cout << ((t.hour == 0 || t.hour == 12) ? 12 :
t.hour % 12)
<< ":" << (t.minute < 10 ? "0" : "") << t.minute
<< ":" << (t.second < 10 ? "0" : "") << t.second
<< (t.hour < 12 ? " AM" : " PM");
}

15

Comments

Initialization is not required --> can cause


problems.

A program can assign bad values to members of


Time.

If the implementation of the struct is changed,


all the programs that use the struct must be chan
ged. [No interface]
16

4. Implementing a Time Abstract Data


Type with a Class
#include <iostream.h>
// Time abstract data type (ADT) definition
class Time {
public:
Time();
// default constructor
void setTime(int, int, int);
void printMilitary();
void printStandard();
private:
int hour;
// 0 - 23
int minute;
// 0 - 59
int second;
// 0 - 59
17
};

// Time constructor initializes each data member


to zero.
// Ensures all Time objects start in a consistent
state.
Time::Time() { hour = minute = second = 0; }
// Set a new Time value using military time.
// Perform validity checks on the data values.
// Set invalid values to zero (consistent state)
void Time::setTime(int h, int m, int s)
{
hour = (h >= 0 && h < 24) ? h : 0;
minute = (m >= 0 && m < 60) ? m : 0;
second = (s >= 0 && s < 60) ? s : 0;
}

18

// Print Time in military format


void Time::printMilitary()
{
cout << (hour < 10 ? "0" : "") << hour << ":"
<< (minute < 10 ? "0" : "") << minute << ":"
<< (second < 10 ? "0" : "") << second;
}
// Print time in standard format
void Time::printStandard()
{
cout << ((hour == 0 || hour == 12) ? 12 : hour %
12)
<< ":" << (minute < 10 ? "0" : "") << minute
<< ":" << (second < 10 ? "0" : "") << second
<< (hour < 12 ? " AM" : " PM");
}
19

// Driver to test simple class Time


main()
{
Time t; // instantiate object t of class Time
cout << "The initial military time is ";
t.printMilitary();
cout << "\nThe initial standard time is ";
t.printStandard();
t.setTime(13, 27, 6);
cout << "\n\nMilitary time after setTime is ";
t.printMilitary();
cout << "\nStandard time after setTime is ";
t.printStandard();

20

t.setTime(99, 99, 99);


// attempt invalid settings
cout << "\n\nAfter attempting invalid settings:
\n"
<< "Military time: ";
t.printMilitary();
cout << "\nStandard time: ";
t.printStandard();
cout << endl;
return 0;
}

21

Output

The initial military time is 00:00:00


The initial standard time is 12:00:00 AM
Military time after setTime is 13:27:06
Standard time after setTime is 1:27:06 PM
After attempting invalid settings:
Military time: 00:00:00
Standard time: 12:00:00 AM
22

Comments

hour, minute, and second are private data

members. They are normally not accessible outsid


e the class. [Information Hiding]

Use a constructor to initiailize the data members.


This ensures that the object is in a consistate state
when created.
Outside functions set the values of data members
by calling the setTime method, which provides err
or checking.
23

5. Classes as User-Defined Types

Once the class has been defined, it can be used as


a type in declarations as follows:

Time sunset,
arrayOfTimes[5],
*pointerToTime,

//object of type Time


//array of Time objects
//pointer to a Time object

24

6. Using Constructors

Constructors can be overloaded, providing several


methods to initialize a class.
Time example:

Interface
Time();
Time(int hr, int min, int sec);

Implementation
Time::Time()
{ hour = minute = second = 0; }
Time::Time(int hr, int min, int sec)
{ setTime(hr, min, sec); }

25

Use:
Time t1;
Time t2(08,15,04);

26

27

You might also like