2013-04-09 5 views
-1

여기에 CMyString이라는 클래스에 대해 = 할당을 기본적으로 구현하는 코드가 있으며 코드가 맞습니다.연산자에 대한 C++ 인터뷰

CMyString& CMyString::operator =(const CMyString &str) { 
if(this == &str) 
    return *this; 

delete []m_pData; 
m_pData = NULL; 

m_pData = new char[strlen(str.m_pData) + 1]; 
strcpy(m_pData, str.m_pData); 

return *this; 
} 

인스턴스는 참조로 전달되며, 첫 번째 'if'는 전달 된 인스턴스가 자체인지 여부를 확인합니다. 내 질문은 : &str을 사용하여 비교하는 이유는 무엇입니까? str에 인스턴스의 주소가 이미 포함되어 있지 않습니까? 아무도이 라인이 어떻게 작동하는지 설명 할 수 있습니까?

또한 단지 this에 개체 주소가 포함되어 있는지 확인하고 싶습니다. 정확합니까? str에 이미되지

+0

제안은 중위는 만들 수는 할당 작업 execption를 저장하기 위해 그것의 더 나은을 추구한다 임시 포인터에서 m_pData 끝에 임시 포인터를 삭제하므로 m_pData = new에 대한 메모리 할당시에도 예외가 발생합니다. char [strlen (str.m_pData) + 1]; 원본 개체 데이터가 안전합니다. CMyString & CMyString :: operator = (const CMyString & str) { if (this == & str) return * this; char * temp = m_pData; m_pData = new char [strlen (str.m_pData) +1]; strcpy (m_pData, str.m_pData); delete [] temp; 임시 = NULL; return * this; } – shivakumar

+0

나는 기능적이지만 예외 처리를하지 않을 것을 생각하고 있었지만 실제로는 내가 여기에 관한 것이 아니지만 ... 어쨌든 – fiftyplus

답변

1

Address-of OperatorReference Operator이 다릅니다..

&은 주소 선언자 이외에 참조 선언자로 C++에서 사용됩니다. 의미는 동일하지 않습니다.

int target; 
int &rTarg = target; // rTarg is a reference to an integer. 
         // The reference is initialized to refer to target. 
void f(int*& p);  // p is a reference to a pointer 

참조의 주소를 가져 가면 해당 주소가 반환됩니다. 이전 선언을 사용하면 & rTarg는 & 대상과 동일한 메모리 주소입니다.

4

인스턴스에 대한 참조가 오브젝트 자체

번호의 주소를 포함한다. 개체에 대한 포인터가 아닙니다. .

(I. 전자는 함수의 선언, &str에서 "str 참조"및 하지 "str의 주소"의 약자 - 함수가 같이 선언하면 잘 될 것입니다 무슨 얘기 이 :

CMyString& CMyString::operator =(const CMyString *str); 

만이 아닌)

+0

후속 질문 : – fiftyplus

+0

에 대한 차이점이 있습니다. C와 C++ 사이의 참조로 전달, C에서 참조는 & a를 사용하여 전달되며이 포인터에 저장된 값에 액세스하는 데 동일한 유형의 포인터가 사용됩니다. 하지만 C++처럼 보이고 & a를 사용할 필요가 없으며 그냥 a를 사용할 수 있으며 매개 변수는 참조 유형이어야합니다. 내 경우에는 (CMyString & str)입니다. 그래서 str 객체가 전달 될 때이 참조 유형이 정확히 무엇을 의미합니까? 원래의 것과 똑같은가요? 이 참조 형식 개체의 사용법은 값 형식 개체와 매우 유사하게 보입니다. 감사합니다 – fiftyplus

+2

@fifty C에는 참조가 없습니다. C에는 포인터가 있습니다. C에서 foo (& a)를 사용하면 a에 대한 포인터를 전달하고 foo의 서명은 foo (type_of_a *)입니다. C++에서는 똑같은 일을 할 수 있으며 참조별로 전달할 수 있습니다. foo의 서명은 foo (type_of_a &)가되어 foo (a)로 사용됩니다. 여기서 a는 포인터가 아니며 참조 용입니다. H2CO3이 말했듯이 참조는 객체 자체입니다. 이 참조는 객체를 사용하는 것처럼 사용합니다. 귀하의 혼동을 설명 할 수있는 연산자 Jermaine Xu의 답변을 참조하십시오. – undu

0

str참조으로 전달되므로 주소가 아닌 실제 개체가 포함되어 있습니다. this은 메서드가 호출되는 클래스에 대한 포인터이므로 전달할 개체가 동일한 개체인지 여부를 비교하려면 비교할 주소를 str으로 가져와야합니다.

&은 사용되는 위치에 따라 다르게 동작합니다. in 문에서는 적용 대상에 대한 주소를 가져 오는 것을 의미합니다. 반면에 선언에서 사용되는 경우 선언 된 객체는 참조입니다.

는 다음과 같은 예를 생각해

int i = 42; 
int & refToI = i; // A reference to i 
refToI = 99; 
std::cout << i; // Will print 99 

int j = 42; 
int * pJ = &j; // A pointer to j 
*pJ = 99; 
std::cout << j; // Will print 99 

this 인스턴스에 대한 포인터, 그래서 네,이 주소가 포함되어 있습니다.

전달 된 객체가 this 인 지 확인하는 전체 요점은 불필요한 (또는 아마도 파괴적인) 할당을 피하기위한 것입니다.

0

실제로 가변 참조 - 형식 이름 뒤에 기호 &으로 표시되는 경우 일반적으로 기본 구현은 포인터이지만 C++ 표준에서는 겉으로는 지정하지 않습니다.

어쨌든 구문 수준에서 동일한 유형의 참조되지 않은 값처럼 참조가 사용됩니다. 보다 엄격하게 말하자면 :

변수의 유형이 인 경우, 유형이 T 인 것처럼 사용되어야합니다.

는 (화살표 연산자 중 과부하없이) str.someMethod()하지 str->someMethod()를 작성해야하는 경우는 값의 주소를 구하는 &를 사용한다. 즉, 참조는 포인터가 아닌 변수의 별칭과 비슷하거나 비슷합니다. 참조와 포인터에 대한 자세한 내용은

참조 이러한 질문 :