C++
-
[C++] default parameterC++ 2023. 4. 19. 21:52
C++에서는 함수나 생성자의 매개변수에 일부분에 default 값으로 지정가능함 정의할 시에는 반드시 오른쪽부터 채워야함 무조건 오른쪽 정렬 void func(int a=0, int b=0); void func2(int a, int b=5, int c=3, int d=10); void func3(int a=4, int b, int c=5); // error void func4(int a=10, int b=20, int c); // error 함수 호출 시 인자값은 왼쪽부터 채워짐 여기서 생성자에 디폴트 매개변수를 도입하는게 진짜 개 골때리는 부분이다 이게 생성자에 디폴트 매개변수를 도입하면 한 개의 생성자가 커버칠 수 있는 다른 생성자들이 생긴다 예를 들어 class Point { private: int..
-
[C++] 반환형 참조형 (return값이 참조형일때)C++ 2023. 4. 15. 20:30
[함수의 return 값이 참조자일때] return 값이 참조자여도 return type이 참조형일 수도 있고 참조형이 아닐 수 도 있다 즉, 참조자를 return 한다고 return type이 참조형이여야만 하는 것은 아니다! 참조형이 아니여도 된다. 그리고 이에 따른 결과가 다르다 이해해도 이 문장 읽을때마다 ㅈㄴ 헷갈림 그래서 별도로 정리해놓는다... 일단 알아야할건 다음과 같다 매개변수로 선언된 참조자는 지역변수와 동일한 성격을 갖는다. 즉, 매개변수 참조자를 반환하면 참조자는 소멸된다. 하지만 참조자는 그저 어떤 변수에 대한 참조자일뿐, 그 자체로 변수는 아니기 때문에 참조자가 참조하는 변수는 소멸되지 않는다. // int num = 10 전달했다고 가정 int& func1(int& ref) {..
-
[C++] MyString 클래스 실습C++ 2023. 4. 13. 22:42
1. 포인터 받을때 nullptr 항상 체크해주기 2. int 같은거 받을때 0 항상 체크 3. 왜 getLength(const char* in) 은 static인지 이유 알기 int MyString::getLength(const char* in) { if (in == nullptr) return 0; // important int ret = 0; while (*in++ != NULL) ret++; return ret; } getLength 함수는 해당 클래스 내 멤버변수를 참조하여 사용하진 않지만 해당 클래스 객체가 사용할 목적으로 정의한 함수이다. 따라서 static으로 클래스 내부에 넣어두는게 좋다 왜냐하면 만약 static이 아니면 이 함수 하나 호출하기 위해 불필요한 객체를 생성해야하기 때문이다..
-
[C++] constC++ 2023. 4. 12. 00:19
[const 변수] 변수에 const가 보이면 runtime 전에 초기화하는구나 만 생각하자 상수화 보단 위에꺼를 떠올리자 더 직관적이다 상수화는 나한테 너무 추상적 ㅇㅇ runtime 전에 초기화되어야하므로 (compile time에 초기화) 선언과 동시에 초기화 해야하고 "상수화" 이므로 runtime 때 수정이 불가능하다! 이렇게 이해하면됨 결론적으로, 만약 어떤 객체나 변수가 불변이여야하면 const 선언을 해주고 프로그램 시작 전에 다 초기화가 되어 자기값을 갖게 만들어 놓는 것이고, runtime때 초기화가 필요하거나 수정이 필요한 녀석은 무조건 const 는 아니다 라는 결론을 내릴 수 있다 class MyMath { public: static const double PI; // const ..
-
[C++] 접근지정자 (access modifiers)C++ 2023. 4. 11. 22:52
[종류와 직접접근 방식] private : 해당 클래스에서만 직접접근 가능 다른 클래스에서 사용하려면 해당 클래스의 public 멤버함수를 통해 접근 가능 protected : 상속일때만 예외를 둔 private public : 어디서든 직접접근 가능 [private 멤버] private 변수 , private 함수, private 생성자 등 모든 private 멤버는 해당 클래스의 public 멤버로 우회해서 접근해야한다 즉 직접 접근이 불가능하다! 그래서 private 멤버가 있을때는 public 생성자 또는 getter/setter 함수로 접근이 가능한지부터 살펴보는게 좋다 [예제 3-7 컴파일 오류 찾기] class PrivateAccessError { private: int a; void f()..
-
[C++] friendC++ 2023. 4. 11. 20:58
내 클래스 멤버는 아니지만 내 클래스 멤버와 동일한 권한을 가졌다고 인정하는 것 friend keyword는 함수와 클래스 앞에 붙는다! [friend 함수] 일단 friend 가 붙으면 해당 클래스꺼는 절대 아님 외부에 선언된 함수인데 (전역함수 or 타 클래스 함수) friend 라고 선언된 클래스에서 friend라고 인정한 것임 friend 함수는 선언된 클래스의 모든 멤버에 접근할 수 있는 권한이 부여된다 즉, private까지 접근할 수 있다 [friend 선언 3종류] 1. 전역함수 bool equals(Rect r, Rect s) { // code } class Rect { // code friend bool equals(Rect r, Rect s); }; 전역함수는 소속 클래스가 없으므로 ..
-
[C++] staticC++ 2023. 4. 6. 20:54
c++에서의 static 은 원래의 global 전역변수를 클래스로 끌어들이는 역할이다 C에서 쓰인 global 전역변수가 C++에서는 static으로 업그레이드 된 것이다 참고로 C++에 static 클래스라는 것은 없다 static 변수와 static 함수 즉, static 멤버만 존재한다 또한 static 도 접근지정자를 탄다 public private 을 잘 구별해서 써줘야한다 [global이 쓰레기인 이유] global 전역변수 는 코드 전체에서 전역적으로 쓰이는데 1. 어떤 변수,함수와 연관되어 있고 어디 소속인지 파악하기 힘들다 코드 상에 왜 있는지 파악하기도 어렵 2. 아무 곳에서 접근 가능하기 때문에 보안성이 매우 떨어진다 (public으로 해놓으면 모든 곳에서 접근 가능하기 때문) 따라..
-
[C++] inline functionC++ 2023. 4. 3. 15:42
[ 인라인 함수 (inline function) ] 그냥 일반적인 함수를 사용하면 다음과 같은 많은 이점을 얻을 수 있다. 1. 함수 내부의 코드를 재사용할 수 있다. 2. 인스턴트 코드보다 함수에서 코드를 변경하거나 업데이트하기가 더 쉽다. 3. 함수 이름을 통해 코드가 무엇을 의미하는지 이해하기 더 쉽다. 4. 함수는 함수 호출 인수가 함수 매개 변수와 일치하는지 확인하기 위해 타입 검사를 한다. (매크로는 안한다.) 5. 함수는 프로그램을 디버그하기 쉽게 만든다. 그러나 함수는 함수가 호출될 때마다 발생하는 일정량의 성능 오버헤드가 있다는 단점이 있다. 이는 CPU가 다른 레지스터와 함께 실행 중인 현재 명령어의 주소를 저장(JUMP하기 위해)해야 하므로 (나중에 반환할 위치를 알 수 있도록) 모든..