-
Notifications
You must be signed in to change notification settings - Fork 0
Home
-
레퍼런스는 해당 변수의 별명같은 역할을 해준다. 함수에서 포인터로 귀찮게 바꿔줄 필요 없이 인자를 레퍼런스로 받아주면 간단하게 값변경 가능 해당 변수를 그대로 가져올 수 있다고 생각하면 댄다. 배열 사용시에는 int(&arr)[3] 과 같은 식으로 사용해야함
-
C++의 경우 malloc 대신 new를 사용하여 할당 가능 ( 소멸할 때 free 와 같이 delete를 해주어야함 ) 예를 들어 int *p = new int[3] 와 같은 식으로 여기서 3에는 변수명도 들어갈 수 있어서 편리하다(new int[arr_size]) 또한 자바에서 arraylist와 비슷한 역할인 vector 클래스가 있는데 vector는 동적 배열구조 클래스로, 배열의 크기를 조절할 수 있음
vector 장점
원소를 마지막에 삽입,삭제 하는것이 빠르다
랜덤으로 요소에 접근이 가능하다
개별 원소에 접근이 빠르다
단점
끝이 아닌 곳의 삽입/삭제시 성능이 안좋음
동적이라 편리하나 확장시 비용이 크다
list 장점
어느 위치여도 삽입/삭제 빠르다
단점
특정 원소를 찾는데 오래걸림
--> 순서 상관없으면 vector , 상관있으면 list 라고한다..
자세한건 arraylist 공부하면서 더 찾아본다 -
포인터와 const의 의미를 확실히 알아야한다. const의 경우 상수라는 의미로, 해당 변수는 한번 정해지면 변경할 수 없다. 그런데 포인터 const의 경우 헷갈리기 쉽다. 예를들어 const int *p = &a 인 경우 *p = 3로 해당 변수의 값을 바꾸는 것은 불가능하지만 p = &b 처럼 포인터가 가리키는 값을 바꾸는 것은 가능하다.(여기서 a=3은 가능하다 a는 const가 아니기때문에) 반대로 int const *p의 경우 p=&b가 불가능하지만 *p=3은 가능하다
const int *p 는 가리키는 변수의 값을 바꾸지 마라, int const *p는 가리키는 변수, 즉 p의 값을 바꾸지 마라 이다. const 바로 뒤의 것을 바꾸지 말라고 이해하는게 좋을거같음 -
래퍼런스 const도 있는데 주로 값을 복사할때, 즉 값을 읽기만 하고 변경되지 않아야 할 때 쓴다. (const int& ref) int& ref 의 경우 ref가 가리키는 변수의 값을 변경할 수 있지만 const의 경우 변경할수없음 물론 const인 경우도 가리키는 변수를 변경할 수 없다
(근데 왜 const int 는 안쓰고 const int&를 쓰는것인지?) --> 래퍼런스로 넘기는 것이 value로 넘기는 것보다 효율이 좋고 빠르다 왜냐하면 value로 넘기면 그 값을 복사해야 하지만 래퍼런스로 넘기면 그럴 필요가 없다 그러므로 읽기 전용의 변수는 const 래퍼런스로 사용하도록 합시다. 무 적 권 -
함수에서 return자료형이 int 인것과 int& 인것은 비슷해보이지만 차이점을 확실히 알아야한다 int는 값을 return하는것이고 int&는 해당 변수를 return하는 것이다. 즉, return 값을 둘다 a라고 하면 int& 에서는 get_a()=3 이 a=3처럼 되지만, int에서는 4=3 과 같은 식으로 된다는 것이다.
-
const 함수는 함수 내에서 값을 바꾸지 않는 함수 이 함수에서는 const 함수만이 호출 가능하다.
-
using namespace std를 사용하지 말아야 하는 이유 : 혹시 std에 있는 것과 내가 만든 함수가 겹칠 수 있기 때문에. 프로젝트가 커지면 커질수록 이 확률은 높아진다. std::cout 을 쓰는 습관을 들이자( 근데 인터넷에는 using namespace std를 쓰는 곳이 많은데 이게 맞는 건지 모르겠음 )
-
explicit는 생성자에 사용하는 키워드이다. A 라는 클래스에 A(int a) 라는 생성자가 있고, func(A a) 라는 함수가 있다 하면 원래는 A클래스를 가진 변수가 함수의 인자로 들어가야 하지만 func(3)과 같은 식으로 코드가 작성되어도 자동으로 A(3)으로 진행된다. 이렇게 자동으로 생성자가 작동하는 것은 암시적이기 때문인데, 이것을 막기 위해 explicit를 붙인다. 생성자에 explicit A(int a) 와 같은 식으로 생성자를 만들면 func(3)은 작동하지 않는다. A q = 3 도 마찬가지로 실행안됨 즉, explicit를 붙인 생성자는 A q(3) 로만 실행 가능하다.
-
변수를 생성할 때 mutable을 붙여서 선언하면 const 함수에서도 해당 변수를 변경할 수 있다.
-
friend 키워드는 private 던 protected 던 모든 것을 public 처리한다.
- friend 클래스 -> 클래스 내에서 다른 클래스에 friend를 붙이면 friend를 붙인 클래스는 해당 클래스를 public 처리하여 접근 가능하다
- friend 멤버함수 -> 함수에 friend를 붙이면 해당 함수는 그 클래스를 public 처리한다.
- frined 전역함수 -> 함수 선언시 friend를 붙인다. 이건 이해가 안댐... 연산자오버로딩때 쓴다
(참고 : https://genesis8.tistory.com/98 )
- (리턴 타입) operator(연산자) (연산자가 받는 인자) 연산자 오버로딩을 하기 위한 함수 선언이다. 절 대 외 워
예) bool operator==(MyString& str), Complex operator+(const Complex& c); (return이 Complex&가 아니다 ) - C에서의 int p = (int)doube_val 과 같은식으로 캐스팅(형변환)을 했는데, 실수가 발생할 수 있고, 이 때 컴파일러는 이것을 오류로 발생시키지 않아서 실수에 매우 취약하다. 또한 보기에도 좋은 코드도 아니다. 아무튼 안좋음 따라서 C++에서는 캐스팅을 다르게 한다