본 문서는 c의 구조체와 c++ 구조체의 차이점을 중점으로 설명한다.

구조체의 의의는 서로 연관이 있는 데이터를 하나의 구조체에 넣어 관리할 수 있다는 것이다.

경우를 하나 가정해보자.
2차원 좌표계의 정점을 저장하는 Point 구조체가 있고, 정점을 이동시키는 기능을 가진 vertexMove 함수가 있다.

 
typedef struct Point
{
	int x;
	int y;
} Point;
 
Point vertexMove(Point vertex1, int moveX, int moveY)
{
	Point movedVertex = {vertex1.x + moveX, vertex1.y + moveY};
	return (movedVertex);
}
 

vertexMove 함수는 Point 구조체에 종속적이라고 할 수 있다. 그러나 c 언어는 구조체 내부의 함수 선언을 허용하지 않는다는 한계가 있다.

하지만 c++ 힘수에서는 구조체 내부 함수 선언을 아래와 같이 허용한다.

 
struct Point
{
	//멤버변수
	int x;
	int y;
 
	//멤버함수
	void vertexMove(int moveX, int moveY)
	{
		x + moveX;
		y + moveY;
		return ;
	}
};
 

c++에서 구조체 내부에 함수선언을 할 때, 다음과 같은 특징이 있다.

  1. 구조체의 변수를 멤버변수, 구조체의 함수를 멤버함수라고 한다.
  2. 멤버함수는 매개변수에 멤버변수를 전달하지 않아도 멤버함수에 접근할 수 있다.
  3. 멤버함수의 원형선언과 함수의 정의를 아래와 같은 형식으로 분리할 수 있다.
 
struct Car
{
	//. . .
	//함수의 원형선언
	void ShowCarStat();
	void Accel();
	//. . .
};
 
//함수의 정의
//structName::functionName의 형식으로 어느 구조체의 멤버함수인지를 지정해야 한다.
void Car::ShowCarState()
{
	//. . .
}
 
void Car::Accel()
{
	//. . .
}
 
  1. 멤버함수는 기본적으로 인라인으로 처리된다. 그러나 함수의 선언과 정의를 분리하면 인라인 처리되지 않는다. 키워드 inline을 이용해서 선언과 정의를 분리하고도 함수가 인라인 처리되도록 할 수 있다.
 
inline void Car::ShowCarState() { . . . . . }
 
  1. 멤버 함수는 객체 외부의 별도의 공간에 선언된다 ( 객체가 아직 생성되지 않은 시점에서도 그러하다 ). 객체는 외부에 있는 멤버 함수의 주소를 참조한다.
  2. 별도의 접근제어 지시자가 없을 경우, 구조체의 멤버함수와 멤버변수는 기본적으로 public으로 선언된다.

참고자료

윤성우의_열혈_cpp_프로그래밍