문제

이 질문이 여기 많은 사람들에게 사소한 것처럼 보이면 죄송합니다.

C ++ 코드에는 다음과 같은 것이 있습니다.

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

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
  1. '밴드'가 한 번 수업 내에서 정적으로 선언 될 때 위의 진술이 다시 필요한 이유는 무엇입니까?

  2. 또한 정적 변수를 클래스에서 개인 회원 변수로 선언 할 수 있습니까?

도움이 되었습니까?

해결책

C ++는의 구별을 참고합니다 선언 그리고 정의. bands 클래스 내에서 선언되지만 정의되지 않았습니다.

비 정적 데이터 구성원은 해당 유형의 객체를 정의 할 때 정의되지만 정적 멤버는 특정 객체의 일부가 아니기 때문에 자체 정의가 필요합니다.

다른 팁

a) 랑그가 설계된 방식이기 때문에 필요합니다.

b) 정적 변수는 기본 생성자로 초기화되거나 내장 유형의 경우 0으로 초기화됩니다.

c) 예, 그들은 개인 일 수 있습니다.

보세요 이 질문.

OBJ 파일, 사용 방법 및 전 세계적으로 범위를 가진 변수에 대한 메모리 주소가 궁극적으로 연결 프로세스를 통해 발견되는 방법과 관련이 있습니다. 객체 파일에는 해당 CPP에 정의 된 모든 글로벌 데이터 및 기능이 포함되어 있습니다. 그들은 상대적인 방식으로 일부 메모리를 레이아웃하여 해당 파일에서 이러한 글로벌 Vars/Func를 찾을 수있는 Liker를 알려줍니다. 예를 들어

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

이전에 C를 똑바로 해준 경우 생각하기가 거의 더 쉽습니다. 순수한 C 세계에서는보다 전통적인 모듈 식 프로그래밍 의미로 일을 할 것입니다. 모듈은 헤더와 CPP로 정의됩니다. 헤더는 외부 키워드를 사용하여 아래와 같은 "공개"변수를 정의 한 다음 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

"extern 키워드"는이 이름이 유효하고 주소가 링크 시간에 해결 될 것이라고 명시하고 있습니다. "foo.h"를 포함한 모든 사람들은 이제 "밴드"를 사용하고 싶었습니다. 링크 시간에 링커 밴드가 foo.obj에 존재한다는 것을 알아낼 것입니다. foo.obj에 "int bands"를 넣는 것을 잊어 버린 경우 링커 오류가 발생하여 해결해야합니다.

클래스 선언에서 정적을 사용하는 C ++에서 I 비슷합니다. 당신은 사용자에게 "foo :: bands"라는 것이 존재한다고 말하고 있으며 그것이 어디에 살 것인지 링크 시간에 해결 될 것입니다. 나중에 라인 아래로 링커는 foo.obj에 foo :: 밴드가 존재한다는 것을 알 수 있으며 foo :: 밴드에 대한 모든 참조가 해결 될 수 있습니다.

내 이해는 수업 인스턴스를 만들기 전에 Foo :: Bands를 사용하는 경우에만 선언하면됩니다. 기본적으로 C ++ 클래스에서 정적을 선언하면 해당 클래스의 모든 인스턴스에 해당 변수의 사본이 하나만 있습니다. 그러나 클래스의 인스턴스가 선언 될 때까지 일반적으로 foo :: 밴드에 액세스 할 수 없습니다.

예를 들어:

회원들에게 포인터

#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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top