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