С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1

Непонятки со статическими полями класса

04.08.2015, 23:19. Показов 6260. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обязательно ли инициализировать статическую константу в определении класса?
Можно ли ее определить вне области определения класса?
А статический константый массив?

Добавлено через 49 минут
Ну ответьте кто-нубудь?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2015, 23:19
Ответы с готовыми решениями:

Ошибка с статическими членами класса
Доброго времени суток, форумчане! Недавно пришлось вернуться с С# на С++ и я тут же заметил что я все забыл( Итак по сути: Есть...

Сделать несколько экземпляров класса со статическими полями
Здравствуйте, для начала обрисую проблему. Есть обычный класс Человек с присущими человеку параметрами: возраст, вес имя и т.д. В этом...

Ошибка Unresolved external при работе со статическими полями класса
Доброго всем времени суток. Помогите решить вот такую проблемку. Имеется 2 класса: class ELEMENT { //различные поля и методы...

15
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
04.08.2015, 23:22
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Обязательно ли инициализировать статическую константу в определении класса?
Это же константа, как ж её не инициализировать.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Можно ли ее определить вне области определения класса?
Да. Даже нужно.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
А статический константый массив?
В классе объявляешь, в любом месте программы инициализируешь.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <memory>
int _q;
class myclass{
public:
    static const int kas[];
};
 
const int myclass::kas[] = { 7, 8, 8, 0 };
 
int main(void)
{
    myclass a1, a2;
    printf("%d %d", a1.kas[2], a2.kas[1]);
    scanf_s("%d",&_q);
    return 0;
}
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.08.2015, 23:28  [ТС]
Цитата Сообщение от Eraston Посмотреть сообщение
Это же константа, как ж её не инициализировать.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Можно ли ее определить вне области определения класса?
Цитата Сообщение от Eraston Посмотреть сообщение
Да. Даже нужно.
ты сам себе противоречишь

Цитата Сообщение от Ferrari F1 Посмотреть сообщение
А статический константый массив?
имелось в виду, можно ли в определении класса инициализировать
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
04.08.2015, 23:31
что мешает взять, да попробовать в коде сделать то, что у вас вопросы вызывает?
компилится - значит можно. нет - надо дальше копать, может просто неправильно сделали.
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
04.08.2015, 23:38
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
имелось в виду, можно ли в определении класса инициализировать
2 IntelliSense: элемент типа "const int [4]" не может иметь инициализатор внутри класса
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
ты сам себе противоречишь
Это где?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.08.2015, 23:39  [ТС]
Обязательно ли инициализировать статическую константу в определении класса?
Можно ли ее определить вне области определения класса?
На оба вопроса у тебя подразумевался ответ да.
0
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
04.08.2015, 23:42
в определении класса можно только константы интегральных типов инициализировать, если не добавили каких-нибудь новых фич в язык. как быть с остальными типами? т.е. вне класса только и можно их инициализировать. в смысле не интегральные константы. ну раз так, то и интегральные можно. т.е. вне класса инициализировать статические константы можно.
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
04.08.2015, 23:43
C++
1
2
3
4
struct Test
{
    static constexpr int arr[4] = { 5 , 8 , 9 , 6 } ;
} ;
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
04.08.2015, 23:44
Ferrari F1, и что тебя смущает? Логично, что если ты инициализируешь const int в классе, то второй раз это делать не нужно, а если ты инициализируешь её вне класса, то и в классе она у тебя инициализирована.
По моему разумению, в классе она вообще объявляется без определения.
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
04.08.2015, 23:47  [ТС]
Eraston,
Цитата Сообщение от Eraston Посмотреть сообщение
инициализируешь её вне класса
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Можно ли ее определить вне области определения класса?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
04.08.2015, 23:50
Массивы в заголовочных файлах

Когда статическую целочисленную константу инициализируют прямо в описании класса, то, строго говоря, это корявое действо. Разработчики языка скорее всего пошли на это, чтобы можно было использовать статические поля класса для описания массивов. Тут уже по смыслу получается не переменная, а макрос (значение есть, а выделенной памяти нет)

C++
class T
{
public:
  static const int i = 4;
};
 
int main (void)
{
  int x = T::i;
 
  // Если эту строку закомментировать, то всё нормально скомпилируется
  // как если бы T::i был макросом. Т.е. значение мы добудем, но в памяти
  // переменной T::i не будет
  const int *p = &T::i;
 
  return 0;
}
Code
$ g++ t.cc
/tmp/cc6anBoD.o:t.cc:(.text+0x1a): undefined reference to `T::i'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1
0
 Аватар для Eraston
60 / 11 / 4
Регистрация: 09.09.2014
Сообщений: 182
04.08.2015, 23:55
Ferrari F1, я тебя не понимаю. Типа, в классе ты вообще ничего писать не хочешь?
C++
1
2
3
4
5
6
class myclass{
public:
    //static constexpr int kas[4] = { 7, 8, 8, 6};
};
 
const int myclass::kas[] = { 7, 8, 8, 0 };
Как ты инициализируешь константу, или определишь её, если в описании класса её нет?
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
05.08.2015, 00:01  [ТС]
Цитата Сообщение от Eraston Посмотреть сообщение
я тебя не понимаю
C++
1
2
3
4
5
6
class bullshit
{
    static const int i;
};
 
int bullshit::i(1);
и
C++
1
2
3
4
5
6
7
class bullshit
{
    static const int i[] =
    {
        1 , 3 , 4
    };
};
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
05.08.2015, 00:03
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
int bullshit::i(1);
C++
1
const int bullshit::i(1);
0
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
05.08.2015, 00:04  [ТС]
DrOffset, аа да, забыл
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
05.08.2015, 00:17
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Можно ли ее определить вне области определения класса?
Определять можно. И обязательно, если нужна реальная переменная, а не константа времени компиляции.
Массивы нельзя определять внутри класса, потому что они сразу подразумевают адресацию.

Но в С++11 ввели constexpr. С помощью которых, можно определять и массивы и, например, double.
C++
1
2
3
4
5
6
struct A
{
    static constexpr const double a = 15;  // без constexpr не скомпилируется.
 
    static constexpr const int a[] = {1, 2, 3}; // без constexpr не скомпилируется.
};
Добавлено через 6 минут
constexpr будет работать на этапе компиляции до тех пор, пока это возможно. Если ты напишешь код, который берет адрес такой переменной (как в примере Evg), то constexpr уже не спасет и определение придется вынести из класса. Т.е. внутри класса статические константы определяются только если с ними идет работа исключительно на этапе компиляции. Во всех остальных случаях, нужно честное определение.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
struct A
{
    static constexpr const double a = 15; 
};
 
//const double A::a;
    
 
int main()
{
    std::cout << A::a << '\n';
    
    
    std::cout << &A::a; // oops! спасет раскомментирование строки 8
}
http://rextester.com/PSWM47334
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.08.2015, 00:17
Помогаю со студенческими работами здесь

Непонятки с полями свойств класса get set - требуется ";"
помогите понят что не так. пытаюсь сделать свойства класса в студии. public class Student { private int _age; ...

Стоит ли делать все методы и переменные-члены класса list статическими
Сделал класс list(знаю, что существует уже этот stl контейнер, просто сделал для себя), стоит ли делать все его методы и переменные-члены...

Почему внук родительского класса не может работать с полями дедовского класса?
Не всё так просто на самом деле. Непонятно, какую роль во всём этом играют шаблоны. Но к делу. Вот код: class base { public: base...

Из класса "Дата" с полями день, месяц, год создать класс "Время" с дополнительными полями час, минута, секунда
в общем .надо класс дата полями день, месяц год.теперь мне надо создать класс &quot;Время&quot; з дополнительными полями...

Непонятки с конструктором класса
Создал простенький класс, и не менее сложный конструктор и при компиляции вадает ошибки. Может компилятор нагибается потихоньку ? :) Ну или...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru