crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Тема закрытаНачать новую тему
> приватная статическая переменная-член класса, требуется разъяснение
Litkevich Yuriy
  опции профиля:
сообщение 4.5.2008, 18:42
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Есть такой код, у Шилдта:
#include <iostream>
using namespace std;

class shared {
  static int a;
  int b;
public:
  void set(int i, int j) {a=i; b=j;}
  void show();
};

int shared::a; // define a

void shared::show()
{
  cout << "This is static a: " << a;
  cout << "\nThis is non-static b: " << b;
  cout << "\n";
}

int main()
{
  shared x, y;
  
  cout << "====X===\n";
  x.set(1, 1); // set a to 1
  x.show();
  
  cout << "====Y===\n";
  y.set(2, 2); // change a to 2
  y.show();

  cout << "=show X=\n";
  x.show(); /* Here, a has been changed for both x and y
               because a is shared by both objects. */

  return 0;
}

Он работает, но я не понимаю такую строчку int shared::a;, ведь она приватная т.е. ее недолжно быть видно, как мы можем ее так объявить вне класса?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.5.2008, 19:28
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


1. Статические члены - и функции и данные - должны быть где-то определены. В данно примере:
Объявление
static int a;

Определение
int shared::a; // define a
не обязательно данную переменную инициализировать так как она и так по умолчанию должна установиться в 0 (это по стандарту, если мне не изменяет память).

2. Почему же ее не должно быть видно? Просто ключевым словом private мы говорим, что данная переменная закрыта для доступа от всех, даже для производных от данного класса класов. Другими словами, делаем так, что мы могли работать с данной переменной членом только в данном классе и не хотим, чтобы ее кто-то мог "испортить". Вот и все. ":)

Сообщение отредактировал ViGOur - 4.5.2008, 19:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.5.2008, 19:44
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


т.е. мы можем определить ее в не класса, и больше ничго в не класса сней сделать будет нельзя?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.5.2008, 20:54
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Угу, можно определять вне класса, только ничего сделать с ней нельзя будет в другом классе или функции не относящейся к этому классу.
Например:
class CSample
{
   void TestSample();
private:
   static int m_a;
protected:
   static int m_b;
public:
   static int m_c;
};

int CSample::m_a;
int CSample::m_b;
int CSample::m_c;

void CSample::TestSample()
{
   CSample::m_a=1; // можно
   CSample::m_b=1; // можно
   CSample::m_c=1; // можно
}

class CTest: public CSample
{
   void TestSample();
};

void CTest::TestSample()
{
   CSample::m_a=1; // нельзя
   CSample::m_b=1; // можно
   CSample::m_c=1; // можно
}

void main()
{
   CSample::m_a=1; // нельзя
   CSample::m_b=1; // нельзя
   CSample::m_c=1; // можно
}
Читай книжки по С++, там это описывается достаточно хорошо. ;)

Сообщение отредактировал ViGOur - 4.5.2008, 20:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.5.2008, 20:57
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я думал что и определить приватную нельзя, но это видимо исключение только для статик? если бы она не была статик, можно ли было бы ее так определить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 4.5.2008, 21:13
Сообщение #6


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Так, нельзя. Так как к не статической переменной члену таким образом обращатся просто по определению нельзя. :)
Если она не константная, для константной переменной члена также требуется определение и прочее как у статической.

Сообщение отредактировал ViGOur - 4.5.2008, 21:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.5.2008, 21:21
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


угу, понял.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 7:47