study/C++

C++ 정리

IT공부 2020. 10. 22. 18:39
반응형

키워드 const의 의미 

const int num = 10;                // 변수 num을 상수화 

const int * ptr1= &val             // 포인터 ptr을 이용해서 val1의 값을 변경할 수 없다.

int * const ptr2 = &val            // 포인터 ptr2를 상수화 

const int * const ptr3 = &val3   // 포인터 ptr3가 상수화 되었으며, ptr3을 이용해서 val3의 값을 변경 불가

 

const 함수 

int GetX() const;    // " 이 함수 내에서는 멤버 변수에 저장된 값을 변경하지 않겠다"

int GetY() const;    // " const 함수 내에서는 const가 아닌 함수의 호출을 제한한다"

 

C언어에서는 없지만  C++에서는 있는 새로운 자료형 bool

bool isTrue = True; 

bool isFalse = False; 

 

참조자(Reference)

int num1 = 10;

int num2 = num1;    // num1이라는 이름이 붙어있는 메모리 공간에서 num2라는 이름이 하나 더 붙게 된다. 

num2는 num1에 참조자가 된다. 

 

참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름

 

참조자(Reference)와 함수

[Call-by-Value && Call-by-Reference]

Call-by-Value : 값을 인자로 전달하는 함수의 호출 방식( 함수 외부에 선언된 변수에 접근이 불가능하다)

Call-by-Reference : 주소 값을 인자로 전달하는 함수의 호출방식( 주소 값이 참조하는 영역에 저장된 값을 직접 변경)

 

참조자를 이용한 Call-by-Reference

void SwapByRef(int &ref1, int &ref2)

{

   int temp = ref1;

   ref1 = ref2;

   ref2 = temp

}

 

 

C언어 malloc() , new() 차이 

malloc()은 함수이고, new는 연산자이다. 

이 차이로 발생하는 가장 큰 차이는 생성자에 유무인데,

malloc()은 시스템 함수로서 함수 안에서 메모리를 할당하는 반면에, new()는 연산자로 바로 메모리를 할당하는 것이 아닌, 생성자를 호출하여 메모리를 할당하는 차이점이 있다. 

 

new()로 메모리를 할당하면 생성 시 초기화가 가능한 장점이 있다. 

 

클래스(class)와 객체(object)

클래스와 구조체의 유일한 차이점

키워드 struct를 대신하여 class를 사용하면, 구조체가 아닌 클래스가 된다. 

 

[접근제어 지시자]

  • public : 어디서든 접근 허용 

  • protected : 상속관계에 놓여있을 때, 유도 클래스에서의 접근허용 

  • private : 클래스 내(클래스 내에 정의된 함수)에서만 접근 허용

[private로 선언하는 이유?]

'정보은닉(Information Hiding)'과 관련 

 

 

생성자(Constructor)와 소멸자(Destructor)

[생성자 특징]

  • 클래스의 이름과 함수의 이름이 동일하다. 

  • 반환형이 선언되지 않는다면, 실제로 반환하지 않는다. 

  • "객체 생성 시 딱 한번 호출된다.

  • 생성자도 함수의 일종이므로, 오버 로딩과 매개변수 '디폴트 값'을 설정 가능하다.

이러한 유형의 함수를 "생성자"라 한다.

 

멤버 이니셜 라이저(Member Initializer)를 이용한 멤버 초기화 

class Number {

private:

   int num1;

   int num2;

public:

   Number(const int &val1, const int &val2) : num1(val1), num2(val2){ }

   //Number(const int &val1, const int &val2){ num1 = val1; num2=val2; }

   //(Numver(const int &num1, const int &num2) { this->num1 = num1; this->num2 = num2; }

};  

 

생성자의 몸체에서 초기화하는 방법과 이니셜 라이저를 이용하는 초기화 방법 중에서 선택이 가능하다.

 

객체 포인터 배열 

객체 배열이 객체로 이루어진 배열이라면, 객체 포인터 배열은 객체의 주소 값이 저장 가능한 포인터로 이뤄진 배열이다.

 

this 포인터의 이해 

멤버 함수 내에서는 this라는 이름의 포인터를 사용할 수 있다. this는 객체 자신의 주소 값을 의미한다.

 

복사 생성자

class SoSimple {

private:

   int num1;

   int num2;

public:

   SoSilple(const int &val, const int &val2) : num1(val), num2(val2) {.... } 

}

 

Sosimple sim1(15,20);

Sosimple sim2 = sim1;      // sim2 객체를 새로 생성해서 객체 sim1과 sim2간의 멤버 대 멤버 복사가 일어난다(얕은 복사)

const Sosimple sim(20, 30)  // 이 객체는 const 멤버 함수만 호출이 가능하다. " 이 객체의 데이터로 변경을 허용 X"

복사 생성자를 따로 클래스에 정의하지 않으면 디폴트 복사 생성자가 자동으로 삽입이 된다. 

 

'깊은 복사' VS '얕은 복사'

디폴트 복사 생성자는 멤버 대 멤버의 복사를 진행한다 ( 이러한 복사를 가리켜 '얕은 복사')

얕은 복사는 " 멤버 변수가 힙의 메모리 공간을 참조하는 경우에 문제가 된다."

"얕은 복사 시에 멤버 변수가 힙 영역을 참조하는 경우 소멸자가 실행되지 않는다. 

 

 

클래스와 함수에 대한 friend 선언 

class Boy {

private:

  int weight;   

  friend class Girl;  // Boy 클래스는 Girl 클래스를 friend로 선언, 따라서 Girl 클래스 내에서는  Boy 클래스의 모든 private 멤버에 접근 가능

public:

  Boy(int weit) : weight(weit) {... } 

};

 

키워드 mutable

 

const : 값에 변경을 허용하지 않는다.  객체 const : 객체 멤버 변수의 값을 허용하지 않는다. 

explicit : 기본 복사 생성자 호출을 허용하지 않는다.(정확하지 않음)

 

mutable : const 함수 내에서의 값의 변경을 예외적으로 허용한다.

class SoSimple {
private:
  int num1;
  mutable int num2;  // 함수가 const라도, 값의 변경을 허용한다는 뜻  
public:
  SoSimple(int n1, int n2) : num1(n1), num2(n2){  }
  void ShowSimpleData() const
  {
   cout<<num1<<",  ";
   cout<<num2<<endl;
  }
  void CopyToNum2() const
 {
   num2 = num1;
 }
};

 

상속이란?

person <--> UnivStudent

상위 클래스 <--> 하위 클래스 

기초 클래스 <--> 유도 클래스

슈퍼 클래스 <--> 서브 클래스 

부모 클래스 <--> 자식 클래스

 

" 유도 클래스의 객체 생성 과정에서 기초 클래스의 생성자는  100% 호출된다"

" 유도 클래스의 생성자에서 기초 클래스의 생성자 호출을 명시하지 않으면, 기초 클래스의 void 생성자가 호출된다"

" 유도 클래스의 객체가 소멸될 때에는, 유도 클래스 소멸자가 실행되고 난 다음에 기초 클래스의 소멸자가 실행된다"

 

객체 포인터의 참조 관계

1. Person * ptr   // 포인터 변수 선언

2. ptr = new Person() // 포인터 변수의 객체 참조 

 

1번 문장이 실행되면,  포인터 ptr은  Person 객체를 가리킨다. 

2번 문장은 Person형 포인터는 Person 객체뿐만 아니라, Person을 상속하는 유도 클래스의 객체도 가리킬 수 있다. 

 

템플릿(Template), 함수 템플릿

' 함수 템플릿'이라는 것은 함수를 만드는 도구가 된다   "자료형은 결정되어 있지 않아서 결정해야 한다."

 

int Add(int num1, int num2)           함수의 기능 : 덧셈    대상 자료형 : int형 데이터

{

  return num1+num2;

}

 

template < typename T>   == <class T>

T Add(T num1, T num2)      함수의 기능 : 덧셈   대상 자료형 : 결정되어 있지 않음

{

   return num1+num2;

}

int main(void)

{

  Add <int>(15, 20);

}

 

클래스 템플릿(class template)

" 함수를 템플릿으로 정의했듯이 클래스도 템플릿으로 정의가 가능하다. 정의된 것을 클래스 템플릿이라 하며,

  이를 기반으로 컴파일러가 만들어 내는 것을 템플릿 클래스라 한다. " 

 

template <typename T>

class Point {

private:

  T xpos, ypos;

public:

  Point(T x=0, T y=0);

};

 

[함수 템플릿과 마찬가지로, 컴파일러는 '클래스 템플릿'을 기반으로 '템플릿 클래스'를 만든다]

  • Point <int> 템플릿 클래스

  • Point <double> 템플릿 클래스 

  • Point <char> 템플릿 클래스

[클래스 템플릿 특수화]

template <typename T>

class Sosimple

{

public:

  T SimpleFunc(T num) {...... }

};

 

tmeplate < >  //int형 Sosimple 객체가 만들어지면, 컴파일러가 템플릿 클래스 생성을 하지 않고, 정의해놓은 것을 사용하면 된다고 알려주는 것

class Sosimple <int>{

public:

  int SimpleFunc(int num) {.... }

};

 

 

 

'study > C++' 카테고리의 다른 글

예외처리 (try catch)  (0) 2020.06.30
malloc & free를 대체하는 new & delete  (0) 2020.05.20
참조자(Reference)  (0) 2020.05.19
자료형 bool  (0) 2020.05.19
이름공간(namespace)에 대한 소개  (0) 2020.05.19