第12章

  1. 非成员友元函数对类成员的访问权限与成员函数相同。
  2. 将友元关系授予一个模板,所以该模板的每一次实例化都是类的友元;这包括使用不同且不相关类型的同一模板的实例化。
  3. 作为成员函数实现的二元操作符总是作用于操作符的左操作数,且对该对象不允许进行类型转换。对于右操作数,则可以根据成员操作符参数的类型进行转换。这导致 x + 2 和 2 + x 这样的表达式之间存在不对称性,后者无法由成员函数处理,因为 2(int 类型)本身没有成员函数。
  4. 插入运算符(如 <<)的第一个操作数始终是流对象,而不是要打印的对象。如果作为成员函数,必须定义在流类上,而流是标准库的一部分,用户无法扩展标准库类来包含用户自定义类型。
  5. 虽然细节较为复杂,但主要区别在于:调用非模板函数时会考虑用户自定义的转换(隐式构造函数和转换运算符);而对于模板函数,参数类型必须(几乎)完全匹配,不允许用户自定义的转换。
  6. 在类模板中定义一个就地友元函数(即在声明后立即给出定义),会导致该模板的每一次实例化都在外围作用域中,生成一个具有给定名称和参数类型的非模板、非成员函数。