2011-12-13 4 views
2
class example1 
{ 
    private: 
    int i; 
public: 
    example1(){i = 1;} 
    int getI(){return i;} 
}; 

class example2 
{ 
public: 
    example2(){} 
    vector<example2> this_vector_wont_compile(3); 
    vector <example2> theVec; 
    void addVec() 
    { 
     //what's the scope of this? 
     //does push_back create a pointer 
     //to which a deep copy of the example1 instance 
     //returned by the constructor is performed? 
     theVec.push_back(example2()); 
    } 
}; 
int main() 
{ 
    example2 theExample; 
    theExample.theVec[0]; //can be accessed, instance of example1 in scope. 
    return 0; 
} 

안녕하세요, std :: vectors를 사용하여 기본 메모리 작업을 이해하려고합니다. 위 예제는 과거에 어떻게 사용되었는지를 묻지 않고 어떻게 사용했는지를 보여줍니다.C++ std 벡터 내용 범위

example2() 생성자는 addVec() 함수가 끝날 때 범위를 벗어나는 인스턴스를 반환하므로 theVec은 theVec이 범위 내에있는 동안 어떻게 추가합니까?

또한 클래스에서 상수 크기를 갖는 것으로서 std :: vector를 선언하면 컴파일러 오류가 발생하며 어떻게 피할 수 있습니까?

답변

3

theVec.push_back(example2());을 호출하면 벡터는 push_back에 전달 된 example2의 임시 인스턴스 복사본을 만듭니다. 컴파일러는 클래스의 복사 생성자를 사용하여 명시 적으로 생성하지 않았으므로 자동으로 생성됩니다.

일정한 크기의 std::vector을 신고하는 것에 대해 무엇을 묻고 있는지 잘 모르겠습니다. std::vector은 정의 상 일정한 크기가 아닙니다. 그러나 다음과 같이 생성자를 정의하여 초기 크기로 구성 할 수 있습니다.

class example2 
{ 
    example2() : theVec(10) {}; 
    std::vector<example2> theVec; 
    .... 
} 
1

addVec에있는 push_back 조작은 구성된 오브젝트를 내부 메모리로 복사합니다. 원본은 범위를 벗어나 파괴됩니다.

비 컴파일 부분이 의미가 없습니다. 일정한 크기의 vector과 같은 것이 없습니다. 이것은 std::array을위한 것입니다.

+0

감사합니다. pmr 및 @obmarg, 내 질문에 완벽하게 대답합니다. –