C++和Java的重载

  1. C++swap函数
  2. Java的add函数
  3. C++运算符重载
  4. 一般运算符重载
  5. 关系运算符
  6. 逻辑运算符
  7. 单目运算符
  8. 自增自减运算符
  9. 位运算符
  10. 赋值运算符
  11. 内存运算符
  12. 特殊运算符

C++中可以进行函数重载和运算符重载;Java中则只能进行方法的重载.

C++函数重载与Java的方法重载一样,是需要满足参数数目参数类型两个因素中一个以上不同.

例如:

C++swap函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

void swap(int& a,int& b) {
int t = a;
a = b;
b = t;
}

void swap(float& a,float& b) {
float t = a;
a = b;
b = t;
}

void swap(char& a,char& b) {
char t = a;
a = b;
b = t;
}

Java的add函数

1
2
3
4
5
6
7
8
9
10
public static int add(int a,int b) {
return a + b;
}

public static double add(double a,double b) {
return a + b;
}

public static String add(String a,String b) { return a + b;
}

C++运算符重载

注意事项:

一般运算符重载

在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,就是在类里面定义了一个与操作符相关的函数。友元函数因为没有this指针,所以形参会多一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

class Test {
int data;
public:
Test(int d):data(d) {}
Test operator+(Test&);
Test operator-(Test&);
Test operator*(Test&);
Test operator/(Test&);
Test operator%(Test&);
friend Test operator+(Test&,Test&);
friend Test operator-(Test&,Test&);
friend Test operator*(Test&,Test&);
friend Test operator/(Test&,Test&);
friend Test operator%(Test&,Test&);
}

Test Test::operator+(Test& a) {
return Test(data + a.data);
}
Test Test::operator-(Test& a) {
return Test(data - a.data);
}
Test Test::operator*(Test& a) {
return Test(data * a.data);
}
Test Test::operator/(Test& a) {
return Test(data / a.data);
}
Test Test::operator%(Test& a) {
return Test(data % a.data);
}

Test operator+(Test& a1,Test& a2) {
return Test(a1.data + a2.data);
}
Test operator-(Test& a1,Test& a2) {
return Test(a1.data - a2.data);
}
Test operator*(Test& a1,Test& a2) {
return Test(a1.data * a2.data);
}
Test operator/(Test& a1,Test& a2) {
return Test(a1.data / a2.data);
}
Test operator%(Test& a1,Test& a2) {
return Test(a1.data % a2.data);
}

关系运算符

函数体类似上述一般运算符的重载.所以只写出成员函数声明.

1
2
3
4
5
6
bool operator== (const Test&);
bool operator!= (const Test&);
bool operator< (const Test&);
bool operator<= (const Test&);
bool operator> (const Test&);
bool operator>= (const Test&);

逻辑运算符

1
2
3
bool operator|| (const Test&);
bool operator&& (const Test&);
bool operator! ();

单目运算符

1
2
3
4
Test& operator+ ();
Test& operator- ();
Test& operator& ();
Test& operator* ();

自增自减运算符

1
2
Test& operator++();
Test& operator--(int);//前置后置都可重载

位运算符

1
2
3
4
5
6
Test operator| (const Test&);
Test operator& (const Test&);
Test operator^ (const Test&);
Test operator<< (const Test&);
Test operator>> (const Test&);
Test operator~ (const Test&);

赋值运算符

1
2
3
4
5
6
7
8
9
10
Test& operator+= (const Test&);
Test& operator-= (const Test&);
Test& operator*= (const Test&);
Test& operator/= (const Test&);
Test& operator%= (const Test&);
Test& operator&= (const Test&);
Test& operator|= (const Test&);
Test& operator^= (const Test&);
Test& operator<<= (const Test&);
Test& operator>>= (const Test&);

内存运算符

1
2
3
4
5
6
void* operator new(size_t size);
void* operator new(size_t size,int i);
void* operator new[](size_t size);
void operator delete(void* p);
void operator delete(void* p,int i,int j);
void operator delete[](void* p);

特殊运算符

以上的运算符都可以用成员函数或者友元函数,但下面提到的运算符的重载之能是成员函数.

1
2
3
4
5
6
7
8
9
10
11
12
Test& operator= (const Test&);
char operator[] (int i);
const char* opertaor() ();
T operator -> ();

operator char* () const;
operator const char() const;
operator short int() const;
operator long long () const;
.
.
.

流运算符只能用友元函数重载.

1
2
friend inline ostream& operator<< (ostream&,Test&);
friend inline istream& operator>> (istream&,Test&);
script>