다음 코드를 작성했습니다.
#include <iostream>
using namespace std;
const int * myFunction()
{
int * p = new int(5);
return p;
}
int main()
{
int * q = myFunction();
cout << "*q=" << *q;
cout << endl;
return 0;
}
오류를 수신하기 위해 의도적으로 위의 코드를 작성했습니다. 내가 만든 실수는 내가 함수의 반환 형식 진술이다 myFunction()
등을 const int *
하지만, 내가 전화했을 때 myFunction()
에 main()
, 포인터 변수가 q
선언되지 않았습니다 const
. 의 반환 유형은 myFunction()
반환 값을받을 변수 유형과 정확히 일치해야합니다 (여기에서 수정 했습니까? 이것이 내가 이해 한 것입니다).
그래서 11 번 줄을 const int * q = myFunction();
. 이제 (pointer) 변수의 유형 q
, 즉 const int *
반환 유형과 정확히 일치 myFunction()
하고 코드가 오류없이 컴파일되어 출력을 생성합니다 *q=5
(이 시점까지 내 이해가 맞습니까?).
그런 다음 다음 코드를 작성했습니다.
#include <iostream>
using namespace std;
const int * const myFunction()
{
int * p = new int(5);
cout << "p: " << p;
return p;
}
int main()
{
int a;
const int * q = myFunction();
cout << "\nq=" << q;
cout << "\n*q=" << *q;
delete q;
q = &a;
cout << "\nq: " << q;
cout << endl;
return 0;
}
여기에서도 오류가 발생할 것으로 예상했습니다. 이제 반환 유형은 myFunction()
is const int * const
but the (pointer) variable q
has type const int *
. q
상수 포인터로 선언되지 않았습니다. 그러나 프로그램이 컴파일되고 다음과 같은 출력이 나타납니다.
p : 0x36cb8 q = 0x36cb8 * q = 5 q : 0x61ff08
두 번째 코드가 왜 컴파일되고 실행되는지 혼란 스럽습니다. 내가 생각한 것은 반환 값을받을 사람은 myFunction()
항상 처리해야한다는 것입니다 (즉, 다른 메모리 주소를 사용할 수 없음). 그러나 포인터 변수 q
는 다른 메모리 위치를 사용했습니다.
myFunction의 반환 유형은 반환 값을받을 변수 유형과 정확히 일치해야합니다. (제가 여기에서 맞습니까? 이것이 제가 이해 한 것입니다.)
아니요, 반환 유형은 변수 유형과 정확히 일치하지 않아야합니다. 그러나 반환 유형을 변수 유형으로 암시 적으로 변환 할 수 있어야합니다. 예를 들어 다음과 같은 내용이 컴파일됩니다.
int someInt = getMeAFloat();
경우 getMeAFloat
반환 A를 float
A를하기 때문에,이 컴파일 float
암시 적으로 변환 할 수 있습니다 int
. (이는 경고를 제공하며의 추가 정보를 잃어 버리기 때문에 나쁘지만 float
제 요점을 전달하려고합니다.)
일반적으로 a const int*
는 int*
.
user4581301이 지적했듯이 const
두 번째 예제에서 두 번째는 중요하지 않습니다. 반환 된 포인터의 값만 주 함수의 포인터에 할당되기 때문입니다. 두 번째 const
는 포인터 자체를 일정하게 만들어 값에 영향을주지 않습니다. 그 수단 const int * const myFunction()
같다const int * myFunction()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다