기초 cs - 함수 6(매개변수)

킴스코딩클럽·2022년 9월 30일
1

CS기초 시리즈

목록 보기
25/71

구조체도 매개변수로 활용가능

struct MyData 
	//선언은 전역변수와 다르게 마음대로 사용해도 에러가 거의없음
{
	int x;
	int y;
};
void PrintData(MyData data)
{
	std::cout << data.x << "," << data.y << std::endl;
    data.x =2; 
    data.y =2;
     //원본에는 전혀 영향이안줌 (call by value 개념)
    
}
int main()
{
	MyData data1{1,1};
	PrintData(data1);
}

배열을 매개변수로 활용

void PrintArray(int numbers[5])
//매개변수에도 배열을 사용할 수 있다
{
	for (int i = 0; i < 5; i++)
	{
		std::cout << numbers[i] << std::endl;
	}
}

int main()
{
	
	int numbers[5]{1,2,3,4,5};
	//caller
	PrintArray(numbers); 
	// 배열은 이름 자체만으로는 오브젝트를 알 수 없어 이름만쓰면 안됨
	
}

포인터?


void PrintArray(int numbers[5])
//매개변수에도 배열을 사용할 수 있다
{
	for (int i = 0; i < 5; i++)
	{
		std::cout << numbers[i] << std::endl;
	}
	numbers[0] = 0;
	numbers[1] = 0;
	numbers[2] = 0;
}

int main()
{
	
	int numbers[5]{1,2,3,4,5};
	//caller
	PrintArray(numbers);
	// 배열은 이름 자체만으로는 오브젝트를 알 수 없어 이름만쓰면 안되지만 이 경우는 이렇게 사용
	
}

결과는 12345 + 000 왜 000이 추가될까?
포인터의 개념을 알아야한다
포인터를 개념이 메모리와 cpu를 적게 사용하는데 도움을 주고 빨라지는 효과 그래서 c++이 빠르다는 말을 들음


함수의 오버로딩(overloading)
같은 함수의 이름으로 다른 기능을 구현하는 것

void Who(int value)
{
	std::cout << "나는 정수 처리" << value << std::endl;
}

void Who(float value)
{
	std::cout << "나는 실수 처리" << value << std::endl;
}
// 함수를 구분하기 위해서 사용되는 것은 함수의 이름과 + 매개변수까지 봄

int main()
{
	Who(1);//int value로
	Who(2.0f);//float value로 
	//같은 이름으로 매개변수에 따라서 서로 다른 기능을 만들기 가능함
}

polymorphism
형태가 여러개인것 성질을 만들어냄 Who 함수가 float int char double등등 이름은 하나인데 상황에 따라 여러 성질을 가짐
함수의 오버로딩 구현방법
매개변수의 이름 : 같아야함
매개변수 갯수 : 달라도됨
매개변수 타입 : 달라도됨
반환타입 : 같아야함 :오버로딩이 안되서 중복된다고 컴파일러는 이해

int Print(int i);
int Print(float f);
int Print(int x , inty);
int Print(intx, float y);
가능한 함수의 오버로딩

void Print(int i);
불가능한 함수의 오버로딩- 반환값이 다름 
리턴타입만 다른 함수는 오버로딩이 불가능하다는 에러 생성

왜 이런 현상이 생길까?
Function Signature 개념
일반 변수는 구분하기 위해서 식별자(이름)만 다르면됨
하지만 함수는 구분을 위한 signature가 있음

함수의 이름
매개변수의 타입
매개변수의 갯수
매개변수의 순서
-(int x ,float y) 와 (float y, int x)는 다르다
-(int x ,int y) 와 (inty, int x)는 같다

함수의 signature 정보는 visual stuio로 함수의 디버그해서 함수로 들어가보면 호출 스택에서 찾아볼 수 있음

함수의 signature정보에는 리턴값은 포함되어 있지 않음
(function ambigous : 함수 중복의 모호성)

int print(int x)
{

}
void print(int x)
{

}
 

int main()
{

	
}
에러 코드 E0311 : 반환 형식으로만 구분되는 함수를 오버로드 할 수 없습니다.
profile
공부 기록용

0개의 댓글