티스토리 뷰
https://www.youtube.com/channel/UCdGTtaI-ERLjzZNLuBj3X6A/featured
요 분의 강의를 듣구서, 얻어놨던 꿀팁을 정리하는 포스팅 입니다.
1. C++ 참조연산자
C언어에 없었지만, 변수를 선언할 때 &(ampersand)를 붙인 형태로 선언할 수 있습니다.
void &temp;
(이미 있는 변수의 &변수명 을 통해서 주소를 보는것과는 다릅니다.)
C++에서 등장한 문법으로, 다른 변수를 '참조'하는 변수입니다. (다른 표현으로 alias라고 하더라구요)
이 참조연산다는 이 변수가 가리키는 위치가 변하기않는, 상수포인터 입니다
(가리키는 값이 상수가 아니라, 가리키는 것이 변하지 않는다는뜻)
아래 코드를 보면 이해가 빠릅니다.
//C style
int b = 10;
int fake_b = 22;
int* const a = &b;
//요러면 재할당이 발생해서 에러가 납니다
//a = &fake_b;
//C++ style
int &a = b;
//아래 경우로 재 할당이 되기 때문에 에러가 발생
//&a = fake_B
2. Object를 가지고 반복문
C++에서는 STL이나 Array를 가지고 반복문을 사용하는것이 가능합니다.
(Python의 "for i in list(a)" 를 생각하면 쉽습니다)
하지만 Python같은 경우 read만 가능하지, 반복문 내에서 i에 무엇을 대입 하더라도 list에 영향을 주지 않죠
하지만 C++에서는 Object로 부터 받은 값을 참조연산으로 받는다면?
temp에서 봅아온 값을 참조 하는 변수가 되고, 이는 해당 변수를 가리키는 포인터와 같은 역할을 합니다.
덕분에, 이 참조변수 i를 반복문 내에서 수정할 수가 있게 됩니다.(auto 변수로 바로 받을 수 있는건 덤)
int main()
{
int temp[] = {1,5,9,7,8,6,5,2,1,6,5};
//아래의 경우 read 만 가능
for (auto i : temp){
printf("%d ", i);
}
//아래의 경우 read/write가 모두 가능함
for (auto &i : temp){
i += 1;
printf("%d ", i);
}
return -1;
}
/*
stdout result:
1 5 9 7 8 6 5 2 1 6 5
2 6 10 8 9 7 6 3 2 7 6
*/
3. 함수의 다중 정의
(override : 재정의, overload : 다중정의)
C에서는 동일한 이름을 갖는 함수를 여러개 정의할 수 없습니다
(ex. double add(double c, double d), int add(int c, int d) => 에러발생)
하지만 C++에서는 동일한 이름을 갖지만, 반환값이나 매개변수의 Type이 다를경우 다중으로 정의가 가능합니다.
이때, 컴파일이 진행되면서 함수명이 동일&Type이 다른 함수들은 함수명을 그대로 사용하는 것이 아니라 name mangling을 통해서 다른 이름을 갖게 합니다.
대신, 이런 방법은 나중에 .dll파일을 만들어 다른 프로그램에서 import할 때 에러를 발생시킬 수 있다고 합니다.
이 문제는 방지하는게 extern C { 블라블라 } 라고 scope를 지정해 준다면 c++ 컴파일러로 컴파일이 되더라도 name mangling을 하지 않습니다.
대신 요러면 동일한 이름에 타입이 다른 함수 여러개 정의 불가능
(extern C의 경우 CPython에서도 자주 볼 수가 있죠)
'C언어 잡기술 > C++' 카테고리의 다른 글
상속에 관해서 (0) | 2022.05.19 |
---|---|
Python과 C++의 클래스 생성자 (0) | 2022.05.18 |
- Total
- Today
- Yesterday
- 자료구조
- Search알고리즘
- 알고리즘
- hash
- AVX
- 컴퓨터그래픽스
- 동적계획법
- 완전탐색 알고리즘
- C++
- Python
- GDC
- prime number
- Greedy알고리즘
- stack
- git
- heap
- Sort알고리즘
- 병렬처리
- SIMD
- 분할정복
- 프로그래머스
- 이분탐색
- 코딩테스트
- 사칙연산
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |