Bài giảng Ngôn ngữ Lập trình C++ - Chương 8: Operator Overloading

pdf 80 trang phuongnguyen 2431
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Ngôn ngữ Lập trình C++ - Chương 8: Operator Overloading", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_ngon_ngu_lap_trinh_c_chuong_8_operator_overloading.pdf

Nội dung text: Bài giảng Ngôn ngữ Lập trình C++ - Chương 8: Operator Overloading

  1. 1 Chapter 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 String Class 8.11 Overloading ++ and 8.12 Case Study: A Date Class 8.13 Standard Library Classes string and vector © 2003 Prentice Hall, Inc. All rights reserved.
  2. 2 8.1 Introduction •Sử dụng các toán tử với các đối tượng (operator overloading) – đối với một số lớp, sử dụng toán tử trong sáng hơn sử dụng các lời gọi hàm object2 = object1.add(object2); object2 = object2 + object1; – toán tử cảm ngữ cảnh (sensitive to context) Ví dụ • << – chèn vào dòng (Stream insertion), phép dịch trái nhị phân (bitwise left-shift) • + –thực hiện tính cộng cho nhiều kiểu dữ liệu (integers, floats, etc.) © 2003 Prentice Hall, Inc. All rights reserved.
  3. 3 8.2 Fundamentals of Operator Overloading •Các kiểu dữ liệu –Có sẵn (Built in) (int, char) hoặc kiểu người dùng (user- defined) –Có thể sử dụng các toán tử có sẵn cho các kiểu dữ liệu người dùng • Không thể tạo toán tử mới • Overloading operators –Tạo một hàm của lớp – Đặt tên hàm là operator tiếp theo là ký hiệu • Operator+ dành cho phép cộng + © 2003 Prentice Hall, Inc. All rights reserved.
  4. 4 8.2 Fundamentals of Operator Overloading •Sử dụng toán tử với một đối tượng –Nó phải được overloaded cho lớp đó • ngoại trừ: • phép gán, = – phép gán từng thành viên của đối tượng này cho đối tượng kia (Memberwise assignment between objects) • toán tử địa chỉ, & –trả về địa chỉ của đối tượng •cả hai đều có thể được overloaded • Overloading cho ký hiệu ngắn gọn object2 = object1.add(object2); object2 = object2 + object1; © 2003 Prentice Hall, Inc. All rights reserved.
  5. 5 8.3 Restrictions on Operator Overloading • Không thể thay đổi: –Hoạt động của các toán tử đối với các kiểu dữ liệu có sẵn •ví dụ., không thể thay đổi phép cộng số nguyên –Thứ tự ưu tiên của các toán tử – Quan hệ kết hợp - Associativity (left-to-right hoặc right-to- left) –Số lượng toán hạng (operand) • & là toán tử đơn, chỉ dành cho một toán hạng • Không thể tạo các toán tử mới • Các toán tử phải được overloaded một cách tường minh –Overload+ không có nghĩacả += cũng được overload © 2003 Prentice Hall, Inc. All rights reserved.
  6. 6 8.3 Restrictions on Operator Overloading Operators that can be overloaded + - * / % ^ & | ~ ! = += -= *= /= %= ^= &= |= > >>= = && || ++ ->* , -> [] () new delete new[] delete[] Operators that cannot be overloaded . .* :: ?: sizeof © 2003 Prentice Hall, Inc. All rights reserved.
  7. 7 8.4 Operator Functions As Class Members Vs. As Friend Functions • aa@bb Î aa.operator@(bb) hoặc operator@(aa,bb) • @aa Î aa.operator@( ) hoặc operator@(aa) • aa@ Î aa.operator@(int) hoặc operator@(aa,int) • Operator functions – Member functions •Sử dụng từ khóa this để ngầm lấy tham số – là toán hạng bên trái đối với các toán tử hai ngôi (ví dụ +) – là toán hạng duy nhất đối với các toán tử một ngôi • Toán tử và toán hạng bên trái nhất phải thuộc cùng lớp – Non member functions •Cần tham số cho cả hai toán hạng •Có thể lấy các đối tượng không thuộc lớp của toán tử •Phải là friend để truy nhập các dữ liệu private hoặc protected © 2003 Prentice Hall, Inc. All rights reserved.
  8. 8 8.4 Operator Functions As Class Members Vs. As Friend Functions • Các phép toán có tính giao hoán – phép + cần có tính giao hoán •cả “a + b” và “b + a” đều phải chạy được –giả sử ta có hai lớp khác nhau – Overloaded operator chỉ có thể là member function khi lớp của nó ở bên trái • HugeIntClass + long int –trường hợp kia, cần một non-member overload function • long int + HugeIntClass © 2003 Prentice Hall, Inc. All rights reserved.
  9. 9 8.5 Overloading Stream-Insertion and Stream-Extraction Operators • > – đã được overloaded để xử lý từng kiểu built-in –cũng có thể overload để xử lý kiểu dữ liệu người dùng • Overloaded > cần toán tử trái kiểu istream & –Vậy, cả hai phải là non-member function •Chương trình ví dụ – Class PhoneNumber •Lưu trữ một số điện thoại –In số điện thoại đã được định dạng tự động • (123) 456-7890 © 2003 Prentice Hall, Inc. All rights reserved.
  10. function prototype cho các hàm overload các toán 10 1 // Fig. 8.3: fig08_03.cpp tử >> và > object 18 friend ostream &operator >( istream&, PhoneNumber & ); 20 Biểu thức: cout << phone; 21 private: được hiểu là lời gọi hàm: 22 char areaCode[ 4 ]; // 3-digit area code and null operator<<(cout,phone); 23 char exchange[ 4 ]; // 3-digit exchange and null output là một tên khác cho 24 char line[ 5 ]; // 4-digit line and null cout. 25 26 }; // end class PhoneNumber 28 // overloaded stream-insertion operator; cannot be 29 // a member function if we would like to invoke it with 30 // cout << somePhoneNumber; 31 ostream &operator<<( ostream &output, const PhoneNumber &num ) 32 { cho phép g ọ i object thành chuỗi 33 output << "(" << num.areaCode << ") " cout << phone1 << phone2; 34 << num.exchange << "-" << num.line; tr ướ c h ế t g ọ i 35 operator<<(cout, phone1), 36 return output; // enables cout << a << b <<và trc;ả v ề cout . 37 © 2003 Prentice Hall, Inc. 38 } // end function operator<< ti ế p theo, cout <<All rightsphone2 reserved.chạy.
  11. 11 Outline ignore() bỏ qua một số ký tự input, số lượng được chỉ ra tại fig08_03.cpp tham số (mặc định là 1). (2 of 3) 40 // overloaded stream-extraction operator; cannot be 41 // a member function if we would like to invoke it with 42 // cin >> somePhoneNumber; 43 istream &operator>>( istream &input, PhoneNumber &num ) 44 { 45 input.ignore(); // skip ( 46 input >> setw( 4 ) >> num.areaCode; // input area code 47 input.ignore( 2 ); // skip ) and space 48 input >> setw( 4 ) >> num.exchange; // input exchange 49 input.ignore(); // skip dash (-) Stream manipulator setw 50 input >> setw( 5 ) >> num.line; // input line giới hạn số ký tự được đọc. 51 setw(4) cho phép đọc3 ký 52 return input; // enables cin >> a >> b >> c; tự, dành chỗ cho ký tự null. © 2003 Prentice Hall, Inc. All rights reserved.
  12. 12 53 Outline 54 } // end function operator>> 55 56 int main() fig08_03.cpp 57 { (3 of 3) 58 PhoneNumber phone; // create object phone 59 fig08_03.cpp 60 cout > phone invokes operator>> by implicitly issuing 63 // the non-member function call operator>>( cin, phone ) 64 cin >> phone; 65 66 cout << "The phone number entered was: " ; 67 68 // cout << phone invokes operator<< by implicitly issuing 69 // the non-member function call operator<<( cout, phone ) 70 cout << phone << endl; 71 72 return 0; 73 74 } // end main Enter phone number in the form (123) 456-7890: (800) 555-1212 © 2003 Prentice Hall, Inc. The phone number entered was: (800) 555-1212 All rights reserved.
  13. 13 8.6 Overloading Unary Operators • Overloading unary operators – Non-static member function, không cần tham số – Non-member function, một tham số • tham số phải là đối tượng hoặc tham chiếu đến đối tượng – Ghi nhớ, static function chỉ truy nhập static data •Ví dụ (8.10) – Overload ! để kiểm tra xâu ký tự có rỗng hay không –nếu là non-static member function, không cần tham số • !s trở thành s.operator!() class String { public: bool operator!() const; }; –nếu là non-member function, cần một tham số • s! trở thành operator!(s) class String { friend bool operator!( const String & ) } © 2003 Prentice Hall, Inc. All rights reserved.
  14. 14 8.7 Overloading Binary Operators •non-static member function, một tham số class String { public: const String &operator+=( const String & ); }; – y += z tương đương với y.operator+=( z ) • non-member function, hai tham số –tham số phải là đối tượng hoặc tham chiếu đến đối tượng class String { friend const String &operator+=( String &, const String & ); }; – y += z tương đương với operator+=( y, z ) © 2003 Prentice Hall, Inc. All rights reserved.
  15. 15 8.8 Case Study: Array class • Arrays in C++ – Không có kiểm tra khoảng – No range checking – Không thể so sánh == một cách có nghĩa – Không có phép gán mảng (tên mảng là const pointer) – không thể nhập/in cả mảng một lúc •mỗi lần một phần tử •Ví dụ: Cài đặt một lớp Array với – Range checking – Array assignment –mảng biết kích thước của mình – Output/input toàn bộ mảng bằng > –So sánh mảng với == và != © 2003 Prentice Hall, Inc. All rights reserved.
  16. 16 8.8 Case Study: Array class • Copy constructor – được dùng mỗi khi cần sao chép đối tượng •truyền bằng trị (trả về giá trị hoặc tham số) •khởi tạo một đối tượng bằng một bản sao của một đối tượng khác – Array newArray( oldArray ); – newArray là bản sao của oldArray – Prototype • Array( const Array & ); • Phải lấy tham biến –nếu không, tham số được truyền bằng giá trị – trình biên dịch sẽ cố tạo một bản sao bằng cách gọi copy constructor –lặp vô tận © 2003 Prentice Hall, Inc. All rights reserved.
  17. 17 1 // Fig. 8.4: array1.h Outline 2 // Array class for storing arrays of integers. 3 #ifndef ARRAY1_H 4 #define ARRAY1_H array1.h (1 of 2) 5 6 #include 7 8 using std::ostream; 9 using std::istream; Prototype for copy constructor. 10 11 class Array { 12 friend ostream &operator >( istream &, Array & ); 14 15 public: 16 Array( int = 10 ); // default constructor Hầu hết các toán tử được 17 Array( const Array & ); // copy constructor overloaded bằng member 18 ~Array(); // destructor function (trừ > phải 19 int getSize() const; // return size dùng non-member function). 20 21 // assignment operator 22 const Array &operator=( const Array & ); 23 24 // equality operator 25 bool operator==( const Array & ) const; © 2003 Prentice Hall, Inc. 26 All rights reserved.
  18. 18 Outline array1.h (2 of 2) 27 // inequality operator; returns opposite of == operator 28 bool operator!=( const Array &right ) const 29 { 30 return ! ( *this == right ); // invokes Array::operator== 31 Toán tử != chỉ cần trả về đảo của toán tử == . 32 } // end function operator!= V ậ y, ch ỉ c ầ n đị nh ngh ĩ a toán tử == 33 34 // subscript operator for non-const objects returns lvalue 35 int &operator[]( int ); 36 37 // subscript operator for const objects returns rvalue 38 const int &operator[]( int ) const; 39 40 private: 41 int size; // array size 42 int *ptr; // pointer to first element of array 43 44 }; // end class Array 45 46 #endif © 2003 Prentice Hall, Inc. All rights reserved.
  19. 19 1 // Fig 8.5: array1.cpp Outline 2 // Member function definitions for class Array 3 #include 4 array1.cpp (1 of 7) 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include 10 11 using std::setw; 12 13 #include // C++ standard "new" operator 14 15 #include // exit function prototype 16 17 #include "array1.h" // Array class definition 18 19 // default constructor for class Array (default size 10) 20 Array::Array( int arraySize ) 21 { 22 // validate arraySize 23 size = ( arraySize > 0 ? arraySize : 10 ); 24 25 ptr = new int[ size ]; // create space for array © 2003 Prentice Hall, Inc. 26 All rights reserved.
  20. 20 27 for ( int i = 0; i < size; i++ ) Outline 28 ptr[ i ] = 0; // initialize array 29 30 } // end Array default constructor array1.cpp (2 of 7) 31 32 // copy constructor for class Array; 33 // must receive a reference to prevent infinite recursion 34 Array::Array( const Array &arrayToCopy ) Ta phải khai báo một mảng số nguyên mới để các 35 : size( arrayToCopy.size ) đối tượng không chỉ đến cùng một vùng bộ nhớ. 36 { 37 ptr = new int[ size ]; // create space for array 38 39 for ( int i = 0; i < size; i++ ) 40 ptr[ i ] = arrayToCopy.ptr[ i ]; // copy into object 41 42 } // end Array copy constructor 43 44 // destructor for class Array 45 Array::~Array() 46 { 47 delete [] ptr; // reclaim array space 48 49 } // end destructor 50 © 2003 Prentice Hall, Inc. All rights reserved.
  21. 21 51 // return size of array Outline 52 int Array::getSize() const 53 { 54 return size; array1.cpp (3 of 7) 55 56 } // end function getSize 57 58 // overloaded assignment operator; 59 // const return avoids: ( a1 = a2 ) = a3 muốn tránh việc tự gán (self-assignment). 60 const Array &Array::operator=( const Array &right ) 61 { 62 if ( &right != this ) { // check for self-assignment 63 64 // for arrays of different sizes, deallocate original 65 // left-side array, then allocate new left-side array 66 if ( size != right.size ) { 67 delete [] ptr; // reclaim space 68 size = right.size; // resize this object 69 ptr = new int[ size ]; // create space for array copy 70 71 } // end inner if 72 73 for ( int i = 0; i < size; i++ ) 74 ptr[ i ] = right.ptr[ i ]; // copy array into object 75 © 2003 Prentice Hall, Inc. 76 } // end outer if All rights reserved.
  22. 22 77 Outline 78 return *this; // enables x = y = z, for example 79 80 } // end function operator= array1.cpp (4 of 7) 81 82 // determine if two arrays are equal and 83 // return true, otherwise return false 84 bool Array::operator==( const Array &right ) const 85 { 86 if ( size != right.size ) 87 return false; // arrays of different sizes 88 89 for ( int i = 0; i < size; i++ ) 90 91 if ( ptr[ i ] != right.ptr[ i ] ) 92 return false; // arrays are not equal 93 94 return true; // arrays are equal 95 96 } // end function operator== 97 © 2003 Prentice Hall, Inc. All rights reserved.
  23. 23 98 // overloaded subscript operator for non-const Arrays Outline 99 // reference return creates an lvalue 100 int &Array::operator[]( int subscript ) 101 { integers1[5]array1.cppgọi (5 of 7) 102 // check for subscript out of range error integers1.operator[]( 5 ) 103 if ( subscript = size ) { 104 cout ) kết 109 } // end if thúc chương trình. 110 111 return ptr[ subscript ]; // reference return 112 113 } // end function operator[] 114 © 2003 Prentice Hall, Inc. All rights reserved.
  24. 24 115 // overloaded subscript operator for const Arrays Outline 116 // const reference return creates an rvalue 117 const int &Array::operator[]( int subscript ) const 118 { array1.cpp (6 of 7) 119 // check for subscript out of range error 120 if ( subscript = size ) { 121 cout >( istream &input, Array &a ) 135 { 136 for ( int i = 0; i > a.ptr[ i ]; 138 139 return input; // enables cin >> x >> y; © 2003 Prentice Hall, Inc. 140 All rights reserved.
  25. 25 142 Outline 143 // overloaded output operator for class Array 144 ostream &operator<<( ostream &output, const Array &a ) 145 { array1.cpp (7 of 7) 146 int i; 147 148 // output private ptr-based array 149 for ( i = 0; i < a.size; i++ ) { 150 output << setw( 12 ) << a.ptr[ i ]; 151 152 if ( ( i + 1 ) % 4 == 0 ) // 4 numbers per row of output 153 output << endl; 154 155 } // end for 156 157 if ( i % 4 != 0 ) // end last line of output 158 output << endl; 159 160 return output; // enables cout << x << y; 161 162 } // end function operator<< © 2003 Prentice Hall, Inc. All rights reserved.
  26. 26 1 // Fig. 8.6: fig08_06.cpp Outline 2 // Array class test program. 3 #include 4 fig08_06.cpp 5 using std::cout; (1 of 3) 6 using std::cin; 7 using std::endl; 8 9 #include "array1.h" 10 11 int main() 12 { 13 Array integers1( 7 ); // seven-element Array 14 Array integers2; // 10-element Array by default 15 16 // print integers1 size and contents 17 cout << "Size of array integers1 is " 18 << integers1.getSize() 19 << "\nArray after initialization:\n" << integers1; 20 21 // print integers2 size and contents 22 cout << "\nSize of array integers2 is " 23 << integers2.getSize() 24 << "\nArray after initialization:\n" << integers2; 25 © 2003 Prentice Hall, Inc. All rights reserved.
  27. 27 26 // input and print integers1 and integers2 Outline 27 cout > integers1 >> integers2; 29 fig08_06.cpp 30 cout << "\nAfter input, the arrays contain:\n" (2 of 3) 31 << "integers1:\n" << integers1 32 << "integers2:\n" << integers2; 33 34 // use overloaded inequality (!=) operator 35 cout << "\nEvaluating: integers1 != integers2\n"; 36 37 if ( integers1 != integers2 ) 38 cout << "integers1 and integers2 are not equal\n"; 39 40 // create array integers3 using integers1 as an 41 // initializer; print size and contents 42 Array integers3( integers1 ); // calls copy constructor 43 44 cout << "\nSize of array integers3 is " 45 << integers3.getSize() 46 << "\nArray after initialization:\n" << integers3; 47 © 2003 Prentice Hall, Inc. All rights reserved.
  28. 28 48 // use overloaded assignment (=) operator Outline 49 cout << "\nAssigning integers2 to integers1:\n"; 50 integers1 = integers2; // note target is smaller 51 fig08_06.cpp 52 cout << "integers1:\n" << integers1 (3 of 3) 53 << "integers2:\n" << integers2; 54 55 // use overloaded equality (==) operator 56 cout << "\nEvaluating: integers1 == integers2\n"; 57 58 if ( integers1 == integers2 ) 59 cout << "integers1 and integers2 are equal\n"; 60 61 // use overloaded subscript operator to create rvalue 62 cout << "\nintegers1[5] is " << integers1[ 5 ]; 63 64 // use overloaded subscript operator to create lvalue 65 cout << "\n\nAssigning 1000 to integers1[5]\n"; 66 integers1[ 5 ] = 1000; 67 cout << "integers1:\n" << integers1; 68 69 // attempt to use out-of-range subscript 70 cout << "\nAttempt to assign 1000 to integers1[15]" << endl; 71 integers1[ 15 ] = 1000; // ERROR: out of range 72 73 return 0; 74 © 2003 Prentice Hall, Inc. 75 } // end main All rights reserved.
  29. 29 Outline Size of array integers1 is 7 Array after initialization: 0 0 0 0 fig08_06.cpp 0 0 0 output (1 of 3) Size of array integers2 is 10 Array 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 arrays contain: integers1: 1 2 3 4 5 6 7 integers2: 8 9 10 11 12 13 14 15 Evaluating: integers1 != integers2 integers1 and integers2 are not equal © 2003 Prentice Hall, Inc. All rights reserved.
  30. 30 Size of array integers3 is 7 Outline Array after initialization: 1 2 3 4 5 6 7 fig08_06.cpp output (2 of 3) 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[15] Error: Subscript 15 out of range © 2003 Prentice Hall, Inc. All rights reserved.
  31. 31 8.9 Converting between Types • Phép đổi kiểu – Cast operator (conversion operator) – Chuyển từ •lớp này sang lớp khác •từ lớp sang kiểu dữ liệu cài sẵn (built-in) (int, char, v.v ) –Phải là non-static member function • không thể là friend – Không chỉ rõ kiểu trả về •Ngầm trả về kiểu mà ta đang muốn đổi đến •Ví dụ –Prototype A::operator char *() const; • đổi từ class A thành một char * tạm thời • (char *)s gọi s.operator char*() –và • A::operator int() const; • A::operator OtherClass() const; © 2003 Prentice Hall, Inc. All rights reserved.
  32. 32 8.9 Converting between Types • Casting có thể loại bỏ bớt nhu cầu overloading –Giả sử class String có thể được đổi thành char * – cout << s; // s is a String • Trình biên dịch ngầm đổi s thành char * • Không cần overload << –Lưu ý: Trình biên dịch chỉ có thể thực hiện 1 cast mỗi lần © 2003 Prentice Hall, Inc. All rights reserved.
  33. 33 8.10 Case Study: A String Class •Xây dựng class String –tạo và thao tác xâu dữ liệu – Class string trong thư viện chuẩn(Chương 15) • Constructor chuyển đổi – Conversion constructor – Single-argument constructor (chỉ có 1 tham số) –Biến đổi các đối tượng thuộc các kiểu khác thành các đối tượng của lớp • String s1(“hi”); •tạo một đối tượng String từ một char * –mỗi constructor đơn tham số là một constructor chuyển đổi © 2003 Prentice Hall, Inc. All rights reserved.
  34. 34 1 // Fig. 8.7: string1.h Outline 2 // String class definition. string1.h (1 of 3) 3 #ifndef STRING1_H 4 #define STRING1_H s1 += s2 được hiểu là 5 s1.operator+=(s2) 6 #include 7 Còn có thể dùng để nối một String Conversion constructor để và một vì trình biên dịch sẽ 8 using std::ostream; char * tạo một đối tượng cast tham số thành một 9 using std::istream; char * String từ một char *. String. Tuy nhiên, nó chỉ có thể 10 thực hiện casting 1 mức. 11 class String { 12 friend ostream &operator >( istream &, String & ); 14 15 public: 16 String( const char * = "" ); // conversion/default constructor 17 String( const String & ); // copy constructor 18 ~String(); // destructor 19 20 const String &operator=( const String & ); // assignment 21 const String &operator+=( const String & ); // concatenation 22 23 bool operator!() const; // is String empty? 24 bool operator==( const String & ) const; // test s1 == s2 25 bool operator<( const String & ) const; // test s1 < s2 © 2003 Prentice Hall, Inc. 26 All rights reserved.
  35. 35 27 // test s1 != s2 Outline 28 bool operator!=( const String & right ) const 29 { 30 return !( *this == right ); string1.h (2 of 3) 31 32 } // end function operator!= 33 34 // test s1 > s2 35 bool operator>( const String &right ) const 36 { 37 return right 40 41 // test s1 = s2 49 bool operator>=( const String &right ) const 50 { 51 return !( *this < right ); © 2003 Prentice Hall, Inc. 52 All rights reserved.
  36. Hai toán tử chỉ số được 36 overloaded, dành cho const vàOutline 54 non-const object. 55 char &operator[]( int ); // subscript operator string1.h (3 of 3) 56 const char &operator[]( int ) const; // subscript operator 57 58 String operator()( int, int ); // return a substring 59 60 int getLength() const; //Overload return toán string tử gọi hàmlength() để trả về một xâu 61 con. Toán tử này có thể có số toán hạng tùy ý. 62 private: 63 int length; // string length 64 char *sPtr; // pointer to start of string 65 66 void setString( const char * ); // utility function 67 68 }; // end class String 69 70 #endif © 2003 Prentice Hall, Inc. All rights reserved.
  37. 37 1 // Fig. 8.8: string1.cpp Outline 2 // Member function definitions for class String. 3 #include 4 string1.cpp (1 of 8) 5 using std::cout; 6 using std::endl; 7 8 #include 9 10 using std::setw; 11 12 #include // C++ standard "new" operator 13 14 #include // strcpy and strcat prototypes 15 #include // exit prototype 16 17 #include "string1.h" // String class definition 18 19 // conversion constructor converts char * to String 20 String::String( const char *s ) 21 : length( strlen( s ) ) 22 { 23 cout << "Conversion constructor: " << s << '\n'; 24 setString( s ); // call utility function 25 © 2003 Prentice Hall, Inc. 26 } // end String conversion constructor All rights reserved.
  38. 38 27 Outline 28 // copy constructor 29 String::String( const String © ) 30 : length( copy.length ) string1.cpp (2 of 8) 31 { 32 cout << "Copy constructor: " << copy.sPtr << '\n'; 33 setString( copy.sPtr ); // call utility function 34 35 } // end String copy constructor 36 37 // destructor 38 String::~String() 39 { 40 cout << "Destructor: " << sPtr << '\n'; 41 delete [] sPtr; // reclaim string 42 43 } // end ~String destructor 44 45 // overloaded = operator; avoids self assignment 46 const String &String::operator=( const String &right ) 47 { 48 cout << "operator= called\n"; 49 50 if ( &right != this ) { // avoid self assignment 51 delete [] sPtr; // prevents memory leak 52 length = right.length; // new String length 53 setString( right.sPtr ); // call utility function © 2003 Prentice Hall, Inc. 54 } All rights reserved.
  39. 39 55 Outline 56 else 57 cout << "Attempted assignment of a String to itself\n"; 58 string1.cpp (3 of 8) 59 return *this; // enables cascaded assignments 60 61 } // end function operator= 62 63 // concatenate right operand to this object and 64 // store in this object. 65 const String &String::operator+=( const String &right ) 66 { 67 size_t newLength = length + right.length; // new length 68 char *tempPtr = new char[ newLength + 1 ]; // create memory 69 70 strcpy( tempPtr, sPtr ); // copy sPtr 71 strcpy( tempPtr + length, right.sPtr ); // copy right.sPtr 72 73 delete [] sPtr; // reclaim old space 74 sPtr = tempPtr; // assign new array to sPtr 75 length = newLength; // assign new length to length 76 77 return *this; // enables cascaded calls 78 79 } // end function operator+= © 2003 Prentice Hall, Inc. 80 All rights reserved.
  40. 40 81 // is this String empty? Outline 82 bool String::operator!() const 83 { 84 return length == 0; string1.cpp (4 of 8) 85 86 } // end function operator! 87 88 // is this String equal to right String? 89 bool String::operator==( const String &right ) const 90 { 91 return strcmp( sPtr, right.sPtr ) == 0; 92 93 } // end function operator== 94 95 // is this String less than right String? 96 bool String::operator<( const String &right ) const 97 { 98 return strcmp( sPtr, right.sPtr ) < 0; 99 100 } // end function operator< 101 © 2003 Prentice Hall, Inc. All rights reserved.
  41. 41 102 // return reference to character in String as lvalue Outline 103 char &String::operator[]( int subscript ) 104 { 105 // test for subscript out of range string1.cpp (5 of 8) 106 if ( subscript = length ) { 107 cout = length ) { 122 cout << "Error: Subscript " << subscript 123 << " out of range" << endl; 124 125 exit( 1 ); // terminate program 126 } 127 128 return sPtr[ subscript ]; // creates rvalue 129 130 } // end function operator[] © 2003 Prentice Hall, Inc. All rights reserved.
  42. 42 131 Outline 132 // return a substring beginning at index and 133 // of length subLength 134 String String::operator()( int index, int subLength ) string1.cpp (6 of 8) 135 { 136 // if index is out of range or substring length = length || subLength length ) ) 145 len = length - index; 146 else 147 len = subLength; 148 149 // allocate temporary array for substring and 150 // terminating null character 151 char *tempPtr = new char[ len + 1 ]; 152 153 // copy substring into char array and terminate string 154 strncpy( tempPtr, &sPtr[ index ], len ); 155 tempPtr[ len ] = '\0'; © 2003 Prentice Hall, Inc. All rights reserved.
  43. 43 156 Outline 157 // create temporary String object containing the substring 158 String tempString( tempPtr ); 159 delete [] tempPtr; // delete temporary array string1.cpp (7 of 8) 160 161 return tempString; // return copy of the temporary String 162 163 } // end function operator() 164 165 // return string length 166 int String::getLength() const 167 { 168 return length; 169 170 } // end function getLenth 171 172 // utility function called by constructors and operator= 173 void String::setString( const char *string2 ) 174 { 175 sPtr = new char[ length + 1 ]; // allocate memory 176 strcpy( sPtr, string2 ); // copy literal to object 177 178 } // end function setString © 2003 Prentice Hall, Inc. All rights reserved.
  44. 44 179 Outline 180 // overloaded output operator 181 ostream &operator >( istream &input, String &s ) 191 { 192 char temp[ 100 ]; // buffer to store input 193 194 input >> setw( 100 ) >> temp; 195 s = temp; // use String class assignment operator 196 197 return input; // enables cascading 198 199 } // end function operator>> © 2003 Prentice Hall, Inc. All rights reserved.
  45. 45 1 // Fig. 8.9: fig08_09.cpp Outline 2 // String class test program. 3 #include 4 fig08_09.cpp 5 using std::cout; (1 of 4) 6 using std::endl; 7 8 #include "string1.h" 9 10 int main() 11 { 12 String s1( "happy" ); 13 String s2( " birthday" ); 14 String s3; © 2003 Prentice Hall, Inc. All rights reserved.
  46. 46 16 // test overloaded equality and relational operators Outline 17 cout s1 yields " 25 s1 ? "true" : "false" ) 26 = s1 yields " 29 = s1 ? "true" : "false" ) 30 << "\ns2 <= s1 yields " 31 << ( s2 <= s1 ? "true" : "false" ); 32 33 // test overloaded String empty (!) operator 34 cout << "\n\nTesting !s3:\n"; 35 36 if ( !s3 ) { 37 cout << "s3 is empty; assigning s1 to s3;\n"; 38 s3 = s1; // test overloaded assignment 39 cout << "s3 is \"" << s3 << "\""; 40 } © 2003 Prentice Hall, Inc. All rights reserved.
  47. 47 41 Outline 42 // test overloaded String concatenation operator 43 cout << "\n\ns1 += s2 yields s1 = "; 44 s1 += s2; // test overloaded concatenation fig08_09.cpp 45 cout << s1; (3 of 4) 46 47 // test conversion constructor 48 cout << "\n\ns1 += \" to you\" yields\n"; 49 s1 += " to you"; // test conversion constructor 50 cout << "s1 = " << s1 << "\n\n"; 51 52 // test overloaded function call operator () for substring 53 cout << "The substring of s1 starting at\n" 54 << "location 0 for 14 characters, s1(0, 14), is:\n" 55 << s1( 0, 14 ) << "\n\n"; 56 57 // test substring "to-end-of-String" option 58 cout << "The substring of s1 starting at\n" 59 << "location 15, s1(15, 0), is: " 60 << s1( 15, 0 ) << "\n\n"; // 0 is "to end of string" 61 62 // test copy constructor 63 String *s4Ptr = new String( s1 ); 64 cout << "\n*s4Ptr = " << *s4Ptr << "\n\n"; 65 © 2003 Prentice Hall, Inc. All rights reserved.
  48. 48 66 // test assignment (=) operator with self-assignment Outline 67 cout << "assigning *s4Ptr to *s4Ptr\n"; 68 *s4Ptr = *s4Ptr; // test overloaded assignment 69 cout << "*s4Ptr = " << *s4Ptr << '\n'; fig08_09.cpp 70 (4 of 4) 71 // test destructor 72 delete s4Ptr; 73 74 // test using subscript operator to create lvalue 75 s1[ 0 ] = 'H'; 76 s1[ 6 ] = 'B'; 77 cout << "\ns1 after s1[0] = 'H' and s1[6] = 'B' is: " 78 << s1 << "\n\n"; 79 80 // test subscript out of range 81 cout << "Attempt to assign 'd' to s1[30] yields:" << endl; 82 s1[ 30 ] = 'd'; // ERROR: subscript out of range 83 84 return 0; 85 86 } // end main © 2003 Prentice Hall, Inc. All rights reserved.
  49. 49 Conversion constructor: happy Conversion constructor: birthday Outline Conversion constructor: s1 is "happy"; s2 is " birthday"; s3 is "" The results of comparing s2 and s1: s2 == s1 yields false s2 != s1 yields true Conversion constructor: happy birthday s2 > s1 yields false Copy constructor: happy birthday s2 = s1 yields false The substring of s1 starting at s2 <= s1 yields true location 0 for 14 characters, s1(0, 14), is: happy birthday Testing !s3: s3 is empty; assigning s1 to s3; Destructor: happy birthday operator= called Conversion constructor: to you s3 is "happy" Copy constructor: to you s1 += s2 yields s1 = happy birthday Destructor: to you The substring of s1 starting at s1 += " to you" yields location 15, s1(15, 0), is: to you Conversion constructor: to you Destructor: to you Destructor: to you s1 = happy birthday to you Copy constructor: happy birthday to you *s4Ptr = happy birthday to you constructor và destructor được gọi assigning *s4Ptr to *s4Ptr cho đối tượng String tạm thời operator= called (đổi từ char * “to you”). Attempted assignment of a String to itself *s4Ptr = happy birthday to you© 2003 Prentice Hall, Inc. Destructor: happy birthday toAll you rights reserved.
  50. 50 s1 after s1[0] = 'H' and s1[6] = 'B' is: Happy Birthday to you Outline Attempt to assign 'd' to s1[30] yields: Error: Subscript 30 out of range fig08_09.cpp (3 of 3) © 2003 Prentice Hall, Inc. All rights reserved.
  51. 51 8.11 Overloading ++ and • Increment/decrement operators cũng có thể được overload –Cộng 1 vào một đối tượng Date, d1 – Prototype (member function) • Date &operator++(); • ++d1 chính là d1.operator++() – Prototype (non-member) • friend Date &operator++( Date &); • ++d1 chính là operator++( d1 ) © 2003 Prentice Hall, Inc. All rights reserved.
  52. 52 8.11 Overloading ++ and • Phân biệt pre/post increment – Post increment có một tham số độn (dummy parameter) • int of 0 – Prototype (member function) • Date operator++( int ); • d1++ chính là d1.operator++( 0 ) – Prototype (non-member) • friend Date operator++( Data &, int ); • d1++ chính là operator++( d1, 0 ) –Tham số integer không có tên •Thậm chí không có tên tại function definition © 2003 Prentice Hall, Inc. All rights reserved.
  53. 53 8.11 Overloading ++ and • Các giá trị trả về – Preincrement •Trả về tham chiếu – Returns by reference (Date &) • là giá trị trái – lvalue (có thể được gán trị) – Postincrement •Trả về giá trị •trả về đối tượng tạm thời với giá trị cũ (trước khi tăng) • là giá trị phải – rvalue (không thể đặt bên trái phép gán) •Tương tự đối với phép giảm - Decrement operator © 2003 Prentice Hall, Inc. All rights reserved.
  54. 54 8.12 Case Study: A Date Class •Ví dụ Date class – Overload phép tăng •sửa ngày, tháng, năm – Overload phép += –hàm kiểm tra năm nhuận (leap year) –hàm kiểm tra xem ngày có phải ngày cuối tháng © 2003 Prentice Hall, Inc. All rights reserved.
  55. 55 1 // Fig. 8.10: date1.h Outline 2 // Date class definition. 3 #ifndef DATE1_H 4 #define DATE1_H date1.h (1 of 2) 5 #include 6 7 using std::ostream; 8 9 class Date { 10 friend ostream &operator<<( ostream &, const Date & ); 11 Chú ý sự khác nhau giữatăng trước và sau. 12 public: 13 Date( int m = 1, int d = 1, int y = 1900 ); // constructor 14 void setDate( int, int, int ); // set the date 15 16 Date &operator++(); // preincrement operator 17 Date operator++( int ); // postincrement operator 18 19 const Date &operator+=( int ); // add days, modify object 20 21 bool leapYear( int ) const; // is this a leap year? 22 bool endOfMonth( int ) const; // is this end of month? © 2003 Prentice Hall, Inc. All rights reserved.
  56. 56 23 Outline 24 private: 25 int month; 26 int day; date1.h (2 of 2) 27 int year; 28 29 static const int days[]; // array of days per month 30 void helpIncrement(); // utility function 31 32 }; // end class Date 33 34 #endif © 2003 Prentice Hall, Inc. All rights reserved.
  57. 57 1 // Fig. 8.11: date1.cpp Outline 2 // Date class member function definitions. 3 #include 4 #include "date1.h" date1.cpp (1 of 5) 5 6 // initialize static member at file scope; 7 // one class-wide copy 8 const int Date::days[] = 9 { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 10 11 // Date constructor 12 Date::Date( int m, int d, int y ) 13 { 14 setDate( m, d, y ); 15 16 } // end Date constructor 17 18 // set month, day and year 19 void Date::setDate( int mm, int dd, int yy ) 20 { 21 month = ( mm >= 1 && mm = 1900 && yy <= 2100 ) ?yy: 1900; 23 © 2003 Prentice Hall, Inc. All rights reserved.
  58. 58 24 // test for a leap year Outline 25 if ( month == 2 && leapYear( year ) ) 26 day = ( dd >= 1 && dd = 1 && dd <= days[ month ] ) ? dd : 1; 29 Postincrement cập nhật object vả trả về 30 } // end function setDate một bản sao của object cũ. 31 Không trả về tham chiếu đến một biến 32 // overloaded preincrement operator t ạm, vì nó là một biến địa phương và sẽ bị 33 Date &Date::operator++() h ủ y. 34 { 35 helpIncrement(); L ư u ý tham số integer không có tên. 36 37 return *this; // reference return to create an lvalue 38 39 } // end function operator++ 40 41 // overloaded postincrement operator; note that the dummy 42 // integer parameter does not have a parameter name 43 Date Date::operator++( int ) 44 { 45 Date temp = *this; // hold current state of object 46 helpIncrement(); 47 48 // return unincremented, saved, temporary object © 2003 Prentice Hall, Inc. 49 return temp; // value return; not a reference return All rights reserved.
  59. 59 50 Outline 51 } // end function operator++ 52 53 // add specified number of days to date date1.cpp (3 of 5) 54 const Date &Date::operator+=( int additionalDays ) 55 { 56 for ( int i = 0; i < additionalDays; i++ ) 57 helpIncrement(); 58 59 return *this; // enables cascading 60 61 } // end function operator+= 62 63 // if the year is a leap year, return true; 64 // otherwise, return false 65 bool Date::leapYear( int testYear ) const 66 { 67 if ( testYear % 400 == 0 || 68 ( testYear % 100 != 0 && testYear % 4 == 0 ) ) 69 return true; // a leap year 70 else 71 return false; // not a leap year 72 73 } // end function leapYear 74 © 2003 Prentice Hall, Inc. All rights reserved.
  60. 60 75 // determine whether the day is the last day of the month Outline 76 bool Date::endOfMonth( int testDay ) const 77 { 78 if ( month == 2 && leapYear( year ) ) date1.cpp (4 of 5) 79 return testDay == 29; // last day of Feb. in leap year 80 else 81 return testDay == days[ month ]; 82 83 } // end function endOfMonth 84 85 // function to help increment the date 86 void Date::helpIncrement() 87 { 88 // day is not end of month 89 if ( !endOfMonth( day ) ) 90 ++day; 91 92 else 93 94 // day is end of month and month < 12 95 if ( month < 12 ) { 96 ++month; 97 day = 1; 98 } 99 © 2003 Prentice Hall, Inc. All rights reserved.
  61. 61 100 // last day of year Outline 101 else { 102 ++year; 103 month = 1; date1.cpp (5 of 5) 104 day = 1; 105 } 106 107 } // end function helpIncrement 108 109 // overloaded output operator 110 ostream &operator<<( ostream &output, const Date &d ) 111 { 112 static char *monthName[ 13 ] = { "", "January", 113 "February", "March", "April", "May", "June", 114 "July", "August", "September", "October", 115 "November", "December" }; 116 117 output << monthName[ d.month ] << ' ' 118 << d.day << ", " << d.year; 119 120 return output; // enables cascading 121 122 } // end function operator<< © 2003 Prentice Hall, Inc. All rights reserved.
  62. 62 1 // Fig. 8.12: fig08_12.cpp Outline 2 // Date class test program. 3 #include 4 fig08_12.cpp 5 using std::cout; (1 of 2) 6 using std::endl; 7 8 #include "date1.h" // Date class definition 9 10 int main() 11 { 12 Date d1; // defaults to January 1, 1900 13 Date d2( 12, 27, 1992 ); 14 Date d3( 0, 99, 8045 ); // invalid date 15 16 cout << "d1 is " << d1 << "\nd2 is " << d2 17 << "\nd3 is " << d3; 18 19 cout << "\n\nd2 += 7 is " << ( d2 += 7 ); 20 21 d3.setDate( 2, 28, 1992 ); 22 cout << "\n\n d3 is " << d3; 23 cout << "\n++d3 is " << ++d3; 24 25 Date d4( 7, 13, 2002 ); © 2003 Prentice Hall, Inc. All rights reserved.
  63. 63 26 Outline 27 cout << "\n\nTesting the preincrement operator:\n" 28 << " d4 is " << d4 << '\n'; 29 cout << "++d4 is " << ++d4 << '\n'; fig08_12.cpp 30 cout << " d4 is " << d4; (2 of 2) 31 32 cout << "\n\nTesting the postincrement operator:\n" 33 << " d4 is " << d4 << '\n'; 34 cout << "d4++ is " << d4++ << '\n'; d1 is January 1, 1900 35 cout << " d4 is " << d4 << endl; d2 is December 27, 1992 36 d3 is January 1, 1900 37 return 0; 38 d2 += 7 is January 3, 1993 39 } // end main d3 is February 28, 1992 ++d3 is February 29, 1992 Testing the preincrement operator: d4 is July 13, 2002 ++d4 is July 14, 2002 d4 is July 14, 2002 Testing the postincrement operator: d4 is July 14, 2002 d4++ is July 14, 2002 © 2003 Prentice Hall, Inc. d4 is July 15, 2002 All rights reserved.
  64. 64 8.13 Standard Library Classes string and vector •Các lớp cài sẵn trong C++ –mọi người đều có sẵn để dùng – string •tương tự lớp String trong ví dụ – vector •mảng kích thước động (dynamically resizable array) •Thực hiện lại các ví dụ String và Array –sử dụng string và vector © 2003 Prentice Hall, Inc. All rights reserved.
  65. 65 8.13 Standard Library Classes string and vector • Class string –Header , namespace std –Có thể khởi tạo string s1(“hi”); – = > <= < – Phép gán – Assignment operator = – Phép nối – Concatenation (overloaded +=) © 2003 Prentice Hall, Inc. All rights reserved.
  66. 66 8.13 Standard Library Classes string and vector • Class string –hàm xâu consubstr • 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.
  67. 67 1 // Fig. 8.13: fig08_13.cpp Outline 2 // Standard library string class test program. 3 #include 4 fig08_13.cpp 5 using std::cout; (1 of 4) 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.
  68. 68 26 s1 yields " Outline 27 s1 ? "true" : "false" ) 28 = s1 yields " (2 of 4) 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.
  69. 69 49 // test overloaded string concatenation operator Outline 50 // with C-style string 51 cout << "\n\ns1 += \" to you\" yields\n"; 52 s1 += " to you"; fig08_13.cpp 53 cout << "s1 = " << s1 << "\n\n"; (3 of 4) 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.
  70. 70 74 // test destructor Outline 75 delete s4Ptr; 76 77 // test using subscript operator to create lvalue fig08_13.cpp 78 s1[ 0 ] = 'H'; (4 of 4) 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.
  71. 71 s1 is "happy"; s2 is " birthday"; s3 is "" Outline The results of comparing s2 and s1: s2 == s1 yields false fig08_13.cpp s2 != s1 yields true output (1 of 2) s2 > s1 yields false 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.
  72. 72 The substring of s1 starting at Outline location 15, s1.substr(15), is: to you fig08_13.cpp *s4Ptr = happy birthday to you output (2 of 2) 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. 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.
  74. 74 1 // Fig. 8.14: fig08_14.cpp Outline 2 // Demonstrating standard library class vector. 3 #include 4 fig08_14.cpp 5 using std::cout; (1 of 5) 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.
  75. 75 25 // print integers1 size and contents Outline 26 cout << "Size of vector integers1 is " 27 << integers1.size() 28 << "\nvector after initialization:\n"; fig08_14.cpp 29 outputVector( integers1 ); (2 of 5) 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"; © 2003 Prentice Hall, Inc. 50 All rights reserved.
  76. 76 51 if ( integers1 != integers2 ) Outline 52 cout 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.
  77. 77 73 // use overloaded equality (==) operator Outline 74 cout << "\nEvaluating: integers1 == integers2\n"; 75 76 if ( integers1 == integers2 ) fig08_14.cpp 77 cout << "integers1 and integers2 are equal\n"; (4 of 5) 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.
  78. 78 97 // output vector contents Outline 98 void outputVector( const vector &array ) 99 { 100 for ( int i = 0; i &array ) 115 { 116 for ( int i = 0; i > array[ i ]; 118 119 } // end function inputVector © 2003 Prentice Hall, Inc. All rights reserved.
  79. 79 Size of vector integers1 is 7 Outline vector after initialization: 0 0 0 0 0 0 0 fig08_14.cpp output (1 of 2) 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.
  80. 80 Size of vector integers3 is 7 Outline vector after initialization: 1 2 3 4 5 6 7 fig08_14.cpp output (2 of 2) 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 © 2003 Prentice Hall, Inc. All rights reserved.