C++프로 그래 밍 의 구성원 변수 와 구성원 함수 에 대한 지식

C++클래스 의 구성원 변수 와 구성원 함수
클래스 는 데이터 형식 으로 일반적인 데이터 형식 과 유사 하지만 일반적인 데이터 형식 과 다르다.클래스 와 같은 데이터 형식 은 구성원 변수 와 구성원 함 수 를 포함 하 는 집합 입 니 다.
클래스 의 구성원 변 수 는 일반 변수 와 마찬가지 로 데이터 형식 과 이름 도 있 고 고정된 길이 의 메모리 공간 을 차지 합 니 다.그러나 클래스 를 정의 할 때 구성원 변수 에 값 을 부여 할 수 없습니다.클래스 는 데이터 형식 일 뿐 메모리 공간 을 차지 하지 않 고 변수의 값 은 메모리 로 저장 해 야 합 니 다.
클래스 의 구성원 함수 도 일반 함수 와 마찬가지 로 반환 값 과 매개 변수 목록 이 있 습 니 다.일반 함수 와 의 차 이 는 구성원 함 수 는 하나의 클래스 의 구성원 으로 클래스 에 나타 나 며 그 역할 범 위 는 클래스 에 의 해 결 정 됩 니 다.일반 함 수 는 독립 적 이 고 역할 범 위 는 전역 적 이거 나 특정한 네 임 스페이스 에 있 습 니 다.
지난 절 에 우 리 는 마지막 전체 예제 에서 Student 류 의 정 의 를 내 렸 는데 다음 과 같다.

