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

* const 와 reference

레퍼런스도 이제 어셈수준에서는 포인터와 똑같이 작동한다. c는 어셈블리어를 제외하면,가장 기계어와 가까운 고급언어이다. c에 없는 기능이 어떠한 언어에 추가되었다면,이는 사용자의 편의성에 의해 고급 (엔지니어 or) 프로그래머가 제작한 것이다. 그렇다면 c에 없는 c++에 있는 레퍼런스를 만드려 한다면 어떻게 만드는 것이 좋은가? * const 를 쓰면 된다. * const는 선언과 동시에 초기화해줘야하며,실제로 레퍼런스와 * const의 초기화 오류는 똑같이 작동된다.  다음과 같이 초기화 한 후에, 값을 바꿀 수 없다는 점, 포인터로 해당 기능을 만들 수 있다는 점은* const를 쓰면 C++의 레퍼런스와 같이 사용할 수 있다.

함수 뒤에 const? 너 누군데

멤버 함수 뒤에 const를 붙이면const 키워드로 멤버 함수를 선언하면 함수가 자신이 호출되는 개체를 수정하지 않는 "읽기 전용" 함수로 지정하는 것이다. const 객체들은 const 맴버함수만 호출할수 있다.그렇다고 일반 객체는 const가 뒤에 있는 맴버함수도 가능하지 않다는 것은 아니다. int getMonth() const; // A read-only function 그럼 앞에 쓰면? 반환값을 상수화 하는 것이다.const int A(); // 반환값을 상수화한다. 주로 참조값으로 반환이기 때문에 const를 붙여줘야 할 때 쓰인다.  그럼 매개변수에 const는?매개변수를 call by reference일때 즉 참조값으로 받을때 사용한다.속도는 높이고 싶은데 참조값을 변경하기 싫을때..

C++ 람다 식

람다 식이란? C++ 11 이상에서는 람다 식(종종 람다라고도 함)은 함수에 인수로 호출되거나 전달되는 윛에서 익명 함수 개체(클로저)를 정의하는 편리한 방법입니다. 일반적으로 람다는 알고리즘 또는 비동기 함수에 전달되는 몇 줄의 코드를 캡슐화하는 데 사용됩니다. 이 문서에서는 람다를 정의하고 다른 프로그래밍 기술과 비교합니다. 해당 장점을 설명하고 몇 가지 기본 예제를 제공합니다. 람다 식의 일부 다음 함수에 서 번째 인수 std::sort()로 전달되는 간단한 람다입니다.#include #include void abssort(float* x, unsigned n) { std::sort(x, x + n, //람다 표현식 시작 [](float a, float b) { return (std::abs(a) ..

C++ 기억 존속 시간, 사용 범위

기억 존속 기간  여러 개의 파일로 이루어진 하나의 프로그램을 만드는 것은 분할 컴파일 과정입니다.기억 공간의 유형은 여러 파일에 걸쳐 정보를 공유하는 방법에 영향을 주기 때문에,이러한 것들은 메모리에 대해 알아두는 과정 즉 기억 존속 기간과 관련있습니다. C++은 이러한 기억 존속 기간이 네 가지 유형으로 데이터를 저장합니다.이 네 가지 유형은 메모리에 데이터를 존속시키는 시간에서 차이가 납니다. 자동 기억 존속 시간 (automatic storage duration) :함수 매개변수를 포함하여, 함수 정의 안에 선언된 변수는 자동 기억 존속을 가진다.그들은 프로그램 실행이 그들을 정의하고 있는 함수나 블록 안으로 들어갈 때 생성된다.그리고 그들에게 대입된 메모리는, 프로그램 실행이 해당 함수나 블록을..

템플릿

