Use a palavra-chave estática em C++

Jinku Hu 12 outubro 2023
  1. Use a palavra-chave static para declarar variáveis ​​com duração estática em C++
  2. Use a palavra-chave static para declarar membros estáticos da classe em C++
Use a palavra-chave estática 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artigo relacionado - C++ Static