Classes and Structs in C++ Based on materials by Bjarne Stroustrup

Similar documents
AT&T Global Network Client for Windows Product Support Matrix January 29, 2015

Analysis One Code Desc. Transaction Amount. Fiscal Period

COMPARISON OF FIXED & VARIABLE RATES (25 YEARS) CHARTERED BANK ADMINISTERED INTEREST RATES - PRIME BUSINESS*

COMPARISON OF FIXED & VARIABLE RATES (25 YEARS) CHARTERED BANK ADMINISTERED INTEREST RATES - PRIME BUSINESS*

Case 2:08-cv ABC-E Document 1-4 Filed 04/15/2008 Page 1 of 138. Exhibit 8

Enhanced Vessel Traffic Management System Booking Slots Available and Vessels Booked per Day From 12-JAN-2016 To 30-JUN-2017

Introduction to C++ Introduction to C++ Week 7 Dr Alex Martin 2013 Slide 1

C++ INTERVIEW QUESTIONS

Boolean Expressions, Conditions, Loops, and Enumerations. Precedence Rules (from highest to lowest priority)

PART-A Questions. 2. How does an enumerated statement differ from a typedef statement?

Ashley Institute of Training Schedule of VET Tuition Fees 2015

Object Oriented Software Design II

Operator Overloading. Lecture 8. Operator Overloading. Running Example: Complex Numbers. Syntax. What can be overloaded. Syntax -- First Example

PROBLEM SOLVING SEVENTH EDITION WALTER SAVITCH UNIVERSITY OF CALIFORNIA, SAN DIEGO CONTRIBUTOR KENRICK MOCK UNIVERSITY OF ALASKA, ANCHORAGE PEARSON

C++ Crash Kurs. C++ Object-Oriented Programming

CENTERPOINT ENERGY TEXARKANA SERVICE AREA GAS SUPPLY RATE (GSR) JULY Small Commercial Service (SCS-1) GSR

Accident & Emergency Department Clinical Quality Indicators

ACCA Interactive Timetable

ACCA Interactive Timetable

P/T 2B: 2 nd Half of Term (8 weeks) Start: 24-AUG-2015 End: 18-OCT-2015 Start: 19-OCT-2015 End: 13-DEC-2015

IS0020 Program Design and Software Tools Midterm, Feb 24, Instruction

2016 Examina on dates

ACCA Interactive Timetable

