Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/41: Рейтинг темы: голосов - 41, средняя оценка - 4.78
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
1

Static члены класса

05.01.2016, 08:43. Показов 7837. Ответов 70
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

есть класс, например

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
point
{ 
public:
    float x;
    float y;
 
    static distance (point A, point B) 
    {
        float dx = A.x - B.x;
        float dy = A.y - B.y;
        return sqrt(dx*dx + dy*dy);
    } 
}
static получается совместно разделяемым, те будет выделена память под distance один раз и все объекты point будут этой функцией пользоваться?
Например:
C++
1
2
3
4
point A;
point B;
cout << A.distance(A,B);
cout << B.distance(A,B);// будет использоваться одна функ в 1-ом и 2-ом случае, те одна область памяти?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2016, 08:43
Ответы с готовыми решениями:

класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции)
Помогите пожалйуста с реализацией программы... Реализовать класс «Строка» (данные-члены класса –...

Static члены классов
Доббрый день. Хочу решить следующую задачу: посчитать количество сравнений, которое делает...

Static член класса
Всем привет! Подскажите, пожалуйста, почему так писать нельзя: В хедере объявляю статический...

Static-член класса
Подскажите пожалуйста в чем проблема, не получается инициализировать static-член указатель на...

70
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
08.01.2016, 17:47 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от SergioO Посмотреть сообщение
на данный момент вопросов больше не имею
Вот на этой мажорной ноте и остановимся.

Добавлено через 22 часа 57 минут
Тема открыта по просьбе автора. Убедительная просьба ко всем ораторам - высказываться по существу, в манере доброжелательной и уважительной.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
08.01.2016, 18:54  [ТС] 62
gru74ik, спасибо.

есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class shared {
static int a;
};
 
int shared::a=1;
 
 
int main() {
 
// какой-то код
    return 0;
 
}
правильно я понимаю, что в таком случае с "переменной" a ничего больше не получится сделать?

Добавлено через 18 минут
стр 142 стандарта ISO/IEC 14882:2014(E) - С++14
так вот, там примеры когда пары приводятся. с английским не совсем плохо, но в данном случае надо предмет понимать.
The linkages implied by successive declarations for a given entity shall agree. That is, within a given scope,
each declaration declaring the same variable name or the same overloading of a function name shall imply
the same linkage. Each function in a given set of overloaded functions can have a different linkage, however.
[ Example:
static char* f(); // f() has internal linkage
char* f() // f() still has internal linkage
{ /∗ ... ∗/ }

....................
поясните что имеется в виду в этих примерах, пожалуйста, а то переводить вроде перевожу, а смысла нет
что говорится о линковке и что линковка может быть внешняя(external) и внутренняя(internal) я понимаю, а почему приводятся два примера к ряду и типа f() // still has internal linkage
Each function in a given set of overloaded functions can have a different linkage, however.
можно пояснить более подробно эти примеры. зачем два раза одну функцию объявлять или это имеется в виду что вторая перегружена?
0
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
08.01.2016, 18:54 63
Цитата Сообщение от SergioO Посмотреть сообщение
правильно я понимаю, что в таком случае с "переменной" a ничего больше не получится сделать?
Если имеется в виду, что переменная закрыта в private класса shared, то да.
А так, из самого класса shared, будь у него еще какие-то функции, вполне можно что-то сделать.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
08.01.2016, 18:57  [ТС] 64
Цитата Сообщение от DrOffset Посмотреть сообщение
Если имеется в виду, что переменная закрыта в private класса shared, то да.
А так, из самого класса shared, будь у него еще какие-то функции, вполне можно что-то сделать.
так в классе же ничего нет, те спосбоа к ней обратиться, а всякими shared::, тк она в private нельзя вот и получается что никак несмотря на то, что она static.
0
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
08.01.2016, 19:06 65
Цитата Сообщение от SergioO Посмотреть сообщение
зачем два раза одну функцию объявлять или это имеется в виду что вторая перегружена?
Объявлений может быть сколько угодно, а определение одно (ODR). В данном случае это просто несколько объявлений одной и той же функции, а не перегрузка.
Так вот, в стандарте говорится, что при наличии нескольких объявлений, где сначала указан один тип связывания (внутреннее связывание, посредством static), а затем явно не указан (по умолчанию внешнее связывание), то второе объявление соответствует первому, т.е. тоже имеет внутреннее связывание, в данном случае.
При этом цитата:
Цитата Сообщение от SergioO Посмотреть сообщение
Each function in a given set of overloaded functions can have a different linkage, however.
Говорит о том, что каждый набор перегруженных функций может иметь разные типы связывания. Т.е. например
C++
1
2
static void foo(); // внутреннее связывание
void foo(char *); // внешнее связывание
0
6 / 6 / 1
Регистрация: 27.12.2014
Сообщений: 67
08.01.2016, 19:06 66
Цитата Сообщение от SergioO Посмотреть сообщение
так в классе же ничего нет, те спосбоа к ней обратиться, а всякими shared::, тк она в private нельзя вот и получается что никак несмотря на то, что она static.
Private не соседствует со static. Private это спецификатор доступа, а static спецификатор способа хранения в памяти, так сказать.
Такое ощущения, что вы пытаетесь их связать их как-то вместе.
Было бы здорово, если бы вы объяснили, что вас смущает в static.
0
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
08.01.2016, 19:07 67
Цитата Сообщение от SergioO Посмотреть сообщение
так в классе же ничего нет
Я вообще-то про это и написал.
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
08.01.2016, 19:25  [ТС] 68
static char* f(); // f() has internal linkage
char* f() // f() still has internal linkage
{ /∗ ... ∗/ }
те если static указали в первый раз, то в данном случае линковка только internal, те судя по всем примерам, если я static сказал, то сиди в своем сипипи, попытка extern не проходит. по-другому: статик только первым объявлением (или ошибка) и линковка тогда только внутренняя.
а почему
char* g(); // g() has external linkage
из второго примера имеет внешнюю линковку? и
void h();
inline void h(); // external linkage
из третьего примера тоже. мы ж вроде extern не объявляли. все переменные и функции без спецификаторов, такие как
C++
1
2
int a;
f() {};
так они же могут декларироваться здесь в этом же файле. в смысле что к ним можно extern линковаться из другого файла, а если статик, то с другого файла не "линканешься"?
0
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
08.01.2016, 19:39 69
Цитата Сообщение от SergioO Посмотреть сообщение
мы ж вроде extern не объявляли
extern - это по умолчанию. Т.е. функция (и глобальная переменная), которая не static и не в анонимном namespace, не в локальном классе - extern.

Добавлено через 5 минут
Если интересует более полная информация, здесь: http://en.cppreference.com/w/c... on#Linkage
1
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
08.01.2016, 19:41  [ТС] 70
Цитата Сообщение от Kirik516 Посмотреть сообщение
Private не соседствует со static. Private это спецификатор доступа, а static спецификатор способа хранения в памяти, так сказать.
Такое ощущения, что вы пытаетесь их связать их как-то вместе.
Было бы здорово, если бы вы объяснили, что вас смущает в static.
я имел в виду что несмотря на то, что переменная хранится отдельно от класса и вроде вообще ни одного экземпляра класса не создано, но мы ее все равно никак не "возьмем".
0
18842 / 9841 / 2409
Регистрация: 30.01.2014
Сообщений: 17,284
08.01.2016, 19:46 71
Цитата Сообщение от SergioO Посмотреть сообщение
я имел в виду что несмотря на то, что переменная хранится отдельно от класса
Идеологически правильно говорить "отдельно от объекта". Статик переменная класса подчиняется правилам ограничения доступа, которые задают public/protected/private наравне с остальными членами класса. Все особенности связанные с доступом (наследование, дружба) также сохраняются. Т.е. переменная именно что принадлежит классу, но не является частью объекта класса.
1
08.01.2016, 19:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.01.2016, 19:46
Помогаю со студенческими работами здесь

Static поля класса
объясните нубу, вот имею я такой код на С# class WebResponse { public static...

Static в описании метода класса
всем привет. что такое static в описании метода класса или самого класса. что такое статичный...

Статические методы класса (static)
Доброго времени суток! Читаю &quot;Решение сложных задач С++ - Саттер&quot;, у него есть такая задача: вы...

Инициализация static члена класса
Добрый вечер! Есть класс, в нём в private реализован ещё один + это всё шаблоны. Во вложенном...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
71
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru