문제

방금 C ++로 시작하여 클래스의 개인 회원 변수의 범위가 어떻게 작동하는지 이해하는 데 몇 가지 문제가 있습니다. 아래 코드를 참조하십시오

class Foo{
    private:
        std::vector<int> container;
    public:
        // other methods
};

int main(int argc, char* argv[])
{
    Foo* foo = new Foo;
    // other method calls to which foo is passed
    delete foo;
    return 0;
}

위의 코드에서 변수 "컨테이너"는 개인 멤버 변수입니다. "foo"인스턴스를 호출하고 다른 여러 방법과 수업에 전달합니다. 다음은 나의 의심입니다

  1. 변수 "컨테이너"의 범위는 무엇입니까? 인스턴스 foo를 삭제할 때까지 그 변수가 존재합니까?
  2. "컨테이너"를 벡터의 포인터로 만들어야합니까?

도와 주셔서 감사합니다

도움이 되었습니까?

해결책

  1. 예, 일생 컨테이너 멤버의 컨테이너 멤버는 포함 된 개체가 존재하는 한 오래 지속됩니다. delete 포인터를 가리키는 포인터에 (foo 귀하의 경우).
  2. 아니요, 그렇게 할 이유가 없습니다. 포인터로 만들면 동적 개체를 만들어야합니다. vector<int> 수명을 관리해야합니다 (컨테이너 포인터에서 삭제 호출 포함). 여기에는 불필요합니다. 컨테이너가 Foo 개체만큼 오래 지속되기를 원한다고 가정하면 포인터로 작업하지 않고 직접 포함하는 것이 좋습니다.

통과 foo 포인터는 포인터를 통과합니다. 그것이 의지를 가리키는 대상 ~ 아니다 Necassary라면 포인터 만 가리키는 포인터 만 복사하십시오. Java를 알고 있다면 포인터를 전달한다고 말하면 Java의 물체에 대한 언급을 전달하는 것과 동일합니다.

Foo f = new Foo();
// just passes the reference (pointer in C++) to doIt. 
// the actual object is not copied
doIt(f);

다른 팁

"foo"인스턴스를 호출하고 있습니다

실제로, 당신은 인스턴스를 만들고 있습니다 클래스 푸.

구체적으로, 당신은 힙에서 메모리 블록을 할당하고 있습니다. 새로운(). 이 메모리 블록은 포함하기에 충분히 큽니다 foo :: 컨테이너 그리고 다른 오버 헤드 클래스 foo 필요합니다.

(이 예에서는 아무것도 없습니다. 다른 클래스의 경우 추가 속성이나 가상 포인터 테이블이있을 수 있습니다.)

당연히, 새로운() (아마도 기본값?) foo :: foo () 생성자 foo :: 컨테이너 through the std :: 벡터 건설자.

변수 "컨테이너"의 범위는 무엇입니까?

컨테이너 인스턴스의 속성 [구성 요소]입니다 foo. 인스턴스만큼 오래 존재합니다 foo 존재합니다.

범위 측면에서 우리는 말할 수 있습니다 foo :: 컨테이너. 그러나 당신은 액세스 할 수 없습니다 Foo :: Constainer 수업 사례없이 foo. (예 : 대상 foo.) Foo :: Constainer 수업 인스턴스 없이는 존재하지 않습니다 foo.

(모든 인스턴스에서 하나의 값이 공유되는 곳에서 다소 다르게 작동하는 클래스 변수가 있습니다. 그러나 여기에는 그렇지 않습니다.)

이 범위는입니다 관련이 없습니다 공개/보호/개인/친구 회원 액세스 제어에.

예를 들어, 일부 foo :: mypublicmethod () 당신은 참조 할 수 있습니다 foo :: 컨테이너. 이 상황에서 명백한 범위를 포기할 수도 있지만 컨테이너.

당신은 사적이라면, 당신은 접근 할 수 없습니다 foo :: 컨테이너 수업 밖에서 행동 양식.

인스턴스 foo를 삭제할 때까지 그 변수가 존재합니까?

예.

"컨테이너"를 벡터의 포인터로 만들어야합니까?

아뇨. 가능하지만 확실히 필요하지 않습니다.

일반적으로 말하자면, 클래스 인스턴스 멤버는 생성자의 새로운 포인터와 소멸자를 삭제하는 것을 권장합니다. 비효율적이고 번거 롭습니다. (기본 카피 생성자는 포인터 값을 복사 할 수 있고, 소멸자는 동일한 포인터 값을 두 번 삭제할 수 있습니다.)


귀하의 요구에 따라 다음을 고려할 수 있습니다.

int main(int argc, char* argv[])
{
  Foo foo;
  // other method calls to which foo is passed
  return 0;
}

foo 그 후에는 범위를 벗어날 것입니다 반환 0;, 자동으로 삭제됩니다. 더구나, foo 힙 대신 스택에서 할당됩니다.


중고 사본을 찾을 수 있습니다 주석이 달린 C ++ 참조 매뉴얼 유용한. 오래되었지만 신호 대 잡음비가 높습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top