난 내가 링크 편집 한 수 있다면 질수도 반드시 거기 후속 의견 요청, 그리고 할 생각 몇 가지 의심이 내 질문에 대한 질문 ... 따라서 새로운 질문.
첫째, 연결된 질문에서 배운 점은 로컬로 돌아 오는 참조가 사악하다는 것입니다.
지금, 그 질문에서 같은 예를 살펴 조금하지만 수정 :
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
class A
{
public:
int x;
string s;
A(int xx,string ss):x(xx),s(ss)
{
cout<<"A::A()"<<x<<","<<s<<"\n";
}
A(const A& that)
{
cout<<"cpy ctr\n";
x=that.x;
s=that.s;
}
A& operator=(const A& that)
{
cout<<"operator=\n";
}
~A()
{
cout<<"~A()"<<s<<"\n";
}
};
const A& getA1()
{
A a(1,"A1");
cout<<"returning from A1\n";
return a;
}
A& getA2()
{
A a(2,"A2");
cout<<"returning from A2\n";
return a;
}
A getA3()
{
A a(3,"A3");
cout<<"returning from A3\n";
return a;
}
int main()
{
A &newA2 = getA2(); //.....................LINE 2
cout<<"returned from A2\n";
cout<<"-----------------------------\n";
A newA3 = getA3(); //......................LINE 3
//A const newConstA3 = getA3();
cout<<"returned from A3\n";
cout<<"-----------------------------\n";
//cout<<"newA2="<<newA2.x<<","<<newA2.s<<"\n";
cout<<"newA3="<<newA3.x<<","<<newA3.s<<"\n";
}
출력은 다음과 같다 ..
A::A()2,A2
returning from A2
~A()A2
returned from A2
-----------------------------
A::A()3,A3
returning from A3
returned from A3
-----------------------------
newA3=3,A3
~A()A3
이제 내 의심 ...
라인 2, fun
getA2()
(ref로 반환)은 일시적으로 파괴 된 후에 반환되므로 수신 객체newA2
은 위험합니다. (이유는 내가 사용하지 않았기 때문입니다.) 그렇다면 왜 재미를 느낍니까getA3()
임시로 소멸시킵니다. 그것은 "copy"에 의해 반환되지만 (getA3()
내부의 임시 소멸자는main()
의 끝에서 죽을 때만 개체의 소멸자가 호출됩니다.) 나는 그 임시 직원이 어디 있는지 전혀 모른다. ??이제 LINE 2 내가 (결국 지시 대상이 사망했다으로 세그먼트 폴트를 제공합니다)하지만 나던 왜 복사 클릭률이 라인에서 호출되는 여기
A newA2 = getA2();
, 복사 클릭률 (CTR)이 호출됩니다에A& newA2 = getA2();
에서 그것을 변경하는 경우 3? 임시 상태가 객체 으로 복사되는 방법은operator=()
중 하나를 호출 중임을 알 수 있습니까?마지막으로 출력은 gcc이지만 MSVC++ 2008에서는 다르게 작동합니까 ?? 코드
A newA3 = getA3();
도 LINE 3과 동일하게 동작합니다. LINE 2과 동일하게 동작합니다. 즉, 복귀하기 전에 temp를 파괴합니다! 모든 단서?
출력 레이아웃과 질문을 따르기가 매우 어렵습니다. 당신은 단순하게 할 수 없습니까? 그리고, 질문마다 하나의 질문을하십시오 ... –