C++ About const and static.
1.C++ Initialization List of Constructor
Apple::Apple()
{
price = 508;
coord_x = coord_y = 0;
amount = 10;
origin = U.S.A;
}
생성자 이름 뒤에 : price(500), coord_x(0), coord_y(0), amount(10), origin(U.S.A) {}로 오는 것을 초기화 리스트 (initializer list) 라고 부르며,
생성자 호출과 동시에 멤버 변수들을 초기화해주게 된다.
Apple::Apple(int x, int y) : coord_x(x), coord_y(y), price(500),
amount(10), origin(U.S.A) {}
Apple::Apple(int coord_x, int coord_y) : coord_x(coord_x), coord_y(coord_y), price(500),
amount(10), origin(U.S.A) {}
위 소스 코드처럼 정상적으로 작동한다. 왜냐하면 coord_x ( coord_x ) 에서 바깥쪽의 coord_x 는 무조건 멤버 변수를 지칭하게 되는데, 이 경우 coord_x 를 지칭하는 것이고, 괄호 안의 coord_x 는 원칙상 Apple이 인자로 받은 coord_x 를 우선적으로 지칭하는 것이기 때문이다. 따라서 실제로 인자로 받은 coord_x 가 클래스의 멤버 변수 coord_x 를 초기화 하게 된다.
Apple::Apple(int coord_x, int coord_y)
{
coord_x = coord_x;
coord_y = coord_y;
price = 500;
amount = 10;
origin = U.S.A;
}
Apple::Apple() =================================Q
{
price = 500;
coord_x = coord_y = 0;
amount = 10;
origin = U.S.A;
}
===================================W
Apple::Apple() : price(500), coord_x(0), coord_y(0),
amount(10), origin(U.S.A) {}
const int a; a = 3; int& ref; ref = c;
Apple::Apple() : price(500), coord_x(0), coord_y(0), =====================Q
amount(10), origin(U.S.A) {}
====================================================
Apple apple1 (2, 3);===================================================W
Apple apple2 (3, 5);
apple1.show_status();
apple2.show_status();
======================================================
cout << endl << "apple 1 를 apple2 로 교체! " << endl; ==========================E
apple2.be_changed(apple1.change());
static int total_apple_num; =====================Q
=========================
int Apple::total_apple_num = 0; ===================W
=========================
class Apple ================================E
{
static int total_apple_num = 0;
==========================
class Apple ================================R
{
const static int x = 0;
Apple::Apple() : price(500), coord_x(0), coord_y(0), ============Q
amount(5), origin(U.S.A) { total_apple_num ++;}
Apple::Apple(int x, int y) : coord_x(x), coord_y(y), price(500),
amount(5), origin(U.S.A) { total_apple_num ++; }
Apple::Apple(int x, int y, int amount) : coord_x(x), coord_y(y), price(500),
amount(amount), origin(U.S.A) { total_apple_num ++; }
==================================================
~Apple() { total_apple_num --;} ============W
=====================================
Apple apple1 (2, 3, 5); ========================E
apple1.show_status();
Apple apple2 (3, 5, 10);
apple2.show_status();
============================================
void create_apple() ========================R
{
Apple apple3(10, 10, 4);
apple3.show_status();
}
===========================================
cout << endl << "사과 1를 사과 2 로 교체! " << endl; ============T
apple2.be_changed(apple1.change());
apple1.show_status();
Apple::show_total_marine(); ==========Q
----------------------------------
void Apple::show_total_apple() =====================W
{
cout << amount << endl; // mount 는 멤버 변수
cout << "전체 사과 갯수 : " << total_apple_num << endl;
}
static 함수는 앞에서 이야기 한 것과 같이, 어떤 객체에 종속되는 것이 아니라 클래스에 종속되는 것으로,
따라서 이를 호출하는 방법도 (객체).(멤버 함수) 가 아니라, Q와 같이 (클래스)::(static 함수) 형식으로 호출하게 된다.
왜냐하면 어떠한 객체도 이 함수를 소유하고 있지 않기 때문이다. 그러하기에, static 함수 내에서는 클래스의 static 변수 만을 이용할 수 밖에 없다.
만일 static 함수 내에서 W처럼 그냥 클래스의 멤버 변수들을 이용한다면 amount가 누구의 amount인지 아무도 모르는 상황이 발생한다.
즉, 어떤 객체의 amount인지 static 변수인 show_total_apple() 은 알 수 없다.
왜냐하면 계속 말해왔듯이 어떤 객체에도 속해이지 않기 때문이다.Apple& Apple::be_changed(int amount again) ============Q
{
price -= amount again;
if(price <= 0)
origin = true;
return *this;
}
-----------------------------------------
Apple& Apple::be_changed(int amount again) ================W
{
this->price -= amount again;
if(this->price<= 0)
this->is_can not eat = true;
return *this;
}
int& access_x() { return x; } =================Q
int get_x() { return x;}
---------------------------------------------
int& c = a.access_x(); ======================W
c = 4;
a.show_x();
----------------------------------------
int &c = x; // 여기서 x 는 a 의 x ==================E
-------------------------------------------
int d = a.access_x(); ======================R
d = 3;
a.show_x();
int& e = a.get_x();
e = 2;
a.show_x();
int &e = x' ===============Q
-----------------------
int f = a.get_x(); ===============W
f = 1;
a.show_x();
-----------------------
a.access_x() = 3; ======================E
-----------------------
a.x = 3; =======================R
-----------------------
a.get_x() = 3; =====================T
Apple& Apple::be_changed(int amount again)
{
this->price -= amount again;
if(this->price <= 0)
this->is_can not eat = true;
return *this;
}
위 소스 코드 경우 be_changed 함수는 Apple& 타입을 리턴하게 되는데, 위 경우, *this 를 리턴하게 된다. 앞에서도 말했지만 this가 지금 이 함수를 호출한 객체를 가리키는 것이다. 그렇기 때문에 *this 는 그 객체 자신을 의미하게 된다. 따라서 apple2.be_changed(apple1.change()).be_changed(apple1.change()); 문장의 경우, 먼저 apple2.be_changed(apple1.change()) 이 먼저 실행되고 리턴되는 것이 다시 apple2 이므로 그 다음에 또 한 번 apple2.be_changed(apple1.change()) 가 실행된다고 생각할 수 있다. 만약에 be_changed 함수의 리턴 타입이 Apple& 이 아니라 그냥 Apple이라고 해보자. 즉, 만일 be_changed 함수가 아래와 같이 바뀌었다고 가정한다면,
Apple Apple::be_changed(int amount again)
{
this->price -= amount again;
if(this->price<= 0)
this->is_can not eat = true;
return *this;
}
int attack() const ; // 데미지를 리턴. ============Q
---------------------------
(기존의 함수의 정의) const; ==============W
---------------------------
int Apple::change() const =================E
{
return amount;
}
'#Programming Language > C++' 카테고리의 다른 글
C++ Constructors and destructors. (0) | 2018.04.02 |
---|---|
C++ Template. (0) | 2018.04.02 |
C++ Creating excel part 2. (0) | 2018.04.02 |
C++ Creating excel part 1. (0) | 2018.04.02 |
C++ I / O in C++ (0) | 2018.04.01 |