정의된 객체에 대해 어디 소속인지 지정해주는것과 동일
중복된 함수 구별
하기 위해서 사용
ex)서울 사는 철수, 부산 사는 철수
using namespace 이름공간;
지정하면 이름공간에 정의된 모든것들을 이름공간:: 이렇게 안쓰고 사용가능
ex)using namespace std;
using namespace std;를 쓰는 것은 위험하다
정말 많은 함수가 있어서 이름 겹치는 함수 만들면 오류 생기기때문임
using std::cout << 이런식으로 써라?
std::cout<<"Hello World!"<<std::endl;
std::cin >> user_input;
user_input을 레퍼런스로 받기 때문에 &붙일 필요없음, %d, %c 구분해줄 필요없음
가리키고자 하는 타입 뒤에 &
붙이면 참조자 만들어진다
int& double& ... int*&
포인터 참조자도 됨
int& another_a (X)
int& another_a = a (O)
int* p (O)
int a = 10
int another_a = a;
int b =3;
another a = b //b에 a의 값을 대입하라(a = b와같다)
한번 설정되면 원본a처럼 쓰이는듯
int a = 10;
int *p = &a;
int b = 20;
*p = &b;
포인터는 누구를 가르키는지 자유롭게 변경가능
int a = 10;
int &another_a = a;
컴파일러가 굳이 메모리 상에 공간을 할당할 필요를 못느낀다 another_a 쓰이는 자리는 a로 바꿔치기 하면된다.
int change_val(int& p)
{
p = 3;
return 0;
}
int main()
{
int num = 5;
cout << num << endl;
change_val(num);
cout << num << endl;
}
change_val이 불릴때 int &p = num라고 처음에 누구의 별명이 될지 설정해주기 때문에 가능하다.
int x;
int& y = x;
int& z = y;
x = 1;
cout << x << y << z << endl;
y = 2;
cout << x << y << z << endl;
z = 3;
cout << x << y << z << endl;
C++ 문법 상 참조자의 참조를 만드는 것은 금지, 참조자를 사용하면 불필요한 &, * 사용 안해도된다.
int main() {
int& ref = 4; //불가능
const int& ref = 4; //가능 ref를 그냥 4로 쓰겠다는 의미 int a = ref (a = 4)
std::cout << ref << std::endl;
}
상수 자체는 리터럴이기 때문에
레퍼런스로 참조하면 ref = 5로 리터럴의 값을 바꾸는 것은 불가능하다
int a, b;
int& arr[2] = { a,b }; //불가능!
배열의 이름은 첫번째 원소의 주소값으로 변환될 수 있어야 하지만 주소값이 존재한다라는 의미는 해당 원소가 메모리 상에서 존재한다 라는 의미와 동일하다. 레퍼런스는 특별한 경우가 아니면 메모리 공간을 차지하지 않기 때문에 이러한 모순 때문에 언어 차원에서 금지됨
int arr[3] = { 1,2,3 };
int(&ref)[3] = arr;
ref[0] = 2;
ref[1] = 3;
ref[2] = 1;
배열의 레퍼런스는 가능하다 포인터와는 다르게 레퍼런스 참조위해서 배열 크기 명시해야함
중요하게 볼거는 괄호 묶는거 생각하기
int function()
{
int a = 2;
return a;
}
int main()
{
int b = function();
return 0;
}
함수 종료되고 a가 사라진다
int& function()
{
int a = 2;
return a;
}
int main()
{
int b = function();
b = 3;
return 0;
}
b에서는 사라진 a의 레퍼런스를 참조하고 있기 때문에 오류가난다는데(댕글링 레퍼런스)
잘된다?? 컴파일러가 업데이트 되면서 알아서 업데이트 해주는듯
int& function(int & a)
{
a = 5;
return a;
}
int main()
{
int b = 2;
int c = function(b);
return 0;
}
원래는 레퍼런스를 받아서 리턴해야 오류가 안나는것 같다
int function()
{
int a = 5;
return a;
}
int main()
{
//int& c = function(); 이건 안되지만
const int& c = function(); //const로 받으면 가능하다
return 0;
}
상수 레퍼런스로 리턴값을 받으면 해당 리턴값의 생명이 연장된다
그 연장되는 기간은 레퍼런스가 사라질때 까지다