, . :
- :
Date today;
Date d = today; // d today
- :
void takesDate (Date _d) {... }
// takesDate today
Date today;
takesDate (today);
- :
Date returnsDate () { return Date(); }
// d , returnsDate
Date d = returnsDate();
, (values), . , (entities) . - /, .
(Copy Constructors).
, (memberwise copy) , . , , . . .
, - , . , , . , . , , :
// ,
Stack s;
s.Push(3);
s.Push(5);
// , ,
Stack s2 = s;
// :
// Stack::~Stack(& s2);
// Stack::~Stack(& s1);
// ,
, Push:
, - , , , m_pDataStart m_pDataTop:
, , , , .. . :
|
|
, . , . (dangling pointer) .
, . - - , , .
class Stack
{
//...
public:
//
Stack (const Stack & _s);
//...
};
. , - , , -:
//
Stack::Stack (const Stack & _s)
: m_size(_s.m_size)
{
//
m_pDataStart = new int [ m_size ];
// -
int nActuallyStored = _s.m_pDataTop - _s.m_pDataStart;
//
m_pDataTop = m_pDataStart + nActuallyStored;
//
memcpy(m_pDataStart, _s.m_pDataStart, nActuallyStored * sizeof (int));
}
, .
. , - . , , (- , . ).
, . - . , , :
class Date
{
//...
public:
//
Date(const Date & _d);
//...
};
//
Date::Date (const Date & _d)
: m_Year(_d.m_Year),
m_Month(_d.m_Month),
m_Day(_d.m_Day)
{
}
, -, . ( -), , , . , (- , ), , . , .
|
|
, - , , . - .
, , , , :
Date d(2013, 2, 19);
//...
Date today;
// d today
d = today;
(copy assignment operator), , .
- , .
, - , - :
class MyClass
{
public:
MyClass (Stack & _stack)
: m_stack(_stack)
{
}
private:
Stack & m_stack; // -
};
int main ()
{
Stack s1, s2;
MyClass myObject1(s1), myObject2(s2);
myObject1 = myObject2; // !
}
error C2582: 'operator =' function is unavailable in 'MyClass'
, -. , , . -, , , . -, , , .
//
Stack s1;
s1.Push(2);
//
Stack s2;
s2.Push(3);
s2.Push(5);
// . -
s1 = s2;
// :
// Stack::~Stack(& s2);
// Stack::~Stack(& s1);
// -
//
:
class Stack
{
//...
public:
//
Stack& operator = (const Stack & _s);
//...
};
//
Stack & Stack:: operator = (const Stack & _s)
{
//
if (& _s == this)
return * this;
//
delete[] m_pDataStart;
// ,
m_size = _s.m_size;
//
m_pDataStart = new int [ m_size ];
// -
|
|
int nActuallyStored = _s.m_pDataTop - _s.m_pDataStart;
//
m_pDataTop = m_pDataStart + nActuallyStored;
//
memcpy(m_pDataStart, _s.m_pDataStart, nActuallyStored * sizeof (int));
//
return * this;
}
, - . , , .
, / . , :
Stack s;
s = s; //
. -:
if (& _s == this) //
return * this;
, .. (return * this), :
Stack s1;
s1.Push(2);
Stack s2;
if ((s2 = s1).IsEmpty())
// ^ ,
//
, . , . , :
class Stack
{
public:
//...
//
Stack (const Stack & _s);
//
Stack & operator = (const Stack & _s);
//...
private:
//
void CopyDataFrom (const Stack & _s);
//...
};
//
Stack::Stack (const Stack & _s)
{
CopyDataFrom(_s); //
}
//
Stack & Stack:: operator = (const Stack & _s)
{
//
if (this == & _s)
return * this;
//
delete[] m_pDataStart;
// -
CopyDataFrom(_s);
return * this;
}
//
void Stack::CopyDataFrom (const Stack & _s)
{
// ,
m_size = _s.m_size;
//
m_pDataStart = new int [ m_size ];
// -
int nActuallyStored = _s.m_pDataTop - _s.m_pDataStart;
//
m_pDataTop = m_pDataStart + nActuallyStored;
|
|
//
memcpy(m_pDataStart, _s.m_pDataStart, nActuallyStored * sizeof (int));
}
, , , 2 : .
9. . . RVO/NRVO.
- , , , , , .
-, , .
, - , .