C++ 与 Java 最不同的地方在我看来可能就是操作符重载了,Java 对于自定义类的加减法操作可能需要通过使用自定义的 add() 和 sub() 方法来实现,而在 C++ 中,可以通过简单的操作符重载来赋予相同的符号以不同的意义(操作符重载也是一种函数重载)。这是 C++ 这个语言给予开发者的一个极大的权利与特性,让开发者能够根据自己的设想来实现不同的操作符,但是其也有一定的坏处,是否能够很好地使用这种特性考验的还是开发者的水平。
2 能够重载的符号
带来了较为方便快捷的操作,在 C++ 中,能够被重载的操作符有以下几种:
Expression
As member function
As non-member function
Example
@a
(a).operator@ ( )
operator@ (a)
std::cin calls std::cin.operator!()
a@b
(a).operator@ (b)
operator@ (a, b)
std::cout << 42 calls std::cout.operator << (42)
a=b
(a).operator= (b)
cannot be non-member
Given std::string s;, s = "abc"; calls s.operator=("abc")
a(b…)
(a).operator()(b…)
cannot be non-member
Given std::random_device r;, auto n = r(); calls r.operator()()
a[b]
(a).operator
cannot be non-member
Given std::map<int, int> m;, m[1] = 2; calls m.operator[](1)
a->
(a).operator-> ( )
cannot be non-member
Given std::unique_ptr<S> p;, p->bar() calls p.operator->()
a@
(a).operator@ (0)
operator@ (a, 0)
Given std::vector<int>::iterator i;, i++ calls i.operator++(0)
in this table, @ is a placeholder representing all matching operators: all prefix operators in @a, all postfix operators other than -> in a@, all infix operators other than = in a@b
void* Student::operatornew(size_t size) { std::cout << "Overloading new opeartor with size: " << size << std::endl; void* p = ::operatornew(size); // malloc will also work fine // void* p = malloc(size); return p; }