static да C/C++ середина Очень часто используетсямодификатор,он используетсяКонтролируйте, как переменные хранятся и отображаются。
Глобальная (статическая) область хранениясуществоватьОбласть памяти серединаразделение,Как показано ниже:
Глобальная (статическая) область хранения:разделен наdataДанваbassчасть。dataчасть(Глобальная область инициализации)Хранить инициализированное глобальнопеременнаяи статическийпеременная;bassчасть(Глобальная неинициализированная область)Хранить неинициализированный глобальныйпеременнаяи статическийпеременная。Автоматически высвобождается по завершении программы。Чтосерединаbassчастьсуществовать Программа будет автоматически очищена системой перед выполнением.0,Таким образом, неинициализированная глобальная переменная и статическая переменнаясуществовать уже равны 0 перед выполнением программы. Переменная, в которой хранится существующая область статических данных, будет инициализирована, когда программа только запускается.,Это также единственная инициализация.
существовать C++ середина static Внутренний механизм реализации:Статические члены данных должнысуществовать Его необходимо сохранить при запуске программы.существовать。потому чтофункциясуществовать Программа работаетсерединаназывается,Таким образом, статическим элементам данных нельзя выделить пространство и инициализировать их внутри какой-либо существующей функции. Таким образом, существует три возможных места для распределения пространства: одно — это заголовочный файл внешнего интерфейса класса, где находится объявление класса, другое — внутренняя реализация определения класса, где находятся члены класса; определены третьи — приложения; main() Объявление и определение глобальных данных перед функцией. Статическим членам данных необходимо фактически выделить пространство, поэтому их нельзя объявлять в классе (можно объявлять только члены данных). Объявление класса только объявляет «размер и спецификации» класса и не выполняет фактическое распределение памяти, поэтому в объявлении класса середина неправильно писать определение да. Он также не может существовать в заголовочном файле внешнего определения объявления класса середина, поскольку это привело бы к существованию нескольких исходных файлов середина, использующих этот класс, и его переопределению. static Он введен для того, чтобы сообщить компилятору, что переменная будет храниться в статической области памяти существующей программы, а не в пространстве стека. Статические элементы данных инициализируются в том порядке, в котором они определены. Обратите внимание, что при статических элементах. вложенный, убедитесь, что вложенные элементы инициализированы. Порядок исключения является обратным порядку инициализации.
Преимущества: Можно сохранить память,Потому что это общее для всех объектов,поэтому,Для нескольких объектов статические элементы данных хранятся только в одном месте и являются общими для всех объектов.Значение статического элемента данных для каждогообъект Вседа Такой же,но его ценностьдаможно обновить。Пока значение статического элемента данных обновляется один раз, все объекты гарантированно получают доступ к одному и тому же обновленному значению, что может повысить эффективность использования времени.
Члены класса, объявленные как статические, называются статическими членами класса.,Переменные-члены, измененные с помощью static, называются статическими переменными-членами; функции-члены, измененные с помощью static, называются статическими функциями-членами.。Статические члены переменная должна быть инициализирована вне класса.
Статические члены являются общими для всех классов объектов.,Не принадлежащий конкретному объекту,Магазин существует в статической зоне.Следующий код:
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добрыйобъект ПриходитьЗапишите количество создания/уничтожения объектов класса.。Уведомление,Из-за небезопасности глобальной переменной,Мы не рекомендуем использовать глобальную переменную для этой задачи.,Следующий код,Определяет класс, который может вычислить количество классов объекта и существующий жизненный цикл программы середина:
#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;
}
Давайте проверим, может ли этот код подсчитать количество классов в текущей строке. Используйте:
Подводить итоги,дляДля учета количества создания/уничтожения объектов класса можно начать со следующих трех направлений:
следующее,Когда мы обычно создаем объект класса,еслибез ограничений,ноКласс объекта может быть создан существующим в разных областях памяти.:
class A
{
public:
A()
{}
private:
int _a1 = 1;
int _a2 = 2;
};
int main()
{
static A aa1; //Класс объекта существует статическая область
A aa2; //добрыйобъектсуществоватькуча
A* ptr = new A; //добрыйобъектсуществоватькуча
return 0;
}
Но если мы столкнемся с определенным сценарием,То есть класс, который мы создали,Просто хочу, чтобы он был создан в объекте стека / Хочу, чтобы он был создан только в объекте стекачас,мы можемСоздайте указанный объект класса, инкапсулировав конструктор, а затем используя статически модифицированную функцию-член класса.,нравиться:
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 для изменения функции-члена, поскольку вы хотите решить проблему, заключающуюся в том, что функцию-член класса нельзя вызвать без объекта класса.,нравиться:
Позвольте мне сделать мем, который поможет вам понять противоречивую логику:
Подводя итог: умело используя инкапсуляцию и статику, мы можем добиться некоторых специальных эффектов, которых хотим достичь, поэтому нам нужно использовать их гибко.
Ссылка на вопрос Niuke.com:JZ64 Найдите 1+2+3+...+n
Найдите 1+2+3+...+n, требуется, чтобы умножение и деление, for, while, if, else, switch, case и другие ключевые слова и операторы условного суждения (A?B:C) не могли использоваться. Диапазон данных: 0<n≤200 Передовой: пространственная сложность O(1) , временная сложность O(n)
Ввод: 5 Возвращаемое значение: 15
Ввод: 1 Возвращаемое значение: 1
Основываясь на вышеизложенных идеях, код для решения этой проблемы выглядит следующим образом:
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 и выполните тестовый запуск:
Пройдено успешно: