프로그래밍 언어/C & C++ 정리 101

연산자 오버로딩을 남용하는 것

남용하여 나만의 의미로 만들면협업의 효율성이 떨어질 수 있다.자유도가 높은 언어일 수록애매하게 쓰지 않도록 함수로 만드는 것이 좋다. (ex 자바처럼)가령 다음과 같이벡터 *= 벡터 의 코드와 같은 경우에연산자 오버로딩을 사용했다면 해당 경우가 벡터 곱샘이 외적인지 내적인지 모호성을 띄게 된다.이를 함수로 명확히 이름을 통해 알 수 있도록 코드를 제작하여,dotproduct 인지 crossproduct 인지 명확한 이름을 사용하여 함수를 짠다면가독성도 높고, 해당 코드에 대한 의미가 명확해진다.대입 연산자와 복사 생성자의 유사성복사 생성자와 대입 연산자는 거의 비슷하지만차이점은대입 연산자는 메모리를 해제해 줄 필요가 있을 수 있으며,대입 연산자는 이미 만들어 진 객체를 쓰고복사 생성자는 방금 생성된 객체..

연산자 오버로딩과 const

const를 쓰는 이유는?멤버 변수의 값이 바뀌는 것을 방지하기 위해서최대한 많은 곳에 const를 붙일 것지역 변수에 까지도 붙일 것모든 회사가 이 코딩 표준을 따르지는 않는다. Vectro operater + (const Vector& rhs) const; const &를 사용하는 이유는?불필요한 개체의 사본이 생기는 것을 방지하기 위해서이다.멤버 변수가 바뀌는 것 역시 방지하기 위해서이다.어디에 const를 넣고 안넣고는 곰곰히 생각하면어디에 const를 넣어야 할 지 알 수 있다.생각보다 연산자 오버로딩에서 const는 생각보다 잘못쓸 가능성이 있다.왜냐하면 연산자 오버로딩을 짤 일이 별로 없기 때문이다. 잘못 사용하는 코드는 다음 예시와 같다.// 잘못된 코드의 예시std::ostream& op..

C++ 함수 오버로딩과 C언어의 _Generic

C++ 함수 오버로딩은 C++만의 것이라고 보긴 어렵다. C에서도 함수 오버로딩과 비슷한 기능이 있다. _Generic 키워드를 사용하여 컴파일 시간에 인수의 형식을 기반으로 식을 선택하는 코드를 작성하면 된다. 인수의 형식을 호출할 함수가 선택되는 C++의 오버로딩과 유사하다. 여기서는 인수의 형식을 기반으로 평가할 식이 선택된다. 예를 들어 _Generic(42, int : "integer", char : "character", default : "unknown");은 42의 형식을 평가하고 목록에서 일치하는 형식 int를 검색한다. 이 형식을 찾아 "integer"를 반환한다. generic-selection: ( , ) _Generic assignment-expressionassoc-list as..

복사 생성자

복사 생성자복사 생성자란 무엇일까?Java에는 없는데 C++에는 있는 기능이다.그럼 C에는 있을까? 없다.OOP의 개념이 있어야 생성자가 있다.생성자라는 개념이 있으려면 OOP가 있어야 한다. 그럼 Java는 OOP인데 왜 복사 생성자가 없냐?클론 함수 ( = clone()) 이런 걸 사용해서 쓴다. 그럼 복사 생성자는 어떻게 만들까? 자신과 같은 클래스에 있는 개체를 매개변수로 받는 코드를 짜면 된다. 즉, 매개변수가 다른 개체 그것도나랑 똑같은 클래스에 속한 개체면 복사 생성자이다. // Vector.hclass Vector{public: Vector(const Vector& other);private: int mX; int mY;};// Vector.cppVector::Vector(const Vec..

구조체와 클래스의 차이

구조체와 클래스의 차이 중 가장 먼저 설명할 수 있는 것은기본 접근 권한이 다르다는 것이다. struct 는 기본적으로 public이고,class 는 기본적으로 private이다. 컴퓨터는 struct와 class을 구분할까?-> 어셈블리단에서는 이 둘의 차이가 있을까? 안난다.C에 있던 기능이 다른 언어에 있다면, 고급 엔지니어가 만든 기능이다. 그럼 컴퓨터는 struct를 알까?모른다. 그룹개념도 없다 따로따로 노는 건데 사실은,메모리 어디에 접근한다 일 뿐이지,클래스와 구조체는 거의 차이없이 돈다. 근데 컴파일러는 구분할까?구분한다.컴파일러 에러가 잡아내기 때문에컴파일러는 private와 pubilc의 차이점을 안다. 구조체에 관한 코딩표준(기본) C++에서는 구조체를 클래스처럼 쓸 수 있다.하지만..