템플릿이란?템플릿은 C++에서 제네릭 프로그래밍의 기초입니다.강력한 형식의 언어인 C++에서는 모든 변수에 프로그래머가 명시적으로 선언하거나,컴파일러에서 추론한 특정 형식이 있어야 합니다.그러나 많은 데이터 구조와 알고리즘이 어떤 형식에서 작동하든 동일하게 보입니다.템플릿을 사용하면 클래스 또는 함수의 작업을 정의하고,그러한 작업이 어떤 구체적인 형식에서 작동해야 하는지를 사용자가 지정하도록 할 수 있습니다. 템플릿 정의 및 사용 템플릿은 사용자가 템플릿 매개 변수에 대해 제공하는 인수를 기반으로컴파일 시간에 일반 형식 또는 함수를 생성하는 구문입니다. 예를 들어 다음과 같이 함수 템플릿을 정의할 수 있습니다. tamplate T minimum(const T& lhs, const T& rhs){ retu..

파일 복사 프로그램

복사할 파일명과 복사 후 생성되는 파일명을 입력받아서 파일을 복사하는 프로그램을 작성하라. 단, txt파일 뿐만 아니라 이미지 파일 등.. 모든 종류의 파일에 다 동일하게 적용할 수 있어야 한다. 복사 진행 과정을 백분율로 화면에 표시해주도록하고 n바이트씩 복사하도록 한다. ex) 4바이트 - 원본 파일 : source.txt - 대상 파일 : dest.txt#define _CRT_SECURE_NO_WARNINGS #include #include #include void copy_file(const char* src_file, const char* dest_file, size_t buffer_size) { FILE* src, * dest; char* buffer; size_t bytes_..

함수와 스택 그리고 호출 스택

너무 짧은 코드의 함수화는 주소지를 찾아가야하기 때문에 비효율적이다.하지만 inline 함수는 자주 쓰이기 때문에 짧은 코드를 활용하기 좋다. C/C++ 및 어셈블러는 x64 환경에서RSP의 현재 주소를 초과하는 모든 메모리는 휘발성으로 간주된다.OS 또는 디버거는 사용자 디버그 세션 또는 인터럽트 처리기 중에 이 메모리를 덮어쓸 수 있다. 따라서 스택 프레임에 대한 값을 읽거나 쓰기 전에 항상 RSP를 설정해야 한다.이 섹션에서는 로컬 변수에 대한 스택 공간 할당 및 alloca 내장 함수에 대해 설명한다. 스택 할당 함수의 프롤로그는1) 로컬 변수, 2) 저장된 레지스터, 3) 스택 매개 변수 및 4) 레지스터 매개변수에 대한 스택 공간을 할당한다. 매개 변수 영역은 항상 스택의 맨 아래에 있다(al..

동적 바인딩 정적 바인딩

바인딩이란? "컴퓨터 프로그래밍에서 각종 값들이 확정되어 더 이상 변경할 수 없는 구속(bind) 상태가 되는 것" 프로그램 내에서 변수, 배열, 라벨, 절차 등의 명칭, 즉 식별자가 그 상대인 메모리 주소, 데이터형 또는 실제값으로 배정되는 것이 이에 해당되며, 원시 프로그램의 컴파일링 또는 링크 시에 확정되는 바인딩을 정적 바인딩이라 하고, 프로그램의 실행되는 과정에서 바인딩되는 것을 동적 바인딩이라고 한다. 프로그래밍에서는 바인딩을 가급적 뒤로 미루도록 권고하고 있다. 즉, 프로그래머가 코딩을 해서 컴파일을 하게되면 각각의 코드가 메모리 어딘가에 저장되고, 함수를 호출하는 부분에는 그 함수가 저장된 메모리의 주소값이 저장되며 프로그래머가 값을 변경할 수 없는 상태가 된다. 정적 바인딩이란? 실행 이..

재귀함수

재귀함수란  유사한 하위 작업 형태로 정의할 수 있는 작업을 처리하는 데 유용하게 쓰인다.예를 들어 정렬이나 검색, 종주 문제에는 간단한 재귀적인 형태의 풀이가 있는 경우가 흔하다. 재귀적인 루틴에서는자기 자신을 호출하여 하위 작업을 처라하는 방식(=재귀 케이스)으로 작업의 일부분을 수행한다. 재귀 호출을 하다보면 자신을 호출하지 않고도 처리할 수 있는 하위 작업(=기본 케이스)이 나온다. 이렇게 루틴에서 자기 자신을 호출하는 것을 재귀 케이스라 말하고,자기 자신을 호출하지 않아도 되는 경우를 기본 케이스라고 부른다. 재귀 알고리즘에는 재귀 케이스와 기본 케이스, 이렇게 두 가지 케이스가 있다. 간단하고 널리 알려저 있는 예제인 팩토리얼 연산을 통해 이 개념을 확인해보자. // n이 1초과일 경우의 팩토..