Pass by Reference
๋ด๊ฐ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ํด๋์ค๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค์๋ค. ์ด๋, ์ด ํด๋์ค์ ์ฐ๊ฒฐ๋์ด ์๋, ํจ์๋ฅผ ๋ฉ์๋๋ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด ๋ง๋ค์ด์ง ๊ฐ์ฒด๋ฅผ ํด๋์ค ๋ฐ์ ํจ์์์ input์ผ๋ก ๋ฐ๋๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ณดํต ํด๋์ค๋ฅผ ํจ์์ input parameter๋ก ๋ฐ์ ๋, reference๋ก ๋ฐ๋๋ค. ๊ทธ ์ด์ ๋ ํด๋์ค๊ฐ ์ ์ฅ๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์ ์ฝ์ ์ํด์์ด๋ค.
const
์ธ๋ถ ํจ์์์ ๋ด๊ฐ ๋ง๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฅผ ๋, callbyreference๋ก ๊ฐ์ ๊ฐ์ ธ์๋ค๋ฉด, ํจ์ ๋ด์์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํจ์๋ฅผ ๋ง๋ค ๋, input ํ๋ผ๋ฏธํฐ ์์ย constย ๋ฅผ ๋ฌ์์ค๋ค.
void print(const Point& pt){
// ํจ์๋ด์ฉ
}
๊ทธ๋ฐ๋ฐ, ์ด ํจ์๋ด์์ ํจ์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ํด๋์ค๋ฅผ ์ ์ํ๋๋ฐ ์์ด์ ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๋ฐ, const๋ก ์ด ๊ฐ์ฒด๊ฐ ์ฌ์ฉ๋๋ค๋ฉด const๋ผ๋ ํ์๊ฐ ์๋ method๋ง ์ฌ์ฉํ ์ ์๋ค.
// class ์ ์
class Point {
private:
int x;
int y;
public:
Point(): x(0), y(0) {}
Point(int _x, int _y): x(_x), y(_y) {}
// ์ธ๋ถํจ์์ ๊ฐ์ฒด๋ฅผ const๋ก ๋๊ฒผ์ ๋ ์ฌ์ฉํ ์ ์๋ ํจ์
int getX() const {return this->x;}
int getY() const {return this->y;}
// ์ธ๋ถ ํจ์ ์ ์
void print(const Point& pt){
cout << pt.getX() << ", " << pt.getY() << endl << endl;
}
Pointer to Object
ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ๋๋ ์ญ์ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒ๊ณผ ๋๊ฐ๋ค.
*
์ฐ๋ฆฌ๊ฐ ์์ ์ ํฌ์ธํฐ์ ๋ํด์ ๋ฐฐ์ธ๋, ํด๋น ์ฃผ์์ ์๋ ๊ฐ์ผ๋ก ์ ํ ํ๋ผ๊ณ ํ์ ๋, *
ย ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ์๋ค.
ํด๋์ค ๋ณ์์ ๋ํด ์ด ๊ฒ์ ์ทจํ๊ฒ ๋๋ฉด ํด๋์ค ๊ฐ์ฒด ์์ฒด๋ฅผ ๋งํ๊ฒ ๋๊ณ , ๊ทธ์ ์์ผ ์ฐ๋ฆฌ๋ ๋ฉค๋ฒ๋ณ์์ ์ ๊ทผ ํ ์ ์๋ค.
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
};
int main(){
Point pt1;
Point* ppt1;
pt1.x = 1;
pt1.y = 2;
ppt1 = &pt1;
cout << (*ppt1).x << ", " << (*ppt1).y << endl;
return 0;
}
1, 2
โ
์ด๋ฒ์๋ ํฌ์ธํฐ์์ ๋ฉค๋ฒ๋ณ์๋ก ์ ๊ทผํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์.
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
};
int main(){
Point pt1;
Point* ppt1;
pt1.x = 1;
pt1.y = 2;
ppt1 = &pt1;
cout << ppt1->x << ", " << ppt1->y << endl;
return 0;
}
1, 2
ํฌ์ธํฐ ๋ณ์(์ฃผ์๊ฐ ๋ด๊ธด) โ ๋ณ์ ์ด๋ฐ์์ผ๋ก ์ ์ด์ฃผ๊ฒ ๋๋ฉด, โํด๋น ํฌ์ธํฐ ์ฃผ์๋ก ๊ฐ์, ๋ณ์ x์ ๊ฐ์ ์ฝ์ด!โ ๋ผ๋ ๋ป์ด ๋๋ค.
๋์ ํ ๋น new, delete
๋์ ํ ๋น๋ ์ญ์ ํ ์ ์๋ค.
๋์ ํ ๋น์, ํ ํจ์๋ด์์ ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฃ์๋ค๊ฐ ์ญ์ ํ ์ ์์ด ํจ์จ์ฑ์ ๋์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด์๋ค.
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
};
int main(){
Point* pt1, pt2;
pt1 = new Point;
pt2 = new Point[5];
pt1.x = 1;
pt1.y = 2;
cout << ppt1->x << ", " << ppt1->y << endl;
delete pt1;
delete pt2;
return 0;
}
์ฃผ์์ฌํญ
๋์ ํ ๋น์ ํด์ ํ์ง ์์ผ๋ฉด, ํจ์๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๋จ์์์ผ๋ฏ๋ก! stream ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ผญ! delete๋ก ํ ๋น์ ํด์ ย ํด์ฃผ์ด์ผ ํ๋ค!
this Pointer
์๊ธฐ ์์ ์ ์ฃผ์๊ฐ์ ๊ฐ์ ธ์จ๋ค.
์ฐ๋ฆฌ๊ฐ class๋ฅผ ๋ง๋ค๋ค๋ณด๋ฉด, ํน์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ ๋, ์๊ธฐ์์ ์ ๋ด๋ฑ์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค. ์ด ๊ฒ์ ์ํด์ ์ฐ๋ฆฌ๋ ๋งค์๋ ์์์ย thisย ๋ผ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์ฌ์ฉํ๋ค.
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
// ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์์ ์ ๋ฉค๋ฒ๋ณ์์ ๊ฐ์ ํ ๋นํ๋ค.
void setXY(int _x, int _y){
this->x = _x;
this->y = _y;
}
// const ๋ ๋ค๋ฅธ ํจ์์์ ์ผ์ ๋ const๋ก ๋ฐ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๊ฐ๋ฅํ ํจ์
//
int getX() const {return this->x;}
int getY() const {return this->y;}
};