Use a palavra-chave estática em C++
-
Use a palavra-chave
static
para declarar variáveis com duração estática em C++ -
Use a palavra-chave
static
para declarar membros estáticos da classe em C++
Este guia explicará vários métodos de como usar a palavra-chave static
em C++.
Use a palavra-chave static
para declarar variáveis com duração estática em C++
A palavra-chave static
pode ser usada para declarar variáveis locais com duração estática. Ao contrário do que a nomenclatura pode sugerir, uma variável local com duração estática implica que seu valor permaneça ativo na memória mesmo após o bloco, onde a variável é declarada, sair do escopo.
Basicamente, essas variáveis locais podem ter seus valores salvos entre as chamadas de função em que são definidas. Observe que a função incrementCount
possui uma variável chamada count
, que é inicializada com o valor de 0
. O atributo count
é alocado na região da memória que está ativa até que o programa termine. Assim, cada chamada para incrementCount
adiciona uma única unidade ao número inteiro fornecido.
#include <iostream>
using std::cout;
using std::endl;
int incrementCount() {
static int count = 0;
return ++count;
}
int main() {
for (int i = 0; i < 20; ++i) {
if (i % 2 == 0) incrementCount();
}
cout << incrementCount() - 1 << endl;
return EXIT_SUCCESS;
}
Resultado:
10
Use a palavra-chave static
para declarar membros estáticos da classe em C++
Por outro lado, a palavra-chave static
é utilizada para declarar membros de dados estáticos da classe. Esses membros são associados ao próprio tipo de classe, e não a instâncias específicas da classe. Portanto, se definirmos um membro de dados estáticos para uma determinada classe, cada instância desse tipo de classe terá o mesmo valor para o membro de dados. Ao contrário de ter um membro privado, o primeiro terá uma única cópia na memória. O último recurso torna os membros de dados estáticos eficientes do ponto de vista da área de cobertura da memória da classe.
Os membros de dados static
são definidos e inicializados de forma diferente dos membros de dados regulares. Os membros static
devem ser declarados dentro da classe e definidos fora da classe no arquivo de origem associado. A palavra-chave static
é usada apenas na declaração dentro da classe. Nenhum dos membros de dados static
pode ser inicializado pelos construtores, e eles não podem ser inicializados dentro do corpo da classe, a menos que tenham um tipo integral const
. Os últimos tipos ainda precisam ser definidos fora do corpo da classe sem uma especificação de valor inicial. O exemplo a seguir demonstra o uso simples do membro de dados static
name
, que é inicializado com a string literal e posteriormente modificado com a função setNewName
.
#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class MyClass1 {
private:
static string name;
string nickname;
public:
explicit MyClass1(string n) : nickname(std::move(n)){};
static string getName() { return name; }
static void setNewName(std::basic_string<char> s) { name = std::move(s); }
string getNickname() { return nickname; }
~MyClass1() = default;
};
string MyClass1::name = "Static name";
int main() {
MyClass1 m1(string("April"));
MyClass1 m2(string("Maude"));
cout << MyClass1::getName() << endl;
MyClass1::setNewName("New name");
cout << MyClass1::getName() << endl;
return EXIT_SUCCESS;
}
Resultado:
Static name New name
Alternativamente, a classe pode ter os membros de função static
que não estão vinculados a nenhum objeto e, portanto, eles não podem se referir ao objeto this
em seus corpos. Geralmente, essas funções não precisam ter declaração separada e definição semelhante aos membros de dados static
, conforme mostrado no programa de exemplo a seguir. Ainda assim, a maioria dos guias de estilo contemporâneo geralmente exige que o programador separe os dois.
#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class MyClass1 {
private:
static string name;
string nickname;
public:
explicit MyClass1(string n) : nickname(std::move(n)){};
static string getName() { return name; }
static void setNewName(std::basic_string<char> s) { name = std::move(s); }
string getNickname() { return nickname; }
static bool compareStrings(const std::basic_string<char>& s1,
const std::basic_string<char>& s2) {
if (s1 == s2)
return true;
else
return false;
}
~MyClass1() = default;
};
string MyClass1::name = "Static name";
int main() {
MyClass1 m1(string("April"));
MyClass1 m2(string("Maude"));
MyClass1::compareStrings(m1.getNickname(), m2.getNickname())
? cout << "strings are equal" << endl
: cout << "strings are not equal" << endl;
MyClass1::compareStrings(MyClass1::getName(), MyClass1::getName())
? cout << "strings are equal" << endl
: cout << "strings are not equal" << endl;
return EXIT_SUCCESS;
}
Resultado:
strings are not equal strings are equal
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook