[C++] Подробное объяснение ключевого слова static и его модифицированных статических переменных/функций-членов.
[C++] Подробное объяснение ключевого слова static и его модифицированных статических переменных/функций-членов.

Что такое статика?

Введение статики

static да C/C++ середина Очень часто используетсямодификатор,он используетсяКонтролируйте, как переменные хранятся и отображаются


Статическое хранение данных

Глобальная (статическая) область хранения

Глобальная (статическая) область хранениясуществоватьОбласть памяти серединаразделение,Как показано ниже:

Глобальная (статическая) область хранения:разделен наdataДанваbassчасть。dataчасть(Глобальная область инициализации)Хранить инициализированное глобальнопеременнаяи статическийпеременная;bassчасть(Глобальная неинициализированная область)Хранить неинициализированный глобальныйпеременнаяи статическийпеременная。Автоматически высвобождается по завершении программы。Чтосерединаbassчастьсуществовать Программа будет автоматически очищена системой перед выполнением.0,Таким образом, неинициализированная глобальная переменная и статическая переменнаясуществовать уже равны 0 перед выполнением программы. Переменная, в которой хранится существующая область статических данных, будет инициализирована, когда программа только запускается.,Это также единственная инициализация.

существовать C++ середина static Внутренний механизм реализации:Статические члены данных должнысуществовать Его необходимо сохранить при запуске программы.существовать。потому чтофункциясуществовать Программа работаетсерединаназывается,Таким образом, статическим элементам данных нельзя выделить пространство и инициализировать их внутри какой-либо существующей функции. Таким образом, существует три возможных места для распределения пространства: одно — это заголовочный файл внешнего интерфейса класса, где находится объявление класса, другое — внутренняя реализация определения класса, где находятся члены класса; определены третьи — приложения; main() Объявление и определение глобальных данных перед функцией. Статическим членам данных необходимо фактически выделить пространство, поэтому их нельзя объявлять в классе (можно объявлять только члены данных). Объявление класса только объявляет «размер и спецификации» класса и не выполняет фактическое распределение памяти, поэтому в объявлении класса середина неправильно писать определение да. Он также не может существовать в заголовочном файле внешнего определения объявления класса середина, поскольку это привело бы к существованию нескольких исходных файлов середина, использующих этот класс, и его переопределению. static Он введен для того, чтобы сообщить компилятору, что переменная будет храниться в статической области памяти существующей программы, а не в пространстве стека. Статические элементы данных инициализируются в том порядке, в котором они определены. Обратите внимание, что при статических элементах. вложенный, убедитесь, что вложенные элементы инициализированы. Порядок исключения является обратным порядку инициализации.

Преимущества: Можно сохранить память,Потому что это общее для всех объектов,поэтому,Для нескольких объектов статические элементы данных хранятся только в одном месте и являются общими для всех объектов.Значение статического элемента данных для каждогообъект Вседа Такой же,но его ценностьдаможно обновить。Пока значение статического элемента данных обновляется один раз, все объекты гарантированно получают доступ к одному и тому же обновленному значению, что может повысить эффективность использования времени.


концепция статического члена

Члены класса, объявленные как статические, называются статическими членами класса.,Переменные-члены, измененные с помощью static, называются статическими переменными-членами; функции-члены, измененные с помощью static, называются статическими функциями-членами.Статические члены переменная должна быть инициализирована вне класса.


статические атрибуты членов

Статические члены являются общими для всех классов объектов.,Не принадлежащий конкретному объекту,Магазин существует в статической зоне.Следующий код:

Язык кода:javascript
копировать
class Student
{
public:
	Student(const char name[], int idea, int grade)
	{
		strcpy(_name, name);
		_idea = idea;
		_grade = grade;
	}
	static int GetPostalCode()
	{
		return _postalCode;
	}
private:
	char _name[10];
	int _idea;
	int _grade;

	static int _postalCode;
};
int Student::_postalCode = 710400;

int main()
{
	cout << Student::GetPostalCode() << endl;

	Student s1("Чжан Сан", 1001, 3);
	Student s2("Ли Си", 1002,2);
Студент s3("Ван Ву", 1003, 1);

	return 0;
}

Путем мониторинга мы можем обнаружить, что статический член переменная, определенный в позиции члена переменная в классе существования, не существует в классе объектсередина:

То есть, да,Неважно, сколько категорий открыто объектом,Существует только один статический член — переменная.,и сам не принадлежит ни одному объекту класса,Только члены переменная принадлежат классу объекта. Связь между статическим членом переменная и объектом класса и его членом переменная следующая:

Статические члены переменная должна быть определена вне класса,Не добавляйте ключевое слово static при определении,Класс середина только для объявления

Доступ к статическим членам класса можно получить, используя classname::staticmember или object.staticmember.

Статические функции-члены не скрывают этот указатель.,Невозможно получить доступ к нестатическим членам, но нестатические члены могут получить доступ к статическим функциям-членам;

Статические члены также являются членами класса да, защищенными публичным, защищенным, частным Ограничение квалификатора доступа


Применение статических членов

Используйте static для реализации класса, который может рассчитать, сколько объектов класса используется в программе.

мы можем использоватьСоздание объекта должно вызывать конструктор, а уничтожение — деструктор.Характеристики,существовать Создать классstaticдобрыйобъект ПриходитьЗапишите количество создания/уничтожения объектов класса.。Уведомление,Из-за небезопасности глобальной переменной,Мы не рекомендуем использовать глобальную переменную для этой задачи.,Следующий код,Определяет класс, который может вычислить количество классов объекта и существующий жизненный цикл программы середина:

Язык кода:javascript
копировать
#include<iostream>
using namespace std;

class Count
{
public:
	//Функция построения, каждый раз, когда создается объект, count+1
	Count() { ++_scount; }

	//константная функция построения, каждый раз, когда создается объект, count+1
	Count(const Count& t) { ++_scount; }

	//Функция уничтожения, каждый раз, когда уничтожается, счетчик-1
	~Count() { --_scount; }

	//Получаем значение count
	static int GetSCount() { return _scount; }

частный:
//Выражение переменной_scount
статический int _scount;
};
//Определение переменной_scount
int Count::_scount = 0;

//Создаем глобальный Countobjecta0
Count a0;

int main()
{
	cout << __LINE__ << ":" << Count::GetSCount() << endl;
	Count a1, a2;

	{
		Count a3(a1);
		cout << __LINE__ << ":" << Count::GetSCount() << endl;
	}//Когда жизненный цикл a3 выходит за пределы домена, он будет автоматически уничтожен.
	
	cout << __LINE__ << ":" << Count::GetSCount() << endl;

	return 0;
}

Давайте проверим, может ли этот код подсчитать количество классов в текущей строке. Используйте:

Подводить итоги,дляДля учета количества создания/уничтожения объектов класса можно начать со следующих трех направлений:

  • Количество созданий объектов класса = статические переменные-члены конструктора++
  • Количество уничтожений объектов класса = статические переменные-члены деструктора++
  • существует число времени существования класса объект = конструкция Функция статический член переменная - Функция разрушения статический член переменная

Спроектируйте класс так, чтобы объекты можно было создавать только в стеке/куче вне класса.

следующее,Когда мы обычно создаем объект класса,еслибез ограничений,ноКласс объекта может быть создан существующим в разных областях памяти.:

Язык кода:javascript
копировать
class A
{
public:
	A()
	{}
private:
	int _a1 = 1;
	int _a2 = 2;
};

int main()
{
	static A aa1;    //Класс объекта существует статическая область
	A aa2;           //добрыйобъектсуществоватькуча
	A* ptr = new A;  //добрыйобъектсуществоватькуча

	return 0;
}

Но если мы столкнемся с определенным сценарием,То есть класс, который мы создали,Просто хочу, чтобы он был создан в объекте стека / Хочу, чтобы он был создан только в объекте стекачас,мы можемСоздайте указанный объект класса, инкапсулировав конструктор, а затем используя статически модифицированную функцию-член класса.,нравиться:

Язык кода:javascript
копировать
class A
{
public:
	static A GetStackObj()
	{
		A aa;
		return aa;
	}
	static A* GetHeapObj()
	{
		return new A;
	}
private:
	A()//Построение функции приватизации
	{}
private:
	int _a1 = 1;
	int _a2 = 2;
};

int main()
{
	//static A aa1;    //Класс объекта существует статическая область
	//A aa2;           //добрыйобъектсуществоватькуча
	//A* ptr = new A;  //добрыйобъектсуществоватькуча

	A::GetStackObj();
	A::GetHeapObj();

	return 0;
}

Здесь нужно объяснить несколько моментов:

1. Инкапсулируйте структуру Function, чтобы функция вне класса не могла произвольно создавать объект класса по мере необходимости.,нравиться:

2. Используйте функцию-член для создания объекта класса, поскольку функция-член, вызывающая функцию класса, не подвержена влиянию ограничений. квалификатора доступа,нравиться:

3. Используйте static для изменения функции-члена, поскольку вы хотите решить проблему, заключающуюся в том, что функцию-член класса нельзя вызвать без объекта класса.,нравиться:

Позвольте мне сделать мем, который поможет вам понять противоречивую логику:

Подводя итог: умело используя инкапсуляцию и статику, мы можем добиться некоторых специальных эффектов, которых хотим достичь, поэтому нам нужно использовать их гибко.


Статические члены решают проблему 1+2+3+...+n

1. Описание названия

Ссылка на вопрос Niuke.com:JZ64 Найдите 1+2+3+...+n

icon-default.png?t=N7T8
icon-default.png?t=N7T8

https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?tpId=13&tqId=11200&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

описывать:

Найдите 1+2+3+...+n, требуется, чтобы умножение и деление, for, while, if, else, switch, case и другие ключевые слова и операторы условного суждения (A?B:C) не могли использоваться. Диапазон данных: 0<n≤200 Передовой: пространственная сложность O(1) , временная сложность O(n)

Пример 1:

Ввод: 5 Возвращаемое значение: 15

Пример 2:

Ввод: 1 Возвращаемое значение: 1

Детали вопроса:


2. Идеи вопросов

  • первый,насСоздать класс суммы,ЧтосерединаСодержит два статических члена переменная.,Одна штука да_и,ада_рет
  • Во-вторых,нассуществующая основная функция создает массив из n данных класса Sum.,Это означает, чтоЧтобы создать n объектов класса Sum,ноКонструктор суммы будет вызываться n раз.
  • наконец,нассуществует структурная функция Sum Send_ret+=_iПостсексуальность_i++,так,Создание класса object_ret увеличит его порядок.,То есть прибавляем от 1 до n.

3. Код решения проблем

Основываясь на вышеизложенных идеях, код для решения этой проблемы выглядит следующим образом:

Язык кода:javascript
копировать
class Sum {
public:
    Sum()
    {
        _ret+=_i;
        _i++;
    }
    static int Getret()
    {
        return _ret;
    }
    private:
    static int _i;
    static int _ret;
};
int Sum::_i = 1;
int Sum::_ret = 0;

class Solution {
public:
    int Sum_Solution(int n) {
    Sum a[n];//Создано n объектов, вызванных n раз при построении Функция
    return Sum::Getret();
    }
};

Скопируйте на Niuke.com и выполните тестовый запуск:

Пройдено успешно:

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose