2015-01-08 2 views
0

저는 C++의 초보자입니다. 다음 두 파일을 코딩하고 결과에 몇 가지 문제점이 있습니다.C++의 파괴 함수의 시퀀스

#include <string> 
class StringTool 
{ 

public: 

StringTool(std::string name); 
~StringTool(); 
void Print(); 
std::string getName(); 
void setName(std::string name); 

private: 

std::string name; 
}; 

통화 당

#include <iostream> 
#include <string> 
#include "StringTool.h" 
using namespace std; 

StringTool::StringTool(std::string name) 
{ 
    this->name = name; 
} 

StringTool::~StringTool() 
{ 
    cout<<"Delete: "<<name<<endl; 
} 

void StringTool::Print() 
{ 
    cout<<"Print: "<<name<<endl; 
} 

int main() { 

    StringTool tool = StringTool("Test"); 
    tool.Print(); 

    tool = StringTool("New Test"); 
    tool.Print(); 
} 

출력은 .H :

Delete: Test 
Print: Test 
Delete: New Test 
Print: New Test 
Delete: New Test 

내 질문은 : 1) 처음에 테스트를 삭제하고 이 왜) 왜 새 테스트를 두 번 삭제합니까?

미리 감사드립니다. 귀하의 도움을 크게 주시면 감사하겠습니다.

+0

1) 생성자에 print 문이 없기 때문에 2) "Nre Test"가'StringTool ("New Test")'및'tool'에 대해 삭제되었습니다. – Jagannath

답변

0

암시 적 복사본 생성자를 사용하고 있습니다. 새로운 익명 개체가 생성되어 변수 도구에 할당되고 삭제됩니다. 그런 다음 tool.Print()가 실행됩니다. 다시 새로운 익명 객체가 생성되어 변수 도구에 할당되고 삭제되고 tool.Print()가 실행됩니다.

자간 나트로 말했듯
0

하면 ctor에의 추적을 넣어야 번째 블록에서 사용하는 복사 생성자 (암시 적)하다

StringTool tool("Test"); 
tool.Print(); 

tool = StringTool("New Test"); 
tool.Print(); 

사용해야 (I 이해 됨) 결과를 원하는하세요 실제로 일어나는 일을 이해하는 것을 도울뿐만 아니라 객체의 주소도 출력합니다. 첫 번째 줄에서

봐 :

StringTool tool = StringTool("Test"); 

은 먼저, StringTool("Test")와 임시 StringTool 구성은 도구를 생성하고 임시 개체를 삭제하는 암시 적 복사 생성자를 사용합니다. 임시 객체를 피하기 위해 싶었 경우

대신 작성해야 : 직접 생성자를 사용하는 것이

String tool("Test"); 

합니다.

두 번째 질문 ("새 테스트"의 두 번 삭제)의 경우 첫 번째 줄과 같이 임시 개체를 먼저 삭제 한 다음 tool 프로그램의 끝 부분이 삭제됩니다.

+1

'StringTool tool = StringTool (" 테스트 ");'는 할당이 아니며 복사 초기화입니다. 그리고 그 사본은 거의 확실히 제거 될 것입니다. – Praetorian

+0

@Praetorian : 고쳐 주셔서 감사합니다. 소식이 업데이트되었습니다. –