Skip to main content
Contents
Dark Mode Prev Up Next Scratch ActiveCode Profile
\(
\newcommand{\lt}{<}
\newcommand{\gt}{>}
\newcommand{\amp}{&}
\definecolor{fillinmathshade}{gray}{0.9}
\newcommand{\fillinmath}[1]{\mathchoice{\colorbox{fillinmathshade}{$\displaystyle \phantom{\,#1\,}$}}{\colorbox{fillinmathshade}{$\textstyle \phantom{\,#1\,}$}}{\colorbox{fillinmathshade}{$\scriptstyle \phantom{\,#1\,}$}}{\colorbox{fillinmathshade}{$\scriptscriptstyle\phantom{\,#1\,}$}}}
\)
Exercises 14.12 Multiple Choice Exercises
1.
What is one use of data encapsulation?
To wrap up a sequence of code in a function.
This is one use of functional encapsulation, not data encapsulation.
To hide implementation details from users or programmers that donβt need to know them.
Data encapsulation is the separation of the implementation of data from the interface of a structure.
To keep all data in a container like a vector.
This is not related to encapsulation.
To make all data public and accessible to everyone.
Data encapsulation is based on the idea that each structure should prevent unrestricted access to internal representation.
2.
Which of the following are accessor functions?
struct Student {
private:
int id;
public:
string name;
int year;
int getID() { return id; }
int setID(int i) { id = i; }
void printInfo() { cout << "Student: " << name << ", " << year; }
};
This is the Student
constructor.
This is a βgetterβ function, which is an accessor function since it accesses and returns a private member variable.
This is a βsetterβ function, which is an accessor function since it accesses and modifies a private member variable.
This function does not access a private member variable.
3.
Which of the following are true?
By default,
struct
member variables are private.
By default, struct
member variables are public. This is the main difference between a class
and a struct
.
By default,
class
member variables are private.
This is different from a struct
, whose member variables default to be public.
Private member variables can be accessed within the class.
Private member variables are private to things outside of the class.
Public member variables can be accessed within the class.
Public member variables can be accessed anywhere, including within the class.
4.
What should replace the question marks in the code below? Use accessor functions.
class rightTriangle {
int base;
int height;
public:
int getBase() { return base; }
int getHeight() { return height; }
double calculateHypotenuse() {
???
}
};
return sqrt(pow(getBase, 2) + pow(getHeight, 2));
We use the Pythagorean Theorem and getBase
and getHeight
to calculate and return the hypotenuse.
return pow(getBase, 2) + pow(getHeight, 2);
Use the Pythagorean Theorem!
return sqrt(pow(base, 2) + pow(height, 2));
Although this would work, we want to use accessor functions.
cout << sqrt(pow(getBase, 2) + pow(getHeight, 2));
Take a look at the return type of calculateHypotenuse
.
5.
What is wrong with the code below?
class Plane {
int flightNumber;
string model;
string origin;
string destination;
public:
void printInfo() {
cout << "Flight " << flightNumber << " (" << model
<< ") from " << origin << " to " << destination << endl;
}
};
int main() {
Plane p;
p.flightNumber = 1846;
p.model = "Boeing 787";
p.origin = "Los Angeles";
p.destination = "Detroit";
p.printInfo();
}
The
Plane
class is missing the keyword
private:
.
By default, class
member variables are private, so we donβt need to explicitly write private:
.
printInfo
cannot access
Plane
βs private member variables.
The private member variables of Plane
are only inaccessible to those outside of the class.
We cannot assign the private member variables of
p
in
main
.
We are trying to access the private member variables of a Plane
object outside of the Plane
class.
We cannot call
printInfo
in
main
.
printInfo
is a public member function, so we are allowed to call it in main
.
6.
What is the output of the code below?
class Temp {
private:
double fahrenheit;
double celsius;
bool is_fahrenheit;
bool is_celsius;
public:
double getFahrenheit() { return fahrenheit; }
double getCelsius() { return celsius; }
void setFahrenheit(double f) { fahrenheit = f; is_fahrenheit = true; is_celsius = false; }
void setCelsius(double c) { celsius = c; is_celsius = true; is_fahrenheit = false; }
void printTemp() {
if (is_fahrenheit) {
cout << "It is " << getFahrenheit() << " degrees Fahrenheit" << endl;
}
else {
cout << "It is " << getCelsius() << " degrees Celsius" << endl;
}
}
};
int main() {
Temp t;
t.setFahrenheit (125);
t.setCelsius (30);
t.printTemp();
}
It is 125 degrees Fahrenheit
Since we called setCelsius
last, is_celsius
is true
and is_fahrenheit
is false.
It is 30 degrees Fahrenheit
Since we called setCelsius
last, is_celsius
is true
and is_fahrenheit
is false.
It is 125 degrees Celsius
What was the value that we set celsius
equal to?
Since we called setCelsius
last, we print out 30 degrees Celsius.
7.
Which of the following are true about invariants?
Data encapsulation helps enforce invariants by preventing unrestricted access to private member variables.
By limiting access to private member variables, data encapsulation can control what values these variables can take on.
If an invariant is true at the start of a function, it can be false at the end.
If an invariant is true at the start of a function, it must also be true at the end.
An invariant cannot be false in the middle of a function, even if it is true at the start and the end.
An invariant can be false in the middle of a function, and it is sometimes unavoidable.
Maintaining invariants can reduce the number of bugs in a program.
By maintaining invariants, you can guarantee that all values are what they should be.
8.
Take a look at the class definition of
Date
. What are some invariants we must maintain?
class Date {
private:
int day;
int month;
int year;
bool is_birthday;
string message;
public:
Date(int hour, int d, int m, int y, bool b, string m) {
day = d;
month = m;
year = y;
is_birthday = b;
message = m;
}
};
day
must be between 1 and 31.
There is a maximum of 31 possible days in a month.
month
must be between 1 and 12.
There are 12 months in a year.
is_birthday
must be
true
or
false
.
This isnβt an invariant since is_birthday
being a bool
isnβt really a condition.
year
must be greater than 2000.
year
can be less than 2000, so this isnβt a correct invariant to maintain.
9.
Take a look at the function below. What are its preconditions and postconditions?
int calculateRectangleArea(int length, int width) {
return length * width;
}
Precondition:
length
and
width
must both be positive.
A rectangle canβt have negative dimensions, or dimensions of 0.
Precondition:
length
must be greater than
width
.
A rectangle can be wider than it is long.
Postcondition:
calculateRectangleArea
must return a positive number.
Since length
and width
must both be positive, their product muast also be positive.
Postcondition:
calculateRectangleArea
must return a nonnegative number.
calculateRectangleArea
cannot return 0, which is a nonnegative number but not a valid area.
10.
What are private functions and what do they do?
Functions that return the type
private
.
There is no return type of private
.
Functions that are used to retrieve and modify private member variables.
These are called accessor functions, not private functions.
Functions written outside of a class that accesses a classβs private member variables.
No function outside of a class can access that classβs private member variables.
Functions that are declared private which cannot be invoked by client programs.
We would make functions private if we wanted to restrict their usage outside of the class.
You have attempted
of
activities on this page.