1 bool operator==(complex a, Complex b) { 2 return a.real()==b.real() 3 && a.imag()==b.imag(); 4 } 1 bool Complex::operator==(Complex b) {

CS193D Handout 06 Winter 2004 January 26, 2004 Copy Constructor and operator=

Detailed guidance for employers

BCOE Payroll Calendar. Monday Tuesday Wednesday Thursday Friday Jun Jul Full Force Calc

Resource Management Spreadsheet Capabilities. Stuart Dixon Resource Manager

Based on Chapter 11, Excel 2007 Dashboards & Reports (Alexander) and Create Dynamic Charts in Microsoft Office Excel 2007 and Beyond (Scheck)

CAFIS REPORT

A Resource for Free-standing Mathematics Units. Data Sheet 1

Open_polyline. Display Engine. window. Rectangle. draw() attach() draw() attach() draw()

PROJECTS SCHEDULING AND COST CONTROLS

Choosing a Cell Phone Plan-Verizon

P/T 2B: 2 nd Half of Term (8 weeks) Start: 25-AUG-2014 End: 19-OCT-2014 Start: 20-OCT-2014 End: 14-DEC-2014

P/T 2B: 2 nd Half of Term (8 weeks) Start: 26-AUG-2013 End: 20-OCT-2013 Start: 21-OCT-2013 End: 15-DEC-2013

CpSc212 Goddard Notes Chapter 6. Yet More on Classes. We discuss the problems of comparing, copying, passing, outputting, and destructing

Ways We Use Integers. Negative Numbers in Bar Graphs

Coding conventions and C++-style

Using INZight for Time series analysis. A step-by-step guide.

NUMBER SYSTEMS APPENDIX D. You will learn about the following in this appendix:

Outline. Conditional Statements. Logical Data in C. Logical Expressions. Relational Examples. Relational Operators

Five Ways Student Loans Impact Credit. Federal Student Loans are Unique. Federal Student Loans are Unique

Computing & Telecommunications Services Monthly Report March 2015

Infographics in the Classroom: Using Data Visualization to Engage in Scientific Practices

1. Introduction. 2. User Instructions. 2.1 Set-up

List 10 different words to describe the weather in the box, below.

2015 Settlement Calendar for ASX Cash Market Products ¹ Published by ASX Settlement Pty Limited A.B.N

Business Plan Example. 31 July 2020

The University of Alabama in Huntsville Electrical and Computer Engineering CPE Test #4 November 20, True or False (2 points each)

Managing Users and Identity Stores

Everything you wanted to know about using Hexadecimal and Octal Numbers in Visual Basic 6

Assignment 4 CPSC 217 L02 Purpose. Important Note. Data visualization

Independent Accountants Report on Applying Agreed-Upon Procedures

Human Resources Management System Pay Entry Calendar

Department of Public Welfare (DPW)

LeSueur, Jeff. Marketing Automation: Practical Steps to More Effective Direct Marketing. Copyright 2007, SAS Institute Inc., Cary, North Carolina,

N3458: Simple Database Integration in C++11

Consumer ID Theft Total Costs

For the next three questions, consider the class declaration: Member function implementations put inline to save space.

Create Stoplight charts using Milestones Professional

CIMA Interactive Timetable Professional London

How To Understand Your Gift Card Buying Habits

CALL VOLUME FORECASTING FOR SERVICE DESKS

US Army Corps of Engineers. Vision Statement. Be the premier stewards of entrusted hydropower resources

Are you prepared to make the decisions that matter most? Decision making in healthcare

PTC Creo 2.0 Hardware Support Dell

Generalizing Overloading for C++2000

MONTHLY REMINDERS FOR 2013

C++FA 3.1 OPTIMIZING C++

Lesson 6: Credit Reports and You Thought Your Report Card Was Important

Computer Science 281 Binary and Hexadecimal Review

Object Oriented Programming With C++(10CS36) Question Bank. UNIT 1: Introduction to C++

2015 Examination dates

DATA QUALITY VISUALIZATION TOOLS ON ARCHIVED HISTORICAL FREEWAY TRAFFIC DATA

Beyond SEO: What to Do With Your Website Visitors

Annexure B: Planning, Budgeting and Performance Management Programme

Storage Classes CS 110B - Rule Storage Classes Page 18-1 \handouts\storclas

Impacts of Government Jobs in Lake County Oregon

CORBA Programming with TAOX11. The C++11 CORBA Implementation

Maryland Board of Public Accountancy CPA Examination Application Process (August 1, 2012)

1. Polymorphism in C++...2

Estuary Time Series Evaluations, Part 1

CHAPTER 2. Logic. 1. Logic Definitions. Notation: Variables are used to represent propositions. The most common variables used are p, q, and r.

Name: Class: Date: 9. The compiler ignores all comments they are there strictly for the convenience of anyone reading the program.

Interest rate Derivatives

More C++ Concepts. Operator overloading Friend Function This Operator Inline Function

CS107L Handout 04 Autumn 2007 October 19, 2007 Custom STL-Like Containers and Iterators

Excel Formatting: Best Practices in Financial Models

Multichoice Quetions 1. Atributes a. are listed in the second part of the class box b. its time is preceded by a colon. c. its default value is

Academic Calendar Arkansas State University - Jonesboro

Function Overloading I

6.170 Tutorial 3 - Ruby Basics

Why you shouldn't use set (and what you should use instead) Matt Austern

Teller & Cash Activity Analysis Tools

An Incomplete C++ Primer. University of Wyoming MA 5310

START HERE THE BASICS TIPS + TRICKS ADDITIONAL HELP. quick start THREE SIMPLE STEPS TO SET UP IN UNDER 5 MINUTES

CQC Compliance Monitoring Framework

OMBU ENTERPRISES, LLC. Process Metrics. 3 Forest Ave. Swanzey, NH Phone: Fax: OmbuEnterprises@msn.

Supervisor Instructions for Approving Web Time Entry

Transcription:

Classes and Structs in C++ Based on materials by Bjarne Stroustrup www.stroustrup.com/programming

Overview Classes Implementation and interface Constructors Member functions Enumerations Operator overloading 2

Classes The idea: A class directly represents a concept in a program If you can think of it as a separate entity, it is plausible that it could be a class or an object of a class Examples: vector, matrix, input stream, string, FFT, valve controller, robot arm, device driver, picture on screen, dialog box, graph, window, temperature reading, clock A class is a (user-defined) type that specifies how objects of its type can be created and used In C++ (as in most modern languages), a class is the key building block for large programs And very useful for small ones also The concept was originally introduced in Simula67 3

Members and member access One way of looking at a class; class X { // this class name is X // data members (they store information) // function members (they do things, using the information) Example class X { public: int m; // data member int mf(int v) { int old = m; m=v; return old; } // function member X var; // var is a variable of type X var.m = 7; // access var s data member m int x = var.mf(9); // call var s member function mf() 4

Classes A class is a user-defined type class X { // this class name is X public: // public members -- that s the interface to users // (accessible by all) // functions // types // data (often best kept private) private: // private members -- that s the implementation details // (accessible by members of this class only) // functions // types // data 5

Struct and class Class members are private by default: class X { int mf(); Means class X { private: int mf(); So X x; // variable x of type X int y = x.mf(); // error: mf is private (i.e., inaccessible) 6

Struct and class A struct is a class where members are public by default: struct X { int m; Means class X { public: int m; structs are primarily used for data structures where the members can take any value 7

Structs Date: my_birthday: y // simplest Date (just data) d struct Date { int y,m,d; // year, month, day m Date my_birthday; // a Date variable (object) my_birthday.y = 12; my_birthday.m = 30; my_birthday.d = 1950; // oops! (no day 1950 in month 30) // later in the program, we ll have a problem 8

Structs Date: my_birthday: y m // simple Date (with a few helper functions for convenience) d struct Date { int y,m,d; // year, month, day Date my_birthday; // a Date variable (object) // helper functions: void init_day(date& dd, int y, int m, int d); // check for valid date and initialize void add_day(date&, int n); // increase the Date by n days init_day(my_birthday, 12, 30, 1950); // run time error: no day 1950 in month 30 9

Structs my_birthday: y m // simple Date d 30 // guarantee initialization with constructor // provide some notational convenience struct Date { int y,m,d; // year, month, day Date(int y, int m, int d); // constructor: check for valid date and initialize void add_day(int n); // increase the Date by n days Date my_birthday; // error: my_birthday not initialized Date my_birthday(12, 30, 1950); // oops! Runtime error Date my_day(1950, 12, 30); // ok my_day.add_day(2); // January 1, 1951 my_day.m = 14; // ouch! (now my_day is a bad date) Date: 1950 12 10

Classes m // simple Date (control access) d 30 class Date { int y,m,d; // year, month, day public: Date(int y, int m, int d); // constructor: check for valid date and initialize my_birthday: y // access functions: void add_day(int n); // increase the Date by n days int month() { return m; } int day() { return d; } int year() { return y; } Date my_birthday(1950, 12, 30); // ok cout << my_birthday.month() << endl; // we can read my_birthday.m = 14; // error: Date::m is private Date: 1950 12 11

Classes The notion of a valid Date is an important special case of the idea of a valid value We try to design our types so that values are guaranteed to be valid Or we have to check for validity all the time A rule for what constitutes a valid value is called an invariant The invariant for Date ( Date must represent a date in the past, present, or future ) is unusually hard to state precisely Remember February 28, leap years, etc. If we can t think of a good invariant, we are probably dealing with plain data If so, use a struct Try hard to think of good invariants for your classes that saves you from poor buggy code 12

Classes // simple Date (some people prefer implementation details last) d class Date { public: Date(int y, int m, int d); // constructor: check for valid date and initialize void add_day(int n); // increase the Date by n days int month(); private: int y,m,d; // year, month, day Date::Date(int yy, int mm, int dd) // definition; note :: member of :y(yy), m(mm), d(dd) { /* */ // note: member initializers void Date::add_day(int n) { /* */ // definition my_birthday: y Date: m 1950 12 30 13

Classes my_birthday: y Date: // simple Date (some people prefer implementation details last) d class Date { public: Date(int y, int m, int d); // constructor: check for valid date and initialize void add_day(int n); // increase the Date by n days int month(); private: int y,m,d; // year, month, day int month() { return m; } // error: forgot Date:: // this month() will be seen as a global function // not the member function, can t access members m 1950 12 30 int Date::season() { /* */ } // error: no member called season 14

Classes // simple Date (what can we do in case of an invalid date?) class Date { public: class Invalid { // to be used as exception Date(int y, int m, int d); // check for valid date and initialize private: int y,m,d; // year, month, day bool check(int y, int m, int d); // is (y,m,d) a valid date? Date:: Date(int yy, int mm, int dd) : y(yy), m(mm), d(dd) // initialize data members { if (!check(y,m,d)) throw Invalid(); // check for validity } 15

Classes Why bother with the public/private distinction? Why not make everything public? To provide a clean interface Data and messy functions can be made private To maintain an invariant Only a fixed set of functions can access the data To ease debugging Only a fixed set of functions can access the data (known as the round up the usual suspects technique) To allow a change of representation You need only to change a fixed set of functions You don t really know who is using a public member 16

Enumerations An enum (enumeration) is a very simple user-defined type, specifying its set of values (its enumerators) For example: enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec Month m = feb; m = 7; // error: can t assign int to Month int n = m; // ok: we can get the numeric value of a Month Month mm = Month(7); // convert int to Month (unchecked) 17

Enumerations Simple list of constants: enum { red, green // the enum { } doesn t define a scope int a = red; // red is available here enum { red, blue, purple // error: red defined twice Type with list of constants enum Color { red, green, blue, /* */ enum Month { jan, feb, mar, /* */ Month m1 = jan; Month m2 = red; // error red isn t a Month Month m3 = 7; // error 7 isn t a Month int i = m1; // ok: an enumerator is converted to its value, i==0 18

Enumerations Values By default // the first enumerator has the value 0, // the next enumerator has the value one plus the value of the // enumerator before it enum { horse, pig, chicken // horse==0, pig==1, chicken==2 You can control numbering enum { jan=1, feb, march /* */ // feb==2, march==3 enum stream_state { good=1, fail=2, bad=4, eof=8 int flags = fail+eof; // flags==10 stream_state s = flags; // error: can t assign an int to a stream_state stream_state s2 = stream_state(flags); // explicit conversion (be careful!) 19

Date: Classes // simple Date (use Month type) class Date { public: enum Month { my_birthday: y m d jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec Date(int y, Month m, int d); // check for valid date and initialize private: int y; // year Month m; int d; // day 1950 Date my_birthday(1950, 30, Date::dec); // error: 2 nd argument not a Month Date my_birthday(1950, Date::dec, 30); // ok 20 12 30

Const class Date { public: int day() const { return d; } // const member: can t modify void add_day(int n); // non-const member: can modify Date d(2000, Date::jan, 20); const Date cd(2001, Date::feb, 21); cout << d.day() << " " << cd.day() << endl; // ok d.add_day(1); // ok cd.add_day(1); // error: cd is a const 21

Const // Date d(2004, Date::jan, 7); // a variable const Date d2(2004, Date::feb, 28); // a constant d2 = d; // error: d2 is const d2.add(1); // error d2 is const d = d2; // fine d.add(1); // fine d2.f(); // should work if and only if f() doesn t modify d2 // how do we achieve that? (say that s what we want, of course) 22

Const member functions // Distinguish between functions that can modify (mutate) objects // and those that cannot ( const member functions ) class Date { public: int day() const; // get (a copy of) the day void add_day(int n); // move the date n days forward const Date dx(2008, Month::nov, 4); int d = dx.day(); // fine dx.add_day(4); // error: can t modify constant (immutable) date 23

Classes What makes a good interface? Minimal As small as possible Complete And no smaller Type safe Beware of confusing argument orders Const correct 24

Classes n Essen%al opera%ons n Default constructor (defaults to: nothing) n No default if any other constructor is declared n Copy constructor (defaults to: copy the member) n Copy assignment (defaults to: copy the members) n Destructor (defaults to: nothing) n For example Date d; // error: no default constructor Date d2 = d; // ok: copy ini3alized (copy the elements) d = d2; // ok copy assignment (copy the elements) 25

Interfaces and helper functions Keep a class interface (the set of public functions) minimal Simplifies understanding Simplifies debugging Simplifies maintenance When we keep the class interface simple and minimal, we need extra helper functions outside the class (non-member functions) E.g. == (equality),!= (inequality) next_weekday(), next_sunday() 26

Helper functions Date next_sunday(const Date& d) { // access d using d.day(), d.month(), and d.year() // make new Date to return } Date next_weekday(const Date& d) { /* */ } bool operator==(const Date& a, const Date& b) { return a.year()==b.year() && a.month()==b.month() && a.day()==b.day(); } bool operator!=(const Date& a, const Date& b) { return!(a==b); } 27

Operator overloading You can define almost all C++ operators for a class or enumeration operands that s often called operator overloading enum Month { jan=1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec Month operator++(month& m) // prefix increment operator { m = (m==dec)? jan : Month(m+1); // wrap around return m; } Month m = nov; ++m; // m becomes dec ++m; // m becomes jan 28

Operator overloading You can define only existing operators E.g., + - * / % [] () ^! & < <= > >= You can define operators only with their conventional number of operands E.g., no unary <= (less than or equal) and no binary! (not) An overloaded operator must have at least one user-defined type as operand int operator+(int,int); // error: you can t overload built-in + Vector operator+(const Vector&, const Vector &); // ok Advice (not language rule): Overload operators only with their conventional meaning + should be addition, * be multiplication, [] be access, () be call, etc. Advice (not language rule): Don t overload unless you really have to 29