2011. 5. 20. 12:39ㆍC++
C++ 기초 3
1. Bitwise
정수 변수의 값을 비트만큼 이동시키는 것을 말한다. (shart ,int ,long, char 만 사용가능하다)
비트가 소실되지 않는한 n비트만큼 왼쪽으로 밀면 기존 값*2^n 의 결과가 된다.
오른쪽으로 밀면 기존값/2^n 이 된다.
사용법: unsigned int number = 4;
number<<2; // 16
number>>2; // 1
2. lvalue 의 의미
lvalue란 메모리안에 있는 하나의 어드레스를 지정하는 것입니다. lvalue라고 불리는 이유는 할당문에서 등호의 왼쪽에 나탈수 있기때문에 그렇게 이름지어졌습니다.
3. Struct & Class
Struct : 사용자 정의 자료형, 기본 자료형으로 인식해 주지 않는다.
따라서 아래와 같이 사용해야 합니다.
typedef 을 하지 않았다면
struct Person {
int age;
char name[20];
}
Person p = {10,"ncanis"}; (c: x , c++:o)
struct Person p; (o)
Class : 멤버 변수와 멤버함수를 사용할 수 있다. 이 2가지를 이용해 하나의 자료형을 만든다.
4. 접근 제한자
public: 어디서든 사용가능
protected: 상속된 자식클래스까지만 사용가능
private: 내부 접근만 가능
만약 선언이 되어있지 않으면 private으로 인식한다.
* 전역 함수에 대한 friend 선언
정보 은닉에 위배되기때문에 유용하지 않습니다.
다만 연산자 오버로딩에서는 유용하게 사용합니다.
전역함수에게 private 영역 접근을 허용합니다.
예를들면 AAA 클래스에서 friend class BBB; 라고 선언하면
BBB 클래스에서는 AAA클래스내의 private 영역에 접근이 가능합니다.
class AAA {
private: int value;
friend void SetX(A& a, int value); // 외부 전역함수를 friend로 선언
friend class BBB; // BBB 클래스를 friend로 선언함
};
void SetX(A&a, int value) {
a.value = value; // AAA의 private 변수 value 접근
}
class BBB {
public: void SetX(A& a, int value) {
a.value = value; // AAA의 private 변수 value 접근
}
}
5. 클래스
- 정보은닉: 외부공개할필요 없는 변수들은 접근 제한자를 이용해 제한한다.(private)
- 캡슐화
- 생성자: 객체 생성과 동시에 초기화, 단 한번만 호출
- 객체 생성
: 메모리 할당
: 생성자의 호출
: 생성자를 통한 인자의 전달
ex> Person p; // 디폴트 생성자(void)
Person p(10,"name");
Person p(); // 이건 함수의 선언이다. 참고.
- 소멸자
: 객체는 기본자료형 변수, 구조체 변수가 소멸되는 시점과 동일합니다.
: 함수내에서 선언된 객체는 호출이 끝나면 소멸됩니다.
: 전역적으로 선언된 객체는 프로그램이 종료될때 소멸됩니다.
: 소멸자는 객체의 소멸시 자동으로 호출됩니다.
: 생성자에서 메모리 동적 할당을 하는경우
예>
char *name;
Person::Person() {
name = new char[10]; // Heap에 저장됨 (동적할당)
int b; // Stack 에 저장
}
Person::~Person() {
delete []name;
}
Heap에 저장된 name은 반드시 명시적으로 해제를 해주어야 합니다.
즉 반드시 delete []name 을 호출 해주어야 합니다.
int main() {
Person p1;
Person p2;
return 0; // 리턴과 동시에 p1과 p2의 소멸자가 호출된후 객체가 소멸 됩니다.
}
6. 객체의 포인터
객체를 가리킬 수 있는 포인터를 멤버로 지니는 배열
Point* arr[5]; // Point 클래스에 대한 포인터 주소, 포인터는 무조건 4바이트 할당 ( 20bytes)
for(int i=0;i<5;i++) {
arr[i] = new Point(10); // 포인트 클래스의 포인터 주소들은 Stack에
// Point 객체는 Heap에 저장
}
7. this(자기참조 포인터)
- 연산자 오버로딩에서 유용하게 사용 (예> this->name = name; )
Person* GetThis() {
return this;
}
int main() {
Person *p1 = new Person();
cout<<p1<<endl;
cout<<p1->GetThis()
// 위 2개는 서로 같은 주소값을 보여준다.
// 즉 this는 할당된 자기자신 객체의 시작번지 주소를 가리킨다.( 자기참조 포인트 )
}
=> p1->i 는 (*p1).i 을 말한다.