![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Путаюсь, что где лежит.
static переменные\методы лежат в описаниях классов - в экземплярах их нет. Где лежат protected переменные\методы? Так же в классах или их экземплярах? В классах\подклассах или их экземплярах? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Это ты сравниваешь теплое с мягким. Protected - это спецификация доступности. Protected члены могут быть и static, так что "лежать" могут где угодно.
-------------------- ... |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
Earnest, static - специальное указание, что переменная\метод лежит в классе, а не в его экземплярах, все остальные переменные\методы дублируются по экземплярам. И, значит, существуют и в экземплярах классов-наследников?
Это сообщение отредактировал(а) Gunslinger - 6.10.2009, 15:15 |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
Gunslinger, метод вообще нигде не "лежит". Метод это просто участок байт (код). Обычно для методов членов класса препологается что в стек компилятор сам будет класть указатель на данные (this) экземпляра класса, а далее метод будет работать с данными используя формулу this+offset (где offset это смещение от this (указатель на поле в классе), вычисляемое на этапе линковки).
Статические методы это просто методы, которые можно рассматривать как глобальные функции просто. Аналогично статические поля - это глобальные участки памяти, адресация к которым производится по их конкретному вирт адресу (почти всегда), вычисленному на этапе линковки, а не по формуле this+offset -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
Gunslinger, private\protected\public - это лишь указание компилятору ((!)не линковщику) что мол "к этому элементу прямой доступ (по имени) запрещен". Т.е. проверка для программиста по большому счету. Ничем отличие от публичных данных или методов в итоге (в бинарнике) не будет - все теже адреса останутся, только т.к. вы к ним не обращались "из вне" класса (иначе не скомпилит компилятор) (в случае приватных данных например), то и в бинарики не будет прямых указаний на эти области памяти из методов других классов например. Вот и всё.
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Так же стоит отметить что линковка у static члена или метода класса динамическая. Т.е. к этому инстансу можно обращаться из разных модулей. В отличии от значения квалификатора static для глобальных функций и переменных, которые будут у каждого модуля "свои".
Указания компилятору как расценивать обращения к именам в теле класса. public: - доступ открыт для всех, protected: - только для наследников, private - никому кроме меня даже знать не положено. -------------------- вопросов больше чем ответов |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
||||
|
||||
| niXman |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 211 Регистрация: 4.7.2009 Репутация: 0 Всего: 0 |
Верно. Вот тут не понял. --------------------
if ( !c++ ) { *power--; this->wussiness += 10;} |
|||
|
||||
| Gunslinger |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: 1 Всего: 3 |
То есть, будто protected как static - доступны только в классе, и классы-наследники получают доступ к protected этого класса. Хотя это не так. Пример (псевдокод).
Теперь экземпляры класса А могут обращаться к другим экземплярам класса А, а также экземплярам класса В. Экземпляры класса В - к другим экземплярам класса В и экземплярам класса А. |
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Это сообщение отредактировал(а) Леопольд - 7.10.2009, 10:34 -------------------- вопросов больше чем ответов |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Gunslinger, тебе уже сказали, что static и protected вообще сравнивать нельзя. static говорит, что атрибут/метод будет единым для всех экземляров класса. А protected - то что доступ к атрибуту будут иметь только методы этого класса и его потомков.
Например, в семье есть один автомобиль, а водить его можешь только ты и твой отце. Итого, автомобиль protected (отец и сын имеют доступ) и static (общий) одновременно. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |