cplusplus-primer-5ed-notes/part_i/chap05_statements.md

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
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 of cath clauses.
  • 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 in stdexcept 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:

  1. exception header: most general exception class.
    1. Only show exception occur, no additional info
  2. stdexcept header: some general-purpose exception classes, as shown in table
  3. new header: bad_alloc exception type, detailed in Chapter 12.1.2
  4. type_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 ???