열혈강의 5장


복사생성자 정리해야함 꼭!!


class test{

private:


char *name;


public:


test(char* _name){


name = new char[strlen(_name)+1];

strcpy(name, _name);


}


}


char* 에 대한 이해


const


일반 함수

const 함수


우선 순위는 일반 함수가 더 높다.


=====================================


const 정리


1. const 멤버변수를 정의할 때에는 초기화 리스트를 사용해야 한다.


class aaa{

private:

const int x;


public:


aaa(int _a) : x(_a){};


}


--->> const로 정의 되었기 때문에 초기 생성자가 호출 될 때에는 이미 변수에 쓰레기 값이 들어가있어 재정의가 불가능!


2. const 멤버 함수


1. 멤버함수가 상수화되면 이 함수를 통해 어떠한 멤버변수의 변경이 불가능해진다.

2. 상수화된 멤버함수 내에서는 const함수를 제외한 모든 함수를 부를 수 없다.

3. 상수화된 멤버함수는 멤버변수의 포인터를 리턴받을 수 없다.



3. const 객체


상수화된 객체는 어떠한 멤버변수의 조작도 불가하며, 오직 상수화된 멤버 함수만 불러올 수 있다.

(일반 객체에서 상수화된 멤버함수를 불러오는 것은 가능하다.)


-->> const에 의한 함수 오버로딩이 가능하다.



=============================================


explicit 키워드를 자주 사용하는 습관도 필요할 수 있다.


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

[C++] virtual 소멸자, virtual table // 열혈강의  (0) 2016.12.05
[C++] 상속에 대하여 // 열혈강의  (0) 2016.12.01
[C++] 기초3 // 열혈강의  (0) 2016.11.30
[C++] 기초2 // 열혈강의  (0) 2016.11.30
[C++] 기초1 // 열혈강의  (0) 2016.11.28

열혈강의 3장


C++ 문자열에 대해서

char *a --> 함수 넘겨줄 때

void show(char *_a);


or


char a[20];

void show(char* _a);


이 부분 좀더 공부하고

char* 로 문자열을 받을 수 있는 이유

C++ string에 대해 공부하기



생성자 : 가급적 초기화 용도로 사용하기




생성자를 private로 선언하면 오류가 난다.

하지만 private로 선언하는 경우도 있다.


매개변수가 있는 생성자를 정의했을 경우

기본 생성자를 호출하려면 따로 정의를 해주어야 한다.


생성자에서 동적할당을 했을 때

소멸자에서 delete를 통해 효율적으로 해제 할 수 있다.


객체 배열에도 생성자를 이용한 초기화가 가능한가?

포인터는 스택에 있고 포인터가 가르키는 부분이 힙에 저장된거?

동적할당을 할때 a = new char[strlen(_a)+1] 해주는 이유


malloc 는 단순히 메모리를 할당해주는 것

new를 써야 생성자 호출이 이루어진다. - 162p

객체의 조건을 만족시키려면 생성자의 호출은 반드시 이루어져야 한다.



객체 포인터가 가르키는 객체의 멤버 변수, 함수 참조 ->


this는 자기 자신을 가르키는 포인터이다.


어떠한 변수이건 지역변수보다 우선일 수 없다.



char* a;

char a[20];


cin >> a;

왜 밑에꺼만 되지?


객체의 포인터 배열 선언 방법으로 하면

new를 써서 할당해주기까지 메모리를 안잡아먹나?

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

[C++] virtual 소멸자, virtual table // 열혈강의  (0) 2016.12.05
[C++] 상속에 대하여 // 열혈강의  (0) 2016.12.01
[C++] 기초4 // 열혈강의  (0) 2016.12.01
[C++] 기초2 // 열혈강의  (0) 2016.11.30
[C++] 기초1 // 열혈강의  (0) 2016.11.28

열혈강의 2장


oop 프로젝트1


배열을 함수로 넘겨줄 때.


int array[100]; --> 함수 선언


void arr(int *_arr){ ... }


배열의 이름은 배열의 첫주소를 나타낸다.

때문에 함수에 넘겨줄 때 & 주소값표시가 없어도 된다.


단, 배열 전체가 아닌 특정 값을 넘겨줄 때에는


arr(&array[2]); --> 주소값을 넘겨줘야한다.

arr(array) --> 배열의 첫 주소값이 넘어감.


arr(int *arr){


arr[i] = 3;

이런 형식으로 값을 바꿔줄 수 있다.


}



구조체 배열을 함수로 넘겨줄 때도 마찬가지.


typedef struct sss{


char name;

int num;


} SSS;


SSS aaa[100]; --> 구조체 배열 선언


void ss(SSS *_ss){


_ss->name = "ddd";


}


--> ss(&aaa[3]);

마찬가지로 배열의 한 부분을 넘겨줄 떄에는 주소값

그리고 변수 내에서는 -> 를 사용해서 접근한다.


ss(SSS *_ss){


_ss.name = "ddd";


}


ss(aaa);


배열을 통째로 넘겨줄 땐 &사용하지 않음


