2012. 8. 13. 14:04

#include<iostream>

using namespace std;

////////////////////////////////////////////////////////////////////////////

//주제 5. 참조 변수 이야기

//1. 개념 : 기존 메모리의 별명 

//2. 

////////////////////////////////////////////////////////////////////////////

int main(){


int n=10; //메모리 할당

int *p = &n; 

int &r = n;


r = 20;

cout << n << endl;


//int &r2; // error 반드시 초기값이 필요하다. 

int *& pr = p;  //포린터의 별명  오~케이

//int &* rp = &r; //error 별명의 주소 번지  에러에러 

int (&f)() = main; //함수의 별명 

int & r3 = 10;  //에러 참조변수를 강제로 지정해줄수는 없다.

const int & r4=10; // 상수는 상수에 넣을수 있다.

//int && r5 = 10;// 상수를 참조하는 문법 C++ 2.0에 등장



}


==========================================================================================

#include<iostream>


using namespace std;


///////////////////////////////////////////////////////////////////////////////////////////

//참조변수와 함수 인자 이야기

//1. 어떤 함수가 인자의 값을 변경한다면 포인터나 참조 모두 좋지만 포인터가 가독성 측면에서는 좋다.

//2. 어떤 함수가 인자의 값을 변경하지 않는다면 

//(A) built in type : call by value 가 더 좋다. foo(int)  //

//(B) User Define Type  : call by reference 가 좋다. foo(const Data&)

//

//

//////////////////////////////////////////////////////////////////////////////////////////


/*

//어떤 코드가 더좋을까? 

void foo(int a){} //1

void foo(const int &a){} //2

*/


/*

void inc1(int n){++n;}

void inc2(int *p){++(*p);}

void inc3(int &r){++r;}


int main(){


int a = 1, b=1, c=1;

inc1(a); //실패  - call by value

inc2(&b); // 성공 - call by point 

inc3(c); //성공 call  by reference 



cout << a << endl;

cout << b << endl;

cout << c << endl;


}*/

struct Data{

int data;

};


void foo(const Data & x) // call by value 는 인자값을 변경하지 않을것이라는 약속이다.

{ //하지만 메모리 사용량이 2배가 된다. 

//되도록이면 const & 를 사용하자!

x=10;

}

int main(){


Data a = 0; 



int a =10;

foo(a); //이 함수는 절대 a 의 값을 변경하면 안된다.

cout << a<<endl; // a= 0이 나와야 한다.



}


==============================================================================================
#include<iostream>
using namespace std;
/////////////////////////////////////////////////////////////////////////////////////////
// 1. built in type ( int foo()) : 상수 리턴
// 2. User Define type(Point foo()): 임시객체 (상수는 아니다.)
// 
// 함수가 참조로 리턴하는 이유 
// 1. built in type(int &foo()) : 함수 호출을 l value 에 놓고 싶다. foo() = 20
//
// 2. User Define Type( Point & foo()) : 임시 객체를 만들지 말라는 의미!!
//
///////////////////////////////////////////////////////////////////////////////////////////

struct Point{
int x;
int y;
};

Point p = {1,2};
/*
Point foo(){

return p;

}
*/
Point & foo(){
return p;
}

int main(){


foo().x = 10;  //구조체 자체를 리턴하기떄문에 가능하다.
cout << p.x << endl; // 하지만 10 이 나오진 않는다.  1이 나온다. why?!
//복사생성자를 통해서 구조체를 리턴하기 떄문이다.  즉 foo().x 는 임시객체에 들어가게 된다.
//왜냐하면 임시객체가 없으면 지역변수 구조체를 리턴할 수 없다. 
//이를 해결하기 위해서는 Point foo()를 아래와 같이 수정한다.
//


}

Posted by k1rha