목록학습/C, C++ (17)
while (1): study();

비트마스크를 입력받는 예제가 있다. vector getBitmask(vector bitmasks, const int length) { for (int n = 0; n < length; n++) { int numElem; int elem; scanf("%d", &numElem); bitset bitmask; for (int e = 0; e < numElem; e++) { scanf("%d", &elem); bitmask.set(elem, 1); } bitmasks.push_back(bitmask); } return bitmasks; } 이때 반환형이 void이든 벡터이든 결과의 size()를 호출하면 0이 나온다. 이후 빈 벡터에 대해 연산을 가하면 vector subscript out of range 등..

LNK2019는 보통 두 가지 상황에 발생한다. lib 파일이 선언되지 않은 경우 함수가 선언만 되고 정의되지 않은 경우 필자 같은 경우 두 번째 케이스였다. 함수 정의를 지웠는데, 선언 부분에서 지워주지 않아서 오류가 발생했다. 선언된 함수와 정의된 함수 목록을 맞춰주니 오류가 해결되었다.

복사 생성자는 메모리 공간의 할당과 초기화가 동시에 일어나는 상황에 호출된다. 좀 더 디테일하게는 세 가지 상황으로 나누어진다. 기존에 생성한 객체로 새로운 객체를 초기화하는 경우 call-by-value 방식으로 객체를 함수의 인자로 전달하는 경우 함수가 참조형이 아닌 객체를 반환하는 경우 1. 기존에 생성한 객체로 새로운 객체를 초기화하는 경우 Object obj2 = obj1; Object obj2(obj1); 가장 대표적인 복사 생성자 호출 방식이다. 이 경우 obj2를 저장할 메모리 공간을 할당함과 동시에 obj1과 멤버 대 멤버 얕은 복사가 발생하여 새로운 객체를 호출한다. 2. call-by-value 방식으로 객체를 함수의 인자로 전달하는 경우 void Function(Object obj)..

아래 코드를 실행 시 예외가 발생한다. #define _CRT_SECURE_NO_WARNINGS #include #include using namespace std; class Person { private: char* name; int age; public: Person(char* myname, int myage) { int len = strlen(myname) + 1; name = new char[len]; strcpy(name, myname); age = myage; } void ShowPersonInfo() const { cout

절차지향적 언어였던 C에서 객체지향적 언어인 C++로 넘어오면서 생긴 주요한 변화 중 하나는 class 키워드의 존재이다. class는 클래스를 생성하는 키워드이다. 그렇다면 클래스는 어떤 장점이 있기에 언어를 따로 만들면서까지 객체지향 프로그래밍을 실현하려고 한 것일까? 객체지향 프로그래밍의 장점은 더더욱 많겠지만, 여기선 클래스의 장점에 국한해서 이야기한다. 클래스의 장점에는 정보 은닉과 캡슐화가 있다. 우선 정보 은닉부터 보자. 정보 은닉이란 멤버 변수에 대한 직접적인 외부 접근을 차단하는 것이다. 이전에도 복합 데이터 구조를 "구조체"로 지원했던 C였지만, 구조체와 클래스는 결정적인 차이가 있다. 구조체는 멤버를 public으로 초기화하고, 클래스는 멤버를 private으로 초기화한다. 이 간단한..

typedef struct __Point { int xpos; int ypos; } Point; 위의 구조체를 기반으로 두 점의 합을 계산하는 함수를 다음의 형태로 정의하고 Point& PntAdder(const Point& p1, const Point& p2); 임의의 두 점을 선언하여, 위 함수를 이용한 덧셈연산을 진행하는 main함수를 정의해보자. 단, 구조체 Point 관련 변수의 선언은 무조건 new연산자를 이용해서 진행해야 하며, 할당된 메모리 공간의 소멸도 철저해야 한다. #include using std::cin; using std::cout; using std::endl; typedef struct __Point { int xpos; int ypos; } Point; Point& PntA..

C++에서 구현하는 함수의 매개변수는 이용되는 형태에 따라 다양하게 불리운다. 가장 기본적인 경우는 call-by-value로, 전달받은 인수의 값을 복사하여 함수 내부의 지역변수로만 사용하고, 함수 외부에는 전혀 영향을 미치지 않는다. #include int MyAdd(int, int); int main(void) { int a = 3; int b = 5; std::cout

함수 오버로딩이란 이름과 기능이 같은 함수를 인자에 따라 다르게 작동하도록 구현하는 것을 말한다. 기존 C언어에서는 함수의 이름으로 함수를 호출하기 때문에 함수 오버로딩이 불가능했으나, C++에서는 함수의 이름에 더해 매개변수의 수, 타입까지 감안하여 서칭하기 때문에 오버로딩이 가능하다. 여담으로 파이썬에서는 오버로딩은 안되지만 디스패치 함수를 구현할 수는 있다. 다음은 swap 함수를 다양한 자료형에 호환되도록 구현한 함수 오버로딩의 예시이다. #define _CRT_SECURE_NO_WARNINGS #include void swap(int*, int*); void swap(char*, char*); void swap(double*, double*); int main(void) { int num1 = ..

사칙연산 수식을 입력하면 그 결과를 출력하는 프로그램을 작성합니다. 단, 수식을 입력하는 함수와 사칙연산 함수를 매크로 함수로 작성하세요. #define _CRT_SECURE_NO_WARNINGS #define ADD(x, y) ((x) + (y)) #define SUB(x, y) ((x) - (y)) #define MUL(x, y) ((x) * (y)) #define DIV(x, y) ((x) / (y)) #define GET(x, op, y) tmp = scanf("%d", &x);\ if (tmp == EOF) break;\ getchar();\ scanf("%c", &op);\ scanf("%d", &y); #include #include int main(void) { int x, y; int t..

소스 코드를 컴파일하기까지의 과정은 크게 3단계로 나뉩니다. 전처리: 소스코드를 컴파일하기 좋은 형태로 적절히 수정 컴파일: 전처리된 소스코드를 기계가 읽을 수 있는 객체 파일(object file)로 변환 링크: 객체 파일을 운영체제가 읽을 수 있도록 startup code를 붙여 실행 파일로 변환 이 중 가장 첫 단계인 전처리 단계에서 쓰이는 지시자들을 알아봅니다. 1. #include 가장 흔하게 접할 수 있는 전처리 지시자인 #include는 텍스트 형태의 파일을 현재 소스코드에 붙여넣는 기능을 수행합니다. #include #include "my_header.h" #include "my_module.c" 불러올 텍스트 파일은 또는 " "를 사용하여 불러옵니다. 를 사용하는 경우 컴파일러의 incl..