new와 malloc의 차이

C++ new 및 delete는 연산자이다.C스타일 malloc은 라이브러리에 내장된 함수이다. 할당 연산자인 new의 기본 형식은 다음과 같다.포인터 = new 타입 [(초기값)]; 즉, 차이점은 다음과 같다. 1. malloc/free는 라이브러리가 제공하는 함수인데 비해new/delete는 언어가 제공하는 연산자이다.그래서 별도의 헤더 파일을 포함할 필요없이 언제든지 사용할 수 있다.이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다.연산자이기 때문에 사용자 정의 타입에 대해 오버로딩 할 수도 있다. 사용자 정의 타입 오버로당 예시// microsoft 출저class MyClass{public: void * operator new[] (size_t) { return 0; } ..

Java와 C++의 차이로 배우는 소멸자와 const 멤버 함수

소멸자는 언제 호출되길래 소멸자라 부를까? 생성자가 언제 호출되는 지 기억하는가?오브젝트가 새로 만들어질 때이다.스택에 in place되거나 힙에 new로 할당 될 때이다.두 경우 모두 생성자가 호출된다. 그럼 소멸자는 이 객체가 지워질 때 호출된다.new 만든 객체가 delete로 지워질 때,스택에 만든 오브젝트면 스택에서 없어지면서 호출된다. 자바같은 경우에는 소멸자가 없다.없을 수 밖에 없는게 소멸자는 뭐 할 일이 없기 때문이다.C++는 소멸자가 있다.그 이유는 뭘까?C++는 메모리 관리를 스스로 해줘야한다.따라서 만약에 C++ 클래스 안에서 내가 메모리를 할당을 한 상황이라면내 오브젝트가 언제 지워지는 지 알아야그 안에서 할당한 메모리도 지울 수 있다.그 시기를 알기 위해서 사용하는 것이 소멸자이..

Java와 C++ 로 비교하는 - 초기화 리스트와 기본 생성자

대입의 개념과 초기화 리스트의 차이//Javaclass Vector{ public: vector() { //이건 대입 mX = 0; mY = 0 }}/C++class Vector{public : vector(); //이건 초기화 : mX(0),mY(0) {}}  실제 코드 상에서는 대입과 초기화 리스트가 차이가 없어보인다.근데 초기화 해야하는 이유는대입은 초기화가 된 이후에 실행되는 애이고,초기화 리스트는 실제 오브젝트가 만들어질 때 초기화하는 것이다. 초기화 리스트를 권장하는 이유는 다음과 같다.특히 멤버 변수를 대입 없이 초기화 할 수 있으며상수나 참조 변수도 초기화가 가능하다. 다음과 같이 const나 참조는 선언 이후에 대입할 수 ..

Java와 C++/C 차이 개체 배열, 선언문 관례

//JavaVector[] list = new Vector[10]//C++Vector* list = new Vector 위는 실질적으로 다른 코드이다Java의 new는 실제 vector 10개의 공간만 있고아무런 값도 들어있지 않은 nullprt이 10개 만들어진다. 그마다 vector를 만들어주려면 for문 돌면서 Vector 10개 만들어 줘야한다. C++에서는 이런 혼돈이 없다.new Vector하면 진짜 Vector를 10개 만들어준다.즉, 포인터를 담을 수 있는 공간 10개를 만들어주는 것이 아니라오브젝트 10개를 진짜 만들어준다. 글로 말하면 이해가 조금 안되는데 다음 그림을 보면 이해가 쉬울 것이다. 때문에 Java에서는 Vector 포인터라고 하는 것과 같다. 따라서 Java에서의 코드를 ..

C++ 에서 가상 함수가 필요한 이유는 무엇인가?

C++에서 가상 함수란 무엇인가?C++의 가상 함수는 파생 클래스에서다형성을 달성하기 위해 재정의할 수 있는 기본 클래스 멤버 함수입니다.virtual 키워드를 사용하여 기본 클래스에서 함수를 선언할 수 있습니다.기본 클래스에서 함수를 선언하면포인터나 참조를 사용하여 가상 클래스를 호출하고파생 클래스에서 가상 버전을 실행할 수 있습니다.따라서 컴파일러에게 런타임 중에 객체의 유형을 결정하고함수 바인딩(늦은 바인딩 또는 동적 연결)을 생성하도록 요청합니다. C++의 가상 함수는 참조 또는 포인터를 통해 올바른 함수를 호출하는 데 도움이 됩니다. C++ 프로그래밍 언어에서는 단일 포인터만 사용하여 모든 파생 클래스 객체를 참조할 수 있습니다. 포인터는 모든 파생 객체를 참조하므로 이를 호출하면 기본 클래스에..