C++primer 학습: 복사 제어(2)

5353 단어

분석 함수와 구조 함수는 상반된 조작을 수행하는데 이것은 클래스의 구성원 함수로 이름은 파도호와 클래스명으로 구성된다.반환 값이 없습니다. 인자를 받아들이지 않습니다.분석 함수는 유일하다


분석 함수는 언제 호출됩니까?


[1] 변수가 작용역을 벗어나다


[2] 객체가 제거되면 해당 구성원도 제거됩니다.


[3] 동적 분배 대상에 대해 바늘에 delete 조작을 적용할 때;


[4] 임시 대상의 경우 전체 표현식을 만들 때 삭제됩니다.


xigou 함수체 자체는 구성원을 소각하지 않으며 구성원은 분석 함수체 이후의 분석 단계에서 소각된다.


[연습]: Hasptr 클래스에 분석 함수 추가

lass Hasptr
{
public:
    Hasptr(const string & s = string()) :ps(new string(s)), i(0) {}
    Hasptr(const Hasptr & h) : ps(new string(*(h.ps))), i(h.i){}      // 
    ~Hasptr()  {delete ps;}// 

    Hasptr & operator= (const Hasptr &h)  // 
    {                            
        delete ps;// 
        ps = new string(*h.ps);// 
        i = h.i;
        return *this;
    }
private:
    string *ps;
    int i;
};

[연습] 간단한 클래스를 정의함으로써 카피 클래스의 구성원을 익힌다.

class X
{
public:
    X(){ cout << "X()" << endl; }
    X(const X & x){ cout << "X(const X&)
"
; } X & operator=(const X &x){ cout << "operator=
"
; return *this; } ~X(){ cout << "~X()
"
; } }; void f1(const X & test,const X x) { vector<X> vec; vec.reserve(2); vec.push_back(test); vec.push_back(x); } int main() { //auto it = new X;// //delete it; X x; f1(x, x); return 0; }

======================================================================================

하나의 기본 원칙: 하나의 클래스를 위해 분석 함수를 정의해야 한다. 그러면 이 클래스를 위해 자신의 구조 함수를 정의하고 복사 구조 함수를 복사해야 한다는 것을 거의 확신할 수 있다.


두 번째 기본 원칙: 만약에 하나의 클래스가 구조 함수를 복사해야 한다면 그것도 부수 연산자를 복사해야 한다.반대로 해도 마찬가지다.


[연습] 각 객체에 고유한 일련 번호를 지정하는 클래스를 정의합니다.고찰 함수는 인용을 형삼과 클래스로 형삼의 구별을 한다.

class numbered
{
public:
    numbered() :isbn(++count){};
    numbered(const numbered & n)// 
    {
        isbn = ++count;
    }
    void mysn()const{ cout << isbn << endl; }
private:
    size_t isbn;
    static size_t count;// 
};
size_t numbered::count = 0;// 
void f(const numbered & s)
{
    s.mysn();
}
void f2(const numbered & s)
{
    s.mysn();
}
int main()
{
    numbered a, b = a, c = b;
    f(a); f(b); f(c);
    f2(a); f2(b); f2(c);
    return 0;
}

======================================================================================

복사를 막고 함수를 삭제 함수로 정의합니다: = delete;

좋은 웹페이지 즐겨찾기