2015. 3. 9. 21:15

const 함수

1.상수화된 함수는 상수화 되지 않은 함수의 호출을 허용x

2.멤버 변수의 포인터 리턴 허용 x


const 객체

1. 어떤 경로를 통해서든 멤버 변수 조작 불가능

2. 상수화된 멤버 함수만 호출 가능



static 멤버(=클래스변수)의 특징

1. main함수가 호출되기도 전에 메모리 공간에 올라가서 초기화 된다.

 따라서 public으로 선언이 된다면, 객체 생성 이전에도 접근이 가능하다.

2. 객체의 멤버로 존재하는 것이 아니다. 다만, 선언되어 있는 클래스내에서 직접 접근할 수 있는 권한이 부여된 것이다.

-> 데이터 영역에 위치


c++에서는 static 멤버 초기화 문법이 존재한다.

class AAA

{

public:

    static int n;

};

int AAA::n=1;


int main(void)

{

    std::cout<<AAA::n << std::endl;

    AAA::n++;

    return 0;  

}



출처: 열혈강의 c++프로그래밍_윤성우 저

Posted by Triany
2015. 3. 9. 18:42

멤버 이니셜라이저문법 : const 멤버를 초기화 하는 것이 가능!

class Student

{

    const int id;

    int age;

public:

    Student(int _id, int _age) : id(_id)

    {

        age=_age;

    }

};

생성자 : id(_id) 

멤버변수 id를 매개변수 _id로 초기화하라!




이 방법이 아니라

Student(int _id, int _age)

{

    id = _id;

   age = _age; 

}

로 초기화 하면 당연히 에러가 뜬다!! 

객체의 생성순서는

1. 메모리 할당

2. 초기화 인데,

객체가 생성당시 쓰레기 값으로 이미 초기화 된 것을,

생성자로 다시 초기화 하려고 하면서 문제가 발생한다!!

따라서 const멤버 변수를 초기화 하기 위해서는

반드시 위의

멤버 이니셜라이저! 라는 문법을 이용할것!!

Posted by Triany
2015. 3. 9. 14:43

생성자 내에서 동적할당을 한다면

반드시 제공해 주어야 할것!! 1)소멸자   2)복사생성자


class Person

{

    char *name;
    int age;
public:
    Person(char* _name, int _age)
   {
        name = new char[strlen(_name)+1];
        strcpy(name, _name);
        age = _age;
   }



1) 소멸자 제공

-> 메모리 누수(유출) 막음

~Person()

{

    delete []name;

}


2) 복자생성자 정의

->잘못된 메모리 참조 막음  ( 얕은 복사(주소값 복사)가 아닌 깊은 복사(공간할당하여 값 복사)를 하기 위함 )

Person(const Person& p)

{

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

     strcpy(name, p.name);

     age = p.age;

}


Posted by Triany