Ngôn ngữ lập trình C++ - Chương 8: Operator Overloading
Outline
8.1 Introduction
8.2 Fundamentals of Operator Overloading
8.3 Restrictions on Operator Overloading
8.4 Operator Functions as Class Members vs. as friend Functions
8.5 Overloading Stream-Insertion and Stream-Extraction Operators
8.6 Overloading Unary Operators
8.7 Overloading Binary Operators
8.8 Case Study: Array Class
8.9 Converting between Types
8.10 Case Study: A StringClass
8.11 Overloading ++and --8.12 Case Study: A DateClass
8.13 Standard Library Classes stringand vector
>= > <= <
– Phép gán – Assignment operator =
– Phép nối – Concatenation (overloaded +=)
© 2003 Prentice Hall, Inc. All rights reserved.
66
8.13 Standard Library Classes string and
vector
• Class string
– hàm xâu con substr
• s1.substr(0, 14);
– bắt đầu từ vị trí 0, lấy 14 ký tự
• s1.substr(15)
– xâu con bắt đầu từ vị trí 15
– Overloaded []
• truy nhập 1 ký tự
• Không kiểm tra tính hợp lệ của chỉ số (No range checking)
– at function
• s1.at(10)
• Ký tự tại chỉ số 10
• có kiểm tra biên (bounds checking)
– Sẽ dừng chương trình nếu chỉ số không hợp lệ (chi tiết tại
chương 13)
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
67
fig08_13.cpp
(1 of 4)
1 // Fig. 8.13: fig08_13.cpp
2 // Standard library string class test program.
3 #include
4
5 using std::cout;
6 using std::endl;
7
8 #include
9
10 using std::string;
11
12 int main()
13 {
14 string s1( "happy" );
15 string s2( " birthday" );
16 string s3;
17
18 // test overloaded equality and relational operators
19 cout << "s1 is \"" << s1 << "\"; s2 is \"" << s2
20 << "\"; s3 is \"" << s3 << '\"'
21 << "\n\nThe results of comparing s2 and s1:"
22 << "\ns2 == s1 yields "
23 << ( s2 == s1 ? "true" : "false" )
24 << "\ns2 != s1 yields "
25 << ( s2 != s1 ? "true" : "false" )
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
68
fig08_13.cpp
(2 of 4)
26 s1 yields "
27 s1 ? "true" : "false" )
28 << "\ns2 < s1 yields "
29 << ( s2 < s1 ? "true" : "false" )
30 = s1 yields "
31 = s1 ? "true" : "false" )
32 << "\ns2 <= s1 yields "
33 << ( s2 <= s1 ? "true" : "false" );
34
35 // test string member function empty
36 cout << "\n\nTesting s3.empty():\n";
37
38 if ( s3.empty() ) {
39 cout << "s3 is empty; assigning s1 to s3;\n";
40 s3 = s1; // assign s1 to s3
41 cout << "s3 is \"" << s3 << "\"";
42 }
43
44 // test overloaded string concatenation operator
45 cout << "\n\ns1 += s2 yields s1 = ";
46 s1 += s2; // test overloaded concatenation
47 cout << s1;
48
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
69
fig08_13.cpp
(3 of 4)
49 // test overloaded string concatenation operator
50 // with C-style string
51 cout << "\n\ns1 += \" to you\" yields\n";
52 s1 += " to you";
53 cout << "s1 = " << s1 << "\n\n";
54
55 // test string member function substr
56 cout << "The substring of s1 starting at location 0 for\n"
57 << "14 characters, s1.substr(0, 14), is:\n"
58 << s1.substr( 0, 14 ) << "\n\n";
59
60 // test substr "to-end-of-string" option
61 cout << "The substring of s1 starting at\n"
62 << "location 15, s1.substr(15), is:\n"
63 << s1.substr( 15 ) << '\n';
64
65 // test copy constructor
66 string *s4Ptr = new string( s1 );
67 cout << "\n*s4Ptr = " << *s4Ptr << "\n\n";
68
69 // test assignment (=) operator with self-assignment
70 cout << "assigning *s4Ptr to *s4Ptr\n";
71 *s4Ptr = *s4Ptr;
72 cout << "*s4Ptr = " << *s4Ptr << '\n';
73
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
70
fig08_13.cpp
(4 of 4)
74 // test destructor
75 delete s4Ptr;
76
77 // test using subscript operator to create lvalue
78 s1[ 0 ] = 'H';
79 s1[ 6 ] = 'B';
80 cout << "\ns1 after s1[0] = 'H' and s1[6] = 'B' is: "
81 << s1 << "\n\n";
82
83 // test subscript out of range with string member function "at"
84 cout << "Attempt to assign 'd' to s1.at( 30 ) yields:" << endl;
85 s1.at( 30 ) = 'd'; // ERROR: subscript out of range
86
87 return 0;
88
89 } // end main
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
71
fig08_13.cpp
output (1 of 2)
s1 is "happy"; s2 is " birthday"; s3 is ""
The results of comparing s2 and s1:
s2 == s1 yields false
s2 != s1 yields true
s2 > s1 yields false
s2 < s1 yields true
s2 >= s1 yields false
s2 <= s1 yields true
Testing s3.empty():
s3 is empty; assigning s1 to s3;
s3 is "happy"
s1 += s2 yields s1 = happy birthday
s1 += " to you" yields
s1 = happy birthday to you
The substring of s1 starting at location 0 for
14 characters, s1.substr(0, 14), is:
happy birthday
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
72
fig08_13.cpp
output (2 of 2)
The substring of s1 starting at
location 15, s1.substr(15), is:
to you
*s4Ptr = happy birthday to you
assigning *s4Ptr to *s4Ptr
*s4Ptr = happy birthday to you
s1 after s1[0] = 'H' and s1[6] = 'B' is: Happy Birthday to you
Attempt to assign 'd' to s1.at( 30 ) yields:
abnormal program termination
© 2003 Prentice Hall, Inc. All rights reserved.
73
8.13 Standard Library Classes string and
vector
• Class vector
– Header , namespace std
– Lưu trữ kiểu dữ liệu bất kỳ
• vector myArray(10)
– Function size ( myArray.size() )
– Overloaded []
• lấy phần tử theo chỉ số, myArray[3]
– Overloaded !=, ==, and =
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
74
fig08_14.cpp
(1 of 5)
1 // Fig. 8.14: fig08_14.cpp
2 // Demonstrating standard library class vector.
3 #include
4
5 using std::cout;
6 using std::cin;
7 using std::endl;
8
9 #include
10
11 using std::setw;
12
13 #include
14
15 using std::vector;
16
17 void outputVector( const vector & );
18 void inputVector( vector & );
19
20 int main()
21 {
22 vector integers1( 7 ); // 7-element vector
23 vector integers2( 10 ); // 10-element vector
24
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
75
fig08_14.cpp
(2 of 5)
25 // print integers1 size and contents
26 cout << "Size of vector integers1 is "
27 << integers1.size()
28 << "\nvector after initialization:\n";
29 outputVector( integers1 );
30
31 // print integers2 size and contents
32 cout << "\nSize of vector integers2 is "
33 << integers2.size()
34 << "\nvector after initialization:\n";
35 outputVector( integers2 );
36
37 // input and print integers1 and integers2
38 cout << "\nInput 17 integers:\n";
39 inputVector( integers1 );
40 inputVector( integers2 );
41
42 cout << "\nAfter input, the vectors contain:\n"
43 << "integers1:\n";
44 outputVector( integers1 );
45 cout << "integers2:\n";
46 outputVector( integers2 );
47
48 // use overloaded inequality (!=) operator
49 cout << "\nEvaluating: integers1 != integers2\n";
50
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
76
fig08_14.cpp
(3 of 5)
51 if ( integers1 != integers2 )
52 cout << "integers1 and integers2 are not equal\n";
53
54 // create vector integers3 using integers1 as an
55 // initializer; print size and contents
56 vector integers3( integers1 ); // copy constructor
57
58 cout << "\nSize of vector integers3 is "
59 << integers3.size()
60 << "\nvector after initialization:\n";
61 outputVector( integers3 );
62
63
64 // use overloaded assignment (=) operator
65 cout << "\nAssigning integers2 to integers1:\n";
66 integers1 = integers2;
67
68 cout << "integers1:\n";
69 outputVector( integers1 );
70 cout << "integers2:\n";
71 outputVector( integers1 );
72
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
77
fig08_14.cpp
(4 of 5)
73 // use overloaded equality (==) operator
74 cout << "\nEvaluating: integers1 == integers2\n";
75
76 if ( integers1 == integers2 )
77 cout << "integers1 and integers2 are equal\n";
78
79 // use overloaded subscript operator to create rvalue
80 cout << "\nintegers1[5] is " << integers1[ 5 ];
81
82 // use overloaded subscript operator to create lvalue
83 cout << "\n\nAssigning 1000 to integers1[5]\n";
84 integers1[ 5 ] = 1000;
85 cout << "integers1:\n";
86 outputVector( integers1 );
87
88 // attempt to use out of range subscript
89 cout << "\nAttempt to assign 1000 to integers1.at( 15 )"
90 << endl;
91 integers1.at( 15 ) = 1000; // ERROR: out of range
92
93 return 0;
94
95 } // end main
96
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
78
fig08_14.cpp
(5 of 5)
97 // output vector contents
98 void outputVector( const vector &array )
99 {
100 for ( int i = 0; i < array.size(); i++ ) {
101 cout << setw( 12 ) << array[ i ];
102
103 if ( ( i + 1 ) % 4 == 0 ) // 4 numbers per row of output
104 cout << endl;
105
106 } // end for
107
108 if ( i % 4 != 0 )
109 cout << endl;
110
111 } // end function outputVector
112
113 // input vector contents
114 void inputVector( vector &array )
115 {
116 for ( int i = 0; i < array.size(); i++ )
117 cin >> array[ i ];
118
119 } // end function inputVector
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
79
fig08_14.cpp
output (1 of 2)
Size of vector integers1 is 7
vector after initialization:
0 0 0 0
0 0 0
Size of vector integers2 is 10
vector after initialization:
0 0 0 0
0 0 0 0
0 0
Input 17 integers:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
After input, the vectors contain:
integers1:
1 2 3 4
5 6 7
integers2:
8 9 10 11
12 13 14 15
16 17
Evaluating: integers1 != integers2
integers1 and integers2 are not equal
© 2003 Prentice Hall, Inc.
All rights reserved.
Outline
80
fig08_14.cpp
output (2 of 2)
Size of vector integers3 is 7
vector after initialization:
1 2 3 4
5 6 7
Assigning integers2 to integers1:
integers1:
8 9 10 11
12 13 14 15
16 17
integers2:
8 9 10 11
12 13 14 15
16 17
Evaluating: integers1 == integers2
integers1 and integers2 are equal
integers1[5] is 13
Assigning 1000 to integers1[5]
integers1:
8 9 10 11
12 1000 14 15
16 17
Attempt to assign 1000 to integers1.at( 15 )
abnormal program termination
File đính kèm:
Ngôn ngữ lập trình C++ - Chương 8 Operator Overloading.pdf

