Operator overloading is a technique by which operators used in a programming language are implemented in user-defined types with customized logic that is based on the types of arguments passed.
The document discusses operator overloading in C++. It lists which operators can and cannot be overloaded. It provides examples of overloading unary, binary, and subscript operators. It also covers copy constructors and how they must accept a const reference argument to avoid infinite recursion when copying an object. An Array class is implemented that overloads various operators like ==, !=, [], and = to provide functionality like element access, copying, assignment, and comparisons.
Synapse india complain sharing info on chapter 8 operator overloadingSynapseindiaComplaints
The document discusses operator overloading in C++. It covers the fundamentals of operator overloading including which operators can be overloaded and restrictions. It provides examples of overloading unary, binary, and assignment operators. It also discusses overloading stream insertion and extraction operators and includes a case study overloading operators for an Array class. The case study demonstrates overloading operators like ==, !=, [], and << to provide functionality like array comparisons and outputting entire arrays. The document also discusses converting between types using cast operators.
The document describes operator overloading in C++. It discusses how operators can be used with user-defined classes by defining operator functions as class members or non-member functions. It provides examples of overloading stream insertion and extraction operators, unary operators, and binary operators. It also presents a case study of overloading operators for an Array class to add capabilities like range checking and deep copying of arrays.
The document discusses constructors, destructors, copy constructors and operator overloading in C++ classes. It provides examples of:
1) Defining a constructor for the rectangle class that initializes its data members.
2) Calling the constructor when creating new rectangle objects.
3) Defining a destructor for the string class that deletes the dynamically allocated string member.
4) Defining a copy constructor for the string class that makes a deep copy of the string member.
5) Overloading operators like << and >> as non-member functions to allow I/O for user-defined classes.
This document discusses references and dynamic memory allocation in C++. It covers passing references as function parameters, returning references from functions, and advantages over pointers. It also explains static versus dynamic memory allocation, allocating and deallocating single and multi-dimensional dynamic arrays, and avoiding memory leaks when using dynamic allocation.
Operator overloading allows operators like + and - to be used with user-defined types in C++. Certain operators like = and [] must be overloaded as member functions, while others like friends and non-members can also be overloaded. Unary operators operate on a single operand, while binary operators require two operands. Overloaded operators are implemented via member functions, non-member functions, or friend functions depending on whether the left operand is of the class type. Strings can also be manipulated using overloaded operators by defining a string class with a character pointer and length.
Operator Overloading
The keyword Operator
Overloading Unary Operator
Operator Return Type
Overloading Assignment Operator (=)
Rules for Overloading Operators
Inheritance
Reusability
Types of Inheritance
Virtual Base Classes
Object as a Class Member
Abstract Classes
Advantages of Inheritance
Disadvantages of Inheritance
This document provides information about linear search of arrays in C++. It discusses:
- Linear search involves comparing each element of an array to a key value to find a match. It is useful for small, unsorted arrays but is inefficient as it must examine every element if the key is not present.
- The linearSearch function takes an array, search key, and array size as parameters. It uses a for loop to compare each element to the key and returns the index of the match, or -1 if no match is found.
- Multiple examples are provided to demonstrate calling the linearSearch function and displaying the results of searches that do and do not find the key.
C++ Nested loops, matrix and fuctions.pdfyamew16788
Nested loops allow executing a set of statements multiple times in a loop within another loop. This can be used to iterate over multidimensional data structures. The outer loop completes one full iteration for each iteration of the inner loop, nesting the loops within each other. Functions allow breaking programs into reusable blocks of code to perform specific tasks, with declarations informing the compiler of functions' names, return types, and parameters, while definitions contain the function body.
This document discusses operator overloading in C++. It provides the following key points:
1. Operator overloading allows defining new meanings for most C++ operators when used with user-defined types. Operators that cannot be overloaded include ., ->, ::, sizeof, and ?:.
2. To overload an operator, a member function is written with the name operator followed by the operator symbol. This function performs the new task defined for the operator on class objects.
3. Common operators that can be overloaded include +, -, *, /, %, <<, >>, ==, !=, etc. Examples are provided for overloading unary, binary, and subscript operators to manipulate class objects.
This document discusses object oriented programming concepts in C++ including string handling, copy constructors, polymorphism, and dynamic memory allocation. It provides examples of:
1) Using string class functions like append(), find(), length(), replace(), and swap() as well as string operators like =, +, +=, ==, <, and >.
2) Defining and using a copy constructor to initialize an object using another object of the same class.
3) Compile-time polymorphism through function and operator overloading allowing functions or operators to work with multiple types.
4) Dynamic memory allocation using new and delete to allocate and free memory for objects at runtime rather than compile-time.
The document discusses arrays, strings, and functions in C programming. It begins by explaining how to initialize and access 2D arrays, including examples of declaring and initializing a 2D integer array and adding elements of two 2D arrays. It also covers initializing and accessing multidimensional arrays. The document then discusses string basics like declaration and initialization of character arrays that represent strings. It explains various string functions like strlen(), strcat(), strcmp(). Finally, it covers functions in C including declaration, definition, call by value vs reference, and passing arrays to functions.
This document provides an overview of basic Java programming concepts including:
- Java programs require a main method inside a class and use print statements for output.
- Java has primitive data types like int and double as well as objects. Variables are declared with a type.
- Control structures like if/else and for loops work similarly to other languages. Methods can call themselves recursively.
- Basic input is done through dialog boxes and output through print statements. Formatting is available.
- Arrays are objects that store multiple values of a single type and know their own length. Strings are immutable character arrays.
This slide contains short introduction to different elements of functional programming along with some specific techniques with which we use functional programming in Swift.
Operator overloading allows giving special meanings to operators when used with user-defined types. It is implemented using special member functions called operator functions. Common operators that can be overloaded include arithmetic, relational, and function call operators. Operator overloading enhances the functionality of operators but does not change their syntax, precedence, or associativity. It allows applying operators to user-defined types in a similar way as they are used for built-in types.
C++ allows for concise summaries in 3 sentences or less:
The document provides an overview of C++ concepts including data types, variables, operators, functions, classes, inheritance and virtual members. It also covers process and thread concepts at a high level. Code examples are provided to illustrate namespaces, input/output, program flow control, overloading, dynamic memory allocation, and classes. The document serves as a brief review of fundamental C++ and system programming concepts.
Operator overloading allows programmers to define special member functions to customize the behavior of operators (like +, -, etc.) for user-defined types. It can be implemented through member functions, non-member functions, or friend functions. Inline functions replace function calls with the function code directly, which can improve performance for short functions.
The document provides an overview of the C programming language. It discusses basic C programming concepts like data types, variables, functions, pointers, structures, file handling and more. It also includes examples of basic C programs and code snippets to illustrate various programming concepts.
Operator overloading allows user-defined types in C++ to behave similarly to built-in types when operators are used on them. It allows operators to have special meanings depending on the context. Some key points made in the document include:
- Operator overloading enhances the extensibility of C++ by allowing user-defined types to work with operators like addition, subtraction, etc.
- Common operators that can be overloaded include arithmetic operators, increment/decrement, input/output, function call, and subscript operators.
- To overload an operator, a member or friend function is declared with the same name as the operator being overloaded. This function performs the desired operation on the class type.
-
In programming, operator overloading, sometimes termed operator ad hoc polymorphism, is a specific case of polymorphism, where different operators have different implementations depending on their arguments. Operator overloading is generally defined by a programming language, a programmer, or both.
This document discusses operator overloading in C++. It defines operator overloading as allowing an operator to perform operations on user-defined types. It covers the concept, syntax, rules, advantages, disadvantages and provides an example of overloading the + and - operators for an integer class. Operations that can be overloaded include arithmetic, logical, relational, and pointer operators. The main advantage is improved readability and code reuse when working with user-defined types.
C++ - UNIT_-_IV.pptx which contains details about PointersANUSUYA S
Pointer is a variable in C++ that holds the address of another variable. Pointers allow accessing the memory location of other variables. There are different types of pointers based on the data type they are pointing to such as integer, character, class etc. Pointers are declared using an asterisk * before the pointer variable name. The address of a variable can be assigned to a pointer using the & address of operator. Pointers can be used to access members of a class and pass arrays to functions. The this pointer represents the address of the object inside member functions. Virtual functions allow dynamic binding at runtime in inheritance.
2 BytesC++ course_2014_c7_ operator overloading, friends and references kinan keshkeh
The document discusses different ways of overloading operators in C++ classes. It explains how to overload operators as standalone functions or member functions. It provides examples of overloading the +, -, >>, <<, ++, -- and [] operators. It also discusses how to define the >> and << operators as friend functions to allow input and output of class objects through cout and cin.
How to track Cost and Revenue using Analytic Accounts in odoo Accounting, App...Celine George
Analytic accounts are used to track and manage financial transactions related to specific projects, departments, or business units. They provide detailed insights into costs and revenues at a granular level, independent of the main accounting system. This helps to better understand profitability, performance, and resource allocation, making it easier to make informed financial decisions and strategic planning.
Ad
More Related Content
Similar to Operator overloading in c++ is the most required. (20)
Operator overloading allows operators like + and - to be used with user-defined types in C++. Certain operators like = and [] must be overloaded as member functions, while others like friends and non-members can also be overloaded. Unary operators operate on a single operand, while binary operators require two operands. Overloaded operators are implemented via member functions, non-member functions, or friend functions depending on whether the left operand is of the class type. Strings can also be manipulated using overloaded operators by defining a string class with a character pointer and length.
Operator Overloading
The keyword Operator
Overloading Unary Operator
Operator Return Type
Overloading Assignment Operator (=)
Rules for Overloading Operators
Inheritance
Reusability
Types of Inheritance
Virtual Base Classes
Object as a Class Member
Abstract Classes
Advantages of Inheritance
Disadvantages of Inheritance
This document provides information about linear search of arrays in C++. It discusses:
- Linear search involves comparing each element of an array to a key value to find a match. It is useful for small, unsorted arrays but is inefficient as it must examine every element if the key is not present.
- The linearSearch function takes an array, search key, and array size as parameters. It uses a for loop to compare each element to the key and returns the index of the match, or -1 if no match is found.
- Multiple examples are provided to demonstrate calling the linearSearch function and displaying the results of searches that do and do not find the key.
C++ Nested loops, matrix and fuctions.pdfyamew16788
Nested loops allow executing a set of statements multiple times in a loop within another loop. This can be used to iterate over multidimensional data structures. The outer loop completes one full iteration for each iteration of the inner loop, nesting the loops within each other. Functions allow breaking programs into reusable blocks of code to perform specific tasks, with declarations informing the compiler of functions' names, return types, and parameters, while definitions contain the function body.
This document discusses operator overloading in C++. It provides the following key points:
1. Operator overloading allows defining new meanings for most C++ operators when used with user-defined types. Operators that cannot be overloaded include ., ->, ::, sizeof, and ?:.
2. To overload an operator, a member function is written with the name operator followed by the operator symbol. This function performs the new task defined for the operator on class objects.
3. Common operators that can be overloaded include +, -, *, /, %, <<, >>, ==, !=, etc. Examples are provided for overloading unary, binary, and subscript operators to manipulate class objects.
This document discusses object oriented programming concepts in C++ including string handling, copy constructors, polymorphism, and dynamic memory allocation. It provides examples of:
1) Using string class functions like append(), find(), length(), replace(), and swap() as well as string operators like =, +, +=, ==, <, and >.
2) Defining and using a copy constructor to initialize an object using another object of the same class.
3) Compile-time polymorphism through function and operator overloading allowing functions or operators to work with multiple types.
4) Dynamic memory allocation using new and delete to allocate and free memory for objects at runtime rather than compile-time.
The document discusses arrays, strings, and functions in C programming. It begins by explaining how to initialize and access 2D arrays, including examples of declaring and initializing a 2D integer array and adding elements of two 2D arrays. It also covers initializing and accessing multidimensional arrays. The document then discusses string basics like declaration and initialization of character arrays that represent strings. It explains various string functions like strlen(), strcat(), strcmp(). Finally, it covers functions in C including declaration, definition, call by value vs reference, and passing arrays to functions.
This document provides an overview of basic Java programming concepts including:
- Java programs require a main method inside a class and use print statements for output.
- Java has primitive data types like int and double as well as objects. Variables are declared with a type.
- Control structures like if/else and for loops work similarly to other languages. Methods can call themselves recursively.
- Basic input is done through dialog boxes and output through print statements. Formatting is available.
- Arrays are objects that store multiple values of a single type and know their own length. Strings are immutable character arrays.
This slide contains short introduction to different elements of functional programming along with some specific techniques with which we use functional programming in Swift.
Operator overloading allows giving special meanings to operators when used with user-defined types. It is implemented using special member functions called operator functions. Common operators that can be overloaded include arithmetic, relational, and function call operators. Operator overloading enhances the functionality of operators but does not change their syntax, precedence, or associativity. It allows applying operators to user-defined types in a similar way as they are used for built-in types.
C++ allows for concise summaries in 3 sentences or less:
The document provides an overview of C++ concepts including data types, variables, operators, functions, classes, inheritance and virtual members. It also covers process and thread concepts at a high level. Code examples are provided to illustrate namespaces, input/output, program flow control, overloading, dynamic memory allocation, and classes. The document serves as a brief review of fundamental C++ and system programming concepts.
Operator overloading allows programmers to define special member functions to customize the behavior of operators (like +, -, etc.) for user-defined types. It can be implemented through member functions, non-member functions, or friend functions. Inline functions replace function calls with the function code directly, which can improve performance for short functions.
The document provides an overview of the C programming language. It discusses basic C programming concepts like data types, variables, functions, pointers, structures, file handling and more. It also includes examples of basic C programs and code snippets to illustrate various programming concepts.
Operator overloading allows user-defined types in C++ to behave similarly to built-in types when operators are used on them. It allows operators to have special meanings depending on the context. Some key points made in the document include:
- Operator overloading enhances the extensibility of C++ by allowing user-defined types to work with operators like addition, subtraction, etc.
- Common operators that can be overloaded include arithmetic operators, increment/decrement, input/output, function call, and subscript operators.
- To overload an operator, a member or friend function is declared with the same name as the operator being overloaded. This function performs the desired operation on the class type.
-
In programming, operator overloading, sometimes termed operator ad hoc polymorphism, is a specific case of polymorphism, where different operators have different implementations depending on their arguments. Operator overloading is generally defined by a programming language, a programmer, or both.
This document discusses operator overloading in C++. It defines operator overloading as allowing an operator to perform operations on user-defined types. It covers the concept, syntax, rules, advantages, disadvantages and provides an example of overloading the + and - operators for an integer class. Operations that can be overloaded include arithmetic, logical, relational, and pointer operators. The main advantage is improved readability and code reuse when working with user-defined types.
C++ - UNIT_-_IV.pptx which contains details about PointersANUSUYA S
Pointer is a variable in C++ that holds the address of another variable. Pointers allow accessing the memory location of other variables. There are different types of pointers based on the data type they are pointing to such as integer, character, class etc. Pointers are declared using an asterisk * before the pointer variable name. The address of a variable can be assigned to a pointer using the & address of operator. Pointers can be used to access members of a class and pass arrays to functions. The this pointer represents the address of the object inside member functions. Virtual functions allow dynamic binding at runtime in inheritance.
2 BytesC++ course_2014_c7_ operator overloading, friends and references kinan keshkeh
The document discusses different ways of overloading operators in C++ classes. It explains how to overload operators as standalone functions or member functions. It provides examples of overloading the +, -, >>, <<, ++, -- and [] operators. It also discusses how to define the >> and << operators as friend functions to allow input and output of class objects through cout and cin.
How to track Cost and Revenue using Analytic Accounts in odoo Accounting, App...Celine George
Analytic accounts are used to track and manage financial transactions related to specific projects, departments, or business units. They provide detailed insights into costs and revenues at a granular level, independent of the main accounting system. This helps to better understand profitability, performance, and resource allocation, making it easier to make informed financial decisions and strategic planning.
GDGLSPGCOER - Git and GitHub Workshop.pptxazeenhodekar
This presentation covers the fundamentals of Git and version control in a practical, beginner-friendly way. Learn key commands, the Git data model, commit workflows, and how to collaborate effectively using Git — all explained with visuals, examples, and relatable humor.
Geography Sem II Unit 1C Correlation of Geography with other school subjectsProfDrShaikhImran
The correlation of school subjects refers to the interconnectedness and mutual reinforcement between different academic disciplines. This concept highlights how knowledge and skills in one subject can support, enhance, or overlap with learning in another. Recognizing these correlations helps in creating a more holistic and meaningful educational experience.
A measles outbreak originating in West Texas has been linked to confirmed cases in New Mexico, with additional cases reported in Oklahoma and Kansas. The current case count is 817 from Texas, New Mexico, Oklahoma, and Kansas. 97 individuals have required hospitalization, and 3 deaths, 2 children in Texas and one adult in New Mexico. These fatalities mark the first measles-related deaths in the United States since 2015 and the first pediatric measles death since 2003.
The YSPH Virtual Medical Operations Center Briefs (VMOC) were created as a service-learning project by faculty and graduate students at the Yale School of Public Health in response to the 2010 Haiti Earthquake. Each year, the VMOC Briefs are produced by students enrolled in Environmental Health Science Course 581 - Public Health Emergencies: Disaster Planning and Response. These briefs compile diverse information sources – including status reports, maps, news articles, and web content– into a single, easily digestible document that can be widely shared and used interactively. Key features of this report include:
- Comprehensive Overview: Provides situation updates, maps, relevant news, and web resources.
- Accessibility: Designed for easy reading, wide distribution, and interactive use.
- Collaboration: The “unlocked" format enables other responders to share, copy, and adapt seamlessly. The students learn by doing, quickly discovering how and where to find critical information and presenting it in an easily understood manner.
CURRENT CASE COUNT: 817 (As of 05/3/2025)
• Texas: 688 (+20)(62% of these cases are in Gaines County).
• New Mexico: 67 (+1 )(92.4% of the cases are from Eddy County)
• Oklahoma: 16 (+1)
• Kansas: 46 (32% of the cases are from Gray County)
HOSPITALIZATIONS: 97 (+2)
• Texas: 89 (+2) - This is 13.02% of all TX cases.
• New Mexico: 7 - This is 10.6% of all NM cases.
• Kansas: 1 - This is 2.7% of all KS cases.
DEATHS: 3
• Texas: 2 – This is 0.31% of all cases
• New Mexico: 1 – This is 1.54% of all cases
US NATIONAL CASE COUNT: 967 (Confirmed and suspected):
INTERNATIONAL SPREAD (As of 4/2/2025)
• Mexico – 865 (+58)
‒Chihuahua, Mexico: 844 (+58) cases, 3 hospitalizations, 1 fatality
• Canada: 1531 (+270) (This reflects Ontario's Outbreak, which began 11/24)
‒Ontario, Canada – 1243 (+223) cases, 84 hospitalizations.
• Europe: 6,814
Title: A Quick and Illustrated Guide to APA Style Referencing (7th Edition)
This visual and beginner-friendly guide simplifies the APA referencing style (7th edition) for academic writing. Designed especially for commerce students and research beginners, it includes:
✅ Real examples from original research papers
✅ Color-coded diagrams for clarity
✅ Key rules for in-text citation and reference list formatting
✅ Free citation tools like Mendeley & Zotero explained
Whether you're writing a college assignment, dissertation, or academic article, this guide will help you cite your sources correctly, confidently, and consistent.
Created by: Prof. Ishika Ghosh,
Faculty.
📩 For queries or feedback: [email protected]
Social Problem-Unemployment .pptx notes for Physiotherapy StudentsDrNidhiAgarwal
Unemployment is a major social problem, by which not only rural population have suffered but also urban population are suffered while they are literate having good qualification.The evil consequences like poverty, frustration, revolution
result in crimes and social disorganization. Therefore, it is
necessary that all efforts be made to have maximum.
employment facilities. The Government of India has already
announced that the question of payment of unemployment
allowance cannot be considered in India
How to manage Multiple Warehouses for multiple floors in odoo point of saleCeline George
The need for multiple warehouses and effective inventory management is crucial for companies aiming to optimize their operations, enhance customer satisfaction, and maintain a competitive edge.
The ever evoilving world of science /7th class science curiosity /samyans aca...Sandeep Swamy
The Ever-Evolving World of
Science
Welcome to Grade 7 Science4not just a textbook with facts, but an invitation to
question, experiment, and explore the beautiful world we live in. From tiny cells
inside a leaf to the movement of celestial bodies, from household materials to
underground water flows, this journey will challenge your thinking and expand
your knowledge.
Notice something special about this book? The page numbers follow the playful
flight of a butterfly and a soaring paper plane! Just as these objects take flight,
learning soars when curiosity leads the way. Simple observations, like paper
planes, have inspired scientific explorations throughout history.
How to Manage Opening & Closing Controls in Odoo 17 POSCeline George
In Odoo 17 Point of Sale, the opening and closing controls are key for cash management. At the start of a shift, cashiers log in and enter the starting cash amount, marking the beginning of financial tracking. Throughout the shift, every transaction is recorded, creating an audit trail.
*Metamorphosis* is a biological process where an animal undergoes a dramatic transformation from a juvenile or larval stage to a adult stage, often involving significant changes in form and structure. This process is commonly seen in insects, amphibians, and some other animals.
Exploring Substances:
Acidic, Basic, and
Neutral
Welcome to the fascinating world of acids and bases! Join siblings Ashwin and
Keerthi as they explore the colorful world of substances at their school's
National Science Day fair. Their adventure begins with a mysterious white paper
that reveals hidden messages when sprayed with a special liquid.
In this presentation, we'll discover how different substances can be classified as
acidic, basic, or neutral. We'll explore natural indicators like litmus, red rose
extract, and turmeric that help us identify these substances through color
changes. We'll also learn about neutralization reactions and their applications in
our daily lives.
by sandeep swamy
2. Introduction
• Operator overloading
– Enabling C++’s operators to work with class objects
– Using traditional operators with user-defined objects
– Requires great care; when overloading is misused,
program difficult to understand
– Examples of already overloaded operators
• Operator << is both the stream-insertion operator and the
bitwise left-shift operator
• + and -, perform arithmetic on multiple types
– Compiler generates the appropriate code based on the
manner in which the operator is used
3. Introduction
• Overloading an operator
– Write function definition as normal
– Function name is keyword operator followed by the
symbol for the operator being overloaded
– operator+ used to overload the addition operator (+)
• Using operators
– To use an operator on a class object it must be overloaded
unless the assignment operator(=)or the address
operator(&)
• Assignment operator by default performs memberwise assignment
• Address operator (&) by default returns the address of an object
4. Restrictions on Operator Overloading
• C++ operators that can be overloaded
• C++ Operators that cannot be overloaded
Operators that cannot be overloaded
. .* :: ?: sizeof
Operators that can be overloaded
+ - * / % ^ & |
~ ! = < > += -= *=
/= %= ^= &= |= << >> >>=
<<= == != <= >= && || ++
-- ->* , -> [] () new delete
new[] delete[]
5. Restrictions on Operator Overloading
• Overloading restrictions
– Precedence of an operator cannot be changed
– Associativity of an operator cannot be changed
– Arity (number of operands) cannot be changed
• Unary operators remain unary, and binary operators remain binary
• Operators &, *, + and - each have unary and binary versions
• Unary and binary versions can be overloaded separately
• No new operators can be created
– Use only existing operators
• No overloading operators for built-in types
– Cannot change how two integers are added
– Produces a syntax error
6. Operator Functions as Class Members
vs. as friend Functions
• Member vs non-member
– Operator functions can be member or non-member functions
– When overloading ( ), [ ], -> or any of the assignment
operators, must use a member function
• Operator functions as member functions
– Leftmost operand must be an object (or reference to an object)
of the class
• If left operand of a different type, operator function must be a non-
member function
• Operator functions as non-member functions
– Must be friends if needs to access private or protected
members
– Enable the operator to be commutative
7. Overloading Stream-Insertion and
Stream-Extraction Operators
• Overloaded << and >> operators
– Overloaded to perform input/output for user-
defined types
– Left operand of types ostream & and istream
&
– Must be a non-member function because left
operand is not an object of the class
– Must be a friend function to access private data
members
8. 1 // Fig. 8.3: fig08_03.cpp
2 // Overloading the stream-insertion and
3 // stream-extraction operators.
4 #include <iostream>
5
6 using std::cout;
7 using std::cin;
8 using std::endl;
9 using std::ostream;
10 using std::istream;
11
12 #include <iomanip>
13
14 using std::setw;
15
16 class PhoneNumber {
17 friend ostream &operator<<( ostream&, const PhoneNumber & );
18 friend istream &operator>>( istream&, PhoneNumber & );
19
20 private:
21 char areaCode[ 4 ]; // 3-digit area code and null
22 char exchange[ 4 ]; // 3-digit exchange and null
23 char line[ 5 ]; // 4-digit line and null
24 };
25
26 // Overloaded stream-insertion operator (cannot be
27 // a member function if we would like to invoke it with
28 // cout << somePhoneNumber;).
29 ostream &operator<<( ostream &output, const PhoneNumber &num )
30 {
9. 31 output << "(" << num.areaCode << ") "
32 << num.exchange << "-" << num.line;
33 return output; // enables cout << a << b << c;
34 }
35
36 istream &operator>>( istream &input, PhoneNumber &num )
37 {
38 input.ignore(); // skip (
39 input >> setw( 4 ) >> num.areaCode; // input area code
40 input.ignore( 2 ); // skip ) and space
41 input >> setw( 4 ) >> num.exchange; // input exchange
42 input.ignore(); // skip dash (-)
43 input >> setw( 5 ) >> num.line; // input line
44 return input; // enables cin >> a >> b >> c;
45 }
46
47 int main()
48 {
49 PhoneNumber phone; // create object phone
50
51 cout << "Enter phone number in the form (123) 456-7890:n";
52
53 // cin >> phone invokes operator>> function by
54 // issuing the call operator>>( cin, phone ).
55 cin >> phone;
56
57 // cout << phone invokes operator<< function by
58 // issuing the call operator<<( cout, phone ).
59 cout << "The phone number entered was: " << phone << endl;
60 return 0;
61 }
10. Program Output
Enter phone number in the form (123) 456-7890:
(800) 555-1212
The phone number entered was: (800) 555-1212
11. Overloading Unary Operators
• Overloading unary operators
– Can be overloaded with no arguments or one argument
– Should usually be implemented as member functions
• Avoid friend functions and classes because they violate the
encapsulation of a class
– Example declaration as a member function:
class String {
public:
bool operator!() const;
...
};
12. Overloading Unary Operators
– Example declaration as a non-member function
class String {
friend bool operator!( const
String & )
...
}
13. Overloading Binary Operators
• Overloaded Binary operators
– Non-static member function, one argument
– Example:
class String {
public:
const String &operator+=(
const String & );
...
};
– y += z is equivalent to y.operator+=( z )
14. Overloading Binary Operators
– Non-member function, two arguments
– Example:
class String {
friend const String &operator+=(
String &, const String & );
...
};
– y += z is equivalent to operator+=( y, z )
15. Case Study: An Array class
• Implement an Array class with
– Range checking
– Array assignment
– Arrays that know their size
– Outputting/inputting entire arrays with << and >>
– Array comparisons with == and !=
16. 1 // Fig. 8.4: array1.h
2 // Simple class Array (for integers)
3 #ifndef ARRAY1_H
4 #define ARRAY1_H
5
6 #include <iostream>
7
8 using std::ostream;
9 using std::istream;
10
11 class Array {
12 friend ostream &operator<<( ostream &, const Array & );
13 friend istream &operator>>( istream &, Array & );
14 public:
15 Array( int = 10 ); // default constructor
16 Array( const Array & ); // copy constructor
17 ~Array(); // destructor
18 int getSize() const; // return size
19 const Array &operator=( const Array & ); // assign arrays
20 bool operator==( const Array & ) const; // compare equal
21
22 // Determine if two arrays are not equal and
23 // return true, otherwise return false (uses operator==).
24 bool operator!=( const Array &right ) const
25 { return ! ( *this == right ); }
26
27 int &operator[]( int ); // subscript operator
28 const int &operator[]( int ) const; // subscript operator
29 static int getArrayCount(); // Return count of
30 // arrays instantiated.
31 private:
32 int size; // size of the array
33 int *ptr; // pointer to first element of array
34 static int arrayCount; // # of Arrays instantiated
17. 35 };
36
37 #endif
38 // Fig 8.4: array1.cpp
39 // Member function definitions for class Array
40 #include <iostream>
41
42 using std::cout;
43 using std::cin;
44 using std::endl;
45
46 #include <iomanip>
47
48 using std::setw;
49
50 #include <cstdlib>
51 #include <cassert>
52 #include "array1.h"
53
54 // Initialize static data member at file scope
55 int Array::arrayCount = 0; // no objects yet
56
57 // Default constructor for class Array (default size 10)
58 Array::Array( int arraySize )
59 {
60 size = ( arraySize > 0 ? arraySize : 10 );
61 ptr = new int[ size ]; // create space for array
62 assert( ptr != 0 ); // terminate if memory not allocated
63 ++arrayCount; // count one more object
64
65 for ( int i = 0; i < size; i++ )
66 ptr[ i ] = 0; // initialize array
18. 67 }
68
69 // Copy constructor for class Array
70 // must receive a reference to prevent infinite recursion
71 Array::Array( const Array &init ) : size( init.size )
72 {
73 ptr = new int[ size ]; // create space for array
74 assert( ptr != 0 ); // terminate if memory not allocated
75 ++arrayCount; // count one more object
76
77 for ( int i = 0; i < size; i++ )
78 ptr[ i ] = init.ptr[ i ]; // copy init into object
79 }
80
81 // Destructor for class Array
82 Array::~Array()
83 {
84 delete [] ptr; // reclaim space for array
85 --arrayCount; // one fewer object
86 }
87
88 // Get the size of the array
89 int Array::getSize() const { return size; }
90
91 // Overloaded assignment operator
92 // const return avoids: ( a1 = a2 ) = a3
93 const Array &Array::operator=( const Array &right )
94 {
95 if ( &right != this ) { // check for self-assignment
96
97 // for arrays of different sizes, deallocate original
98 // left side array, then allocate new left side array.
99 if ( size != right.size ) {
100 delete [] ptr; // reclaim space
19. 101 size = right.size; // resize this object
102 ptr = new int[ size ]; // create space for array copy
103 assert( ptr != 0 ); // terminate if not allocated
104 }
105
106 for ( int i = 0; i < size; i++ )
107 ptr[ i ] = right.ptr[ i ]; // copy array into object
108 }
109
110 return *this; // enables x = y = z;
111}
112
113// Determine if two arrays are equal and
114// return true, otherwise return false.
115bool Array::operator==( const Array &right ) const
116{
117 if ( size != right.size )
118 return false; // arrays of different sizes
119
120 for ( int i = 0; i < size; i++ )
121 if ( ptr[ i ] != right.ptr[ i ] )
122 return false; // arrays are not equal
123
124 return true; // arrays are equal
125}
126
127// Overloaded subscript operator for non-const Arrays
128// reference return creates an lvalue
129int &Array::operator[]( int subscript )
130{
131 // check for subscript out of range error
132 assert( 0 <= subscript && subscript < size );
20. 133
134 return ptr[ subscript ]; // reference return
135}
136
137// Overloaded subscript operator for const Arrays
138// const reference return creates an rvalue
139const int &Array::operator[]( int subscript ) const
140{
141 // check for subscript out of range error
142 assert( 0 <= subscript && subscript < size );
143
144 return ptr[ subscript ]; // const reference return
145}
146
147// Return the number of Array objects instantiated
148// static functions cannot be const
149int Array::getArrayCount() { return arrayCount; }
150
151// Overloaded input operator for class Array;
152// inputs values for entire array.
153istream &operator>>( istream &input, Array &a )
154{
155 for ( int i = 0; i < a.size; i++ )
156 input >> a.ptr[ i ];
157
158 return input; // enables cin >> x >> y;
159}
160
161// Overloaded output operator for class Array
162ostream &operator<<( ostream &output, const Array &a )
163{
21. 164 int i;
165
166 for ( i = 0; i < a.size; i++ ) {
167 output << setw( 12 ) << a.ptr[ i ];
168
169 if ( ( i + 1 ) % 4 == 0 ) // 4 numbers per row of output
170 output << endl;
171 }
172
173 if ( i % 4 != 0 )
174 output << endl;
175
176 return output; // enables cout << x << y;
177}
178// Fig. 8.4: fig08_04.cpp
179// Driver for simple class Array
180#include <iostream>
181
182using std::cout;
183using std::cin;
184using std::endl;
185
186#include "array1.h"
187
188int main()
189{
190 // no objects yet
191 cout << "# of arrays instantiated = "
192 << Array::getArrayCount() << 'n';
193
# of arrays instantiated = 0
22. 194 // create two arrays and print Array count
195 Array integers1( 7 ), integers2;
196 cout << "# of arrays instantiated = "
197 << Array::getArrayCount() << "nn";
198
199 // print integers1 size and contents
200 cout << "Size of array integers1 is "
201 << integers1.getSize()
202 << "nArray after initialization:n"
203 << integers1 << 'n';
204
205 // print integers2 size and contents
206 cout << "Size of array integers2 is "
207 << integers2.getSize()
208 << "nArray after initialization:n"
209 << integers2 << 'n';
210
211 // input and print integers1 and integers2
212 cout << "Input 17 integers:n";
213 cin >> integers1 >> integers2;
214 cout << "After input, the arrays contain:n"
215 << "integers1:n" << integers1
216 << "integers2:n" << integers2 << 'n';
217
218 // use overloaded inequality (!=) operator
219 cout << "Evaluating: integers1 != integers2n";
220 if ( integers1 != integers2 )
221 cout << "They are not equaln";
222
223 // create array integers3 using integers1 as an
224 // initializer; print size and contents
225 Array integers3( integers1 );
226
23. 227 cout << "nSize of array integers3 is "
228 << integers3.getSize()
229 << "nArray after initialization:n"
230 << integers3 << 'n';
231
232 // use overloaded assignment (=) operator
233 cout << "Assigning integers2 to integers1:n";
234 integers1 = integers2;
235 cout << "integers1:n" << integers1
236 << "integers2:n" << integers2 << 'n';
237
238 // use overloaded equality (==) operator
239 cout << "Evaluating: integers1 == integers2n";
240 if ( integers1 == integers2 )
241 cout << "They are equalnn";
242
243 // use overloaded subscript operator to create rvalue
244 cout << "integers1[5] is " << integers1[ 5 ] << 'n';
245
246 // use overloaded subscript operator to create lvalue
247 cout << "Assigning 1000 to integers1[5]n";
248 integers1[ 5 ] = 1000;
249 cout << "integers1:n" << integers1 << 'n';
250
251 // attempt to use out of range subscript
252 cout << "Attempt to assign 1000 to integers1[15]" << endl;
253 integers1[ 15 ] = 1000; // ERROR: out of range
254
255 return 0;
256}
24. # of arrays instantiated = 0
# of arrays instantiated = 2
Size of array integers1 is 7
Array after initialization:
0 0 0 0
0 0 0
Size of array integers2 is 10
Array after initialization:
0 0 0 0
0 0 0 0
0 0
Input 17 integers:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
After input, the arrays contain:
integers1:
1 2 3 4
5 6 7
integers2:
8 9 10 11
12 13 14 15
16 17
Evaluating: integers1 != integers2
They are not equal
Size of array integers3 is 7
Array after initialization:
1 2 3 4
5 6 7
25. Evaluating: integers1 == integers2
They are equal
integers1[5] is 13
Assigning 1000 to integers1[5]
integers1:
8 9 10 11
12 1000 14 15
16 17
Attempt to assign 1000 to integers1[15]
Assertion failed: 0 <= subscript && subscript < size, file Array1.cpp,
line 95 abnormal program termination
Assigning integers2 to integers1:
integers1:
8 9 10 11
12 13 14 15
16 17
integers2:
8 9 10 11
12 13 14 15
16 17
26. Converting between Types
• Cast operator
– Forces conversions among built-in types
– Specifies conversions between user defined and built-in
types
– Conversion operator must be a non-static member
function
– Cannot be a friend function
– Do not specify return type
• Return type is the type to which the object is being converted
– For user-defined class A
A::operator char *() const;
• Declares an overloaded cast operator function for creating a char
* out of an A object
27. Converting between Types
A::operator int() const;
• Declares an overloaded cast operator function for converting an
object of A into an integer
A::operator otherClass() const;
• Declares an overloaded cast operator function for converting an
object of A into an object of otherClass
• Compiler and casting
– Casting can prevent the need for overloading
– If an object s of user-defined class String appears in a
program where an ordinary char * is expected, such as
cout << s;
The compiler calls the overloaded cast operator function
operator char * to convert the object into a char * and
uses the resulting char * in the expression
28. Case Study: A String Class
• Build a class to handle strings
– Class string in standard library
• Conversion constructor
– Single-argument constructors that turn objects
of other types into class objects
32. 96 delete [] sPtr; // prevents memory leak
97 length = right.length; // new String length
98 setString( right.sPtr ); // call utility function
99 }
100 else
101 cout << "Attempted assignment of a String to itselfn";
102
103 return *this; // enables cascaded assignments
104}
105
106// Concatenate right operand to this object and
107// store in this object.
108const String &String::operator+=( const String &right )
109{
110 char *tempPtr = sPtr; // hold to be able to delete
111 length += right.length; // new String length
112 sPtr = new char[ length + 1 ]; // create space
113 assert( sPtr != 0 ); // terminate if memory not allocated
114 strcpy( sPtr, tempPtr ); // left part of new String
115 strcat( sPtr, right.sPtr ); // right part of new String
116 delete [] tempPtr; // reclaim old space
117 return *this; // enables cascaded calls
118}
119
120// Is this String empty?
121bool String::operator!() const { return length == 0; }
122
123// Is this String equal to right String?
124bool String::operator==( const String &right ) const
125 { return strcmp( sPtr, right.sPtr ) == 0; }
126
127// Is this String less than right String?
33. 128bool String::operator<( const String &right ) const
129 { return strcmp( sPtr, right.sPtr ) < 0; }
130
131// Return a reference to a character in a String as an lvalue.
132char &String::operator[]( int subscript )
133{
134 // First test for subscript out of range
135 assert( subscript >= 0 && subscript < length );
136
137 return sPtr[ subscript ]; // creates lvalue
138}
139
140// Return a reference to a character in a String as an rvalue.
141const char &String::operator[]( int subscript ) const
142{
143 // First test for subscript out of range
144 assert( subscript >= 0 && subscript < length );
145
146 return sPtr[ subscript ]; // creates rvalue
147}
148
149// Return a substring beginning at index and
150// of length subLength
151String String::operator()( int index, int subLength )
152{
153 // ensure index is in range and substring length >= 0
154 assert( index >= 0 && index < length && subLength >= 0 );
155
156 // determine length of substring
157 int len;
158
Notice the overloaded
function call operator.
34. 159 if ( ( subLength == 0 ) || ( index + subLength > length ) )
160 len = length - index;
161 else
162 len = subLength;
163
164 // allocate temporary array for substring and
165 // terminating null character
166 char *tempPtr = new char[ len + 1 ];
167 assert( tempPtr != 0 ); // ensure space allocated
168
169 // copy substring into char array and terminate string
170 strncpy( tempPtr, &sPtr[ index ], len );
171 tempPtr[ len ] = '0';
172
173 // Create temporary String object containing the substring
174 String tempString( tempPtr );
175 delete [] tempPtr; // delete the temporary array
176
177 return tempString; // return copy of the temporary String
178}
179
180// Return string length
181int String::getLength() const { return length; }
182
183// Utility function to be called by constructors and
184// assignment operator.
185void String::setString( const char *string2 )
186{
187 sPtr = new char[ length + 1 ]; // allocate storage
188 assert( sPtr != 0 ); // terminate if memory not allocated
189 strcpy( sPtr, string2 ); // copy literal to object
190}
37. 254 cout << "s1 = " << s1 << "nn";
255
256 // test overloaded function call operator () for substring
257 cout << "The substring of s1 starting atn"
258 << "location 0 for 14 characters, s1(0, 14), is:n"
259 << s1( 0, 14 ) << "nn";
260
261 // test substring "to-end-of-String" option
262 cout << "The substring of s1 starting atn"
263 << "location 15, s1(15, 0), is: "
264 << s1( 15, 0 ) << "nn"; // 0 is "to end of string"
265
266 // test copy constructor
267 String *s4Ptr = new String( s1 );
268 cout << "*s4Ptr = " << *s4Ptr << "nn";
269
270 // test assignment (=) operator with self-assignment
271 cout << "assigning *s4Ptr to *s4Ptrn";
272 *s4Ptr = *s4Ptr; // test overloaded assignment
273 cout << "*s4Ptr = " << *s4Ptr << 'n';
274
275 // test destructor
276 delete s4Ptr;
277
278 // test using subscript operator to create lvalue
279 s1[ 0 ] = 'H';
280 s1[ 6 ] = 'B';
281 cout << "ns1 after s1[0] = 'H' and s1[6] = 'B' is: "
282 << s1 << "nn";
283
s1 = happy birthday to you
38. 284 // test subscript out of range
285 cout << "Attempt to assign 'd' to s1[30] yields:" << endl;
286 s1[ 30 ] = 'd'; // ERROR: subscript out of range
287
288 return 0;
289}
Conversion constructor: happy
Conversion constructor: birthday
Conversion constructor:
s1 is "happy"; s2 is " birthday"; s3 is ""
The results of comparing s2 and s1:
s2 == s1 yields false
s2 != s1 yields true
s2 > s1 yields false
s2 < s1 yields true
s2 >= s1 yields false
s2 <= s1 yields true
Testing !s3:
s3 is empty; assigning s1 to s3;
operator= called
s3 is "happy"
s1 += s2 yields s1 = happy birthday
s1 += " to you" yields
Conversion constructor: to you
Destructor: to you
s1 = happy birthday to you
Attempt to assign 'd' to s1[30] yields:
Assertion failed: subscript >= 0 && subscript <
length, file string1.cpp, line 82
Abnormal program termination
39. Program Output
Conversion constructor: happy birthday
Copy constructor: happy birthday
Destructor: happy birthday
The substring of s1 starting at
location 0 for 14 characters, s1(0, 14), is:
happy birthday
Destructor: happy birthday
Conversion constructor: to you
Copy constructor: to you
Destructor: to you
The substring of s1 starting at
location 15, s1(15, 0), is: to you
Destructor: to you
Copy constructor: happy birthday to you
*s4Ptr = happy birthday to you
assigning *s4Ptr to *s4Ptr
operator= called
Attempted assignment of a String to itself
*s4Ptr = happy birthday to you
Destructor: happy birthday to you
s1 after s1[0] = 'H' and s1[6] = 'B' is: Happy Birthday to you
Attempt to assign 'd' to s1[30] yields:
Assertion failed: subscript >= 0 && subscript < length, file
string1.cpp, line 82
Abnormal program termination
40. Overloading ++ and --
• Pre/post incrementing/decrementing operators
– Allowed to be overloaded
– Distinguishing between pre and post operators
• prefix versions are overloaded the same as other prefix
unary operators
d1.operator++(); // for ++d1
• convention adopted that when compiler sees
postincrementing expression, it will generate the
member-function call
d1.operator++( 0 ); // for d1++
•0 is a dummy value to make the argument list of
operator++ distinguishable from the argument list
for ++operator
41. Case Study: A Date Class
• The following example creates a Date class
with
– An overloaded increment operator to change
the day, month and year
– An overloaded += operator
– A function to test for leap years
– A function to determine if a day is last day of a
month
42. 1 // Fig. 8.6: date1.h
2 // Definition of class Date
3 #ifndef DATE1_H
4 #define DATE1_H
5 #include <iostream>
6
7 using std::ostream;
8
9 class Date {
10 friend ostream &operator<<( ostream &, const Date & );
11
12 public:
13 Date( int m = 1, int d = 1, int y = 1900 ); // constructor
14 void setDate( int, int, int ); // set the date
15 Date &operator++(); // preincrement operator
16 Date operator++( int ); // postincrement operator
17 const Date &operator+=( int ); // add days, modify object
18 bool leapYear( int ) const; // is this a leap year?
19 bool endOfMonth( int ) const; // is this end of month?
20
21 private:
22 int month;
23 int day;
24 int year;
25
26 static const int days[]; // array of days per month
27 void helpIncrement(); // utility function
28 };
29
30 #endif
43. 31 // Fig. 8.6: date1.cpp
32 // Member function definitions for Date class
33 #include <iostream>
34 #include "date1.h"
35
36 // Initialize static member at file scope;
37 // one class-wide copy.
38 const int Date::days[] = { 0, 31, 28, 31, 30, 31, 30,
39 31, 31, 30, 31, 30, 31 };
40
41 // Date constructor
42 Date::Date( int m, int d, int y ) { setDate( m, d, y ); }
43
44 // Set the date
45 void Date::setDate( int mm, int dd, int yy )
46 {
47 month = ( mm >= 1 && mm <= 12 ) ? mm : 1;
48 year = ( yy >= 1900 && yy <= 2100 ) ? yy : 1900;
49
50 // test for a leap year
51 if ( month == 2 && leapYear( year ) )
52 day = ( dd >= 1 && dd <= 29 ) ? dd : 1;
53 else
54 day = ( dd >= 1 && dd <= days[ month ] ) ? dd : 1;
55 }
56
57 // Preincrement operator overloaded as a member function.
58 Date &Date::operator++()
59 {
60 helpIncrement();
61 return *this; // reference return to create an lvalue
62 }
63
44. 64 // Postincrement operator overloaded as a member function.
65 // Note that the dummy integer parameter does not have a
66 // parameter name.
67 Date Date::operator++( int )
68 {
69 Date temp = *this;
70 helpIncrement();
71
72 // return non-incremented, saved, temporary object
73 return temp; // value return; not a reference return
74 }
75
76 // Add a specific number of days to a date
77 const Date &Date::operator+=( int additionalDays )
78 {
79 for ( int i = 0; i < additionalDays; i++ )
80 helpIncrement();
81
82 return *this; // enables cascading
83 }
84
85 // If the year is a leap year, return true;
86 // otherwise, return false
87 bool Date::leapYear( int y ) const
88 {
89 if ( y % 400 == 0 || ( y % 100 != 0 && y % 4 == 0 ) )
90 return true; // a leap year
91 else
92 return false; // not a leap year
93 }
94
95 // Determine if the day is the end of the month
96 bool Date::endOfMonth( int d ) const
97 {
postincrement operator
has a dummy int value.
45. 98 if ( month == 2 && leapYear( year ) )
99 return d == 29; // last day of Feb. in leap year
100 else
101 return d == days[ month ];
102}
103
104// Function to help increment the date
105void Date::helpIncrement()
106{
107 if ( endOfMonth( day ) && month == 12 ) { // end year
108 day = 1;
109 month = 1;
110 ++year;
111 }
112 else if ( endOfMonth( day ) ) { // end month
113 day = 1;
114 ++month;
115 }
116 else // not end of month or year; increment day
117 ++day;
118}
119
120// Overloaded output operator
121ostream &operator<<( ostream &output, const Date &d )
122{
123 static char *monthName[ 13 ] = { "", "January",
124 "February", "March", "April", "May", "June",
125 "July", "August", "September", "October",
126 "November", "December" };
127
128 output << monthName[ d.month ] << ' '
129 << d.day << ", " << d.year;
130
131 return output; // enables cascading
132}
47. d1 is January 1, 1900
d2 is December 27, 1992
d3 is January 1, 1900
d2 += 7 is January 3, 1993
d3 is February 28, 1992
++d3 is February 29, 1992
Testing the preincrement operator:
d4 is March 18, 1969
++d4 is March 19, 1969
d4 is March 19, 1969
Testing the postincrement operator:
d4 is March 19, 1969
d4++ is March 19, 1969
d4 is March 20, 1969