C++/summary

클래스의 활용 2

gandus 2010. 6. 10. 12:00

객체의 포인터가 함수에 전달

Car mine();
Car you();

swap( &mine, &you);

void swap(Car *p1, Car *p2)
{
       Car tmp;
       tmp = *p1;
       *p1 = *p2;
       *p2 = tmp;
       p1->display();
       p2->display();
}


객체의 레퍼런스가 함수에 전달

Car mine();
Car you();

swap( mine, you);

void swapObjects(Car &r1, Car &r2)   // 레퍼런스를 사용
{
   Car tmp;
    tmp = r1;
    r1 = r2;
    r2 = tmp;
    r1.display();
    r2.display();
}


1. 함수 안에서 매개 변수로 전달받은 객체의 내용을 수정하려면 매개 변수를 어떤 타입으로 선언하여야 하는가?
       - 포인터 변수거나, 레퍼런스
2. 매개 변수로 포인터와 레퍼런스를 사용하는 경우를 비교하여 보자.
       - 포인터 변수는 주소만을 이용한 간접접근, 레퍼런스는 그 원본을 사용



정적 멤버 변수


인스턴스 변수(instance variable): 객체마다 하나씩 있는 변수
정적 변수(static variable): 모든 객체를 통틀어서 하나만 있는 변수
 - 프로그램이 끝나야 변수가 소멸된다.



메모리 영역
 1. 텍스트 영역 : 함수코드 저장
 2. 스택 : 지역변수, 매개변수, 반환값
 3. 데이터 : 전역변수, 정적변수, 상수
 4. 힙 : 동적할당 데이터 - 사용자가 할당 및 반납을 담당해야한다.



객체안에 일반 멤버들은 언제 메모리에 할당?  객체가 생성될때


일반 멤버는  객체멤버
- 객체 생성후 접근,  객체명.멤버

정벅 변수는 클래스 멤버 소유
 - 객체 생성과 상관없이 사용가능 , 클래스명 :: 멤버

클래스 안에서 정적변수 하면 객체가 만들어 지지 않더라고 이미 만들어져 있음.
클래스별로 딱 한개만 존재.


왜 사용??  현재 객체가 몇개 만들어 졌는지 //  혹은 모든 매체가 공유하는 변수가 필요할때.



class Car {
  int speed;
  int gear;
  string color;
  int id;        // 자동차의 시리얼 번호

public:
 // 실체화된 Car 객체의 개수를 위한 정적 변수
   static int numberOfCars;
   Car(int s=0, int g=1, string c="white"): speed(s), gear(g), color(c) {
   // 자동차의 개수를 증가하고 id 번호를 할당한다.
   id = ++numberOfCars;
 }
};

int Car::numberOfCars = 0;     //  정의를 꼭 해줘야 한다.


Car c1;
 cout << Car::numberOfCars << endl;

 Car c2;
 cout << c2.numberOfCars << endl;
   // 클래스 생성 하지 않고도 접근이 가능하다.




정적 멤버 함수
static int getNumberOfCars() {
  return numberOfCars; // OK!
 }

// 객체를 생성하지 않더라고 사용가능 , 정적 멤버 변수와 동일하다.
int n = Car::getNumberOfCars();   // 이런식으로 호출가능

-> 사실상 전역 함수처럼 사용한다.

정적 멤버 함수에서 일반 멤버 함수를 호출할수 없다.
-> 정적 멤버 함수는, 처음부터사용 가능하지만 일반 멤버 함수는 객체 생성후 사용가능해서.
-> CPP에서는 사실상 사용하지 않는다, 그냥 전역함수를 사용, 하지만 자바에서는 많은 사용을 한다.


1. 정적 변수는 어떤 경우에 사용하면 좋은가?  
        - 각 객체의 공유값을 설정할때
2. 정적 변수나 정적 멤버 함수를 사용할 때, 클래스 이름을 통하여 접근하는 이유는 무엇인가?  
        - 객체를 생성하지 않더라고 사용이 가능하므로
3. 정적 멤버 함수 안에서 인스턴스 멤버 함수를 호출할 수 없는 이유는 무엇인가?
        -  인스턴스 멤버 함수는 객체를 생성하므로 .



객체들의 배열

Car objArray[3] = {        //  초기화
 Car(0, 1, "white"),
 Car(0, 1, "red"),
 Car(0, 1, "blue"),
};


복소수