string s("Jumping Jack Flash"); string t(s); // definition with initialization by copying string u = s; // definition with initialization by copying stack<int> S; // ... fill S with some elements stack<int> T(S); // definition with initialization by copying
list_item it1, it2; // ... it2 = it1; // it2 now references the same container as it1
array<int> A, B; // ...fill A with some elements... B = A;
Now B
contains the same number
of integers as A
, in the same order,
with the same values.
However, A
and B
do not contain the same objects:
int* p = A[0]; int* q = B[0]; p == q; // false
A
and B
are different objects:
A == B; // false
list<int> L, M; list_item it1, it2; L.push(42); L.push(666); M = L;
L
and M
now
both contain the numbers 666 and 42. These numbers are
not the same objects:
it1 = L.first(); it2 = M.first(); it1 == it2; // false
L
and M
are
different objects as well:
L == M; // false
In the following assignment the rules c, b, and a are applied recursivley (in this order):
list< array<int> > L, M; // ...fill L with some array<int>s // each of them filled with some elements... M = L;
list_item it1, it2; // ... it2 = it1; // it2 now references the same container as it1 it1 == it2; // true
point p(2.0, 3.0); point q(2.0, 3.0); p == q; // true (as defined for class point) identical(p, q); // false point r; r = p; identical(p, r); // true
list<int> L, M; // ...fill L with some elements... M = L; L == M; // false
list_item it = L.first(); L.del_item(it); L.contents(it); // illegal access it = nil; L.contents(it); // illegal access
point p(2.0, 3.0); // p has coordinates (2.0, 3.0) point q; // q has coordinates but it is not known which
edge e; forall(e, G.all_edges()) // dangerous! { ... } // do it like this list<edge> E = G.all_edges(); forall(e, E) { ... }
list_item it; forall(it, L) { L.append(1); // illegal; results in infinite loop if(L[it] == 5 ) L.del(it); // legal if(L[it] == 6 ) L.del(L.succ(it)); // illegal L[it]++; // legal }
class pair { public: int x, y; pair() { x = y = 0; } pair(const pair& p) { x = p.x; y = p.y; } pair& operator=(const pair& p) { if(this != &p) { x = p.x; y = p.y; } return *this; } }; std::istream& operator>> (std::istream& is, pair& p) { is >> p.x >> p.y; return is; } std::ostream& operator<< (std::ostream& os, const pair& p) { os << p.x << " " << p.y; return os; }
namespace leda { int compare(const pair& p, const pair& q) { if (p.x < q.x) return -1; if (p.x > q.x) return 1; if (p.y < q.y) return -1; if (p.y > q.y) return 1; return 0; } };
namespace leda { int Hash(const pair& p) { return p.x ^ p.y; } }; bool operator == (const pair& p, const pair& q) { return (p.x == q.x && p.y == q.y) ? true : false; }