Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2013, 13:06   #1
Юлия Набиева
Новичок
Джуниор
 
Регистрация: 06.03.2013
Сообщений: 2
По умолчанию Ключевое слово в с++

Для чего нужно ключевое слово this?
Юлия Набиева вне форума Ответить с цитированием
Старый 12.03.2013, 13:22   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Указатель на адрес экземпляра объекта. Весьма полезно при пересечении имен, например (когда поле класса и параметры метода одинаково названы).

Вас в поисковых системах забанили?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 12.03.2013 в 13:26.
Sciv вне форума Ответить с цитированием
Старый 12.03.2013, 13:24   #3
Ezhik Kihze
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 639
По умолчанию

А прочитать? Это указатель на текущий объект.
ICQ: 677936656 Gmail: ekEmbed@gmail.com
Ezhik Kihze вне форума Ответить с цитированием
Старый 12.03.2013, 14:36   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Для чего нужно ключевое слово this?
При вызове нестатических методов класса, помимо явно заданных аргументов, методу передаётся ещё один, "невидимый" аргумент - указатель на тот экземпляр класса, для которого метод был вызван. Встречая в теле такого метода идентификаторы, компилятор может трактовать их как поля этого объекта, поэтому this не нужно вставлять на каждый чих. Однако в некоторых случаях он нужен.
Вот как (примерно) выглядел бы класс MyString, если бы методы не принимали "невидимых" аргументов:
Код:
struct MyString{
private:
  char* m_str;
public:
  MyString MyString_Constructor(const char* c);
  size_t getLength(const MyString* thiz);
  char& ElementAt(size_t position, MyString* thiz);
  MyString& Assign(const MyString& other, MyString* thiz);
  void Destruct(MyString* thiz);
};

MyString MyString::MyString_Constructor(const char* c){
  MyString thiz;
  thiz.m_str = new char[strlen(c)+1];
  strcpy(thiz.m_str, c);
  return thiz;
}

size_t MyString::getLength(const MyString* thiz){
  return strlen(thiz->m_str);
}

char& MyString::ElementAt(size_t position, MyString* thiz){
  static char trash = '\0';
  if(position<getLength(thiz)) return thiz->m_str[position];
  else return trash;
}

MyString& MyString::Assign(const MyString& other, MyString* thiz){
  if(&other == thiz) return *thiz;
  delete[] thiz->m_str;
  thiz->m_str = new char[getLength(&other)+1];
  strcpy(thiz->m_str, other.m_str);
  return *thiz;
}

void MyString::Destruct(MyString* thiz){
  delete[] thiz->m_str;
  thiz->m_str = NULL;
}

//Использование
MyString s = MyString_Constructor("Sample");
MyString s2 = MyString_Constructor("Other sample");
std::cout << MyString::getLength(&s) <<std::endl;
MyString::Assign(s, &s2); //s2 is "Sample"
MyString::ElementAt(1, &s) = 'i'; //s1 is "Simple"
А теперь то же самое, но в "нормальном" C++ (обратите внимание на const в getLength()!) :
Код:
class MyString{
private:
  char* m_str;
public:
  explicit MyString(const char* c);
  size_t getLength(void) const;
  char& ElementAt(size_t position);
  MyString& Assign(const MyString& other);
  ~MyString();
};

MyString::MyString(const char* c){
  m_str = new char[strlen(c)+1];
  strcpy(m_str, c);
}

size_t MyString::getLength() const{
  return strlen(m_str);
}

char& MyString::ElementAt(size_t position){
  static char trash = '\0';
  if(position<getLength()) return m_str[position];
  else return trash;
}

MyString& MyString::Assign(const MyString& other){
  if(&other == this) return *this;
  delete[] m_str;
  m_str = new char[other.getLength()+1];
  strcpy(m_str, other.m_str);
  return *this;
}

MyString::~MyString(){
  delete[] m_str;
  m_str = NULL;
}

//Использование
MyString s = MyString("Sample");
MyString s2 = MyString("Other sample");
std::cout << s.getLength() <<std::endl;
s2.Assign(s); //s2 is "Sample"
s.ElementAt(1) = 'i'; //s1 is "Simple"
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ключевое слово out в вызове функции. Указатели Cerebrum C# (си шарп) 3 14.01.2012 00:25
зачем нужно ипользовать ключевое слово super? Syltan Общие вопросы по Java, Java SE, Kotlin 16 20.05.2010 19:06
MSVC++: ключевое слово operator Пепел Феникса Общие вопросы C/C++ 2 20.10.2009 21:32
Ключевое поле Artruman БД в Delphi 1 10.04.2009 10:02