COMP6771 Advanced C++ Programming

Similar documents
COMP6771 Advanced C++ Programming

C++ Classes 2008/04/03. Programming Research Laboratory Seoul National University

COMP6771 Advanced C++ Programming

Chapter 13: Copy Control. Overview. Overview. Overview

Abstraction and Encapsulation. Benefits of Abstraction & Encapsulation. Concrete Types. Using Typedefs to streamline classes.

QUIZ. What is wrong with this code that uses default arguments?

Copying Data. Contents. Steven J. Zeil. November 13, Destructors 2

QUIZ on Ch.5. Why is it sometimes not a good idea to place the private part of the interface in a header file?

COMP6771 Advanced C++ Programming

Object Oriented Design

COMP6771 Advanced C++ Programming

PIC 10A Objects/Classes

G52CPP C++ Programming Lecture 13

COMP6771 Advanced C++ Programming

Shahram Rahatlou. Computing Methods in Physics. Overloading Operators friend functions static data and methods

Short Notes of CS201

CS201 - Introduction to Programming Glossary By

Computer Programming with C++ (21)

Interview Questions of C++

CIS 190: C/C++ Programming. Classes in C++

COMP6771 Advanced C++ Programming

Intermediate Programming, Spring 2017*

Programming 2. Object Oriented Programming. Daniel POP

C++ (Non for C Programmer) (BT307) 40 Hours

Fast Introduction to Object Oriented Programming and C++

And Even More and More C++ Fundamentals of Computer Science

Lecture 8. Xiaoguang Wang. February 13th, 2014 STAT 598W. (STAT 598W) Lecture 8 1 / 47

CSE 374 Programming Concepts & Tools. Hal Perkins Spring 2010

From Java to C++ From Java to C++ CSE250 Lecture Notes Weeks 1 2, part of 3. Kenneth W. Regan University at Buffalo (SUNY) September 10, 2009

... IntArray B (100); // IntArray with 100 elements, each initialized to 0

C++ Modern and Lucid C++ for Professional Programmers

Lecture 7. Log into Linux New documents posted to course webpage

Paytm Programming Sample paper: 1) A copy constructor is called. a. when an object is returned by value

COMP6771 Advanced C++ Programming

TDDE18 & 726G77. Functions

QUIZ How do we implement run-time constants and. compile-time constants inside classes?

Copy Control 2008/04/08. Programming Research Laboratory Seoul National University

Outline. 1 Function calls and parameter passing. 2 Pointers, arrays, and references. 5 Declarations, scope, and lifetimes 6 I/O

III. Classes (Chap. 3)

G52CPP C++ Programming Lecture 9

Object Oriented Design

CSI33 Data Structures

Instantiation of Template class

COMP6771 Advanced C++ Programming

Financial computing with C++

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 19 Introduction to C++

OBJECT ORIENTED PROGRAMMING USING C++ CSCI Object Oriented Analysis and Design By Manali Torpe

Operator Overloading in C++ Systems Programming

Distributed Real-Time Control Systems. Lecture 14 Intro to C++ Part III

2 ADT Programming User-defined abstract data types

CS24 Week 3 Lecture 1

CSE 333. Lecture 11 - constructor insanity. Hal Perkins Paul G. Allen School of Computer Science & Engineering University of Washington

A Deeper Look at Classes

Cpt S 122 Data Structures. Introduction to C++ Part II

Abstraction in Software Development

Protection Levels and Constructors The 'const' Keyword

Outline. User-dened types Categories. Constructors. Constructors. 4. Classes. Concrete classes. Default constructor. Default constructor

Object-Oriented Programming. Lecture 2 Dr Piotr Cybula

Polymorphism Part 1 1

Chapter 15. Object-Oriented Programming

Introduction to Programming session 24

Intermediate Programming, Spring 2017*

Financial computing with C++

CS 247: Software Engineering Principles. Modules

Slide Set 14. for ENCM 339 Fall Steve Norman, PhD, PEng. Electrical & Computer Engineering Schulich School of Engineering University of Calgary

Software Design and Analysis for Engineers

Constructors for classes

CE221 Programming in C++ Part 1 Introduction

SFU CMPT Topic: Classes

C How to Program, 6/e, 7/e

ADTs in C++ In C++, member functions can be defined as part of a struct

Data Abstraction. Hwansoo Han

COMP6771 Advanced C++ Programming

A class is a user-defined type. It is composed of built-in types, other user-defined types and

Intermediate Programming, Spring 2017*

class Polynomial { public: Polynomial(const string& N = "no name", const vector<int>& C = vector<int>());... };

COMP322 - Introduction to C++ Lecture 02 - Basics of C++

