복사 생성자 호출 시점
전갈자리
복사 생성자 호출 시점을 테스트 하고 싶어아래 코드를 작성해보았습니다.
/******************************************************************************************************/
#include iostream
using namespace std;
class a{
int m_n;
public:
a(int n) {
cout 일반 생성자 호출 endl;
m_n = n;
}
a(const a& rvalue) {
cout ##### 복사 생성자 호출 ##### endl;
m_n = rvalue.m_n;
}
~a() {
cout 소멸자 호출 : m_n( m_n ) endl;
}
void showdata() {
cout showdata 호출 : m_n( m_n ) endl;
}
};
void funcarg(a arg) {
cout func 함수 시작 endl;
cout func 함수 끝 endl;
}
a funcret() {
cout funcret 함수 시작 endl;
a a(-1);
return a;
}
int main() {
cout ************************************************ endl;
a a(1);
cout ************************************************ endl;
cout 1. 기존에 생성 된 객체로 새로운 초기화 시 endl;
a b = a;
cout ************************************************ endl;
cout 2. 함수 호출 시 객체를 값에 의한 전달 endl;
funcarg(a);
cout ************************************************ endl;
cout 3. 함수 내에서 객체를 값에 의해 리턴 endl;
funcret();
cout ************************************************ endl;
}
/******************************************************************************************************/
제가 알고 있기론 복사 생성자가 호출되는 시점이
1. 기존에 생성 된 객체로 새로운 초기화 시
2. 함수 호출 시 객체를 값에 의한 전달
3. 함수 내에서 객체를 값에 의해 리턴
로 알고 있는데 직접 작성하여 테스트 해보니 1, 2번은 정상적으로 복사 생성자가 호출되는데 3번과 같은 경우에는 복사 생성자가 호출이 되지 않더라구요. (funcret 함수)
funcret 함수 내 지역 변수로 리턴하면 복사 생성자가 호출되지 않는 반면에 글로벌 변수나 동적 생성한 변수를 리턴하면 이때는 복사 생성자가 호출되더군요.
예)
a g(10);
a funcret() {
cout funcret 함수 시작 endl;
return g;
}3번 같은 경우에 왜 복사 생성자가 호출되지 않는지궁금합니다. 테스트 코드가 잘못되었다면 어떤 식이 3번 경우에 해당하는지 답변 부탁드립니다. 감사합니다~^^
-
거북이
그렇군요...감사합니다~^^
-
UniQue
저 객체는 안쓰니까 아예 만들지도 않는거죠.
쓰면 안 없앱니다. -
god
그런데 최적화 한다는게 호출은 하는건지 아니면 경우에 따라 호출은 안 한다는건지 궁금하네요 ^^a
-
도란도란
아...그런거군요~주말 내내 찾아보다가 수다님 말처럼 컴파일러에 따라 다르다는 웹글을 딱 한번 봤어요...확신할 수가 없어서 집에서 g++ 에서 vc 에서 해봐도 복사생성자 호출결과가 안 나와서 답답했는데...웹상에서 컴파일 되다니 codepad.org 신기하세요~감사합니다~^^