做者:LogMsegmentfault
本文原载于 https://segmentfault.com/u/logm/articles,不容许转载~安全
对象切割(slicing):当派生类对象以 by-value 方式传递参数并被视为基类对象,基类的拷贝构造函数在构造时会把派生类特有的性质抹除。
"引用"在编译器底层的实现就是指针(指针的本质是int类型的变量),因此在如下场景,"引用"并不必定比pass-by-value快:a. C++内置类型;b. STL的迭代器(底层实现是指针);c. 函数对象(底层实现是指针)。
做者的说法有必定道理,但我不彻底赞成做者的观点:cookie
class WebBrowser { public: ... void clearCache(); void clearHistory(); void clearCookies(); ... } //假如如今要写一个函数clearEverything(),做用是同时清理cache、history、cookies。 //使用member函数的状况 class WebBrowser { public: ... void clearEverything(); ... } void WebBrowser::clearEverything() { clearCache(); clearHistory(); clearCookies(); } //使用non-member函数的状况 void clearBrower(WebBrowser& wb) { wb.clearCache(); wb.clearHistory(); wb.clearCookies(); }
//第一种状况:乘法函数为member函数 class Rational { public: ... Rational(int numerator, int denominator); Rational(int num); //这个构造函数使得该类支持从int到Rational的类型转换。若是前面加explict则说明不支持隐式类型转换仅支持显式转换,如今没加,支持隐式转换 const Rational operator* (const Rational& rhs) const; } //使用 Rational lhs(1, 9); Rational result; result = lhs * 2; //ok,2不是Rational类型,但能够发生隐式类型转换 result = 2 * lhs; //bad,2不是Rational类型
//第二种状况:乘法函数为non-member函数 class Rational { public: ... Rational(int numerator, int denominator); Rational(int num); //这个构造函数使得该类支持从int到Rational的类型转换 } const Rational operator* (const Rational& lhs, const Rational& rhs) { ... } //使用 Rational lhs(1, 9); Rational result; result = lhs * 2; //ok,2不是Rational类型,但能够发生隐式类型转换 result = 2 * lhs; //ok,2不是Rational类型,但能够发生隐式类型转换
std::swap
的典型实现以下代码,这个实现比较平淡。对于某些类,写一个模板特化的swap执行效率会更高。做者介绍了怎么本身写std::swap
的特化版本,这边就不展开了。namespace std { //平淡的std::swap实现 template<typename T> void swap(T& a, T& b) { T temp(a); a = b; b = temp; } }