근데 왜 함수 안에서 ->를 사용하지 않는거지?

또 함수 내에서 배열에 *를 붙이지 않는 이유는?


-->??



========================================================================================



포인터 정리


typedef struct num{


int x;

int y;


}NUM;


int i[10] = {1,2,3,4,5,6,7,8,9,10};

NUM n[10]; --> 초기화가 되었다고 가정.


void Show(int * _val){}

void n_Show(NUM* _val){}



1 . Show(i);

2. Show(&i[2]);

3. n_Show(n);

4. n_Show(&n[2]);


1. 배열의 이름은 배열의 첫 인자 주소값을 가진다. 때문에 &키워드가 필요가 없다.

   다만, 함수 내에서 배열을 참조할 때

   _val 만 쓰면 --> 주소값

   *_val 만 쓰면 --> 첫번째 값

   배열의 모든 인자에 접근할 때

   _val[x]  or  *_val+x


2. 배열 전체가 아니라 하나의 인자만을 전달 할 때에는 주소값을 넣어줘야 한다. (하나의 값이기 때문에)

    함수 내에서 배열을 참조 할 때

    _val --> 주소값

   *_val --> 값


3. 구조체 또한 배열과 마찬가지


4. 주소값을 넘겨 받았기 때문에

    함수에서 구조체의 멤버변수를 참조할 때

    _val->x;

    -val ----> 주소값



=================================================================================



1. const int n = 10;

2. const int* n;

3. int* const n;

4. const int* const n;


어떤 의미를 지니는가?


const : 변수를 상수화


2 --> 데이터 상수화 n이라는 포인터가 가르키는 값을 상수화

(포인터를 상수화하는게 아님)

포인터를 이용해서 값을바꾸는것을 방지

포인터가 가르키는 변수는 상수가 아님!


3 --> 포인터 상수화

가르키는 변수를 바꿀 수 없음

주소값이 상수화가 되서 하나의 변수만 가르킬 수 있다.


4 --> 데이터도 상수화 포인터도 상수화


포인터를 이용해서 값을 바꿀 수 없음

또한 하나의 변수만 가르킬 수 있다.




프로그램이 실행되면 운영체제가 메모리공간을 할당 해줌.


데이터 영역 --> 스태틱, 전역

프로그램의 실행과 동시에 생성 프로그램이 종료될 때 소멸


힙 --> 런타임 크기 결정

실행시에 동적으로 할당 됨.

프로그래머가 할당하고 해제함.


스택 --> 컴파일 타임 크기 결정

지역변수, 매개변수


스태틱에 대한 이해, malloc, free




int i;

cin >> i;

int a[i];

이거 실행 되나??


--> 실행 안됨!! --> int i = 7;  int *a;     a= new int[i]; --> 동적할당 해주어야 한다.



특정메모리 공간에 이름을 붙여주기 위한것 --> 레퍼런스

변수에 이름을 하나 더 붙여주기 위한 용도 --> 메모리 할당이 따로 일어나나?

call by reference 좀 더 확인


-->레퍼런스는 단순히 이름만 붙여주는 것!! 한 메모리 공간에 이름만 붙여주기 때문에 메모리할당이 따로 일어나지 않는다 -->>효율적!!


씨언어는 로우레벨 랭귀지와 하이레벨 랭귀지의 특성을 동시에 지닌다.

로우레벨의 대표적인 예 : 포인터


레퍼런스


레퍼런스와 변수는 완전히 같은 것이라 말할 수 있다.

변수로 할 수 없는 일은 레퍼런스로도 할 수 없고

레퍼런스로 하지 못하는 일 또한 변수로도 할 수 없기 때문이다.


레퍼런스를 이용한 콜바이레퍼런스는

값(메모리)의 복사가 없기 때문에 기능이 향상된다.


void showData(const person &p) {



} -->혹시모를 변경에 대한 위험 --> const 키워드



new and delete

malloc 와 free의 기능

malloc는 형변환과 함께 사이즈 계산을 해주어야 한다.

malloc는 주소값을 void로 리턴하기 때문에 형변환

주소값을 리턴한다는 점!


int * val = (int*)malloc(sizeof(int));

int * arr = (int*)malloc(sizeof(int)* size);


free(val);

free(arr);


---> new로 바꾼다면


int * val = new int;

int *arr = new int[size];


delete val;

delete []arr;


new 연산자를 사용했을 때 제대로 되었다면

변수에 주소값이 들어갈 것이고

아니라면 NULL을 리턴한다.


new는 객체의 동적생성도 가능하다.


if(arr==NULL){

cout<<"메모리 할당 실패"<<endl;

}


#if #endif 를 사용해서 좀 더 세련된 예외처리를 해보자.


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

[C++] virtual 소멸자, virtual table // 열혈강의  (0) 2016.12.05
[C++] 상속에 대하여 // 열혈강의  (0) 2016.12.01
[C++] 기초4 // 열혈강의  (0) 2016.12.01
[C++] 기초3 // 열혈강의  (0) 2016.11.30
[C++] 기초1 // 열혈강의  (0) 2016.11.28

+ Recent posts