Материал из C\C++ эксперт
Add a range check to for overloaded [] operator
// A safe array example.
#include <iostream>
#include <cstdlib>
using namespace std;
class MyClass {
int a[3];
public:
MyClass(int i, int j, int k) {
a[0] = i;
a[1] = j;
a[2] = k;
}
int &operator[](int i);
};
// Provide range checking for MyClass.
int &MyClass::operator[](int i)
{
if(i<0 || i> 2) {
cout << "Boundary Error\n";
exit(1);
}
return a[i];
}
int main()
{
MyClass ob(1, 2, 3);
cout << ob[1]; // displays 2
cout << " ";
ob[1] = 25; // [] appears on left
cout << ob[1]; // displays 25
ob[3] = 44; // generates runtime error, 3 out-of-range
return 0;
}
design the operator[ ]( ) function in such a way that the [ ] can be used on both the left and right sides of an assignment statement.
#include <iostream>
using namespace std;
class MyClass {
int a[3];
public:
MyClass(int i, int j, int k) {
a[0] = i;
a[1] = j;
a[2] = k;
}
int &operator[](int i) { return a[i]; }
};
int main()
{
MyClass ob(1, 2, 3);
cout << ob[1]; // displays 2
cout << " ";
ob[1] = 25; // [] on left of =
cout << ob[1]; // now displays 25
return 0;
}
Overload ( ) for Point
#include <iostream>
using namespace std;
class Point {
int x, y;
public:
Point() {}
Point(int px, int py) {
x = px;
y = py;
}
void show() {
cout << x << " ";
cout << y << "\n";
}
Point operator+(Point op2);
Point operator()(int i, int j);
};
// Overload ( ) for Point.
Point Point::operator()(int i, int j)
{
x = i;
y = j;
return *this;
}
// Overload + for Point.
Point Point::operator+(Point op2)
{
Point temp;
temp.x = op2.x + x;
temp.y = op2.y + y;
return temp;
}
int main()
{
Point ob1(10, 20), ob2(1, 1);
ob1.show();
ob1(7, 8); // can be executed by itself
ob1.show();
ob1 = ob2 + ob1(10, 10); // can be used in expressions
ob1.show();
return 0;
}
10 20
7 8
11 11
overloading ( ) for the loc class
#include <iostream>
using namespace std;
class loc {
int longitude, latitude;
public:
loc() {}
loc(int lg, int lt) {
longitude = lg;
latitude = lt;
}
void show() {
cout << longitude << " ";
cout << latitude << "\n";
}
loc operator+(loc op2);
loc operator()(int i, int j);
};
// Overload ( ) for loc.
loc loc::operator()(int i, int j)
{
longitude = i;
latitude = j;
return *this;
}
// Overload + for loc.
loc loc::operator+(loc op2)
{
loc temp;
temp.longitude = op2.longitude + longitude;
temp.latitude = op2.latitude + latitude;
return temp;
}
int main()
{
loc ob1(10, 20), ob2(1, 1);
ob1.show();
ob1(7, 8); // can be executed by itself
ob1.show();
ob1 = ob2 + ob1(10, 10); // can be used in expressions
ob1.show();
return 0;
}
Overload () operator for two values
#include<iostream.h>
class Sample
{
int A[10][10];
public:
int &operator()(int,int);
};
int &Sample::operator()(int x,int y)
{
cout << "()";
return A[x][y];
}
int main()
{
Sample a;
int i,j;
for(i=0;i<10;i++){
for(j=0;j<10;j++)
a(i,j)=i+j;
for(i=0;i<10;i++)
cout<<a(i,1)<<" ";
}
cout<<endl;
}
10 10
The overloaded operator[ ]( ) function returns the value of the array as indexed by the value of its parameter.
#include <iostream>
using namespace std;
class MyClass {
int a[3];
public:
MyClass(int i, int j, int k) {
a[0] = i;
a[1] = j;
a[2] = k;
}
int operator[](int i) { return a[i]; }
};
int main()
{
MyClass ob(1, 2, 3);
cout << ob[1]; // displays 2
return 0;
}