[code]#include <iostream.h>
#include <conio.h>
#include <string.h>
class Some
{
public:
int &ri;
Some(int &i) : ri(i) {}
void OutValue()
{
cout << ri << endl;
}
}
void main()
{
int i=5;
Some S(i);
S.OutValue();
}
/*
클래스가 타입이라면 int, double 같은 타입도 클래스인가하는 질문을 할 수 있다. 이 질문에 대한 대답은 그렇다이다. C++은 일반적인 타입도 클래스와 동등하게 취급하며 클래스에 적용되는 문법이 일반 타입에 대해서도 적용된다. 그 예로 정수형 변수를 선언하면서 초기화하는 두 문장을 보자.
int a=3;
int a(3);
전자는 C에서 사용하던 전통적인 문법이고 후자는 C++의 객체를 초기화하는 문법이다. C컴파일러는 전자만 인정하지만 C++ 컴파일러는 후자도 인정한다. int a(3);이라는 선언문은 int 클래스 타입의 객체 a를 선언하되 생성자 int(int aa)를 호출하는 문장으로 해석할 수 있다. 실제로 이 문장이 int 클래스의 생성자를 호출하는가 아니면 C 방식대로 변수의 값만 초기화하는가는 컴파일러에 따라 다르겠지만 적어도 이론상은 생성자를 호출한다고 해도 전혀 억지가 아니다.
객체 초기화의 임무를 띤 생성자가 하는 주된 일은 멤버 변수의 값을 초기화하는 것이다. 그래서 생성자의 본체는 보통 전달받은 인수를 멤버 변수에 대입하는 대입문으로 구성된다. 멤버에 단순히 값을 대입하기만 하는 경우 본체에서 = 연산자를 쓰는 대신 초기화 리스트라는 것을 사용할 수 있다. 초기화 리스트는 함수 선두와 본체 사이에 :을 찍고 멤버와 초기값의 대응 관계를 나열해 주는 것이다. Position 생성자를 초기화 리스트로 작성하면 다음과 같다.
Position(int ax, int ay, char ach) : x(ax),y(ay),ch(ach)
{
// 더 하고 싶은 일
}
초기화 리스트의 항목은 "멤버(인수)"의 형태를 띠며 멤버=인수 대입 동작을 한다. 단순한 대입만 가능하며 복잡한 계산을 한다거나 함수를 호출하는 것은 불가능하다. 위의 Position 생성자는 초기화 리스트의 지시대로 x는 ax, y는 ay로 ch는 ach로 초기화된다. 초기화 리스트에서 모든 멤버에 값을 대입했으므로 본체는 아무 것도 할 일이 없어졌는데 물론 더 필요한 초기화가 있다면 본체에 추가 코드를 작성할 수 있다.
생성자 본체에서 값을 직접 대입하는 것과 초기화 리스트의 효과는 동일하므로 둘 중 편한 방법을 사용하면 된다. 그러나 다음 세 가지 경우에는 본체에 대입문을 쓸 수 없으므로 반드시 초기화 리스트로 멤버를 초기화해야 한다. 주로 대입 연산을 쓸 수 없는 멤버의 경우이다.
*/[/code]
#include <conio.h>
#include <string.h>
class Some
{
public:
int &ri;
Some(int &i) : ri(i) {}
void OutValue()
{
cout << ri << endl;
}
}
void main()
{
int i=5;
Some S(i);
S.OutValue();
}
/*
클래스가 타입이라면 int, double 같은 타입도 클래스인가하는 질문을 할 수 있다. 이 질문에 대한 대답은 그렇다이다. C++은 일반적인 타입도 클래스와 동등하게 취급하며 클래스에 적용되는 문법이 일반 타입에 대해서도 적용된다. 그 예로 정수형 변수를 선언하면서 초기화하는 두 문장을 보자.
int a=3;
int a(3);
전자는 C에서 사용하던 전통적인 문법이고 후자는 C++의 객체를 초기화하는 문법이다. C컴파일러는 전자만 인정하지만 C++ 컴파일러는 후자도 인정한다. int a(3);이라는 선언문은 int 클래스 타입의 객체 a를 선언하되 생성자 int(int aa)를 호출하는 문장으로 해석할 수 있다. 실제로 이 문장이 int 클래스의 생성자를 호출하는가 아니면 C 방식대로 변수의 값만 초기화하는가는 컴파일러에 따라 다르겠지만 적어도 이론상은 생성자를 호출한다고 해도 전혀 억지가 아니다.
객체 초기화의 임무를 띤 생성자가 하는 주된 일은 멤버 변수의 값을 초기화하는 것이다. 그래서 생성자의 본체는 보통 전달받은 인수를 멤버 변수에 대입하는 대입문으로 구성된다. 멤버에 단순히 값을 대입하기만 하는 경우 본체에서 = 연산자를 쓰는 대신 초기화 리스트라는 것을 사용할 수 있다. 초기화 리스트는 함수 선두와 본체 사이에 :을 찍고 멤버와 초기값의 대응 관계를 나열해 주는 것이다. Position 생성자를 초기화 리스트로 작성하면 다음과 같다.
Position(int ax, int ay, char ach) : x(ax),y(ay),ch(ach)
{
// 더 하고 싶은 일
}
초기화 리스트의 항목은 "멤버(인수)"의 형태를 띠며 멤버=인수 대입 동작을 한다. 단순한 대입만 가능하며 복잡한 계산을 한다거나 함수를 호출하는 것은 불가능하다. 위의 Position 생성자는 초기화 리스트의 지시대로 x는 ax, y는 ay로 ch는 ach로 초기화된다. 초기화 리스트에서 모든 멤버에 값을 대입했으므로 본체는 아무 것도 할 일이 없어졌는데 물론 더 필요한 초기화가 있다면 본체에 추가 코드를 작성할 수 있다.
생성자 본체에서 값을 직접 대입하는 것과 초기화 리스트의 효과는 동일하므로 둘 중 편한 방법을 사용하면 된다. 그러나 다음 세 가지 경우에는 본체에 대입문을 쓸 수 없으므로 반드시 초기화 리스트로 멤버를 초기화해야 한다. 주로 대입 연산을 쓸 수 없는 멤버의 경우이다.
*/[/code]