이름공간, 레퍼런스

·2023년 3월 17일
0

C++

목록 보기
1/5

📌이름공간(namespace)


정의된 객체에 대해 어디 소속인지 지정해주는것과 동일
중복된 함수 구별하기 위해서 사용
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*&

포인터 참조자도 됨

1.레퍼런스는 반드시 처음에 누구의 별명이 될 것인지 지정해야 한다.

int& another_a (X)
int& another_a = a (O)
int* p (O)

2.레퍼런스는 한 번 별명이 되면 절대로 다른 이의 별명이 될 수 없다.

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;

포인터는 누구를 가르키는지 자유롭게 변경가능

3.레퍼런스는 메모리 상에 존재하지 않을 수도 있다.

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로 리터럴의 값을 바꾸는 것은 불가능하다


📌레퍼런스의 배열과 배열의 레퍼런스


레퍼런스의 배열(X)

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;
}

상수 레퍼런스로 리턴값을 받으면 해당 리턴값의 생명이 연장된다
그 연장되는 기간은 레퍼런스가 사라질때 까지다

레퍼런스 함수정리


참고자료

씹어먹는 C언어

profile
개인공부저장용(하루의 기록)

0개의 댓글