Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static, protected, что в классе, что в экземплярах? 
V
    Опции темы
Gunslinger
Дата 6.10.2009, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Путаюсь, что где лежит. 
static переменные\методы лежат в описаниях классов - в экземплярах их нет. 
Где лежат protected переменные\методы? Так же в классах или их экземплярах? В классах\подклассах или их экземплярах?
PM MAIL   Вверх
Earnest
Дата 6.10.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Это ты сравниваешь теплое с мягким. Protected - это спецификация доступности. Protected члены могут быть и static, так что "лежать" могут где угодно.


--------------------
...
PM   Вверх
Gunslinger
Дата 6.10.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Earnest, static - специальное указание, что переменная\метод лежит в классе, а не в его экземплярах, все остальные переменные\методы дублируются по экземплярам. И, значит, существуют и в экземплярах классов-наследников?

Это сообщение отредактировал(а) Gunslinger - 6.10.2009, 15:15
PM MAIL   Вверх
jonie
Дата 6.10.2009, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Gunslinger, метод вообще нигде не "лежит". Метод это просто участок байт (код). Обычно для методов членов класса препологается что в стек компилятор сам будет класть указатель на данные (this) экземпляра класса, а далее метод будет работать с данными используя формулу this+offset (где offset это смещение от this (указатель на поле в классе), вычисляемое на этапе линковки).

Статические методы это просто методы, которые можно рассматривать как глобальные функции просто.
Аналогично статические поля - это глобальные участки памяти, адресация к которым производится по их конкретному вирт адресу (почти всегда), вычисленному на этапе линковки, а не по формуле this+offset


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Gunslinger
Дата 6.10.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(jonie @  6.10.2009,  15:20 Найти цитируемый пост)
метод вообще нигде не "лежит". Метод это просто участок байт (код). 

Я это знаю, просто мне так проще.

А теперь про  protected, пожалуйста.
PM MAIL   Вверх
jonie
Дата 6.10.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Gunslinger, private\protected\public - это лишь указание компилятору ((!)не линковщику) что мол "к этому элементу прямой доступ (по имени) запрещен". Т.е. проверка для программиста по большому счету. Ничем отличие от публичных данных или методов в итоге (в бинарнике) не будет - все теже адреса останутся, только т.к. вы к ним не обращались "из вне" класса (иначе не скомпилит компилятор) (в случае приватных данных например), то и в бинарики не будет прямых указаний на эти области памяти из методов других классов например. Вот и всё.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Леопольд
Дата 6.10.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Так же стоит отметить что линковка у static члена или метода класса динамическая. Т.е.  к этому инстансу можно обращаться из разных модулей. В отличии от значения квалификатора static для глобальных функций и переменных, которые будут у каждого модуля "свои".


Указания компилятору как расценивать обращения к именам в теле класса.
public: - доступ открыт для всех,
protected: - только для наследников,
private - никому кроме меня даже знать не положено.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Gunslinger
Дата 7.10.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(Леопольд @  6.10.2009,  20:15 Найти цитируемый пост)
protected: - только для наследников

Вот здесь путаюсь: под наследниками понимаю классы. То есть обращение как будто к классу, а не к экземпляру. 
PM MAIL   Вверх
niXman
Дата 7.10.2009, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 0
Всего: 0



Цитата(Gunslinger @  7.10.2009,  06:29 Найти цитируемый пост)
под наследниками понимаю классы

Верно.

Цитата(Gunslinger @  7.10.2009,  06:29 Найти цитируемый пост)
То есть обращение как будто к классу, а не к экземпляру.

Вот тут не понял.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Gunslinger
Дата 7.10.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

Репутация: 1
Всего: 3



Цитата(niXman @  7.10.2009,  08:36 Найти цитируемый пост)
Цитата(Gunslinger @  7.10.2009,  06:29 Найти цитируемый пост)
То есть обращение как будто к классу, а не к экземпляру.

Вот тут не понял.

То есть, будто protected  как static - доступны только в классе, и классы-наследники получают доступ к protected этого класса. Хотя это не так. Пример (псевдокод). 
Код

class А{
  protected: 
                int d;
                void funcd(int d);
}
 
class B :A{
    protected:
                  int g;
                  void funcg(int g);
} 

Теперь экземпляры класса А могут обращаться к другим экземплярам класса А, а также экземплярам класса В. Экземпляры класса В - к другим экземплярам класса В и экземплярам класса А.
PM MAIL   Вверх
Леопольд
Дата 7.10.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Код

#include <iostream>

class A{
protected:
    int field;

public:
    A(int field_): field(field_) {}
};

class B: public A{
public:
    B(int field_): A(field_) {}
    B(const A& ref): A(ref) {}

    void print() const{
        std::cout<<field<<std::endl;
    }
};

class C{
private:
    A a;

public:
    C(): a(2) {}

    void print() const{
//        std::cout<<a.field<<std::endl;    //ошибка
        B& ref = (const B)(a);            //так делать нельзя! хоть и работет.
        ref.print();
    }
};

int main(){
    A a(0);
//    std::cout<<a.field;        //ошибка
    B b(1);
    b.print();

    C c;
    c.print();
}


Это сообщение отредактировал(а) Леопольд - 7.10.2009, 10:34


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 7.10.2009, 12:41 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Gunslinger, тебе уже сказали, что static и protected вообще сравнивать нельзя. static говорит, что атрибут/метод будет единым для всех экземляров класса. А protected - то что доступ к атрибуту будут иметь только методы этого класса и его потомков.

Например, в семье есть один автомобиль, а водить его можешь только ты и твой отце. Итого, автомобиль protected (отец и сын имеют доступ) и static (общий) одновременно.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1927 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.