Object-Oriented Programming

CSCI 123 Introduction to Programming Concepts in C++

IS 0020 Program Design and Software Tools

C++ Important Questions with Answers

See the CS 2704 notes on C++ Class Basics for more details and examples. Data Structures & OO Development I

Object-Oriented Programming, Iouliia Skliarova

CSE 303: Concepts and Tools for Software Development

3.Constructors and Destructors. Develop cpp program to implement constructor and destructor.

Object-Oriented Programming for Scientific Computing

Lecture 18 Tao Wang 1

CS32 - Week 4. Umut Oztok. Jul 15, Umut Oztok CS32 - Week 4

What is Polymorphism? Quotes from Deitel & Deitel s. Why polymorphism? How? How? Polymorphism Part 1

Classes: A Deeper Look

QUIZ Friends class Y;

C++ Constructor Insanity

C++ Programming: From Problem Analysis to Program Design, Fifth Edition. Chapter 12: Classes and Data Abstraction

ADTs & Classes. An introduction

18. Dynamic Data Structures I. Dynamic Memory, Addresses and Pointers, Const-Pointer Arrays, Array-based Vectors

Arizona s First University. More ways to show off--controlling your Creation: IP and OO ECE 373

Modern and Lucid C++ for Professional Programmers. Week 5 Classes and Operators. Department I - C Plus Plus

C++ Coding Standards and Practices. Tim Beaudet March 23rd 2015

Distributed Real-Time Control Systems. Chapter 13 C++ Class Hierarchies

Operator overloading

Transcription:

1.... COMP6771 Advanced C++ Programming Week 3 Part One: - Overview, and 2016 www.cse.unsw.edu.au/ cs6771

2.... What is Object-based Programming? A class uses data abstraction and encapsulation to define an abstract data type: Interface: the operations used by the user (an API) implementation: the data members the bodies of the functions in the interface and any other functions not intended for general use Abstraction: separation of interface from implementation Encapsulation: enforcement of this via information hiding Example: Sales Data - Sales data.h (interface), Sales data.cpp (implementation), user code (knows the interface).

.... Class Interface Declaration: Sales data.h 3 1 #ifndef SALES DATA H 2 #define SALES DATA H 3 4 #include <iostream> 5 6 class Sales_data { 7 public: 8 // constructors 9 Sales_data(const std::string &s): bookname{s} { } 10 Sales_data(const std::string &s, unsigned n, double p): 11 bookname{s}, units_sold{n}, revenue{p*n} { } 12 Sales_data() : Sales_data{"", 0, 0} { } 13 Sales_data(std::istream &); 14 // operations on Sales_data objects 15 std::string getbookname() const; 16 Sales_data& combine(const Sales_data&); 17 double avg_price() const; 18 private: 19 std::string bookname; 20 unsigned units_sold {0}; // in-class initialiser 21 double revenue {0.0}; // in-class initialiser 22 mutable unsigned no_of_times_called {0}; 23 }; 24 #endif

.... Class Implementation Definition: Sales data.cpp 4 1 #include "Sales_data.h" 2 3 // member functions 4 Sales_data::Sales_data(std::istream &is) { 5 read(is, *this); 6 } 7 8 std::string Sales_data::getBookName() const { 9 ++no_of_times_called; 10 return bookname; 11 } 12 13 double Sales_data::avg_price() const { 14 if (units_sold) 15 return revenue/units_sold; 16 else 17 return 0; 18 } 19 20 Sales_data& Sales_data::combine(const Sales_data &rhs) { 21 units_sold += rhs.units_sold; 22 revenue += rhs.revenue; 23 return *this; 24 }

