반응형

 

부모 클래스의 속성

상속 속성

상속 시 속성

private

private

private

private

protected

private

private

public

private

protected

private

private

protected

protected

protected

protected

public

protected

public

private

private

public

protected

protected

public

public

public

위 표와 같이 private를 어떤 속성으로 상속하든 결과는 private가 되며,

protectec는 상속되는 속성에 따라 private 또는 protected가 된다.

그리고 public 또한 상속되는 속성에 따라 private, protected, public이 됨을 알 수 있다.

이는 마치 교집합과 같은 성질을 갖는데, 대충 다음과 같이 범위를 표현할 수 있다.

 

private << protected << public

 

private는 범위가 가장 작기 때문에, 어떤 속성을 만나던 private가 될 수 밖에 없다.

각자가 위 속성에 대해서 교집합을 만들어 보면 상속 시 어떤 속성으로 변하는지 쉽게 파악이

될 것이다.

 

앞으로 우리가 MFC로 코딩을 하다 보면 대부분의 상속은 public 상속임을 알 수 있는데,

그렇다면 위 표에서 public으로 상속하는 3가지 경우만 잘 알면 될 것이다.

추가로 private, protected, public에 대해서 다음 표를 갖고 설명해 보면,

Base

클래스속성

클래스내에서

접근

객체에서

접근

상속받은 파생

클래스내에서 접근

상속받은

객체에서 접근

private

가능

불가능

불가능

불가능

protected

가능

불가능

가능

불가능

public

가능

가능

가능

가능

 

private 멤버는 의미 그대로 아주 사적인 멤버이다. 사적인 멤버이기 때문에 현재 클래스에서만

사용하고 상속조차 해주지 않는다. 아빠가 아들한테 상속해 주지 않는 것.. 머 속옷 같은거..ㅋㅋ

 

protected 멤버는 현재 객체만 놓고 보면, private 멤버와 다를 바 없다. 하지만 상속을 할 때는

private와 다르게 작용한다. 아빠의 차가 있는데, 이 차를 아들한테 상속해 주고 싶다.

차는 보통 남한테 잘 빌려주지 않으니까 private나 protected로 해야 하는데, private일 경우에

아들한테 차를 상속해주면 아들은 차를 탈 수가 없다. 그러므로 차를 protected로 만들어 놓고

상속을 해주면, 아들만 탈 수 있는 것이 되는 것이다. 아들은 이 차를 빌려줄 수 있을까?

빌려 줄 수 없다. 객체의 외부에서는 접근할 수 없기 때문이다.

 

public 멤버는 현재 객체만 사용하든 상속을 하든 아무 관계가 없다. 그냥 아무나 쓰면 되고,

아들한테 상속해 주면 아들도 쓰고, 아들이 친구한테도 빌려주고 그럴 수 있는 멤버들이다.

예를 들어 아버지가 책이 한 권 있고, 아들한테 상속해주고, 아들은 또 친구한테 줄 수 있는

그런 존재가 public이다.

 

출처 :: http://cafe.naver.com/pplus/161

'Computer Languages > C | C++' 카테고리의 다른 글

string::getline  (0) 2010.11.19
string을 char로 취급하기  (0) 2010.10.21
[펌] new와 delete  (0) 2010.10.11
포인터 개념  (0) 2010.10.11
3x3 행렬의 곱  (0) 2010.10.08
반응형
메모리를 동적으로 할당하고 해제하기 위해 C에서 malloc과 free가 있었다. C++에서는 new와 delete를 사용한다.

 

< new와 delete >

- new 연산자를 사용할 경우 명시적 형변환을 할 필요가 없다.

 int *p=(int *) malloc(sizeof(int));       // 4바이트 할당

 int *p=(int *) malloc(sizeof(int)*3);   // 12바이트(int형 3개를 갖는 배열) 할당

 int *p=new int;        // 4바이트 할당

 int *p=new int[3];   // 12바이트(int형 3개를 갖는 배열) 할당

- 메모리 할당과 동시에 초기화가 가능하다(단, 배열 형태로 할당받을 경우에는 초기화가 여전히 불가능).

 int *p=new int(100);     // int형 변수 하나를 할당받으면서 값을 '100'으로 초기화.

- new를 사용하여 메모리를 할당한 경우에는 delete 연산자를 사용해서 메모리 해제를 해야한다.

 delete p;

 delete [] p;

 

 

--------------------------------------------------------------------------------------------------------------------------

ex 10. (int형 변수 하나의 동적 할당 및 초기화)

#include <iostream>
using namespace std;

 

int main(void){
   int *p=new int(100);      
// int형 변수 동적 할당 및 100으로 초기화

 

   cout<<"포인터 변수의 주소 : "<<&p<<endl;
   cout<<"포인터 변수의 값 : "<<p<<endl;
   cout<<"동적 변수의 값 : "<<*p<<endl;

 

   delete p;

 

   return 0;
}

   

 

 ex 11.  int형 변수 5개를 동적으로 할당받고 각각 해당 원소의 인덱스로 값 채우기. (배열의 동적 할당)

