배운 모든 개념 정리된 stock 클래스

#include <iostream>
using namespace std
class stock{
	int data;//default access: private
	private: 
		int data1;
		int data2;
		string s;
		void func();
		const int cdata1 =10;
		const int cdata2; //뒤에 생성자에서 정의
		static int privatenum;
	public:
	  stock(int a,int b, string s="");
		//explicit stock(int ~~) 하면, main()에서 stock x = {1,2} 불가능
		stock(); //constructor
		~stock(); //destructor
		stock(const stock &st); //copy constructor
		void func1(int x); //멤버 함수
		void func2(int x) const ; 
		//private을 건들지 않는다고 명시
		//main에서 const stock food 하고 food.func2(2)하면 에러! 이때 const 뒤에 붙임

		
		stock operator+(const stock &b) const;
		friend stock operator-(const stock &a, const stock &b) const;
		friend ostream& operator<<(ostream&os, stock &b);
		stock operator-() const;
		stock &operator =(const stock &st); //assign operator
		//연산자 오버로딩
		//하나 이상의 user-defined 타입 필요
		//새로운 연산자 불가능, 기존 목적과 부합하게
		//멤버 함수로만 만들 수 있는 것:  =  () [] ->
		
		operator string() const{ return s;}
		//stock food(1,2,"orange");
		//string name = food; ->orange 들어감, explicit이면 불가능!
		//string name = (string)food, string(food) 도 가능

		static int publicnum;
		static void init();
};

inline void stock::func(){
	cout <<s; //private 접근 가능
}

void stock::func1(int a){
	data1=data1+a; //private 접근 가능
	statement;
}

void stock::func2 const (int a){
	data1=data1+a; //private 접근 가능
	statement;
}

stock::stock(int a,int b, string str)
: cdata2(10) //선언과 동시에 초기화 ->속도 향상
{
	this->data1=a; //this: 자기 자신을 반환함
	data2=b;
	s=str;
}

stock::stock()
: s("default name"), cdata2(10)
{
	data1=0;
	data2=0;
	s="";
}

stock::~stock(){ //called at: 인스턴스 할당 해제, 프로그램 종료시
	statement; //usually, dynamically deallocate memory
}

stock stock::operator+(const stock &b) const{
	return stock(data1+b.data1, data2+b.data2,"cook");
}

inline stock operator-(const stock &a, const stock &b) const{
	return stock(a.data1+b.data1, a.data2+b.data2, "cook");
}

ostream& operator<<(ostream&os, stock &b){
	os<<b.data1<<b.data2;
	return os;
}

stock stock::operator-() const{
	return stock(-data1,-data2,"");
} 

stock &stock::operator =(const stock &st){
	if(this==&st) return *this;
	delete ~~(자기 데이터)
	new ~~ ->deep copy
	data1 = st.data1;
	~~
}

int stock::publicnum = 0; //static 변수: 밖에서 정의

void stock::init(){ //static method: static만 건드릴 수 있음
	privatenum=1;
}

stock::stock(const stock &st){ //copy constructor
	data1=st.data1;
	~~
	//하는 이유: 그냥 놔두면, 동적할당한것도 그냥 똑같이 해버려서
	//같은걸 가리키게 되고 나중에 복잡해짐
	//따라서 동적할당된 데이터를 복사해야 한다면, 복사본에다가 새로운 동적할당
	//deep copy
}

int main(){
	stock stocks[20]={
		stock food1 = stock;
		stock food2 = stock();
	  stock food3 = stock(1,2,"apple");
		stock food4(3,4,"banana");
		stock food5;
		stock food6(); //함수선언임!
	}
	stock food7 = food1+ food2;
	cout << food7;
	stock food8 = food; //copy constructor
	stock food9;
	food9 = food8; //copy 호출, assign 작동
}