C++/summary

클래스의 활용.

gandus 2010. 6. 8. 15:33

Car myCar ;   // 정적 메모리 할당으로 객체 생성
Car *pCar = new Car();      // 동적 메모리 할당으로 객체 생성 - 힙 공간에 할당, 그 시작주소를 참조
                                       // 반드시 해제할 필요.

pCar->speed = 100;     // 접근 방법 
pCar->speedUp();       // 화살표 연산자를 통해서  = (*pCar). speedUp();


 Car(int s=0, int g=1, string c="white") : speed(s), gear(g), color(c) {          }
// 초기화 리스트 :  상수 , 객체, 레퍼런스 등이 꼭필요 ,  color() 만 필요하다.

-------------------------------

Car myCar;   // 정적 메모리 할당으로 객체 생성
 myCar.display();

 Car *pCar = &myCar;  // 위의 기존 객체 포인터로 객체를 가리키게 함
 pCar->display();

 pCar = new Car(0, 1, "blue");  // 새로운 동적 메모리 할당으로 객체 생성
 pCar->display();


1. 클래스로부터 객체를 생성할 수 있는 방법을 열거하여 보라.
   - 정적으로 , 동적으로(객체 포인터 변수 필요)
2. 객체 포인터로는 반드시 동적 생성된 객체만을 가리켜야 하는가?
   - 동적, 정적 모두 참조가 가능하다.


This

- 현재 코드를 실행하는 객체를 가리키는 포인터,  현재 객체를 가리킨다.

void Car::setSpeed(int speed)
{
 if( speed > 0 )
          this->speed = speed; // speed는 매개 변수, this->speed는 멤버 변수
                                          // 중복을 방지한다.
 else
          this->speed = 0; 
}


1. this 포인터는 무엇을 가리키는가?  - 현재 객체를 가리킨다.

2. this 포인터가 꼭 필요한 경우는?  - 멤버 변수와 인덱스 값을 구분




const 수식어



상수 멤버 변수

class Car
{
 const int serial;
 string color;
 ...
public:
 Car(int s, string c) : serial(s)
 {
  color = c;
 }
}


상수 멤버 함수

void displayInfo() const                      // 안에 있는 멤버 변수를 바꿀수가 없다, 읽기만 가능.
{
  cout << "속도: " << speed << endl;
  cout << "기어: " << gear << endl;
  cout << "색상: " << color << endl;
}


상수 객체  - 상수 멤버 함수만 호출 가능하다!!

int main()
{
 const Car c1(0, 1, "yellow");
 c1.setSpeed(); // 오류!    - 값을 바꿀수 없다
 return 0;
}

void printInfo() const
void printInfo()          //  상수 함수도 중복 정의가 가능하다.


1. 객체 선언시에 const가 붙으면 어떤 의미인가?  - 상수 객체
2. 멤버 변수 getSpeed()에 const를 붙여보라. 어떤 의미인가?  - 상수 멤버 함수, 상수 객체가 호출 가능하도록



객체와 연산자

string s1("hi");    string s2("hel");
- 연산자 함수 : Operatee +
s1 + s2  = > s1.operate+ (s2);         - > +, = , ==등.. 가 연산자 함수이다.


Car c1(0, 1, "white");
 Car c2(0, 1, "red");
 c1 = c2;  // 어떻게 되는가?    //  같은 타입이다. - > 멤버별 복사이다. // 얕은 복사이기에
 return 0;


Car c1(0, 1, "white");
 Car c2(0, 1, "red");
 if( c1 == c2 ){                      // 객체를 비교한다, 기본적 == 은 주소만 비교한다, 재정의가 필요.
  cout << "같습니다“ << endl;
 }
 else {
  cout << "같습니다“ << endl;
 }



객체와 함수

- 함수 사용 시 중요한것
  인자전달(입력)   => pass by value : 값 복사 - 원본(실인자) => 복사본(형식인자)
                          =>pass by add
                          => pass by reference// cpp에서 추가됨


  반환값 = > 값을, 주소를, 레퍼런스를 리턴할수 있음.. 보통은 값을 리턴한다.

-> 객체도  이같이 함수 값으로 전달할수 있다.


Pass by value

void swapObjects(Car c1, Car c2)
{
 Car tmp;
 tmp = c1;
 c1 = c2;
 c2 = tmp;
 c1.display();
 c2.display();
}

int main()
{
 Car mine(0, 1, "white");
 Car yours(0, 1, "red");
 swapObjects(mine, yours);
 mine.display();
 yours.display();   // 실질적인 값은변화지 않는다.

 return 0;



함수가 객체를 반환

Car buyCar()  
{
 Car tmp(0, 1, "metal");
 return tmp;
}

int main()
{
 Car c1;
 c1.display();
 c1 = buyCar();     //  buyCar() 에  객채를 반환한다.
                     // 그 다음에 c1에 객체를 복사시킨다.

 c1.display();

 return 0;
}