Pergunta

Desculpe se esta pergunta parece trivial para muitos aqui.

Em um código C++ há algo como abaixo:

class Foo
{
public:
   static int bands;
   ...
   ...
private:
   ...
   ...

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
  1. Por que a declaração acima é necessária novamente quando 'bandas' é declarada dentro da classe como estática?

  2. Uma variável estática também pode ser declarada como uma variável de membro privado em qualquer classe?

Foi útil?

Solução

C ++ observa uma distinção entre declarando e definindo. bands é declarado dentro da classe, mas não é definido.

Um membro não estático de dados seria definido quando você definir um objeto desse tipo, mas como um membro estático não faz parte de nenhum objeto específico, ele precisa de sua própria definição.

Outras dicas

a) É necessário porque é assim que a linguagem é desenhada.

b) Variáveis ​​estáticas são inicializadas por seu construtor padrão ou com zero para tipos integrados.

c) Sim, podem ser (e geralmente são) privados.

Dar uma olhada em essa questão.

Tem a ver com arquivos obj, como eles são usados ​​e como os endereços de memória para variáveis ​​com escopo global são descobertos por meio do processo de vinculação.Os arquivos objeto contêm os endereços de todos os dados e funções globais definidos no cpp correspondente.Eles organizam um pouco de memória de maneira relativa para informar ao usuário onde naquele arquivo esses vars/funcs globais podem ser encontrados.Então por exemplo

function doFoo can be found 0 bytes from beginning of this file
int foo::bands can be found 12 bytes from beginning of this file
etc

É quase mais fácil pensar se você já fez C direto antes.Em um mundo C puro, você faria as coisas em um sentido de programação modular mais tradicional.Seu módulo seria definido com um cabeçalho e um cpp.O cabeçalho definiria uma variável "pública" como abaixo, usando a palavra-chave extern, e então a instanciaria no cpp.

foo.h

extern int bands; 

foo.cpp

#include "foo.h"
int bands;

foo.obj:

int bands can be found 0 bytes from the beginning of this file

A palavra-chave “extern” indica que este nome é válido e seu endereço será resolvido no momento do link.Todos que incluíssem "foo.h" e quisessem usar a variável global "bands" agora poderiam usá-la.Na hora do link, o vinculador descobriria que existiam bandas no foo.obj.Se você esqueceu de colocar "int bands" em foo.obj, você receberá um erro de vinculador e terá que resolvê-lo.

Em C++, usar static em uma declaração de classe é semelhante.Você está dizendo aos usuários que existe uma coisa chamada "foo::bands" e onde ela ficará será resolvida no momento do link.Mais tarde, o vinculador vê que em foo.obj, foo::bands existe e todas as referências a foo::bands podem ser resolvidas.

Meu entendimento é que você precisaria apenas declarar bandas Foo :: se planejasse usá -lo antes de criar uma instância da sua classe. Basicamente, quando você declara uma estática em uma classe C ++, apenas uma cópia dessa variável existe para todas as instâncias dessa classe. No entanto, você normalmente não pode acessar as bandas Foo :: até que uma instância da classe seja declarada.

Por exemplo:

Ponteiros para membros

#include <iostream>
using namespace std;

class X {
public:
  int a;
  void f(int b) {
    cout << "The value of b is "<< b << endl;
  }
};

int main() {

  // declare pointer to data member
  int X::*ptiptr = &X::a;

  // declare a pointer to member function
  void (X::* ptfptr) (int) = &X::f;

  // create an object of class type X
  X xobject;

  // initialize data member
  xobject.*ptiptr = 10;

  cout << "The value of a is " << xobject.*ptiptr << endl;

  // call member function
  (xobject.*ptfptr) (20);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top