0% found this document useful (0 votes)
5 views52 pages

SOW - C++ - CSO - Chapter - 14 - 9e - Tagged

Chapter 14 of 'Starting Out with C++' discusses advanced class concepts including instance and static members, friend functions and classes, memberwise assignment, copy constructors, operator overloading, object conversion, and aggregation. It explains how static variables are shared among class instances, the role of friend functions in accessing private members, and the importance of copy constructors for managing dynamic memory. Additionally, it covers operator overloading for custom behavior and the use of rvalue references for efficient memory management.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
5 views52 pages

SOW - C++ - CSO - Chapter - 14 - 9e - Tagged

Chapter 14 of 'Starting Out with C++' discusses advanced class concepts including instance and static members, friend functions and classes, memberwise assignment, copy constructors, operator overloading, object conversion, and aggregation. It explains how static variables are shared among class instances, the role of friend functions in accessing private members, and the importance of copy constructors for managing dynamic memory. Additionally, it covers operator overloading for custom behavior and the use of rvalue references for efficient memory management.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 52

STARTING OUT WITH C++

9th Edition

Chapter 14
More about Classes

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.1

Instance and Static Members

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Instance and Static Members

• instance variable: a member variable in a class.


Each object has its own copy.

• static variable: one variable shared among


all objects of a class

• static member function: can be used to


access static member variable; can be called
before any objects are defined

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
static member variable
Contents of Tree.h
1 // Tree class Static member declared here.
2 class Tree
3 {
4 private:
5 static int objectCount; // Static member variable.
6 public:
7 // Constructor
8 Tree()
9 { objectCount++; }
10
11 // Accessor function for objectCount
12 int getObjectCount() const
13 { return objectCount; } Static member defined here.
14 };
15
16 // Definition of the static member variable, written
17 // outside the class.
18 int Tree::objectCount = 0;

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Three Instances of the Tree Class, But Only
One objectCount Variable

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
static member function

• Declared with static before return type:


static int getObjectCount() const
{ return objectCount; }
• Static member functions can only access static
member data
• Can be called independent of objects:
int num = Tree::getObjectCount();

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Modified Version of Tree.h
1 // Tree class
2 class Tree
3 {
4 private:
5 static int objectCount; // Static member
variable.
6 public:
7 // Constructor
8 Tree()
9 { objectCount++; }
10
11 // Accessor function for objectCount
12 static int getObjectCount() const
13 { return objectCount; }
14 };
15
16 // Definition of the static member variable,
written
17 // outside the class.
18 int Tree::objectCount = 0;

Now we can call the function like this:


cout << "There are " << Tree::getObjectCount()
<< " objects.\n";

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.2

Friends of Classes

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Friends of Classes

• Friend: a function or class that is not a member


of a class, but has access to private members
of the class
• A friend function can be a stand-alone function
or a member function of another class
• It is declared a friend of a class with friend
keyword in the function prototype

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
friend Function Declarations
• Stand-alone function:
friend void setAVal(intVal&, int);
// declares setAVal function to be
// a friend of this class
• Member function of another class:
friend void SomeClass::setNum(int num)
// setNum function from SomeClass
// class is a friend of this class

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
friend Class Declarations
• Class as a friend of a class:
class FriendClass
{
...
};
class NewClass
{
public:
friend class FriendClass; // declares
// entire class FriendClass as a friend
// of this class

};
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.3

Memberwise Assignment

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Memberwise Assignment

• Can use = to assign one object to another, or to


initialize an object with an object’s data
• Copies member to member. e.g.,
instance2 = instance1; means:
copy all member values from instance1 and assign
to the corresponding member variables of
instance2
• Use at initialization:
Rectangle r2 = r1;

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.4

Copy Constructors

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copy Constructors

• Special constructor used when a newly created


object is initialized to the data of another object
of same class

• Default copy constructor copies field-to-field

• Default copy constructor works fine in many


cases

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copy Constructors

Problem: what if object contains a pointer?


class SomeClass
{ public:
SomeClass(int val = 0)
{value=new int; *value = val;}
int getVal();
void setVal(int);
private:
int *value;
}

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copy Constructors

What we get using memberwise copy with


objects containing dynamic memory:
SomeClass object1(5);
SomeClass object2 = object1;
object2.setVal(13);
cout << object1.getVal(); // also 13

13
object1 object2

value value

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Programmer-Defined Copy Constructor

• Allows us to solve problem with objects


containing pointers:
SomeClass::SomeClass(const SomeClass &obj)
{
value = new int;
*value = obj.value;
}
• Copy constructor takes a reference parameter to
an object of the class

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Programmer-Defined Copy Constructor

• Each object now points to separate dynamic


memory:
SomeClass object1(5);
SomeClass object2 = object1;
object2.setVal(13);
cout << object1.getVal(); // still 5

5 13
object1 object2

value value

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Programmer-Defined Copy Constructor

• Since copy constructor has a reference to the


object it is copying from,
SomeClass::SomeClass(SomeClass &obj)
it can modify that object.
• To prevent this from happening, make the
object parameter const:
SomeClass::SomeClass
(const SomeClass
&obj)

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.5

Operator Overloading

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Operator Overloading
• Operators such as =, +, and others can be redefined
when used with objects of a class
• The name of the function for the overloaded operator is
operator followed by the operator symbol, e.g.,
operator+ to overload the + operator, and
operator= to overload the = operator
• Prototype for the overloaded operator goes in the
declaration of the class that is overloading it
• Overloaded operator function definition goes with other
member functions

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
The this Pointer
• this: predefined pointer available to a class’s
member functions

