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;
}