5.... Class Implementation Definition: Sales data.cpp Non-member class releated function (note: these need to be delcared as a friend to work) 1 std::istream& read(std::istream &is, Sales_data &item) { 2 double price {0}; // unit price 3 is >> item.bookname >> item.units_sold >> price; 4 item.revenue = price * item.units_sold; 5 return is; 6 } 7 8 std::ostream& print(std::ostream &os, const Sales_data &item) { 9 os << item.bookname << " " << item.units_sold << " " 10 << item.revenue << " " << item.avg_price(); 11 return os; 12 }

6.... User Code 1 #include <iostream> 2 3 #include "Sales_data.h" 4 5 int main() { 6 Sales_data curbook{"harry Potter"}; 7 if (read(std::cin, curbook)) { 8 Sales_data newbook{""}; 9 while(read(std::cin, newbook)) { 10 if (curbook.getbookname() == newbook.getbookname()) { 11 curbook.combine(newbook); 12 } else { 13 print(std::cout, curbook) << std::endl; 14 curbook = newbook; 15 } 16 } 17 print(std::cout, curbook) << std::endl; 18 } else { 19 std::cerr << "No data?!" << std::endl; 20 } 21 }

7.... Compilation Create the Sales data.o file from Sales data.cpp and Sales data.h g++ -std=c++14 -Wall -Werror -O2 -c Sales data.cpp Create the Sales data user.o from from Sales data user.cpp and Sales data.h g++ -std=c++14 -Wall -Werror -O2 -c Sales data user.cpp Link the two.o files to form the Sales data user executable g++ -std=c++14 -Wall -Werror -O2 -o Sales data user Sales data user.o Sales data.o

8.... A class: C++ defines a new type and a new scope is created using the keywords class or struct a struct is a class whose members are all public defines zero or more type (alias), data and function members may contain zero or more public and private sections is instantiated through a constructor A member function: must be declared inside the class may be defined inside the class (it is then inline by default) may be declared const, when it doesn t modify the data members The data members are private, representing the state of an object.

9.... Abstraction and Encapsulation. Abstraction and Encapsulation. We see that abstraction relies on separating the interface from the implementation. The concept of encapsulation refers to hiding details about class representation and implementation: an object s state. can only be accessed/modified via the public interface. Abstraction and encapsulation provide two advantages: object state is protected from user-level errors class implementation may evolve over time

10.... Declarations vs Definitions A class may be defined only once in a given source file. If defined in multiple files, the definitions must be identical. Class definitions should be placed in header files to ensure uniformity. Header guards guarantee that class definitions are seen only once in each file (or only once in each program by using the preprocessor variables). It is possible to just declare a class, using a forward declaration: class Foo;. Incomplete Types. An incomplete type may only be used to define pointers and. references, as well as in function declarations (but not definitions).

11.... Declarations vs Definitions Because of the restriction on incomplete types, a class cannot have data members of its own type. The following is illegal: struct Node { int data; Node next, prev; }; But the following is legal, since a class is considered declared once its class name has been seen: struct Node { int data; Node *next, *prev; };

12.... Member Access Control class Foo { public: Members accessible by everyone private: Accessible only by members & friends } C++ classes support (in this way): encapsulation information hiding

13.... Class Scope 1 Sales_data& Sales_data::combine(const Sales_data &rhs) { 2 units_sold += rhs.units_sold; 3 revenue += rhs.revenue; 4 return *this; 5 } Provides a definition of Sales_data& Sales_data::combine(const Sales_data &) After the ::, the body of the function is in the scope of class Sales_data, so that the usual name resolution process can be used

14.... The Implicit A member function has an extra implicit parameter, named this, which is a pointer to the object on behalf of which the function is called. A member function does not explicitly define it, but may explicitly use it. The compiler treats an unqualified reference to a class member as being made through the this pointer.

.... The Implicit const pointer: this The non-const member function combine is conceptually defined as: 1 Sales_data& combine(sales_data* const this, Sales_data &rhs) { 2 this->units_sold += rhs.units_sold; 3 this->revenue += rhs.revenue; 4 return *this; 5 } Can be invoked on a non-const object: Sales data data1("123", 2, 44.0), data2("123", 1, 22.0); data1.combine(data2); // combine(data1&, data2); But cannot be invoked on a const object: const Sales data data3("123", 1, 22.0); data3.combine(data1); // error 15

.... The Implicit const pointer: this The const member function getbookname: 1 std::string getbookname() const { 2 return bookname; 3 } Is conceptually defined as: 1 std::string getbookname(const Sales_data* const this) const { 2 return this->bookname; // (*this).bookname 3 } Call be invoked on a const object: const Sales data data1("123", 2, 44.0); data1.getbookname() // getbookname(&data1) Call also be invoked on a non-const object: Sales data data2("123", 2, 44.0); data2.getbookname() // ok, too 16

17.... Returning the Object It is possible to use this to return a reference to the object: 1 Sales_data& Sales_data::combine(const Sales_data &rhs) { 2 units_sold += rhs.units_sold; 3 revenue += rhs.revenue; 4 return *this; 5 } 6 7 const Sales_data& Sales_data::print(ostream &os) const { 8 os << data << endl; 9 return *this; 10 } Note that the return statement is the same, but the return type is different!

18.... Returning the Object Are the following correct? Sales_data a("harry Potter"); Sales_data b("harry Potter"); a.combine(b).print(std::cout); a.print(std::cout).combine(b);

19.... Returning the Object Are the following correct? Sales_data a("harry Potter"); Sales_data b("harry Potter"); a.combine(b).print(std::cout); a.print(std::cout).combine(b); The combine/print is fine, but the print/combine fails since print returns a const reference through which we cannot call a nonconst member. Two solutions: overloading based on const, and mutable data members.

20.... Overloading based on const Recall that a function can be overloaded based on the constness of its pointer arguments, and since the constness of the implicit this argument changes, we can overload print: 1 const Sales_data& Sales_data::print(ostream &os) const 2 Sales_data& Sales_data::print(ostream &os). NB. A const object can use only the const member. A nonconst object could use either member but the nonconst version is a better. match.

21.... Mutable Data Members 1 class Sales_data { 2 public: 3 std::string getbookname() const { // ok 4 ++no of times called; 5 return bookno; 6 } 7 private: 8 std::string bookname; 9 unsigned units_sold = 0; 10 double revenue = 0.0; 11 // counts no. of times getbookname() called on a Sales_data object 12 mutable unsigned no of times called = 0; 13 }; allows a data member of a const object to be modified. The mutable data members represent the (logical) state of an object const-correctness for the logical not physical state of an object

22.... define how class data members are initalised. A constructor has the same name as the class and no return type. Default initalisation is handled through the default constructor. Unless we define our own constructors the compile will define a default constructor. This is known as the synthesized default constructor.

.... The Compiler-Synthesized Default Constructor 1 for each data member in declaration order 2 if it has an in-class initialiser 3 Initialise it using the in-class initialiser 4 else 5 if it is of a built-in type 6 it is undefined // local scope 7 else 8 Initialise it using its default constructor The synthesised constructor makes j undefined 1 class A { 2 public: 3 A() { } 4 }; B b; 1 class B { 2 private: 3 int i {1}; // in-class initialiser 4 int j; 5 A a; 6 }; Also we cannot synthesise the default constructor for B if A() is replaced by A(int). 23

24.... The Compiler-Synthesized Default Constructor. Ḍon t rely on this unless you are confident about its behavior. In addition, a synthesised constructor Is generated for a class only if it declares no constructors Is incorrect if some members of built-in types have no in-class initialisers Is unlikely to be correct if some members are raw pointers (as will be clear when we look at Copy Control) Cannot be generated if for a member of a user-defined type, the type doesn t have a default constructor

.... Constructor Initialiser List! class A { A() : { } }. Constructor Phases. The initialisation phase occurs before the body of the constructor is. executed, regardless of whether the initialiser list is supplied. 25 A constructor will:.1 initialise all data members: each data member is initialised using the constructor initialiser or by default value (using the same rules as those used to initialise variables); then.2 execute the body of constructor: the code may assign values to the data members to override the initial values

.... (Overloaded) Constructor initialiser list: Sales_data(const std::string &s, unsigned n, double p) : bookno{s}, units_sold{n}, revenue{p*n} { }.1 First, the data members are initialised.2 Then, the (empty) body is executed Explicitly initialise bookno only and implicitly initialise the other two using the in-class initialisers Sales_data(const std::string &s): bookno{s} { } // SAME AS Sales_data(const std::string &s) : bookno{s}, units_sold{0}, revenue{0.0} { } Do the initialisation in the body: Sales_data(std::istream &) {... } Due to the lack of the initialiser list, the data members will be initialised first as per Slide 23 before this 3rd constructor is called. 26

.... Constructor Initialiser List The last three must be initialised on the initialiser list: 1 class ConstRef { 2 public: 3 ConstRef(int ii) : i{ii}, ci{ii}, ri{i}, o{...} { } 4 private: 5 int i; 6 const int ci; // const 7 int &ri; // reference 8 nodefaultconstructor o; 9 }; Don t do this: 1 ConstRef::ConstRef(int ii) { 2 i = ii; // ok -- uninitialized (by default initialisation) 3 ci = ii; // error: cannot assign to a const 4 ri = ii; // error: was never initialised 5 } // error: nodefaultconstructor() doesn t exist 27

.... Order, Order! This doesn t work as expected! 1 #include<iostream> 2 3 class X { 4 public: 5 X(int val) : j{val}, i{j} { } 6 private: 7 int i; 8 int j; 9 }; The members are always initialised in declaration order: Correct solutions: 1 X(int val) : i{val}, j{val} { } 2 // or 3 X(int val) : i{val}, j{i} { } 28 Why? Because a class has only one destructor! The destructor of a class calls the destructors of its members in the reverse declaration order.

29.... Readings Chapter 7 C++ Object Initialisation: http://stackoverflow.com/questions/3127454/ how-do-c-class-members-get-initialized-if-i-dont-do-it-expl http://stackoverflow.com/questions/12927169/ how-can-i-initialize-c-object-member-variables-in-the-const