• Always points to the instance (object) of the


class whose function is being called

• Is passed as a hidden argument to all non-static


member functions

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
The this Pointer
• Example, student1 and student2 are both
StudentTestScores objects.

• The following statement causes the getStudentName


member function to operate on student1:

cout << student1.getStudentName() << endl;

• When getStudentName is operating on student1,


the this pointer is pointing to student1.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
The this Pointer
• Likewise, the following statement causes the
getStudentName member function to operate on
student2:

cout << student2.getStudentName() <<


endl;

• When getStudentName is operating on student2,


the this pointer is pointing to student2.

• The this pointer always points to the object that is


being used to call the member function.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Operator Overloading

• Prototype:
void operator=(const SomeClass &rval)

parameter for
return function object on right
type name side of operator

• Operator is called via object on left side

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Invoking an Overloaded Operator

• Operator can be invoked as a member function:


object1.operator=(object2);
• It can also be used in more conventional
manner:
object1 = object2;

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Returning a Value

• Overloaded operator can return a value


class Point2d
{
private:
int x, y;

...
public:
double operator-(const point2d &right)
{ return sqrt(pow((x-right.x),2)
+ pow((y-right.y),2)); }
};
Point2d point1(2,2), point2(4,4);
// Compute and display distance between 2 points.
cout << point2 – point1 << endl; // displays 2.82843

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Returning a Value

• Return type the same as the left operand


supports notation like:
object1 = object2 = object3;
• Function declared as follows:
const SomeClass operator=(const
someClass &rval)
• In function, include as last statement:
return *this;

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Notes on
Overloaded Operators

• Can change meaning of an operator


• Cannot change the number of operands of the
operator
• Only certain operators can be overloaded.
Cannot overload the following operators:
?: . .* :: sizeof

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Overloading Types of Operators
• ++, -- operators overloaded differently for
prefix vs. postfix notation
• Overloaded relational operators should return a
bool value
• Overloaded stream operators >>, << must
return reference to istream, ostream objects
and take istream, ostream objects as
parameters

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Overloaded [] Operator
• Can create classes that behave like arrays,
provide bounds-checking on subscripts
• Must consider constructor, destructor
• Overloaded [] returns a reference to object,
not an object itself

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.6

Object Conversion

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Object Conversion
• Type of an object can be converted to another type
• Automatically done for built-in data types
• Must write an operator function to perform conversion
• To convert an FeetInches object to an int:
FeetInches::operator int()
{return feet;}
• Assuming distance is a FeetInches object, allows
statements like:
int d = distance;

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.7

Aggregation

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Aggregation

• Aggregation: a class is a member of a class


• Supports the modeling of ‘has a’ relationship
between classes – enclosing class ‘has a’
enclosed class
• Same notation as for structures within
structures

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Aggregation
class StudentInfo
{
private:
string firstName, LastName;
string address, city, state, zip;
...
};
class Student
{
private:
StudentInfo personalData;
...
};

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
See the Instructor, TextBook, and
Course classes in Chapter 14.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
14.10

Rvalue References and Move Semantics

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Temporary Values
• Consider this code:
int x;
x = 2 * 6;

• When the expression 2 * 6 is evaluated, the value 12


is stored in memory as a temporary value.

• The temporary value is then stored in the x variable.

• Then, the temporary value is discarded.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Temporary Values
• Consider this: The square function is called,
and the value 5 is passed as an
1 int square(int a) argument.
2 {
3 return a * a; The square function calculates 5
4 }
* 5 and stores the result, 25, as a
5
6 int main() temporary value.
7 {
8 int x = 0; The temporary value is copied
9 (assigned) to the variable x.
10 x = square(5);
11 cout << x << endl; The temporary value is no longer
12 return 0; needed, so the system discards it.
13 }

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Lvalues and Rvalues

• Two types of values stored in memory during


the execution of a program:

– Values that persist beyond the statement that created


them, and have names that make them accessible to
other statements in the program. In C++, these
values are called lvalues.

– Values that are temporary, and cannot be accessed


beyond the statement that created them. In C++,
these values are called rvalues.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Rvalue References
• Rvalue Reference: a reference variable that can refer only to
temporary objects that would otherwise have no name.

• Rvalue references are used to write move constructors and


move assignment operators (otherwise known as move
semantics).

• Anytime you write a class with a pointer or reference to a


piece of data outside the class, you should implement move
semantics.

• Move semantics increase the performance of these types of


classes.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Move Assignment vs. Copy Assignment
• From the Person class, in Chapter 14:

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Move Constructor vs. Copy Constructor
• From the Person class, in Chapter 14:

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved
Copyright

This work is protected by United States copyright laws and is provided solely
for the use of instructions in teaching their courses and assessing student
learning. dissemination or sale of any part of this work (including on the
World Wide Web) will destroy the integrity of the work and is not permit-
ted. The work and materials from it should never be made available to
students except by instructors using the accompanying text in their
classes. All recipients of this work are expected to abide by these
restrictions and to honor the intended pedagogical purposes and the needs of
other instructors who rely on these materials.

Copyright © 2019, 2016, 2012 Pearson Education, Inc. All Rights Reserved

You might also like