DS & OOP 課程的前半學期筆記。
Class Operator Overloading cppreference
Expression As member function As non-member function Example @a (a).operator@ ( ) operator@ (a) !std::cin calls std::cina@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)
Assignment 1
2
3
4
5
6
// copy assignment
T & operator = ( const T & other ) { ... }
// move assignment
T & operator = ( T && other ) noexcept { ... }
// copy assignment (copy-and-swap idiom)
T & T :: operator = ( T other ) noexcept { ... }
Increment and decrement 1
2
3
4
5
6
7
8
9
10
struct X {
// ++X, prefix increment
T & operator ++ () { ... }
// X++, postfix increment
X operator ++ ( int ) { ... }
// --X, prefix decrement
X & operator -- () { ... }
// X--, postfix decrement
X operator -- ( int ) { ... }
};
Comparison operators 1
2
3
4
5
6
7
8
struct T {
int a , b , c ;
friend bool operator < ( const T & l , const T & r ) {
return std :: tie ( l . a , l . c , l . b )
< std :: tie ( r . a , r . c , r . b );
// keep the same order
}
};
Static Members declaration 和 definition 分開。cppreference
1
2
3
4
5
6
7
8
9
10
class C {
private :
static int I ; // declaration, can be incomplete type
inline static int J = 2 ; // since c++17
static const int K = 3 ;
static const int L ;
// constexpr static int M; // CE require initializer
};
int C :: I = 1 ; // definition, need complete type
const int C :: L = 4 ;
Friend Declaration Non-member functions can access priavate & protected members. cppreference
1
2
3
4
5
6
7
8
9
class C {
private :
int x ;
public :
C ( int _x ) : x ( _x ) {}
friend std :: ostream & operator << ( std :: ostream & out , const C it ) {
return out << it . x ;
}
};
Inheritance Base Class Derived Classprotected same as private, but derived class can access. cppreference not inherited by defaultconstructor destructor assignment operatorforce inherent, derived class variable will copy move assignment will call base copt assignment 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
#include <bits/stdc++.h>
using namespace std ;
class B {
public :
int x , y ;
B () : x ( 0x1111 ) {};
B ( int i ) : x ( i ) {};
B & operator = ( const B & r ) {
cout << "=B " << r . x << endl ;
this -> x = 0x5555 ;
return * this ;
}
};
class D : public B {
public :
int x ;
D () : x ( 0x2222 ) {};
// y(0x3333) // CE
using B :: B ;
using B :: operator = ;
/*
D& operator=(const D& r) {
cout << "=D " << r.x << endl;
return *this;
}
//*/
};
int main () {
cout << hex ;
D d ;
assert ( 0x2222 == d . x );
assert ( 0x1111 == d . B :: x );
D e ( 0x4444 );
// e.x unknown
assert ( 0x4444 == e . B :: x );
e = d ;
assert ( 0x5555 == e . B :: x );
d = move ( e );
assert ( 0x5555 == d . B :: x );
return 0 ;
}