#include <iostream>
using namespace std;

 

int main(void){
   int *p=new int[5];   
// int형 변수 5개 동적 할당

 

   for(int i=0; i<5; i++)
      p[i]=i;

 

   for(int i=0; i<5; i++)
      cout<<p[i]<<" ";
   cout<<endl;

 

   delete [] p;

 

   return 0;
}

 

ex 12. (2차원 배열의 동적 할당)

#include <iostream>
using namespace std;

 

int main(void){
   int **p;                  // int형 포인터에 대한 포인터
   p=new int *[4];    // p[0], ..., p[3]이 int형 포인터
 
   int i, j;

 

   for(i=0; i<4; i++)
      p[i]=new int[5];
 
// 각 포인터를 통해 int형 변수 5개 생성(4행 5열)

 

   for(i=0; i<4; i++){
      for(j=0; j<5; j++)
         p[i][j]=i+j;
   }

 

   for(i=0; i<4; i++){
      for(j=0; j<5; j++)
         cout<<p[i][j]<<"\t";
      cout<<endl;
   }

 

   for(i=0; i<4; i++)
     
delete [] p[i];
   delete [] p;

 

   return 0;
}

   

  

ex 12_1. (2차원 배열의 동적 할당) - delete 한 번만 해주도록.

#include <iostream>
using namespace std;

 

int main(void){
   int (*p)[5]=new int[4][5];     
// 4행 5열의 2차원 배열 할당

 

   for(int i=0; i<4; i++){
      for(int j=0; j<5; j++)
         p[i][j]=i+j;
   }

 

   for(int i=0; i<4; i++){
      for(int j=0; j<5; j++)
         cout<<p[i][j]<<"\t";
      cout<<endl;
   }

 

   delete [] p;      // 한 번만 delete(해제)해주면 됨.

 

   return 0;
}

 

 

 

 

 


'Computer Languages > C | C++' 카테고리의 다른 글

string을 char로 취급하기  (0) 2010.10.21
[펌]private, proteted, public 의 차이  (3) 2010.10.12
포인터 개념  (0) 2010.10.11
3x3 행렬의 곱  (0) 2010.10.08
링크드리스트(노드추가/삭제)  (0) 2010.10.08
반응형



<결과>


참조자 사용
 1)참조하고자 하는 어떤 객체를 미리 알고있을경우.
 2)다른 객체를 바꾸어 참조할 일이 결코 없을경우.
 3)포인터를 사용하면 문법상 의미가 어색해지는 연산자를 구현할 경우

위의 경우를 제외하고는 포인터사용.

출처 :: More Effective C++

'Computer Languages > C | C++' 카테고리의 다른 글

[펌]private, proteted, public 의 차이  (3) 2010.10.12
[펌] new와 delete  (0) 2010.10.11
3x3 행렬의 곱  (0) 2010.10.08
링크드리스트(노드추가/삭제)  (0) 2010.10.08
cast연산자  (0) 2010.10.04
반응형

끄적..

3x3 행렬의 곱을 C언어로 코딩해보았습니다.

소스코드

#include<iostream>
using namespace std;
#define ROW 3
#define COL 3

int c[ROW][COL]={0,};


int *matrixMultiply()///////행렬 곱셈 함수
{
  int i,j,k;  /////for문 돌리기위한 선언
  int a[ROW][COL], b[ROW][COL];

 //  ********행렬A**********
   cout<<"A행렬"<<endl;
   for(i=0;i<ROW;i++)//A입력
   {
  for(j=0;j<COL;j++)
  {
   cin>>a[i][j];
  }
   }
   //********행렬B**********
   cout<<"B행렬"<<endl;
   for(i=0;i<ROW;i++)//B입력
   {
  for(j=0;j<COL;j++)
  {
   cin>>b[i][j];
  }
   }
   //********행렬C**********
   cout<<"행렬A x 행렬B"<<endl;
   for(i=0;i<ROW;i++)
   {
   for(j=0;j<COL;j++)
  {
   for(k=0;k<3;k++)
   {
    c[i][j]+=a[i][k]*b[k][j]; 
   }
  }
   }

   return *c; //2차원배열을 리턴할때는 reference값을 리턴해야하므로 포인터처리함
}



int main()
{
  int i,j; /////for문 돌리기위한 선언
  matrixMultiply();

   for(i=0;i<ROW;i++){
  cout<<"\n";
  for(j=0;j<COL;j++)
   cout<<"  "<<*(*(c+i)+j);
  cout<<"\n";
   }

}

'Computer Languages > C | C++' 카테고리의 다른 글

[펌] new와 delete  (0) 2010.10.11
포인터 개념  (0) 2010.10.11
링크드리스트(노드추가/삭제)  (0) 2010.10.08
cast연산자  (0) 2010.10.04
Hello world  (0) 2010.09.19

+ Recent posts