객체의 포인터가 함수에 전달
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"),
};
복소수