.


:




:

































 

 

 

 


. .




, . :

- :

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.

- , , , , , .

-, , .

, - , .





:


: 2016-07-29; !; : 469 |


:

:

.
==> ...

1807 - | 1665 -


© 2015-2024 lektsii.org - -

: 0.091 .