c++Primer——第十四章:重载运算与类型转换

1、对于一个运算符函数来说,它或者是类的成员或者至少含有一个类类型的参数。

2、不能被重载的运算符

::        .*        .        ?:

而通常情况下,不应该被重载的运算符

,        &        &&        ||

3、当我们把运算符定义成成员函数时。它的左侧运算对象必须是运算符所属类的一个对象

// 假定 + 是string的成员
string s = "world";
string t = s + "!";		//正确 相当于 s.operator+("!")
string u = "hi" + s;   //错误  相当于 "hi".operator+(s), "hi"是个const char*,一种内置类型 没有成员

4、输入输出运算符必须是非成员函数

5、前置递增、递减运算符返回递增递减后的对象引用。后置递增、递减运算符返回递增递减前的原值,注意返回的是值不是引用。

6、对箭头运算符重载的限定

我们在重载大多数运算符时,可以令它们完成任何我们想要完成的事情。而箭头(->)运算符则不然,在重载->运算符时可以改变的是从哪个对象获取成员,而箭头获取成员这一事实则永远不变。且重载的箭头运算符必须返回类的指针或者返回一些定义了箭头运算符的某个类的对象。

7、lambda

当我们编写了一个lambda表达式后,编译器将该表达式翻译成一个未命名类的未命名对象。在lambda表达式产生的类中含有一个重载的函数调用运算符,但是不含默认构造函数、赋值运算符及默认析构函数,是否含有默认的拷贝、移动构造函数则通常要视捕获的数据成员类型而定。

8、可调用对象与std::function

9、类型转换运算符

  • 编译器一次只能执行一个用户定义的类型转换
  • 类型转换运算符是隐式执行的
  • 类型转换函数不能指定返回类型,但实际上每个类型转换函数都会返回一个对应类型的值
class SmallInt
{
public:
	SmallInt(int i = 0) :val(i)
	{
		if (i < 0 || i>255)
			throw std::out_of_range("Bad SmallInt value");
	}
	//类型转换运算符
	operator int() const{ return val; }
private:
	std::size_t val;
};

void test()
{
	SmallInt si;
	si = 4; // 先将4隐式转换为SmallInt 再调用SmallInt::operator=
	si + 3; // 先将si隐式的转换为int 再执行+
}

10、显示的类型转换运算符(explicit限定)

当类型转换运算符是显示的时,必须通过显示的强制类型转换(如:static_cast)才能使用,但也有例外:如果表达式被用作条件,编译器会将显示的类型转换自动应用于它,即显示的类型转换被隐式的执行。

上一篇:C++类和内存管理【C++ primer 笔记】


下一篇:【C++ Primer Plus 编程练习】——第7章