2015의 게시물 표시

상속 (C++)

이미지
  1. 상속에서 상위 클래스를 (기본 클래스(base class))클래스라고 하고,     상속받는 하위클래스를 (파생 클래스(derived class))클래스라고한다. 2. 상속의 장점 [1]간결한 클래스 작성 기본 클래스의 기능을 물려받아 파생 클래스를 간결히 작성 [2]클래스 간의 계층적 분류 및 관리의 용이성 상속은 클래스들의 구조적 관계 파악 용이 [3]클래스 재사용과 확장을 통한 소프트웨어 생산성 향상 빠른 소프트웨어 생산 필요시,  기존에 작성한 클래스의 재사용(상속)을 이용 상속받아 새로운 기능을 확장 그러므로 앞으로 있을 상속에 대비한 클래스의 객체 지향적 설계 필요 3. 상속의 종류 : public, protected, private 상속에 대해서 간략히 설명(page. 387~388) [1]private 선언된 클래스 내에서만 접근 가능 파생 클래스에서도 기본 클래스의 private 멤버 직접 접근 불가 [2] public 선언된 클래스나 외부 어떤 클래스, 모든 외부 함수에 대해 접근이 허용된다 파생 클래스에서 기본 클래스의 public 멤버 접근이 가능함 [3]protected 선언된 클래스에서 접근 가능 파생 클래스에서만 접근 허용 4. 업캐스팅, 다운캐스팅 [1]업 캐스팅(up-casting) 파생 클래스 포인터가 기본 클래스 포인터에 치환되는 것 (ex) 사람을 동물로 봄 [2]다운 캐스팅(down-casting) 기본 클래스의 포인터가 파생 클래스의 포인터에 치환되는 것 5. 상속관계에서 생성자, 소멸자 호출순서    (1) 그림 8-14코드, 실행결과 #include   <iostream> using   namespace  std; class   A {   public :   A(){ cout <<  "생성자 A"  << endl; }   A( int  x){ cout <<  "매개변수생성자 A"  << endl; } }; class  

함수 중복과 static 멤버

이미지
  1. 함수 중복 조건 중복된 함수들의 매개 변수 타입이 다르거나 개수가 달라야 함 중복된 함수들의 이름이 동일해야함   *리턴 타입은 함수 중복과 무관하다 2. 디폴트 매개변수 선언 및 호출 방법 (예제 6-3 소스코드) #include   <iostream> using   namespace  std; //원형 선언 void  star( int  a=5); void  msg( int  id,  string  text= "" ); // 함수 구현 void  star( int  a){   for ( int  i=0;i<a;i++)   cout <<  '*' ;  cout << endl; } void  msg( int  id,  string  text){  cout << id <<  ' '  << text << endl; } int  main(){   // star() 호출  star();  star(10);   //  msg () 호출  msg(10);  msg(10, "Hello" );   }   3. 디폴트 매개변수의 제약조건 디폴트 매개 변수는 보통 매개 변수 앞에 선언될 수 없음 ( 디폴트 매개 변수는 끝 쪽에 몰려 선언되어야 함) void calc(int a, int b=5, int c, int d=0); void sum(int a=0, int b, int c); <컴파일 불가> void calc(int a, int b=5, int c=0, int d=0); <컴파일 가능> 4. 디폴트 매개변수를 이용하여 함수 간소화 (예제 6-5 소스코드) #include   <iostream> using   namespace  std; void  fillLine( int  n=25,  char  c= '*' ){    // n개의 c 문자를 한 라인에 출력   for ( in

함수와 참조, 복사생성자

이미지
  1. c++에서 함수의 인자전달 방법    (1) call_by_value 작동과정  인수의 값을 전달함 ->  함수가 호출되면 매개 변수가 스택에 생성됨 ->  호출하는 코드에서 값을 넘겨줌 ->호출하는 코드에서 넘어온 값이 매개 변수에 복사됨  * 생성자와 소멸자의 비대칭 으로 실행되는 문제점이 있음.    (2) call_by_address 작동과정  인수의 주소를 전달 ( 함수의 매개 변수는 포인터 타입)  ->  함수가 호출되면 포인터 타입의 매개 변수가 스택에 생성됨  ->  호출하는 코드에서는 명시적으로 주소를 넘겨줌   * 호출하는 코드에서 넘어온 주소 값이 매개 변수에 저장됨    (3) call_by_reference 작동과정 함수의 매개 변수를 참조 타입으로 선언 *참조 매개 변수라고 부름( 참조 매개 변수는 실인자 변수를 참조함) *참조매개 변수의 이름만 생기고 공간이 생기지 않음 * 참조 매개 변수는 실인자 변수 공간 공유 * 참조 매개 변수에 대한 조작은 실인자 변수 조작 효과   2. 객체를 복사하는 코드   3. 객체복사시 복사 생성자가 실행됨.  (1) 얕은 복사 개념 :  객체의 멤버를 1:1로 복사함   *객체의 멤버 변수에 동적 메모리가 할당된 경우    사본은 원본 객체가 할당받은 메모리를 공유하는 문제 발생     (2) 깊은 복사 개념 : 객체의 멤버를 1:1로 복사함   *  객체의 멤버 변수에 동적 메모리가 할당된 경우     사본은 원본이 가진 메모리 크기 만큼 별도로 동적 할당하고      원본의 동적 메모리에 있는 내용을 사본에 복사함   * 완전한 형태의 복사라서 얕은 복사의 문제점인  사본과 원본이 메모리를 공유하는 문제가 없음

객체포인터와 객체배열, 객체의 동적생성

이미지
  1. 객체포인터    (1) 객체 포인터 변수선언방법 Circle *p; //Circle 타입에 대한 포인터변수p   (2) 포인터변수에 주소지정방법 ​ p = &donut; //도넛객체의 주소저장 Circle* p = &donut; //포인터 변수 선언시 주소로 초기화 가능   (3) 포인터를 이용한 객체 멤버접근 d = donut.getArea(); // 객체 이름으로 멤버를 접근함 d = p->getArea(); // 객체 포인터로 멤버를 접근할때는 ->를 쓴다  또는 d = (*p).getArea(); // 괄호를 넣어서 .을 쓸수도 있다.     [출처]   4. 객체포인터와 객체배열, 객체의 동적생성  | 작성자   jklj12 2, 객체배열   (1) 객체 배열 선언방법 ​Circle circleArray[3]; // Circle  객체의 배열 circleArray 를 선언   [출처]   4. 객체포인터와 객체배열, 객체의 동적생성  | 작성자   jklj12 ㅇ   (2) 객체 배열을 이용한 멤버접근 circleArray[0].setRadius(10); circleArray[1].setRadius(20); circleArray[2].setRadius(30); ​   [출처]   4. 객체포인터와 객체배열, 객체의 동적생성  | 작성자   jklj12   (3) 객체배열 소멸순서 circleArrat[2] 소멸자 실행 -> ​ circleArrat[1] 소멸자 실행 ->  circleArrat[0] 소멸자 실행 (생성자 역순으로 소멸) 객체배열도 생성자 역순으로 소멸됨 ​   [출처]   4. 객체포인터와 객체배열, 객체의 동적생성  | 작성자   jklj12 3. 정적할당 개념 프로그램 실행 전에 미리 할당 받는것으로  Java의 경우 static이 정적에 해당됨 stack과  data 영역에 컴파일시 할당되어야 할 메모리들로 , 전역변수 지역변수가 정적부분에 해당됨   [출처]   4. 객체포인터와 객체