2013-04-09 2 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; 
} 

Экземпляр передается по ссылке, а первый «если» проверяет, является ли экземпляр переданным сам или нет. Мой вопрос: почему он использует &str для сравнения, не str уже содержат адрес экземпляра? Может ли кто-нибудь объяснить, как работает эта линия?

Кроме того, я просто хочу убедиться, что this содержит адрес объекта: Это правильно?

+0

Предложения, Симметричный сделать операцию присваивания execption SAFTY Его лучше хранить m_pData в временном указателе удаляет указатель temp в конце, чтобы даже исключение происходило при распределении памяти для 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 = новый символ [strlen (str.m_pData) + 1]; strcpy (m_pData, str.m_pData); delete [] temp; temp = NULL; возвращение * это; } – shivakumar

+0

Я знаю, что я думал о том, чтобы положить что-то вроде функционального, но без обработки исключений, но это не совсем то, что я касаюсь здесь ... но спасибо в любом случае – fiftyplus

ответ

1

Address-of Operator и Reference 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

не Str уже содержит адрес экземпляра

№ А ссылка сам объект. Это не указатель на объект. .

(I. е, в объявлении функции, &str означает «ссылки на str» и не «адрес str» - то, что вы говорите о том, будет правильно, если функция была объявлена ​​как это:

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

, но это не так)

+0

следующий вопрос: – fiftyplus

+0

только что выяснили, что есть разница в передайте по ссылке между C и C++, в C, ссылка передается с помощью & a, и указатель того же типа будет использоваться для доступа к значению, хранящемуся в этом указателе. Но, похоже, на C++ нет необходимости использовать & a, он может просто использовать a, а параметр должен быть ссылочным типом. который в моем случае (CMyString & str). поэтому, когда объект str передается, что означает этот ссылочный тип? это то же самое, что и оригинальное? похоже, что использование этого ссылочного типа объекта очень похоже на объект типа значения. Thanks – fiftyplus

+2

@fifty C не имеет ссылок. C имеет указатели. Когда вы используете foo (& a) в C, вы передаете указатель на a, а подпись foo - foo (type_of_a *). В C++ вы можете сделать то же самое, плюс pass-by-reference. Подпись foo становится foo (type_of_a &), и вы используете ее как foo (a). Здесь a не является указателем, это ссылка. Как сказал H2CO3, ссылка является самим объектом. Вы используете эту ссылку, поскольку будете использовать объект. См. Ответ Jermaine Xu на оператора &, который может объяснить ваше замешательство. – undu

0

str Передано оператором присваивания ссылка, поэтому он содержит фактический объект, а не его адрес. A this - это указатель на класс, на который вызывается метод, поэтому, если вы хотите сравнить, передал ли объект-объект тот же самый объект, он должен получить адрес str для сравнения.

Обратите внимание, что & ведет себя по-разному, в зависимости от того, где он используется. Если в инструкции, это означает получение адреса к объекту, к которому он применяется. С другой стороны, если он используется в декларации, это означает, что объявленный объект является ссылкой .

Рассмотрим следующий пример:

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 &, то он должен использоваться, как если бы он был типа T.

Если вы должны написать str.someMethod() и не str->someMethod() (без какой-либо перегрузки оператора стрелки), то вы должны использовать & для получения адреса значения. Другими словами, ссылка более или менее похожа на псевдоним переменной, а не на указатель.

Для получения дополнительной информации о ссылках и указателях, см этих вопросов:

Смежные вопросы