판다코딩 c++ this 포인터, 클래스 객체 배열

개발자는엉금엉금·2022년 9월 21일
0

1.this 포인터

💻stock.h

#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

  • topval함수는 Stock class를 반환하고 Stock참조자를 매개변수로 가지는 함수

💻function부분

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

}

  • public함수를 정의할 때는 반환형 class::func()으로 정의한다.
  • if (s.share_val > share_val) return s; else return *this;
    • 참조하려는 share_val이 멤버변수의 share_val보다 크면 참조자 s를 반환하고, 그렇지않으면 *this, 즉 자신의 객체를 반환한다.

      this:함수 자신의 주소를 반환하는데, 역참조 *를 쓰면 값을 반환한다.

💻main부분

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

  • 생성자 s1의 멤버함수를 호출하는데 s2를 참조자(비교하려는 객체)로 사용
    그런데 s2.share_val>s1.share_val이므로 return s2를 따른다.

    만약 s2.topval(s1).show();로 호출하면 s2의 share_val이 크기때문에 return *this를 따른다.

2.클래스 객체 배열

💻stock.h와 func.cpp는 동일하므로 생략

💻main부분

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

  • class를 배열처럼 사용하려면 배열의 크기를 선언하고 중괄호안에 생성자를 콤마로 분류하여 초기화한다.
  • topval함수를 사용하여 인덱스끼리 비교한다
    • s[0]<s[1]이므로 s[1]을 first에 저장
    • s[1]<s[2]이므로 s[2]를 first에 저장
    • ... 다음과 같은 과정으로 s[3]이 first에 최종저장이 되고, show로 호출하면 s[3]의 생성자가 출력된다.

💡매개변수를 참조자로 사용했기 때문에, main의 멤버함수도 포인터를 사용해서 간접참조가 가능하다!

💻stock.h

#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

💻func.cpp

#include "stock.h"
Stock& Stock::topval(Stock& s)

{
	if (s.share_val > share_val)
		return s;
	else return *this;//그렇지 않다면 자기자신을 반환
	//this는 topval의 주소를 반환하는데, 역참조 *를 사용하면
	//자기 자신의 객체를 반환
}

  • 반환형에 참조자를 붙여서 참조자 객체를 반환

💻main함수

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

  • class형 포인터변수인 first는 s[0]의 주소를 참조하고, 포인터변수를 선언했기 때문에 화살표로 멤버함수에 간접접근한다.

0개의 댓글