C++ 2011.10.01 (미검사)
#include<iostream.h>
template <class dt, class dt2> // template함수 swap
void swap(dt &x, dt2 &y)
{
dt temp = x;
x = y;
y = temp;
}
void main ( )
{
int a = 10, b = 20;
swap<int> (a, b);
cout << a << ", " << b << endl; // 20, 10
long c = 30, d = 40;
swap<long> (c, d);
cout << c << ", " << d << endl; // 40, 30
swap (a, c);
}
/*
template <class dt> // template함수 swap
void swap(dt &x, dt &y)
{
dt temp = x;
x = y;
y = temp;
}
void main ( )
{
int a = 10, b = 20;
swap<int> (a, b);
cout << a << ", " << b << endl; // 20, 10
long c = 30, d = 40;
swap<long> (c, d);
cout << c << ", " << d << endl; // 40, 30
}
*/
/*
void swap(int &x, int &y)
{
int temp = x;
x = y;
y = temp;
}
void swap(long &x, long &y)
{
long temp = x;
x = y;
y = temp;
}
void main ( )
{
int a = 10, b = 20;
swap(a,b);
cout << a << ", " << b << endl; // 20, 10
long c = 30, d = 40;
swap(c,d);
cout << c << ", " << d << endl; // 40, 30
}
*/
/*
class nike
{
int nai;
int ki;
public :
nike(int x, int y)
{
nai = x, ki = y;
}
friend ostream & operator << ( ostream &out, nike temp);
friend istream & operator >> ( istream &in, nike &temp);
};
ostream &operator << ( ostream &out, nike temp)
{
out << temp.nai << ", " << temp.ki;
return out;
}
istream &operator >> (istream &in , nike &temp)
{
cout << "나이 입력 : ";
in >> temp.nai;
cout << "키 입력 : ";
in >> temp.ki;
return in;
}
void main ( )
{
nike ob(10,20);
cout << ob << endl; // 10, 20
cin >> ob;
cout << ob << endl; // 입력된 값이 출력된다.
}
*/
/*
class nike
{
int nai;
int ki;
public :
nike(int x, int y)
{
nai = x, ki = y;
}
friend ostream & operator << ( ostream & out, nike temp);
};
ostream & operator << ( ostream & out, nike temp)
{
out << temp.nai << ", " << temp.ki;
return out;
}
void main ( )
{
nike ob(10,20);
cout << ob << endl; // 10, 20
}
*/
/*
class A
{
int *ip;
public : A( )
{
cout << "A의 생성자!" << endl;
ip = new int;
}
~A( )
{
cout << "A의 소멸자!" << endl;
delete ip;
}
};
class B : virtual public A // 가상베이스 클래스
{
public : B( ) { cout << "B의 생성자!" << endl; }
~B( ) { cout << "B의 소멸자!" << endl; }
};
class C : virtual public A // 가상베이스 클래스
{
public : C( ) { cout << "C의 생성자!" << endl; }
~C( ) { cout << "C의 소멸자!" << endl; }
};
class D : public B, public C
{
public : D( ) { cout << "D의 생성자!" << endl; }
~D( ) { cout << "D의 소멸자!" << endl; }
};
void main ( )
{
D ob;
}
*/
/*
class A
{
int *ip;
public : A( ) { cout << "A의 생성자!" << endl; }
~A( ) { cout << "A의 소멸자!" << endl;}
};
class B : public A
{
public : B( ) { cout << "B의 생성자!" << endl; }
~B( ) { cout << "B의 소멸자!" << endl; }
};
class C :public A
{
public : C( ) { cout << "C의 생성자!" << endl; }
~C( ) { cout << "C의 소멸자!" << endl; }
};
class D : public B, public C
{
public : D( ) { cout << "D의 생성자!" << endl; }
~D( ) { cout << "D의 소멸자!" << endl; }
};
void main ( )
{
D ob;
}
*/
/*
class A
{
protected :
int ma;
public :
A( int x )
{
ma = x;
cout << "난 A의 생성자!" << endl;
}
~A( ) { cout << "난 A의 소멸자!" << endl; }
void printA( ) { cout << "ma = " << &ma << endl; }
virtual void out( ) { cout << "난 A의 out( )" << endl; }
virtual void pp( ) = 0; // 순수 가상함수
};
class B : public A
{
protected :
int mb;
public :
B( int x , int y ) : A(x) // 매개변수를 받아오는 생성자
{
mb = y;
cout << "난 B의 생성자!" << endl;
}
~B( ) { cout << "난 B의 소멸자!" << endl; }
void printB( ) { cout << "mb = " << &mb << endl; }
virtual void out( ) { cout << "난 B의 out( )" << endl; }
};
class C : public B // A와 B를 다중상속 받는 자식 클래스 C
{
int mc;
public :
C( int x, int y, int z ) : B(x,y), mc(z)
{
mc = z;
cout << "난 C의 생성자!" << endl;
}
~C( ) { cout << "난 C의 소멸자!" << endl; }
void printC( ) { cout << "ma = " << ma << ", mb = " << mb << ", mc = " << mc << endl; }
void out( ) { cout << "난 C의 out( )" << endl; }
void pp( ) { cout << "난 pp( )다!" << endl; } // 순수 가상함수의 정의
};
void main ( )
{
C ob(10,20,30);
ob.printA( );
ob.printB( );
ob.printC( );
cout << "sizeof(ob) = " << sizeof(ob) << ", &ob = " << &ob << endl;
ob.out( ); // C의 out( )이 나온다.
ob.A::out( ); // A이 out( )이 나온다.
ob.B::out( ); // B이 out( )이 나온다.
C *cp = &ob;
cp->out( ); // C의 out( )이 나온다.
cp->A::out( ); // A의 out( )이 나온다.
cp->B::out( ); // B의 out( )이 나온다.
A *ap = &ob; // 부모 클래스형 포인터는 자식형 객체의 주소 보관 가능
B *bp = &ob; // 부모 클래스형 포인터는 자식형 객체의 주소 보관 가능
cout << "&ob = " << &ob << ", ap = " << ap << ", bp = " << bp << endl;
A &ar = ob; // 부모클래스형 레퍼런스는 자식형 객체의 별명이 될 수 있다.
B &br = ob; // 부모클래스형 레퍼런스는 자식형 객체의 별명이 될 수 있다.
ar.out( ); // A의 out( ), out( )이 가상함수라면 C의 out( )
br.out( ); // B의 out( ), out( )이 가상함수라면 C의 out( )
}
*/
/*
class A
{
protected :
int ma;
public :
A( int x )
{
ma = x;
cout << "난 A의 생성자!" << endl;
}
~A( ) { cout << "난 A의 소멸자!" << endl; }
void printA( ) { cout << "ma = " << &ma << endl; }
virtual void out( ) { cout << "난 A의 out( )" << endl; }
virtual void pp( ) = 0; // 순수 가상함수
};
class B
{
protected :
int mb;
public :
B( int y ) // 매개변수를 받아오는 생성자
{
mb = y;
cout << "난 B의 생성자!" << endl;
}
~B( ) { cout << "난 B의 소멸자!" << endl; }
void printB( ) { cout << "mb = " << &mb << endl; }
virtual void out( ) { cout << "난 B의 out( )" << endl; }
};
class C : public A, public B // A와 B를 다중상속 받는 자식 클래스 C
{
int mc;
public :
C( int x, int y, int z ) : A(x), B(y), mc(z)
{
mc = z;
cout << "난 C의 생성자!" << endl;
}
~C( ) { cout << "난 C의 소멸자!" << endl; }
void printC( ) { cout << "ma = " << ma << ", mb = " << mb << ", mc = " << mc << endl; }
void out( ) { cout << "난 C의 out( )" << endl; }
void pp( ) { cout << "난 pp( )다!" << endl; } // 순수 가상함수의 정의
};
void main ( )
{
C ob(10,20,30);
ob.printA( );
ob.printB( );
ob.printC( );
cout << "sizeof(ob) = " << sizeof(ob) << ", &ob = " << &ob << endl;
ob.out( ); // C의 out( )이 나온다.
ob.A::out( ); // A이 out( )이 나온다.
ob.B::out( ); // B이 out( )이 나온다.
C *cp = &ob;
cp->out( ); // C의 out( )이 나온다.
cp->A::out( ); // A의 out( )이 나온다.
cp->B::out( ); // B의 out( )이 나온다.
A *ap = &ob; // 부모 클래스형 포인터는 자식형 객체의 주소 보관 가능
B *bp = &ob; // 부모 클래스형 포인터는 자식형 객체의 주소 보관 가능
cout << "&ob = " << &ob << ", ap = " << ap << ", bp = " << bp << endl;
A &ar = ob; // 부모클래스형 레퍼런스는 자식형 객체의 별명이 될 수 있다.
B &br = ob; // 부모클래스형 레퍼런스는 자식형 객체의 별명이 될 수 있다.
ar.out( ); // A의 out( ), out( )이 가상함수라면 C의 out( )
br.out( ); // B의 out( ), out( )이 가상함수라면 C의 out( )
}
*/
/*
class A
{
protected :
int ma;
public :
A( int x )
{
ma = x;
cout << "난 A의 생성자!" << endl;
}
~A( ) { cout << "난 A의 소멸자!" << endl; }
void printA( ) { cout << "ma = " << &ma << endl; }
void out( ) { cout << "난 A의 out( )" << endl; }
};
class B
{
protected :
int mb;
public :
B( int y ) // 매개변수를 받아오는 생성자
{
mb = y;
cout << "난 B의 생성자!" << endl;
}
~B( ) { cout << "난 B의 소멸자!" << endl; }
void printB( ) { cout << "mb = " << &mb << endl; }
void out( ) { cout << "난 B의 out( )" << endl; }
};
class C : public A, public B // A와 B를 다중상속 받는 자식 클래스 C
{
int mc;
public :
C( int x, int y, int z ) : A(x), B(y), mc(z)
{
mc = z;
cout << "난 C의 생성자!" << endl;
}
~C( ) { cout << "난 C의 소멸자!" << endl; }
void printC( ) { cout << "ma = " << ma << ", mb = " << mb << ", mc = " << mc << endl; }
void out( ) { cout << "난 C의 out( )" << endl; }
};
void main ( )
{
C ob(10,20,30);
ob.printA( );
ob.printB( );
ob.printC( );
cout << "sizeof(ob) = " << sizeof(ob) << ", &ob = " << &ob << endl;
ob.out( ); // C의 out( )이 나온다.
ob.A::out( ); // A이 out( )이 나온다.
ob.B::out( ); // B이 out( )이 나온다.
C *cp = &ob;
cp->out( ); // C의 out( )이 나온다.
cp->A::out( ); // A의 out( )이 나온다.
cp->B::out( ); // B의 out( )이 나온다.
A *ap = &ob; // 부모 클래스형 포인터는 자식형 객체의 주소 보관 가능
B *bp = &ob; // 부모 클래스형 포인터는 자식형 객체의 주소 보관 가능
cout << "&ob = " << &ob << ", ap = " << ap << ", bp = " << bp << endl;
A &ar = ob; // 부모클래스형 레퍼런스는 자식형 객체의 별명이 될 수 있다.
B &br = ob; // 부모클래스형 레퍼런스는 자식형 객체의 별명이 될 수 있다.
ar.out( ); // A의 out( )
br.out( ); // B의 out( )
}
*/
/*
class A
{
protected :
int ma;
public :
A( int x )
{
ma = x;
cout << "난 A의 생성자!" << endl;
}
~A( ) { cout << "난 A의 소멸자!" << endl; }
void printA( ) { cout << "ma = " << &ma << endl; }
};
class B
{
protected :
int mb;
public :
B( int y ) // 매개변수를 받아오는 생성자
{
mb = y;
cout << "난 B의 생성자!" << endl;
}
~B( ) { cout << "난 B의 소멸자!" << endl; }
void printB( ) { cout << "mb = " << &mb << endl; }
};
class C : public A, public B // A와 B를 다중상속 받는 자식 클래스 C
{
int mc;
public :
C( int x, int y, int z ) : A(x), B(y), mc(z)
{
mc = z;
cout << "난 C의 생성자!" << endl;
}
~C( ) { cout << "난 C의 소멸자!" << endl; }
void printC( ) { cout << "ma = " << ma << ", mb = " << mb << ", mc = " << mc << endl; }
};
void main ( )
{
C ob(10,20,30);
ob.printA( );
ob.printB( );
ob.printC( );
cout << "sizeof(ob) = " << sizeof(ob) << ", &ob = " << &ob << endl;
}
*/
/*
class A
{
int ma;
public :
void printA( ) { cout << "ma = " << &ma << endl; }
};
class B
{
int mb;
public :
void printB( ) { cout << "mb = " << &mb << endl; }
};
class C : public A, public B // A와 B를 다중상속 받는 자식 클래스 C
{
int mc;
public :
void printC( ) { cout << "mc = " << &mc << endl; }
};
void main ( )
{
C ob;
ob.printA( );
ob.printB( );
ob.printC( );
cout << "sizeof(ob) = " << sizeof(ob) << ", &ob = " << &ob << endl;
}
*/
/*
class A
{
int ma;
public :
void printA() { cout << "ma = " << ma << endl; }
};
class B
{
int mb;
public :
void printB() { cout << "mb = " << mb << endl; }
};
class C : class A, class B // A와 B를 다중상속 받는 자식 클래스 C
{
int mc;
public :
void printC() { cout << "mc = " << mc << endl; }
};
void main ()
{
C ob;
ob.printA();
ob.printB();
ob.printC();
cout << "sizeof(ob) = " << sizeof(ob) << endl;
}
*/