본문 바로가기

PL/C & C++

(75)
[C++] auto C++ 11에서 타입 추론 (Type inference in C++ 11) C++ 11에서 auto 키워드는 유용하다. 5.0이 부동 소수점 숫자 리터럴이라는 것을 이미 알고 있다면, 왜 d의 타입(=자료형)을 double이라고 명시적으로 선언해야 할까? 변수를 초기화할 때 사용하는 값을 기준으로 적절한 타입을 추론하도록 하면 편하지 않을까? auto 키워드는 선언된 변수의 초기화 식을 사용하여 해당 형식을 추론하도록 컴파일러에 지시한다. 즉, auto 키워드를 사용하면 초깃값의 형식에 맟춰 선언하는 인스턴스(변수)의 형식이 '자동'으로 결정된다. 이것을 타입 추론(type inference)이라고 한다. 주의: 이 기능은 생성 시 변수를 초기화할 때만 작동한다. 초기화 값을 사용하지 않고 생성된 변수는..
[C++] 스마트 포인터, unique_ptr C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다. C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다. 스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다. 스마트 포인터의 동작 보통 new 키워드를 사용해 기본 포인터(raw pointer)가 실제 메모리를 가리키도록 초기화한 후에, 기본 포인터를 스마트 포인터에 대입하여 사용합니다. 이렇게 정의된 스마트 포인터의 수명이 다하면, 소멸자는 delete 키워드를 사용하여 할당된 메모리를 자동으로 해제합니다. 따라서 new 키워드가 반환..
[C++] 깊은 복사 , 얕은 복사 얕은 복사 코드에서 name은 주소값을 참조하기때문에 복사를 하였더라도 같은 주소를 참조하게된다. 그렇기 때문에 name을 바꿨을때 A,B객체의 name값이 둘다 바뀌게된다. 또한 소멸자가 호출될 때 name은 같은 메모리를 참조하기때문에 한번 delete된 메모리를다시 delete하기때문에 오류가 발생한다. 깊은 복사 이번에는 복사 생성자에서 새로운 메모리를 할당하기때문에 원본과 복사본의 참조 공간이 다르며 소멸자도 오류가 발생하지않는다. C++ 얕은 복사와 깊은복사 Intro lesslate.github.io [ C++ ] 깊은 복사( deep copy )와 얕은 복사 ( shallow copy ) 얕은 복사( shallow copy )는 디폴트 복사 생성자에 의한 멤버 대 멤버의 복사 방식을 말한다..
[C++] Rvalue 참조 선언자: && m.blog.naver.com/PostView.nhn?blogId=0511cjh&logNo=221590246985&proxyReferer=https:%2F%2Fwww.google.com%2F
[C++] 참조형 변수 : & References vs pointers 참조형과 포인터는 흥미로운 관계에 있다. 참조형은 접근할 때 암시적으로 역참조되는 포인터와 같은 역할을 한다. (참조형은 내부적으로 포인터를 사용하여 컴파일러서 구현된다.) A brief review of l-values and r-values '01.02 - 변수, 초기화 및 할당' 포스트에서 l-value와 r-value를 공부한 적이 있다. 요약하면, l-value는 메모리 주소를 가진 객체이고 r-value는 메모리 주소가 없고, 표현식 범위에만 있는 임시 값이다. 참조형 변수 (Reference variable) 지금까지 두 가지 변수 타입을 공부했다. 일반 변수(normal variable): 직접 값을 보유. 포인터(pointer): 다른 값의 주소(..
[C++] 멤버 이니셜라이저 위에서 쓰인 멤버 이니셜라이저에 대해 간단히 알아보도록 합시다. 이 멤버 이니셜라이저는, 방금처럼 부모 클래스의 멤버 변수를 초기화 하기 위해서 생성자 함수를 호출한다던가, 클래스 내의 변수를 초기화한다던가, const 변수를 초기화 할때도 사용됩니다. 멤버 이니셜라이저는 생성자의 몸체 부분보다 먼저 실행된다는 특징을 가지고 있습니다. 간단히 멤버 이니셜라이저에 대한 예제를 살펴보도록 합시다. 코드를 살펴보시면, 5~15행에 memInit란 클래스가 정의되어 있고, 그 안에는 num1, num2라는 private 멤버와 생성자, num1과 num2를 출력하는 ShowInfo 함수가 존재합니다. 10행을 잘 보시면, 콜론(:) 연산자 뒤에 "num1(_num1), num2(_num2)"와 같이 쓰였는데, ..
[C++] char to int 문제를 풀다가 문자를 정수로 바꾸는 걸 까먹고 안해서 계속 에러가 나는 걸 꽤나 헤맸다. 뒤늦게 숫자가 아스키 코드라는 것을 깨닫고 C++에서 char 데이터형을 int로 변환하는 법을 검색해 보았다. 스택 오버플로우에 쉬운 방법이 있어 기록해 놓는다. '1'의 문자를 int 1로 수정하고 싶다면 아래와 같이 작성할 수 있다. 아스키 코드의 순서가 '0' 부터 '9'씩 차례대로 1씩 늘어나므로 위와 같이 작성하면 해당 수의 값을 구할 수 있다. '1'의 문자의 아스키 코드 값을 보고 싶다면 (int)를 붙여 형 변환을 해준다. [C++] char형 데이터 int형으로 변환하기 문제를 풀다가 문자를 정수로 바꾸는 걸 까먹고 안해서 계속 에러가 나는 걸 꽤나 헤맸다. 뒤늦게 숫자가 아스키 코드라는 것을 깨닫..
[C++] vector 탐색 [C++ STL] '탐색 알고리즘(search algorithm)' C++ STL에서 제공하는 컨테이너에는 기본적인 기능을 담은 멤버 함수가 있습니다. 그리고 그것과는 별개로, STL에선 알고리즘(algorithm)을 제공합니다. STL algorithm은 algorithm 헤더 파일을 통해 사용할 pangtrue.tistory.com C++ Vector 값 탐색 find - 존재 유무 확인 1. find, find_if vector에서 특정 데이터가 존재하는지 확인하고 싶다. 그렇다면 algorithm 라이브러리의 find를 사용할 수 있다. find는 반복자를 인자로 갖으면서 배열, vector, deque 처럼 일련의 데이터.. notepad96.tistory.com
[C++] 문자열 입력 한 줄을 입력받아 저장할 수 있는 getline 함수를 사용 cin 에 포함되어 있다. 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져온다. 공백이나 개행 입력 시 공백 이전까지의 값만 결과로 받아들인다. 개행 문자를 입력 버퍼에 남겨둔다. 이때 hello 같은 문자열이라면 문제 없이 입력을 받지만 Hello World!와 같이 띄어쓰기가 포함된 문장이라면 Hello 까지 밖에 입력이 되지 않을 것이다. cin의 >> 연산자에서는 공백문자에서 입력을 끊기 때문인데, 이러한 문제를 해결하기 위해서 getline()이라는 함수를 사용한다. getline() getline()함수는 두 가지가 존재하는데 각가 다른 라이브러리에 존재한다. istream 라이브러리에 속한 cin.getline()함수와 strin..
[C++] 배열 초기화 c에서는 그렇게 귀찮은 배열초기화가 c++에는 내장함수가 존재한다!! C++ 배열 초기화 방법 다음과 같은 배열을 초기화 시키고 싶을때 int arr[100]; 이 있을때 이 배열을 전부 0으로 초기화 하고 싶을때 쓰는 방식은 int arr[100] = {0,}; * 만약 0이 아닌 다른값으로 초기화 하고 싶다면, for(int i=0 www.uwangg.com
[C++] 문법 카테고리
[C++] vector 정렬 정렬을 하려면 라이브러리의 sort() 함수를 쓰면 된다. 따라서 헤더파일을 포함해줘야 한다. sort() 함수의 첫번째 두번째 매개변수는 iterator, 즉 포인터이다. [C++] vector (벡터) 정렬, 배열 정렬하기 정렬을 하려면 라이브러리의 sort() 함수를 쓰면 된다. 따라서 헤더파일을 포함해줘야 한다. sort() 함수의 첫번째 두번째 매개변수는 iterator, 즉 포인터이다. sort - C++ Reference custom (2)template void s.. breakcoding.tistory.com
[C++] 다른 파일명의 클래스 파일 헤더파일에서 클래스를 정의했다면 cpp파일에서는 클래스를 따로 선언할 필요 없이 그냥 함수만 작성해주면 된다. [완료]c++ 여러개의 파일을 컴파일 어떻게 하나요? | KLDP 이거 쉬운거라서 검색하면 금방 나올거라고 생각했지만..이외로 안나오네요..-_-; 리눅스에서 C++ 파일을 여러개로 나눈 다음에 그 파일을 컴파일할라고 합니다. 어떻게 해야하나요? #include class kldp.org C, C++] 헤더파일과, CPP파일로 소스 코드 분리 대학교 학부과정에서 C, C++을 배우는 상황에서는 소스코드를 헤더파일과 CPP(혹은 C, 여기서는 CPP파일로 통칭하겠다.)파일로 분할해서 활용하는 일이 거의 없다. 컴퓨터 사고를 키우는 것과 프로 twinparadox.tistory.com main.cp..
[C++] string 관련 함수 ▶ C언어, C++ 문자열 관련 함수들 포스팅 C언어 문자열 탐색 함수 strstr [바로가기] C언어 문자 입출력 함수 getchar, putchar [바로가기] C언어 문자열 입출력 함수 puts, gets [바로가기] C언어 문자열 복사 strcpy, strncpy [바로가기] C언어 문자열 이어붙이기 strcat [바로가기] C언어 문자열 길이 구하기 strlen [바로가기] 1. C++ string 클래스 헤더파일과 설명 그리고 생성하는 방법. 2. C++ string 클래스 멤버함수 거~의 대부분 정리 (꼼꼼하게 작성했습니다.) -> at(), operator[], front(), back() -> size(), length(), capacity(), resize(), shrink_to_fit..
[C] strnset 부분 문자열을 특정 문자로 채우기 mintpark.tistory.com/99
[C++] 복사 생성자와 delete 키워드 복사 생성자 문제점 실행 시 얕은 복사(shallow copy)에 의한 메모리 참조 에러 발생 객체 p1 선언 시 생성자에서 name, phone 메모리 할당 객체 p2 선언 시 디폴트 복사 생성자에서 메모리 할당 없이 객체 p1의 name, phone의 포인터만 복사(얕은 복사) p2 소멸자 호출하여 name, phone 포인터가 가리키는 메모리 해제 소멸자 호출 순서는 생성자와 반대 순서 p1 소멸자 호출하여 name, phone 포인터가 가리키는 메모리 해제 시 실행 에러 이미 p2 소멸자에 의해 해제 !!! ™ 메모리를 할당하는 깊은 복사를 하는 생성자를 작성하여 해결 C++11 이전엔 private 안에 복사 생성자와 대입 연산자를 정의하여 외부에서 접근하지 못하게 하는 방법 이였다면, 이젠 d..
[C++] 생성자 개괄- explicit, delete, default, override 생성자 3가지 타입 - 기본 생성자 - 디폴트 생성자 - 복사 생성자 c++11에서 추가된 explicit, delete, default, override 에 대해 작성합니다. explicit 는 암시적인 형변환을 막아주는 키워드 입니다. delete는 특정한 함수에 대해 정의를 금지하는 키워드 입니다. default는 사용자 정의 타입이 기본적으로 만들어주는 생성자 함수를 명시적으로 만들것을 요구하는 키워드 입니다. override는 사용자 정의 타입의 자식 클래스에게 함수를 오버라이딩 하라고 요구하는 키워드 입니다. 1. 기본 생성자 explicit는 암시적인 형변환을 막아주는 키워드 입니다. 예를 들어 Widget 이라는 사용자 정의 타입을 만들고 정수를 하나 받아 생성하게 만들었습니다. 그리고 p..
[C++] 상속 예제 코드가 예상보다 길죠? 한번 차례차례 살펴보도록 합시다. 코드를 우선 보시면, 5~38행에서 Human란 클래스가 정의되었습니다. 유심히 보셔야 할 부분은 11행입니다. Human 생성자 정의에서, ": age(_age)"란 코드가 보이시나요? Human 생성자로 _age 인자가 넘어오면, Human 클래스 내의 멤버 변수 age의 값을 _age로 초기화 시켜주는 역할을 합니다. 이것이 우리가 조금 있다가 배우게 될 "멤버 이니셜라이저(Member Initializer)"를 이용한 초기화 방법입니다.
[C++] 소멸자(destructor) C++에서 생성자는 객체 멤버의 초기화뿐만 아니라, 객체를 사용하기 위한 외부 환경까지도 초기화하는 역할을 합니다. 따라서 객체의 수명이 끝나면 생성자의 반대 역할을 수행할 멤버 함수도 필요해집니다. 이러한 역할을 하는 멤버 함수를 소멸자(destructor)라고 합니다. 소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되며, 사용이 끝난 객체를 정리해 줍니다. C++에서 클래스 소멸자의 이름은 해당 클래스의 이름과 같으며, 이름 앞에 물결 표시(tilde, ~)를 붙여 생성자와 구분합니다. 즉, Book 클래스의 소멸자는 ~Book()이라는 이름을 가지게 됩니다. 이러한 소멸자는 다음과 같은 특징을 가집니다. 1. 소멸자는 인수를 가지지 않습니다. 2. 소멸자는 반환값이 없지만 void형으로..
[C++] 생성자 콜론(:) Foo(int num): bar(num) 은 초기화 리스트라고 하고, 멤버 변수 bar를 num으로 초기화하는 역할을 합니다. 그냥 생성자 함수{} 내에서 초기화하는 것과, 이렇게 초기화 리스트를 쓰 는것의 차이는 초기화 리스트에서 초기화를 하는 경우, 생성자가 호출될 때 객체의 생성과 초기화가 한 번에 이루어집니다. 생성자 함수 내{}에서 초기화를 하는 경우, 객체가 생성되어, default생성자로 초기화된 상태에서 다시 한 번 할당받게 하게 됩니다. 이 경우엔 default할당-유저할당의 2단계를 거치게 돼서 오버헤드가 생깁니다. 초기화 리스트를 써야만 하는 상황은 크게 다음과 같습니다 클래스가 레퍼런스를 멤버로 가질 때 non static const멤버가 있을 때 default 생성자가 없을 때 b..
[C++] 함수 객체 위 예제에서 주목하셔야 할 부분은 함수 호출 연산자가 오버로딩 되었다는것도 있지만, 메인 함수 내에 Equal 객체로 어떻게 함수가 호출되고 있는지에 대해 보셔야 합니다. 첫번째 호출인 'cmp(5, 5)'는 우리가 첫 예제에서 보아왔던 코드로, 암묵적 호출이라고 합니다. 여기서 암묵적 호출은 밖으로 드러내지 않는 호출이라고 할 수 있으며, 그 아래에 있는 두번째 호출 'cmp.operator()(10, 20)'은 명시적 호출이라고 할 수 있습니다. 분명하게 드러내는 호출이라고 할 수 있는거죠. 그리고 세번째 호출인 'Equal()(10, 20)'은 임시 객체를 통한 암묵적 호출이라고 할 수 있습니다. 여기서 드는 의문점은, 왜 굳이 함수 호출 연산자를 오버로딩하여 객체를 가지고 함수처럼 사용할까요? 우..
[C++] 참조 사이트 'C++ 이야기' 카테고리의 글 목록 소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기 boycoding.tistory.com
[C & C++] macro function, inline function 일반 함수 작동 방식 그런데 여기서 함수포인터를 통하여 함수 내용으로 이동하는데 시간이 소요되게된다. 뭐 엄청나게 큰 타임은 아닐지라도 함수내용이 getter setter와 같이 별볼일 없거나 그러면 왔다 갔다 하는 시간이 더 걸리지도 모른다. 그래서 그러한 함수들은 그냥 포인터로 접근하지말고 사용하는 위치에다가 때려박고싶다. 인라인 함수를 쓰면 컴파일 시간이 길어지고 프로그램 크기가 커진다 그러나 런타임 속도가 빠르다(함수로 넘어가는 시간을 절약) [C++ 때려잡기] C++ 심화강의 7 inline 함수 2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기] C++ 심화강의 1 객체 지향 프로그래밍과 클래스 2018/08/27 - [교육 노트/C++ 심화강의] - [C++ 때려잡기..
[C] 연결 리스트 구조체 만들고 사용하기 NODE 구조체에서 가장 중요한 부분은 struct NODE *next;입니다. 얼핏 보면 구조체 자기 자신의 포인터를 멤버로 가지고 있는데 전혀 어렵지 않습니다. next에는 NODE 구조체로 만든 다른 노드의 메모리 주소를 저장합니다. 즉, 자기 자신이 아닌 다른 노드의 메모리 주소를 저장한다는 점을 기억하세요. NODE 구조체에서 데이터는 int형 하나만 저장했습니다. 실제로 사용할 때는 용도에 따라서 다양한 자료형으로 된 멤버 여러 개를 넣으면 됩니다. 이제 단일 연결 리스트에서 노드의 종류를 알아보겠습니다. 노드는 역할에 따라서 두 가지로 나뉩니다. 머리 노드(head node): 단일 연결 리스트의 기준점이며 헤드(head)라고도 부릅니다. 머리 노드는 첫 번째 노드를 가리키는 용도이므로 데이..
[C++] class와 struct의 차이 C++ CLASS(클래스) 정의와 struct(구조체)와 차이 안녕하세요! 공대남입니다. C언어부터 공부하시고 C++를 하시는 분들은 클래스를 처음 접하실 것 입니다. (객체지향언어를 처음 하신다면) 객체지향언어에서는 클래스와 객체가 중요한 개념입니 k96-ozon.tistory.com
[C++] -> 와 . 의 차이
[C&C++] #include 기본 포함 경로, ""와 <> 차이 #include 전처리기에서 의 기준 위치는? : C 언어 관련 전체 목차 http://blog.naver.com/tipsware/221010831969 1. C 프로젝트에서 include 기준... blog.naver.com
[C++] enum class 어떻게 보면 enum값이 암시적 형변환이 되어서 int 와 비교가 가능하다는 것은 이점으로 보일 수 있지만, 프로그래머가 예상하지 못한 휴먼 에러를 발생할 수 있습니다. enum class를 도입함으로써 더이상 int 로 암시적 형변환이 되는게 불가능해졌습니다. 이는 기존의 enum 암시적 형변환을 유용하게 사용하셨던 분들께는 안좋은 소식일 수 있지만. 이렇게 까다롭게 열거자들의 형식이 강력하게 제한된다는 점이 우리 개발자들이 만들 수 있는 휴먼에러의 위험성을 줄일 수 있다는 이점이 존재합니다. 이제 명확하게 명시적 형변환을 통해서 열거자를 비교해야 합니다. [C++] enum class (scoped enum) 에 대해서 안녕하세요. BlockDMask 입니다. 오늘은 C++11에서 추가된 enum c..
[C++] 네임스페이스(namespace) 란? 네임스페이스가 뭔지 알기 전에 아주 간단한 Hello World 예제를 살펴봅시다. C++에서 Hello World 를 찍어내려면 와 같이 입력하면 됩니다. C를 미리 공부하셨다면, C에서의 HelloWorld 예제랑 차이점을 몇가지 찾아낼 수 있을 것이고 이런 질문을 하겠죠.. ※ 일단, 헤더파일부터 다르네요. => 그거야 사용하는 함수가 다르니까 헤더파일이 다른 것이겠죠? C 언어에서는 printf 함수를 사용했다면, C++ 에서는 cout이라는 함수를 사용합니다. cout 함수를 사용하기 위해 "iostream"(input/output stream 이라는 뜻입니다.) 헤더파일을 인용한 것입니다. ※ 엥? 그렇다면 using namespace std; 는 뭐죠? 처음 보는 건데? => 이 질문을 받기..
[C] 이중 pointer 포인터도 실제로는 변수이기 때문에 메모리 주소를 구할 수 있습니다. 하지만 포인터의 메모리 주소는 일반 포인터에 저장할 수 없고, int **numPtr2;처럼 이중 포인터에 저장해야 합니다. int **numPtr2;를 영어로 읽으면 pointer to pointer to int가 됩니다(numPtr2 → numPtr1 → num1). 여기서 이중 포인터 numPtr2를 끝까지 따라가서 실제 값을 가져오려면 **numPtr2처럼 변수 앞에 역참조 연산자를 두 번 사용하면 됩니다. 즉, 역참조를 두 번 하므로 numPtr2 ← numPtr1 ← num1과 같은 모양이 되고 num1의 값을 가져올 수 있습니다. ▼ 그림 34‑25 이중 포인터의 역참조 포인터를 선언할 때 *의 개수에 따라서 삼중 포인터, ..