소멸자는 객체가 사라질떄 동적할당을 없애줘야함. strcpy -------------@ class str { char*name; int len; public: str(char *x){ len = strlen(x); name = new char[len+1]; strcpy(name, x); } ~str (){ cout <<name<<" 의 동적 할당을 해제합니다." << endl; delete name; } void Disp() { cout << " name=" << name << endl;} }; void main(){ str h1("홍길동"); str h2("고길동");//객체 생성 h1.Disp(); h2.Disp(); } ---------실행결과 name=홍길동 name=고길동 고길동 의 동적 할당을 해제합니다. 홍길동 의 동적 할당을 해제합니다. 계속하려면 아무 키나 누르십시오 . . . -------------------- len = strlen(x); 문자의 길이. 한글은 2바이트 홍길동 6
*) C에서는 같은 자료형은 대입이 가능함. CLass 또한 자료형이기 때문에 대입이 가능하다. 그러나 주소로 대입시 공간을 공유하기 때문에 문제점이 생길 수 있다. ---------@ 포인터를 활용한 주소로 대입 #include "stdafx.h" #include <iostream> #include <string> using namespace std;
class Point { char*name; int x; public: Point(char *n, int a){ int len = strlen(n); name = new char[len+1]; strcpy(name, n); x=a; } -----------------------//다음 내용 추가시 & 레퍼런스 추가로 인해 //주소를 공유하는 또다른 변수가 생성됨 Point(const Point &curr){ int len; len= strlen(curr.name); name = new char[len+1]; strcpy(name, curr.name); x = curr.x; } ----------------------- ~Point(){ delete name; //name은 문자열이 아닌 주소값 } void Disp(){ cout<<name<<"\n";//주소값 배열시 null값 까지 출룍 cout<<x<<"\n"; } }; void main(){ Point *po1 = new Point("첫 번째 값", 10); Point *po2 = new Point(*po1); po1->Disp(); delete po1; po2->Disp(); }
----------실행결과 첫 번째 값 10 硼硼硼硼硼硼硼?mT //주소를 할당 받아서 쓰기에 메모리 삭제시 쓰레기값이 있는 주소를 가리킨다. 10 계속하려면 아무 키나 누르십시오 . . . -
얕은 복사- 주소 자체를 복사 깊은 복사- &(레퍼런스)로 문자열까지 복사
@------------this 포인터 //멤버 변수를 가리킬때 사용. class calc { int num1, num2; public: calc(int num1, int num2){ this-> num1= num1; this-> num2=num2; } int GetSum(){return num1 + num2;} }; void main(){ int su1, su2; calc ca; cin >> su1 >> su2; ca.Init(su1, su2); cout << ca.GetSum() <<endl; } -----------실행결과 5 3 8 계속하려면 아무 키나 누르십시오 . . .
------------@ 4연산 식 class calc{ int num1 , num2; public: calc(int num1 , int num2){ this->num1=num1; this->num2=num2; } int GetSum(){ return num1 + num2; } int GetSub(){ return num1 - num2; } int GetMul(){ return num1 * num2; } int GetDiv(){ return num1 / num2; } }; void main (){ int su1, su2; cin >> su1 >> su2; calc ca(su1, su2);
cout << ca.GetSum() << endl; cout << ca.GetSub() << endl; cout << ca.GetMul() << endl; cout << ca.GetDiv() << endl; } ------------@ Class의 상속 // kdh.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. /* 생성자의 인자가 없을 경우 1~10 까지의 합을 구하시오. 생성자의 인자가 하나일 경우 1~입력한 수 까지의 합을 구하시오. 생성자의 인자가 두 개일 경우 작은 수부터 큰 수까지의 합을 구하시오 */ #include "stdafx.h" #include <iostream> #include <string> using namespace std;
class AAA{ public: AAA(){cout <<"AAA maked!!" <<endl;} }; class BBB:public AAA{ public: BBB(){cout <<"BBB maked!!"<<endl;} };
void main(){BBB b;} ----------실행결과 AAA maked!! BBB maked!! 계속하려면 아무 키나 누르십시오 . . . ------------protected를 이용한 상속 // kdh.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. /* 생성자의 인자가 없을 경우 1~10 까지의 합을 구하시오. 생성자의 인자가 하나일 경우 1~입력한 수 까지의 합을 구하시오. 생성자의 인자가 두 개일 경우 작은 수부터 큰 수까지의 합을 구하시오 */ #include "stdafx.h" #include <iostream> #include <string> using namespace std;
class Mammal{//포유류 protected: int age, weight; public: Mammal(){ age=5, weight=15; } void Disp(){ cout << age << endl; cout << weight<<endl; } }; class Dog:public Mammal{ public: void Bowwow(){ cout << "멍멍\n"; } };
void main(){ Dog jindo; jindo.Disp(); jindo.Bowwow(); } ----------------결과 5 15 멍멍 계속하려면 아무 키나 누르십시오 . . .
private = protected가 유사하게 쓰임. -------------@ 다중상속, 다 수의 부모클래스(super class)들을 자식클래스(sub class)로 상속함으로써 편하게 함수명만 써서 부모클래스의 함수들을 활용할 수 있다. #include "stdafx.h" #include <iostream> #include <string> using namespace std;
class Phone{ public: void Status(){ cout<< "Phone Status OK! \n"; } }; class Printer{ char Data[256]; public: void Print(char *data){ strcpy(Data, data); cout << Data <<endl; } }; class Fax:public Phone, public Printer{ public: void Receive(){ cout<< "Fax receive Ok! \n"; } };
----------결과 Hellow Phone Status OK! Fax receive Ok! 계속하려면 아무 키나 누르십시오 . . . ----------@클래스 안에 같은 명의 함수가 #include "stdafx.h" #include <iostream> #include <string> using namespace std; class Phone{ public: void Status(){ cout << "Phone state\n"; } }; class Printer{ public: void Status(){ cout << "Printer state\n"; } }; class Fax:public Phone, public Printer{ public: void Receive(){ cout << "Ok receive\n"; } }; void main(){ Fax myFax; myFax.Phone::Status();//phone클래스의 status함수를 실행 myFax.Receive(); } ------------실행결과 Phone state Ok receive 계속하려면 아무 키나 누르십시오 . . . ------- status함수가 두개 나타날 때 어떻게 처리할 것인가에 대한 것.
using namespace std;
class Mammal{ public: void Speak(int cnt){ cout<<cnt<<"번 짓다.\n"; } void Speak(){ cout <<"짖다.\n"; } }; class Dog: public Mammal{ public: void Speak(){ cout<<"멍멍.\n"; } };
void main(){ Mammal dogmul; Dog jindo; dogmul.Speak(); dogmul.Speak(3); jindo.Speak(); //jindo.Speak(5); // 주석을 풀면 //'Dog::Speak' : 함수는 1개의 매개 변수를 사용하지 않습니다.' } ----------실행결과 짖다. 3번 짓다. 멍멍. 계속하려면 아무 키나 누르십시오 . . . b
-----------@이전 예제의 Mammal Class 를 상속받는 Person 클래스를 만드시오 // kdh.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다. /* 생성자의 인자가 없을 경우 1~10 까지의 합을 구하시오. 생성자의 인자가 하나일 경우 1~입력한 수 까지의 합을 구하시오. 생성자의 인자가 두 개일 경우 작은 수부터 큰 수까지의 합을 구하시오 */ #include "stdafx.h" #include <iostream> #include <string> using namespace std;
class Mammal{ public: void Speak(int cnt){ cout << cnt <<"번 짖다.\n"; } void Speak() { cout << "짖다.\n"; } }; class Dog : public Mammal{ public: void Speak() { cout << "멍멍\n"; } }; class Person :public Mammal{ public: void Speak() { cout << "멍멍\n"; } }; void main(){ Person st; st.Speak(); } -----------아래 Area 클래스를 상속하여 아래의 클래스를 만드시오 #include "stdafx.h" #include <iostream> #include <string> using namespace std;
class Area{ protected: double height; double width; }; class quad :public Area{ public: int a, b; void Extent(int a, int b){cout <<"사각형은 " <<a * b <<endl;} }; class tri :public Area{ int a, b; public: void Extent(int a, int b){cout << "삼각형은 " << (a * b) / 2<<endl;} }; void main(){ int a, b; cin >> a >> b; quad qe; tri te; qe.Extent(a, b); te.Extent(a, b); }