함수 반환값 요약

예1:
class A
{
	int x;
public:
	A(int i):x(i){}
	int get(){return x;}
};
A& func()
{
	A a(23);
	return a;
}
int main()
{
	A &r = func();
	cout<<r.get()<<endl;
	return 0;
}

출력: 1245000
설명: r는 반환값의 별명으로 초기화되었습니다.인용에 따라 되돌아오기 때문에 되돌아오는 값은 a의 별명이다.그래서 r는 a의 별명이다.
a는 국부 변수로func()가 끝난 후 a가 사라집니다.r는 빈 인용이 되었다.
따라서 출력된 것은 지난번 랜덤 값이다.
 
예2:
class A
{
	int x;
public:
	A(int i):x(i){cout<<"construct     "<<this<<endl;}
	A(const A& a){x = a.x;cout<<"copy     "<<this<<endl;}
	~A(){cout<<"delete     "<<this<<endl;}
	int get(){return x;}
};
A func()
{
	A a(23);
	return a;
}
int main()
{
	A &r = func();
	cout<<r.get()<<endl;
	return 0;
}

출력:
construct 0012FEC8 copy 0012FF34 delete 0012FEC8 23 delete 0012FF34 설명: r는 반환값의 별명으로 초기화되었고 반환값은 a의 복사본입니다.
반환값은 국부 변수가 아니지만 정상적인 상황에서 반환값은func() 다음에 다음 문장이 실행되기 전에 분석해야 한다.
인용의 대상은 여전히 사라지는데 왜 결과를 정상적으로 출력할 수 있습니까?여기에는 다음과 같은 개념이 제시되어 있습니다.
만약 인용이 임시 변수라면 이 임시 변수의 생존 기간은 이 인용의 생존 기간보다 적지 않을 것이다.따라서 반환값(즉 a의 부본)이 r의 작용역이 끝날 때까지 분석된다.
r는 되돌아오는 값의 인용이지 원래 a의 인용이 아니다
 
예3: 이 예는 예2와 대조하기 위해 정상적인 상황에서 반환값은 함수가 끝난 후에 다음 문장이 실행되기 전에 분석한 것이다.
class A
{
	int x;
public:
	A(int i):x(i){cout<<"construct     "<<this<<endl;}
	A(const A& a){x = a.x;cout<<"copy     "<<this<<endl;}
	~A(){cout<<"delete     "<<this<<endl;}
	int get(){return x;}
};
A func()
{
	A a(23);
	return a;
}
int main()
{
	func();
	cout<<"Test"<<endl;
	return 0;
}

출력:
construct 0012FEDC//a 구조copy 0012FF44//반환값의 구조delete 0012FEDC//a의 분석delete 0012FF44//반환값의 분석Test//선분석 재집행 출력,상술한 결론을 증명하였다
예4.본례는 마찬가지로 예2와 대비한다
class A
{
	int x;
public:
	A(int i):x(i){cout<<"construct     "<<this<<endl;}
	A(const A& a){x = a.x;cout<<"copy     "<<this<<endl;}
	~A(){cout<<"delete     "<<this<<endl;}
	int get(){return x;}
};
A func()
{
	A a(23);
	return a;
}
int main()
{
	A *r = &func();
	cout<<r->get()<<endl;
	return 0;
}

출력:
construct 0012FED4//a의 구조copy0012FF40//반환값의 구조delete0012FED4//a의 분석delete0012FF40//반환값의 분석23//사실 r가 가리키는 대상은 이미 분석되었다
설명:
&func () 는func () 의 반환값에 대한 주소를 찾는 것을 의미합니다.따라서 r가 가리키는 대상은 반환값(즉 a의 던전)이다.
예2와 달리 인용은 되돌아오는 수명을 연장할 수 있지만 지침은 안 된다.
왜 분석했는데도 정확한 값을 출력할 수 있습니까?
분석 함수가 어떤 대상을 분석한 후에 컴파일러에게 이 메모리가 대상에 의해 독점되지 않는다는 것을 알려주었기 때문이다.너는 그것을 방문할 수 있고, 다른 대상도 그것을 방문할 수 있다.
이 메모리가 다른 데이터에 덮어씌워지지 않았을 때, 원본 데이터는 삭제되지 않았다.
 