class Student{
public: //      
  char *name;
  int age;
  float score;
public: //      
  void say(){
    printf("%s     %d,    %f
", name, age, score); } }; 。 , , : class Student{ public: char *name; int age; float score; public: void say(); // }; // void Student::say(){ printf("%s %d, %f
", name, age, score); }
클래스 에서 함 수 를 직접 정의 할 때 함수 이름 앞 에 클래스 이름 을 붙 일 필요 가 없습니다.함수 가 어떤 클래스 에 속 하 는 지 는 말 하지 않 아 도 알 수 있 기 때 문 입 니 다.
그러나 구성원 함수 가 클래스 밖 에 정의 되 었 을 때 함수 이름 앞 에 클래스 이름 을 붙 여 한정 해 야 합 니 다.:도 메 인 해석 문자(역할 도 메 인 연산 자 또는 역할 도 메 인 한정 문자 라 고도 함)라 고 불 리 며,클래스 이름과 함수 이름 을 연결 하여 현재 함수 가 어떤 클래스 에 속 하 는 지 밝 힙 니 다.
도 메 인 해석 자":"의 앞 에 클래스 이름 이 없 거나 함수 이름 앞 에 클래스 이름 도 없고 도 메 인 해석 자 도 없다 면":",예 를 들 어:

//   
::say( ){
  //TODO
}
//         
say( ){
  //TODO
}
이 함 수 는 구성원 함수 가 아니 라 전역 함수,즉 구성원 함수 가 아 닌 일반 함수 임 을 나타 낸다.
구성원 함 수 는 먼저 클래스 에서 원형 성명 을 한 다음 에 클래스 밖에서 정의 해 야 합 니 다.즉,클래스 의 위 치 는 함수 가 정의 되 기 전에 해 야 합 니 다.그렇지 않 으 면 컴 파일 할 때 오류 가 발생 할 수 있 습 니 다.
구성원 함수 가 클래스 의 외부 에서 정의 되 지만 호출 할 때 클래스 에서 설명 한 함수 원형 에 따라 함수 의 정의(함수 코드)를 찾 아 이 함 수 를 실행 합 니 다.
inline 멤버 함수
클래스 와 클래스 체 외 에서 구성원 함 수 를 정의 하 는 것 은 차이 가 있 습 니 다.클래스 에서 정 의 된 구성원 함 수 는 내 연(inline)함수 이 고 클래스 체 외 에서 정 의 된 것 은 아 닙 니 다.
내 연 함 수 는 일반적으로 우리 가 기대 하 는 것 이 아니 라 함수 호출 처 를 함수 체 로 대체 할 것 입 니 다.그래서 저 는 클래스 내부 에서 구성원 함수 에 대해 성명 을 하고 클래스 외부 에서 정 의 를 내 리 는 것 을 권장 합 니 다.이것 은 좋 은 프로 그래 밍 습관 입 니 다.
물론 당신 의 함수 가 비교적 짧다 면 내 연 함수 로 정의 하 기 를 원한 다 면 타당 하지 않 은 것 도 없습니다.
함수 가 클래스 외부 에 정의 되 고 내 연 함수 가 되 기 를 원한 다 면 함수 설명 시 inline 키 워드 를 추가 할 수 있 습 니 다.다음 과 같 습 니 다.

class Student{
public:
  char *name;
  int age;
  float score;
public:
  inline void say(); //       
};
//    
void Student::say(){
  printf("%s     %d,    %f
", name, age, score); }
이렇게 하면 say()는 내 연 함수 가 된다.
클래스 내부 에서 정 의 된 함수 도 inline 키 워드 를 추가 할 수 있 지만 이것 은 불필요 합 니 다.클래스 내부 에서 정 의 된 함수 가 기본적으로 내 연 함수 이기 때 문 입 니 다.
주의해 야 할 것 은 클래스 체 외 에서 inline 함 수 를 정의 하려 면 클래스 정의 와 구성원 함수 의 정 의 를 같은 헤더 파일 에 넣 어야 합 니 다(또는 같은 원본 파일 에 쓰 십시오).그렇지 않 으 면 컴 파일 할 때 끼 워 넣 을 수 없습니다(함수 코드 를 함수 호출 에 끼 워 넣 습 니 다).이렇게 하면 프로그램의 집행 효율 을 높 였 지만 소프트웨어 공학 의 질 적 측면 에서 볼 때 이렇게 하 는 것 은 좋 은 방법 이 아니 기 때문에 실제 개발 에 서 는 클래스 에서 내 연 함 수 를 사용 하 는 것 이 비교적 적다.
C++내 연 함 수 를 제시 하 는 주요 의 도 는 내 연 함수 로 대 참 홍 정 의 를 대체 하 는 것 이다.
C++멤버 함수 의 저장 방식
클래스 로 대상 을 정의 할 때 시스템 은 모든 대상 에 게 저장 공간 을 분배 합 니 다.만약 하나의 클래스 가 데이터 와 함 수 를 포함한다 면 데이터 와 함수 의 코드 로 저장 공간 을 분배 해 야 한다.
이치 에 따 르 면 같은 클래스 로 10 개의 대상 을 정의 하면 각각 10 개의 대상 의 데이터 와 함수 코드 로 저장 부 를 분배 해 야 한다.아래 그림 과 같다.

이 공 통 된 함수 코드 세그먼트 만 한 공간 으로 저장 할 수 있 습 니까?각 대상 의 함 수 를 호출 할 때 이 공 통 된 함수 코드 를 호출 할 수 있 습 니 다.그림 에서 보 듯 이.

분명히 이렇게 하면 저장 공간 을 크게 절약 할 수 있다.C++컴 파일 시스템 은 바로 이렇게 하기 때문에 모든 대상 이 사용 하 는 저장 공간 은 이 대상 의 데이터 부분 에서 사용 하 는 저장 공간 일 뿐 함수 코드 가 사용 하 는 저장 공간 은 포함 되 지 않 습 니 다.클래스 를 설명 하면:

class Time
{
  public:
  int hour;
  int minute;
  int sec;
  void set( )
  {
   cin>>a>>b>>c;
  }
};
이러한 대상 이 사용 하 는 바이트 수 를 아래 문장 으로 출력 할 수 있 습 니 다:

  cout<<sizeof(Time)<<endl;
출력 값 은 12 입 니 다.
이 는 한 대상 이 차지 하 는 공간 크기 가 이 대상 에서 데이터 구성원 이 차지 하 는 공간 에 만 달 려 있 고 구성원 함수 와 무관 하 다 는 것 을 증명 한다.
함수 코드 는 대상 공간 밖 에 저 장 됩 니 다.같은 클래스 에 10 개의 대상 을 정의 하면 이 대상 의 구성원 함 수 는 10 개의 서로 다른 함수 코드 세그먼트 가 아 닌 같은 함수 코드 세그먼트 에 대응 합 니 다.주의해 야 할 것 은 서로 다른 대상 의 구성원 함 수 를 호출 할 때 같은 함수 코드 를 실행 하지만 실행 결 과 는 일반적으로 다르다 는 것 이다.
서로 다른 대상 이 사용 하 는 것 은 같은 함수 코드 세그먼트 인 데 어떻게 서로 다른 대상 의 데 이 터 를 각각 조작 할 수 있 습 니까?
원래 C++는 이 를 위해 서로 다른 대상 을 가리 키 는 this 라 는 지침 을 만 들 었 습 니 다.설명 필요:
구성원 함수 가 클래스 내 에서 정의 되 든 클래스 밖에서 정의 되 든 구성원 함수 의 코드 세그먼트 는 같은 방식 으로 저 장 됩 니 다.
구성원 함수 의 이러한 저장 방식 과 inMne(내장)함수 의 개념 을 혼동 하지 마 세 요.inline 성명(또는 기본 값 은 inline)의 구성원 함수 로 착각 하지 마 십시오.코드 세그먼트 는 대상 의 저장 공간 을 차지 하고 inline 성명 의 구성원 함 수 를 사용 하지 않 으 며 코드 세그먼트 는 대상 의 저장 공간 을 차지 하지 않 습 니 다.inline 으로 설명 하 든 안 하 든 구성원 함수 의 코드 세그먼트 는 대상 의 저장 공간 을 차지 하지 않 습 니 다.inline 성명 을 사용 하 는 역할 은 이 함 수 를 호출 할 때 함수 의 코드 세그먼트 를 함수 호출 점 에 복사 하 는 것 입 니 다.inline 성명 을 사용 하지 않 으 면 이 함 수 를 호출 할 때 절 차 는 함수 코드 세그먼트 의 인구 주 소 를 옮 기 고 이 함수 코드 세그먼트 를 실행 한 후에 절 차 는 함수 호출 점 으로 돌아 갑 니 다.inline 은 구성원 함수 가 대상 의 저장 공간 을 차지 하 는 지 여부 와 상 관 없 이 같은 질문}에 속 하지 않 으 며 헷 갈 려 서 는 안 됩 니 다.
흔히 말 하 는'특정한 대상 의 구성원 함수'는 논리 적 인 측면 에서 볼 때 구성원 함수 의 저장 방식 은 물리 적 인 측면 에서 볼 때 이들 은 모순 되 지 않 는 다 는 것 을 설명해 야 한다.

좋은 웹페이지 즐겨찾기