3.9 KiB
3.9 KiB
Chapter 5. Statements
5.1 Simple Statements
5.2 Statement Scope
5.3 Conditional Statements
5.4 Iterative Statements
5.4.1 The while
Statement
5.4.2 Traditional for Statement
5.4.3 Range for
Statement (C++11)
range for statement: simpler for
statement that used to iterate through elements of an container
Syntax:
for (declaration : expression)
statement
- where expression must be a sequence
- declaration defines a variable. Every element in sequence must be converted into declaration
- Hence,
auto
type specifier is best
- Hence,
vector<int> v = {0,1,2,3,4,5,6,7,8,9};
// range variable must be a reference so we can write to the elements
for (auto &r : v) // for each element in v, as we want to change r, we declare it as reference
r *= 2; // double the value of each element in v
which equivalent to
for (auto beg = v.begin(), end = v.end(); beg != end; ++beg) {
auto &r = *beg; // r must be a reference so we can change the element
r *= 2; // double the value of each element in v
}
Q: Why cannot use a range for
to add elements to a vector
A: In a range for
, the value of end()
is cached. If add elements to sequence, the value of end()
will be invalidated.
5.4.4 The do while Statement
5.5 Jump Statements
5.5.1 The break
Statement
5.5.2 The continue
Statement
5.5.3 The goto
Statement
???
5.6 try
Blocks and Exception Handling
- throw expressions: the part which the detecting part uses to indicate that it encountered sth run-time error
- try blocks: code blocks are run, from where exception may occue
- starts with
try
and ends with multiple catch clause - Exceptions thrown from code executed inside a
try
block are handled by one ofcath
clauses.
- starts with
catch
clauses are also called exception handler
5.6.1 A throw
Expression
Syntax of throw
Expression: keyword throw
followed by an expression.
e.g. convert following to code snippet with throw
Sales_item item1, item2;
cin >> item1 >> item2;
// first check that item1 and item2 represent the same book
if (item1.isbn() == item2.isbn()) {
cout << item1 + item2 << endl;
return 0; // indicate success
} else {
cerr << "Data must refer to same ISBN"
<< endl;
return -1; // indicate failure
}
equivalent with throw expression. Rewrite the test to throw an exception rather than returning an error indicator
// first check that the data are for the same item
if (item1.isbn() != item2.isbn())
throw runtime_error("Data must refer to same ISBN");
// if we're still here, the ISBNs are the same
cout << item1 + item2 << endl;
- Throwing an exception terminates the current function and transfers control to a handler that know how to handle this error.
runtime_error
is one of std library exception types, defined instdexcept
header.
5.6.2 The try
Block
general form of try
block
try {
program-statements
} catch (exception-declaration) {
handler-statements
} catch (exception-declaration) {
handler-statements
} // . . .
???
5.6.3 Standard Exceptions
Exception classed defined in std library, defined in 4 headers:
exception
header: most general exception class.- Only show exception occur, no additional info
stdexcept
header: some general-purpose exception classes, as shown in tablenew
header:bad_alloc
exception type, detailed in Chapter 12.1.2type_info
header:bad_cast
exception type, detailed in Chapter 19.2
std exception classes in <stdexcept> |
Description |
---|---|
exception |
Most general kind of problem |
runtime_error |
Problem detected only at runtime |
range_error |
Run-time error: ??? |
??? Not finished ???