#ifndef STOCK
#define STOCK
#include <iostream>
using namespace std;
class Stock
{
private:
string name;
int shares;
float share_val;
double total_val;
void set_total() { total_val = shares * share_val; }
//코드의 가독성을 위해 이렇게 작성
//double로 하고 return total_val로 해도 같은 결과나옴
public:
void buy(int, float);
void sell(int, float);
void update(float);
void show();
Stock topval(Stock&);
Stock(string, int, float);
Stock();
~Stock();
};
#endif
#include "stock.h"
void Stock::buy(int n, float pr)
{
shares += n;
share_val = pr;
set_total();
}
void Stock::sell(int n, float pr)
{
shares -= n;
share_val = pr;
set_total();
}
void Stock::update(float pr)
{
share_val = pr;
set_total();
}
Stock::Stock(string co, int n, float pr)
//Stock이라는 네임스페이스를 설정해줘야 class불러올 수 있음
{
name = co;
shares = n;
share_val = pr;
set_total();
}
Stock Stock::topval(Stock& s)
{
if (s.share_val > share_val)
return s;
else return *this;//그렇지 않다면 자기자신을 반환
//this는 topval의 주소를 반환하는데, 역참조 *를 사용하면
//자기 자신의 객체를 반환
}
Stock::Stock()
{
name = "";
shares = 0;
share_val = 0;
set_total();
}
Stock::~Stock()
{
cout << name << "클래스가 소멸되었습니다.\n";
}
void Stock::show() {
cout << "주식명:" << name << endl;
cout << "주식 수:" << shares << endl;
cout << "주가:" << share_val << endl;
cout << "주식 총 가치:" << total_val << endl;
}
반환형 class::func()
으로 정의한다.if (s.share_val > share_val) return s; else return *this;
this:함수 자신의 주소를 반환하는데, 역참조 *를 쓰면 값을 반환한다.
#include "stock.h"
int main()
{
Stock s1("A", 10, 1000);//생성자 s1
Stock s2("B", 20, 1400);//생성자 s2
s1.show();
s2.show();
cout << "A와 B중 share_val이 큰 객체는?\n";
s1.topval(s2).show();
return 0;
}
만약
s2.topval(s1).show();
로 호출하면 s2의 share_val이 크기때문에 return *this를 따른다.
#include "stock.h"
int main()
{
Stock s[4] = {
Stock("A",10,1000),
Stock("B",20,1200),
Stock("C",20,1300),
Stock("D",20,1400)
};
Stock first = s[0];
for (int i = 1; i < 4; i++)
first = first.topval(s[i]);
first.show();
return 0;
}
💡매개변수를 참조자로 사용했기 때문에, main의 멤버함수도 포인터를 사용해서 간접참조가 가능하다!
#ifndef STOCK
#define STOCK
#include <iostream>
using namespace std;
class Stock
{
private:
string name;
int shares;
float share_val;
double total_val;
void set_total() { total_val = shares * share_val; }
public:
void buy(int, float);
void sell(int, float);
void update(float);
void show();
Stock& topval(Stock&);
Stock(string, int, float);
Stock();
~Stock();
};
#endif
#include "stock.h"
Stock& Stock::topval(Stock& s)
{
if (s.share_val > share_val)
return s;
else return *this;//그렇지 않다면 자기자신을 반환
//this는 topval의 주소를 반환하는데, 역참조 *를 사용하면
//자기 자신의 객체를 반환
}
#include "stock.h"
int main()
{
Stock s[4] = {
Stock("A",10,1000),
Stock("B",20,1200),
Stock("C",20,1300),
Stock("D",20,1400)
};
Stock *first = &s[0];
for (int i = 1; i < 4; i++)
first = &first->topval(s[i]);
first->show();
return 0;
}