개발자 면접 공부/C-C++

함수에 const 위치에 따른 결과

chogyujin 2023. 9. 9. 21:41
728x90

1. 개요

오늘은 함수에 const가 앞 뒤 매개변수일때 어떤 결과가 나오는지 알아봅시다.


2. 반환값 const

먼저 반환값 const에 대해서 알아보도록 하겠습니다.
보통 함수를 정의를 할 경우 void int double 등 여러가지의 반환 타입으로 정의합니다.

하지만 앞에 const가 붙은 함수일 경우에는 어떻게 될가요?

const int sum(int a, int b)
{
	return a + b;
}

이런 형식을 가지고 있습니다.

그냥 간단합니다 반환을 상수로 반환하겠다 라는 뜻 입니다.

보통은 잘 안쓰지만 이런 경우에는 쓸수도 있습니다.

 

const int& sum(int a, int b)
{
	return a + b;
}

이런 경우에는 참조값으로 반환이기 때문에 const를 붙여줘야합니다.
안그러면 return a+b가 에러가 나올 뿐더러 만약 return a만 하더라도 메인에서

int main()
{
	sum(5)++;
}

이런 코드도 가능하기 때문입니다.


3. 함수 뒤 const

함수 뒤에 const는 구조체나 class에서 맴버 변수를 사용하지 못하게 막기 위해 나온 상수입니다.
예시를 보겠습니다.

class A
{
public:
	int y;
	int x;
	int getY() const
	{
		y = 5; // error
		return y;
	}
};

struct B
{
public:
	int y;
	int x;
	int getY() const
	{
		y = 5; // error
		return y;
	}
};

int main()
{
	A* a = new A();
	
	return 0;
}

이런 경우 안에 맴버 변수를 바꾸지 못합니다.

만약 const형식으로 객체를 불렀을때는 어떻게 될가여?

class A
{
public:
	int y;
	int x;
	void print() const
	{
		cout << "const print"<<'\n';
	}
	void print()
	{
		cout << "Normal print";
	}
};

int main()
{
	const A* a = new A();
	A* b = new A();
	a->print();
	b->print();
	return 0;
}

다른 함수가 불러지는 것이 보입니다.

const 객체들은 const 맴버함수만 호출할수 있기 떄문입니다.

하지만 일반 객체는 const가 뒤에 있는 맴버함수도 가능합니다.

class A
{
public:
	int y;
	int x;
	void print() const
	{
		cout << "const print"<<'\n';
	}
	void print()
	{
		cout << "Normal print";
	}
	void setY(int y)
	{
		this->y = y;
	}
};

int main()
{
	const A* a = new A();
	A* b = new A();
	a->print();
	b->print();
	a->setY(5) // error
	return 0;
}

4. 매개 변수 const

매개변수 const는 매개변수 값을 변경하지 못하게 막습니다.

보통 매개변수를 call by reference일때 즉 참조값으로 받을때 사용합니다.

속도는 높이고 싶은데 참조값을 변경하기 싫을때 많이 사용됩니다.

 

int sum(const int& a, const int& b)
{
	return a + b;
}

int main()
{
	cout << sum(5, 5);
	return 0;
}
int sum(const int& a, const int& b)
{
	a = 6;//error 
	b = a;//error 
	return a + b;
}

int main()
{
	cout << sum(5, 5);
	return 0;
}

'개발자 면접 공부 > C-C++' 카테고리의 다른 글

C++ 17 구조적 바인딩  (2) 2023.09.14
C++ 11 tuple  (0) 2023.09.13
가변길이 템플릿  (0) 2023.09.04
구조체, 클래스 패딩 바이트  (2) 2023.08.28
C++11,14 람다식  (2) 2023.06.14