ex1). 포인터를 사용하는 방법 (call by reference)
//2,5 5,2 5,2
void swap(int *, int *);
int main()
{
int a=2, b=5;
std::cout << a << " " << b << '\n' << std::endl;
//a의 주소값, b의 주소값 둘이 바뀜!
swap(&a, &b); // 실 매개변수를 주소로 전달
std::cout << a << " " << b << '\n' << std::endl;
return 0;
}
void swap(int *pa, int *pb) // 형식 매개변수가 포인터 변수
{
//int *pa=&a, int *pb=&b
int temp;
temp=*pa; // pa 주소로 가서 값 참조 (temp=2;)
*pa=*pb; // a의 주소값으로 b 주소값인 5 대입
*pb=temp; // 2를 b주소의 값으로 대입
std::cout << *pa << " " << *pb << '\n' << std::endl;
}
ex2). 참조 연산자를 사용하는 방법
void swap(int &, int &);
int main()
{
int a=2, b=5;
std::cout << a << " " << b << '\n';
// 밑의 swap 함수에서 a,b 바뀜 (잘 체크해야 call by value 인지 reference인지 알 수있음)
swap(a,b);
std::cout << a << " " << b << '\n';
return 0;
}
void swap(int &ra, int &rb)
{
//int &ra=a, int &rb=b
int temp;
temp=ra;
ra=rb;
rb=temp;
std::cout << ra << " " << rb << '\n';
}
int main(void)
{
int num = 10;
int & variable = num; // variable은 num의 참조자 (variable = num 동일!)
std::cout << num << '\n';
std::cout << variable << '\n';
variable = variable + 10;
std::cout << num << '\n';
std::cout << variable << '\n';
return 0;
}
참조자에서 (call by reference) 에서
template <class T1, class T2>
class CCC
{
T1 x;
T2 y;
public:
CCC(T1 xx, T2 yy) { x = xx, y = yy;}
void Print() {std::cout << x << ',' << y << std::endl;}
};
int main()
{
CCC<int, int> c1(10,20);
CCC<double,double> c2(3.5, 5.5);
// = CCC<char, std::string> c3('I', "Love You!"); 와 동일함
CCC<char, const char*> c3('I',"Love You!");
CCC<int, char> c4(3,'B');
c1.Print();
c2.Print();
c3.Print();
c4.Print();
return 0;
}
class A {
int x;
public:
void setX(int i) { x = i; }
// 클래스 A 내부에 있지만 멤버함수가 아니고, 프랜드 함수를 지정하는 것임 (일반함수)
friend int Double(A a); //함수 Double는 클래스 A의 friend 함수
};
int Double(A a)
{
return(a.x*2); //특권: 클래스 A의 private 멤버 x를 접근할 수있음
}
int main()
{
A aa;
aa.setX(3);
std::cout << Double(aa); //Double는 일반 함수, Double(aa)
return 0;
}