Team LiB
Previous Section Next Section

4.6. The Member Access Operators

 

The dot (§ 1.5.2, p. 23) and arrow (§ 3.4.1, p. 110) operators provide for member access. The dot operator fetches a member from an object of class type; arrow is defined so that ptr->mem is a synonym for (*ptr).mem:

 

 

string s1 = "a string", *p = &s1;
auto n = s1.size(); // run the size member of the string s1
n = (*p).size();    // run size on the object to which p points
n = p->size();      // equivalent to (*p).size()

 

Because dereference has a lower precedence than dot, we must parenthesize the dereference subexpression. If we omit the parentheses, this code means something quite different:

 

 

// run the size member of p, then dereference the result!
*p.size();    // error: p is a pointer and has no member named size

 

This expression attempts to fetch the size member of the object p. However, p is a pointer, which has no members; this code will not compile.

 

The arrow operator requires a pointer operand and yields an lvalue. The dot operator yields an lvalue if the object from which the member is fetched is an lvalue; otherwise the result is an rvalue.

 

Exercises Section 4.6

 

Exercise 4.20: Assuming that iter is a vector<string>::iterator, indicate which, if any, of the following expressions are legal. Explain the behavior of the legal expressions and why those that aren’t legal are in error.

(a) *iter++;

 

(b) (*iter)++;

 

(c) *iter.empty()

 

(d) iter->empty();

 

(e) ++*iter;

 

(f) iter++->empty();

 

 
Team LiB
Previous Section Next Section