예5.
class A
{
	int x;
public:
	A(int i):x(i){cout<<"construct     "<<this<<endl;}
	A(const A& a){x = a.x;cout<<"copy     "<<this<<endl;}
	~A(){cout<<"delete     "<<this<<endl;}
	int get(){return x;}
};
A func()
{
	A *p = new A(23);
	return *p;
}
int main()
{
	A &r = func();
	cout<<r.get()<<endl;
	return 0;
}

출력:construct 00251DF8//a의 구조copy0012FF34//반환값의 구조23delete0012FF34//반환값의 분석.인용이 반환값의 수명을 연장시켰다는 해석: 예2를 읽으면 본 문제의 출력이 잘 이해된다.구조의 새로운 대상을 분석할 수 없어 메모리 유출을 초래하다
 
예6.
class A
{
	int x;
public:
	A(int i):x(i){cout<<"construct     "<<this<<endl;}
	A(const A& a){x = a.x;cout<<"copy     "<<this<<endl;}
	~A(){cout<<"delete     "<<this<<endl;}
	int get(){return x;}
};
A& func()
{
	A *p = new A(23);
	return *p;
}
int main()
{
	A &r = func();
	cout<<r.get()<<endl;
	A *pa = &r;
	delete pa;
	cout<<r.get()<<endl;
	return 0;
}

출력: construct 004B1DF8 23 delete 004B1DF8 - 5726307 설명: 값에 따라 되돌아오기 때문에 r는 p가 가리키는 이름 없는 공간의 별명입니다.포인터p는 사라졌지만 새로운 포인터를 주었다. 즉paL17과 L19의 &r는 다르다.L17은 r가 별명이라는 것을 설명하기 위한 것이다.L19는 r에 대한 주소를 표시하기 때문에 r는 이름이 없는 공간의 이름이고pa는 r를 가리키는 지침이다.파를 방출하면 r도 공인용이 된다
 
예7:
class A
{
	int x;
public:
	A(int i):x(i){cout<<"construct     "<<this<<endl;}
	A(const A& a){x = a.x;cout<<"copy     "<<this<<endl;}
	~A(){cout<<"delete     "<<this<<endl;}
	int get(){return x;}
	void set(int i){x = i;}
};
A& func(A &a)
{
	a.set(99);
	return a;
}
int main()
{
	A *p = new A(23);
	cout<<p->get()<<endl;
	func(*p);
	cout<<p->get()<<endl;
	delete p;
	return 0;
}

출력:construct 00701DF8 23 99 delete 00701DF8 설명: 인용 참조에 따라 p가 가리키는 대상 = r가 인용한 대상 = 반환 값 반환 값은 사실 쓸모가 없고 반환 값이 없습니다. 결과도 마찬가지입니다.
8. 함수가 값에 따라 이 함수에 만들어진 창고의 대상을 되돌릴 때 이 대상을 이 함수를 호출하는 역할 영역으로 복사합니다.복제 대상의 작업이 끝난 후, 이어서 분석 함수를 호출하여 복제 대상을 삭제합니다.만약에 바늘로 수신하면 함수가 되돌아온 후에 대상과 복본이 분석되고 부본의 메모리 주소가 바늘에게 되돌아온다. 이 주소의 데이터가 덮어쓰이기 전에 바늘은 이 데이터에 접근할 수 있다. 주소에 따라 무더기의 대상을 되돌려주고 인용으로 수신할 때 인용의 주소를 저장하는 바늘이 필요하다. 이 바늘은 대상을 삭제하는 데 사용된다.

좋은 웹페이지 즐겨찾기