※ LIG Nex1 The SSEN Embedded SW School에서 진행된 내용을 정리한 포스팅입니다.
C++ 개요
- using namespace
- scope 연산자
- C++는 중대형 프로젝트를 관리하기 위한 목적의 언어이다.
- 이름이 충돌할 가능성이 크다.
- 영역을 구분하여 충돌을 방지해야 한다.
- main의 반환값
- 프로그램 종료 코드
- 부모 프로세스로 전달된다.
- 멀티 프로세싱을 사용하면 큰 의미가 없을 수 있다.
- 프로그램 종료 코드
- 함수
- 특정 기능을 제공하기 위한 것
- 목적에 따라 접근 제어자를 설정해주어야 한다.
- 접근 제어자(access modifier)
- defulat 값은 private이다.
- pipeline 연산자 (<<)
- 원시 자료형은 내부적으로 문자열로 변환이 되어 출력된다.
- 멤버 직접 연산자(.)와 멤버 간접 연산자(->)
- 메모리 할당 연산자(new)
- 클래스의 크기 만큼 할당한 주소의 void *를 반환한다.
- 저장하려는 변수의 타입으로 암묵적 형변환이 일어난다.
- 생성자를 호출한다.
- 없는 경우 컴파일러가 생성한 default 생성자를 호출한다.
- delete 메모리 해제 연산자로 할당을 해제한다.
- 클래스의 크기 만큼 할당한 주소의 void *를 반환한다.
함수 오버로딩
함수 호출 시, 함수의 이름과 전달되는 파라미터의 정보를 동시에 참조하여 호출할 함수를 결정한다.
- C에서는 변수와 함수의 이름이 동일한 경우 에러가 발생한다.
- 컴파일러는 모호함을 허락하지 않는다.
- 이름이 같다면 파라미터의 개수 또는 타입이 다른 함수를 구분해야 한다.
// C
int add(int, int);
// int add(float, float); Error
int add(char*, char*);
// C++
int add(int, int);
int add(float, float);
int add(char*, char*);
- 호출 시 전달받은 인자의 타입으로 어떤 함수를 호출할지 탐색한다.
- 상수도 타입이 존재한다.
- 정수: int
- 실수: double(f가 붙었다면 float)
- 데이터가 큰 쪽으로 형변환이 일어난다.
- 정수와 실수 관계에서는 정수가 실수로 형변환이 일어난다.
- 상수도 타입이 존재한다.
add(3, 4);
float f = 3.14; // double 상수를 float로 암묵적 형변환
float f1 = 3.14f; // 상수를 float으로 선언
매개변수의 default 값
매개변수의 default 값을 지정할 때, 오른쪽이 비워진 상태로 함수를 생성할 수 없다.
int func(int a = 1. int b = 2, int c = 3) { ... }
func(4); // func(4, 2, 3);
func(5, 6); // func(5, 6, 3);
func(7, 8, 9); // func(7, 8, 9);
매개변수의 default 값 설정 시 주의점
int add (int a, int b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
파라미터의 개수가 다르더라도 디폴트 값이 설정되어 있는 경우 모호함(ambiguous)을 유발할 수 있다.
int add (int a, int b){
return a + b;
}
int add(int a, int b, int c = 3){
return a + b + c;
}
int main(void) {
add(3, 5); // ambiguous error
}
namespace
이름의 충돌을 막을 목적으로 소속을 정해준다.
- namespace의 선언
namespace Add{
int add (int a, int b);
int add(int a, int b, int c);
float add(float a, float b);
}
- namespace의 사용
- ::연산자를 이용하여 접근한다.
using namespace Add;
int main()
{
cout << "add(1,2): " << Add::add(1,2) <<endl;
cout << "add(1,2,3): " << add(1,2,3) <<endl;
cout << "add(1.2f,2.3f): " << add(1.2f,2.3f) <<endl;
return 0;
}
const
// 변수 num 상수화
const int num = 10;
// 포인터가 가리키는 int 상수화
const int * ptr1 = &val1;
// 포인터의 주소값 상수화
int * const ptr2 = &val2;
// 주소값과 참조값 모두 상수화
const int * const ptr3 = &val3;
구조체
- 멤버함수를 넣을 수는 있지만 추천하지 않는다.
- 데이터의 묶음으로만 사용하며, 공용체(union) 등으로 정의된다.
new와 delete
malloc과 free 대신 new와 delete를 사용한다.
- delete의 형태는 new 선언 시 사용한 형태와 매치된다.
- new -> delete
- new[] -> delete[]
int *ptr1 = new int;
double * ptr2 = new double;
int *arr1 = new int[3];
double *arr2 = new double[4];
// delete의 형태는 new 선언 시 사용한 형태와 매치된다.
// new -> delete, new [] -> delete[]
delete ptr1;
delete ptr2;
delete[] arr1;
delete[] arr2;
※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)
'Language > C++' 카테고리의 다른 글
[TheSSEN/C++] 3. 클래스 (0) | 2025.01.27 |
---|---|
[TheSSEN/C++] 2. 참조자(&) (0) | 2025.01.27 |
[TheSSEN/C++] 0. C와 C++ (0) | 2025.01.27 |
[C++] 36.Unmanaged Programming: 템플릿 프로그래밍 (0) | 2024.01.31 |
[C++] 35.Unmanaged Programming: Map (1) | 2024.01.31 |