본문 바로가기

정상을향해48

얕은복사와 깊은복사 int num =20;int &ref = num; 위와 같은 방식으로 변수와 참조자를 선언 및 초기화해 왔다. 하지만 C++에서는 다음의 방식으로 선언 및 초기화가 가능하다. int num(20);int &ref(num); 위의 두 가지 초기화 방식은 결과적으로 동일하다. 즉, C++에서는 위의 두 가지 초기화 방식을 동시에 지원하고 있다. 다음의 소스코드를 살펴보자. 31번째 줄에 나와있는, SoSimple sim2 = sim1;SoSimple sim2(sim1); 이 두 코드는 동일한 의미로 해석된다. 첫 번째 문장이 두 번째 문장의 형태로 묵시적으로 변환이 되어서 객체가 생성되는 것이다. 결과는 우리가 쉽게 상상할 수 있는 그대로의 결과가 출력된다. 여기서 생각해볼 점은 이러한 유형의 생성자가 정의.. 2013. 11. 11.
멤버 이니셜라이저를 이용한 멤버 초기화 다음은 생성자가 추가된 Rectangle 클래스의 선언이다. 생성자는 직사각형을 이루는 두 점의 정보를 직접 전달할 수 있게 정의하였다. 이 정보를 통해서 두 개의 Point 객체가 초기화되어야 한다. 위 코드는 Rectangle 클래스의 생성자 정의이다. 이 중 다음의 내용이 '멤버 이니셜라이저(Member Initializer)'이다. :upLeft(x1, y1), lowRight(x2, y2) 이 것의 의미는 다음과 같다. 객체 upLeft의 생성과정에서 x1과 y1을 인자로 전달받는 생성자를 호출하라. 객체 lowRight의 생성과정에서 x2와 y2를 인자로 전달받는 생성자를 호출하라. 이렇듯 멤버 이니셜라이저는 멤버변수로 선언된 객체의.. 2013. 11. 11.
C++에서의 파일분할 대부분의 프로그램이 하나의 파일에 모든 것을 담진 않는다. 특히 C++과 같은 객체지향 언어는 클래스 별로 헤더파일과 소스파일을 생성해서, 클래스의 선언과 정의를 분리하는 경우가 많기 때문에 많은 수의 파일이 만들어진다. 클래스 Car를 대상으로 파일을 나눈다고 예를 들어보자. Car.h 클래스의 선언을 담는다.Car.cpp 클래스의 정의(멤버함수의 정의)를 담는다. 여기서 말하는 클래스의 선언(declaration)은 멤버변수의 선언과 멤버함수의 원형을 포함한다. 이는 클래스와 관련된 문장의 오류를 잡아내는데 필요한 최소한의 정보로써, 클래스를 구성하는 외형적인 틀을 보여준다. 클래스의 정의(definition)에 해당하는 함수의 정의는 다른 문장의 컴파일에 필요한 정보를 가지고 있지 않다. 따라서 함.. 2013. 11. 10.
참조자(Reference)와 함수 C언어에서는 함수의 두 가지 호출 방식이 존재한다. Call-by-value 값을 인자로 전달하는 함수의 호출방식Call-by-reference 주소 값을 인자로 전달하는 함수의 호출방식 C언어에서 말하는 Call-by-reference는 다음의 의미를 지닌다. "주소 값을 전달받아서, 함수 외부에 선언된 변수에 접근하는 형태의 함수호출" 즉, 주소 값이 외부 변수의 참조도구로 사용되는 함수의 호출을 뜻한다. 다시 말하면 주소 값이 전달되었다는 사실이 중요한 게 아니라, 주소 값이 참조의 도구로 사용되었다는 사실이 중요한 것이며, 이 것이 Call-by-value와 Call-by-reference를 구분하는 기준이 된다. C++에서는 두 가지 방식으로 Call-by-reference의 함수정의가 가능하다.. 2013. 11. 10.