@ 16. 1 ~ 17. 1/C++
-
Tip : 생성자 초기화 리스트와 생성자 바디에서의 초기화 차이@ 16. 1 ~ 17. 1/C++ 2014. 4. 26. 12:27
C++에서 객체를 생성할 때는 생성자를 호출하기 전에 모든 데이터 멤버들이 먼저 생성되어 메모리에 할당된 상태여야 한다. 이때 객체타입인 데이터 멤버는 생성자가 호출되고 기본 타입들은 그 데이터가 할당된 메모리에 남아 있는 임의의 값을 가지게 된다. 생성자 초기화 리스트는 이러한 과정에서의 멤버에 대한 생성자 호출과 기본 타입 데이터의 초깃값을 선택할 수 있게 해준다. *데이터 멤버 클래스가 디폴트 생성자를 제공하지 않는다면 반드시 생성자 초기화 리스트를 이용해서 그 멤버 클래스의 명시적인 생성자를 호출해 주어야 한다. 예를 들어 class A { public: A(double a); }; 있고(디폴트 생성자는 없음 명시적인 double 타입 생성자만 있다) 다음에는 이 클래스를 데이터 멤버로 가진 다른..
-
열혈강의 C++(잊어버린 부분 정리 2)@ 16. 1 ~ 17. 1/C++ 2014. 4. 7. 23:50
17. operator 키워드와 연산자를 묶어서 함수의 이름을 정의한다. 연산자 오버로딩의 방법에는 2가지가 있다. 전역함수로 설정하는 방법, 멤버함수로 설정하는 방법 둘다 오버로딩 되어있다면 멤버함수로 설정하는 방법에 전역함수의 방법은 가려지게 된다. * 기본데이터형의 연산자 오버로딩은 그 의미가 정해져있으므로 의미를 변경하는 함수의 정의는 허용하지 않는다 18. 유도 클래스에 삽입된 디폴트 대입 연산자가 기초 클래스의 대입연산자(디폴트가 아니여도)까지 호출한다 유도 클래스의 대입연산자(디폴트 말고)정의에서 명시적으로 기초 클래스의 대입 연산자 호출문을 삽입하지 않으면 기초 클래스의 대입 연산자는 호출되지 않아서 기초 클래스의 멤버변수는 복사 대상에서 제외된다. 즉 유도클래스& operator=(con..
-
열혈강의 C++(잊어버린 부분 정리 1)@ 16. 1 ~ 17. 1/C++ 2014. 4. 6. 23:45
1. 배열의 선언과정에서는 호출할 생성자를 별도로 명시하지 못한다.(생성자에 인자를 전달하지 못한다) SoSimple* ptrArr=new SoSimple[10]; 위의 형태로 배열이 생성되려면 다음 형태의 생성자가 반드시 정의되어야 한다. SoSimple() { . . .} 그리고 일일이 초기화의 과정을 별도로 거쳐야 한다. 2. 멤버 이니셜라이저에서는 this포인터를 사용할 수 없다. 3. 복사생성자의 매개변수 선언에서 const는 필수가 아니다 그러나 참조형의 선언을 의미하는 &는 반드시 삽입해야한다. 4. 복사생성자의 호출시점 1) 기존에 생성된 객체를 이용해서 새로운 객체를 초기화하는 경우 2) call - by - value방식의 함수호출 과정에서 객체를 인자로 전달하는 경우 3) 객체를 반환..
-
참조형 리턴 타입 / const 키워드@ 16. 1 ~ 17. 1/C++ 2014. 3. 5. 23:23
함수나 메서드의 리턴값에도 참조령 타입을 사용할 수 있다.(포인터 역시) 당연하지만 참조형 리턴 타입은 리턴되는 객체가 함수/메서드의 종료 이후에도 계속 유효할 때만 사용할 수 있다. 로컬변수가 안되는 이유는 로컬변수는 함수가 구동되는 동안만 유요한 스택에 저장되어 있다가 함수가 리턴할때 스택과 함께 삭제된다. const 키워드 무언가 절대 변경되지 말아야 할 것을 지정한다. 데이터가 변경되는 것을 막고 싶다면 const int* p; p=new int[10]; p[4]=5; // 컴파일 에러 @ ip가 가리키는 데이터는 수정할 수 없게된다. 방식은 다르지만 int const* p로 선언해도 같은 효가가 나타난다. const 키워드를 int앞에 두든 뒤에 두든 기능적으로는 아무런 차이가 없다. 데이터가 ..