https://itisguide.tistory.com/4
코드 누리의 c++ 강의를 보고 정리한 내용임.: 변수, 함수 , 구조체, 클래스등을 묶어서 하나의 소속감을 주는 것.필요성. : 불가피 하게 동일한 이름의 함수명을 만들수 있음. 이때 다른 구별동작에 맞는 namespace를 주어서 구별할 수 있음. : 삼성전자의 핸
: printf , scanf 말고, cin과 cout, 띄어쓰기 되어 있을때는 getline으로 사용을 함. 입출력 시 데이터 타입 아무거나 넣을 수 있음. : cout과 cin은 일단 ostream 클래스의 전역? 객체임. 1번 ) cout 객체를 확인하자. : f
코드누리 강의를 보고 복습, 공부정리한 내용임. 용어 설명 : uniform : 일관된 이란 뜻을 가짐. : {} 중괄호를 이용한 초기화 직접 초기화 중에 하나임.소괄호 초기화보다는 특징이 있음. 1) 직접 초기화 : () 소괄호, {} 중괄호를 이용한 초기화2) 복사
: 컴파일 시간에 타입을 결정하는 키워드 \-> 컴파일 시간에 결정되므로, 오버헤드 없음.
코드누리와 cpp ref를 공부하고 복습, 정리한 내용임.https://docs.microsoft.com/ko-kr/cpp/cpp/aliases-and-typedefs-cpp?view=msvc-170: 타입에 대한 별칭을 정의할 때 사용함. using의 경우
: 컴파일 시간과 런타입 시간에 상수의 값을 결정할 수 있음.but, 배열의 크기로 런타임에 결정된 const 변수를 넣을 경우, 불가함! : 컴파일 시간에만 상수의 값을 결정함.
: 함수 호출시 , 인자를 전달하지 않더라도, 해당 파라미터값으로 함수를 호출하게 함. 1) 뒤에서 부터 설정해야 함. 2) 선언부와 정의부를 다른 파일로 구분지을 경우,선언부에서만, 디폴트 파라미터 값을 설정해야 함. 왜? 함수 호출 시, 선언부를 보고 컴파일을 하므
: 동일한 이름의 함수를 여러개 만들 수 있음. 특징 1) 반환 타입의 다름은 함수 오버로딩이 될수 없음. 2) 오로지 인자 타입, 인자 갯수의 다름에서 함수 오버로딩이 가능함.1) 정수형과 포인터 타입에 대한 오버로딩은 만들지 말자.: 포인터의 경우, 0이 인자로 들
: 컴파일 시간에 템플릿 인자로 들어오는 타입을 보고, 타입과 일치한 함수나 클래스를 만드는 키워드: 개념을 보고,가) 함수 템플릿을 만들고, int형, string,형 함수를 호출하라. 나) 클래스 템플릿을 만들고, 여러개의 타입 객체를 만들어서 호출하라.
: 컴파일 시간에 함수가 호출되는 곳에 함수의 코드를 그대로 치환함. 장점: 함수를 호출할 경우, 스택 프레임에 넣고, 해제하는 등의 과정이 없음.\-> 빠름단점. : 컴파일 후, 생성되는 코드파일, 목적파일, obj 파일, 바이너리 파일이 커짐.특징 : 인라인 해서
: 전처리기에서 call 되는 곳에 치환하는 함수.장점. : 코드 재사용, 단축성단점. 1) 가독성 떨어뜨림. 2) 디버깅 불가함. 3) 타입 검사 안함.전처리기 : 컴파일 전에 실행되는 단계 상세 설명은 블로그에서
: 함수를 삭제함. 1) c++에서의 함수의 인자가 암시적 형변환을 방지함. 2) 함수를 선언부를 delete 함으로서 링커에러가 아닌, 컴파일 에러를 발생시킬 수 있음. 내가 모르는 내용.선언된 함수를 찾는 것은 컴파일러가 아닌, 링커가 하는 역할임. obj, 라이브
: 반환 타입을 컴파일 시간에 결정하는 기법.언제 사용할까? : 이러한 경우가 있음. \-> 반환 타입을 결정하기 어려움. 템플릿 인자가 한개 들어온다면 , 해당 템플릿 인자 타입을 반환하면 되지만,이와 같은 상황은 어떻게 해야할지...??: 이때 사용되는 것이 suf
: 컴파일 시간에 처리할 수 있다면, 컴파일 시간에 미리 함수를 실행함. 그렇지 않다면? 실행시간에 함수를 실행함. 1) 컴파일시간에 실행 할때는 리터럴 상수가 인자로들어올 때2) 런타입 시간에 실행 할때는 변수가 인자로 들어올 때가) consterpr로 함수를 만들어
: 함수의 표현을 , 익명 함수 객체로 정의하는 편리한 기능임.c++11 기능1) 클로저라고 부르는 \[] 의 의미 : 앞으로 람다식에 대한 정의를 하겠다!나머지는 일반 함수와 동일함. 2) 반환 타입 필요 없음!3) 함수의 이름 필요 없음! 4) 함수 호출하는 것처럼
: c++11부터 도입된 새로운 반복문c모양1번) i에 복사 받아서 처리함.for(auto i : 컨테이너)2번) i에 참조형식으로 받아서 처리함. for(auto &i : 컨테이너) 벡터 {1,2,59,-17,55};가) range for로 복사한 후, 해당 구문에서
: 기존 변수에 또 다른 이름을 부여하는 것포인터 변수는 변수의 메모리를 넣지만, 참조 변수는 , 변수를 대입함. 동작에 대해: 상수포인터와 동일한 기능을 수행함.포인터로, 참조할 경우, 1) ++연산자, -- 연산자 등을 통해 외부의 메모리에 접근하는 특징이 있고,
ㅇㅇㅇ
: c++에서 value 반환은 무조건 복사가 이루어짐. 그것이 전역객체나 , 변수라고 하더라도. \-> 이 때 임시객체가 생성됨. 임시객체 : 컴파일러가 임시적으로 생성하는 객체 \- 특징 : rvalue에 속하므로, lvalue 동작 , 즉 값대입 불가능함. 언제
lValue : 등호의 오른쪽과 왼쪽에 올수 있는 것. / 메모리값을 갖고 있음.rValue : 등호의 오른쪽에만 올수 있음. / 메모리 값 없음.: lValue 값만 가리킬수 있음.: lvalue와 rvalue 둘다 가리킬수 있음.: rValue 만 가리킬수 있음.
c언어에서는 void\* -> 다른 포인터 형변환으로 암식적 형변환 처리함. c++에서는 그렇지 않음. c언어 캐스팅은 정말 강력함. 이런것도 가능함. 1번int n =0;double pd = (double 포인터(가려짐.))(&n);(포인터)pd = 3.4; \->
: c언어의 casting을 용도에 맞게 캐스팅하게 하는 4가지 형변환 키워드가 있음.
반환타입이 void\* 타입임 -> 형변환을 해야함. malloc 호출만으로는 초기화가 이루어지지 않음.생성자를 호출함. 캐스팅할 필요 없음. 주의할 점. : 배열 해제할 시 delete\[] 해야 함.
1) private : 해당 객체만 접근이 가능함.\-> 은닉성, 캡슐화를 가져옴. 2) public \-> 외부에서 접근이 가능함. get, set 등 .get 함수는 함수내에서 데이터 변경 못하게 const 지정하자.3) protected : 파생 객체에서만 접근
: 객체 생성시 컴파일러가 자동으로 Call하는 함수.왜 사용할까?: 초기화 코드를 넣기 위해서 유저가 정의하지 않으면, : 컴파일러가 디폴트 생성자를 호출하게 됨. but , 기본생성자를 만들지 않고, 인자가 있는 생성자를 만들면?: 인자 없는 객체를 생성시, 컴파일
: 직접 초기화만 가능하게 하는 생성자 .: 인자가 있는 객체를 만들어서 ,생성자(인자) call하는 형식이 아닌, 인자를 대입해보자. ex) CObject obj = 4;\-> 가능한 구조임. 가) explicit 키워드를 사용해 , 직접초기화만 가능한지 확인하라.나
: 자신과 동일한 참조 타입 한개를 가지는 생성자 .컴파일러가 알아서 디폴트 복사 생성자를 만듦.특징 : 모든 멤버들 간의 복사가 이루어짐. 문제점 : 얕은 복사가 발생할 수 있음. 가 ) CPoint p; CPoint p2(p); 를 해보고, p2의 멤버 데이터를 출
: 디폴트 복사 생성자는 모든 멤버 데이터간의 복사 대입을 이루어지게 함.문제점 : 클래스에 포인터가 존재하고, 소멸자에서 해제하는 코드가 존재시 동일한 포인터를 2번 해제하게 됨. 결과 : 이미 해제된 메모리를 또 해제하므로 오류 발생함. : 위의 내용을 토대로 클래
delete 키워드를 사용해 복사 생성을 방지할 수 있음.: \*char 보다는 내부적으로 복사를 지원하는 string을 사용하자.
정적 멤버 변수로서 소속은 해당 객체에 속함. 외부에서 정의를 해야함. 모든 객체가 공유함. 헤더와 cpp로 분류할 때, 정의는 cpp에서 정의해야 하는 것이 원칙임. 정적 멤버데이터는 객체를 만들지 않더라도 메모리, static 영역에 올라와져 있음. 1) 전역변수는
반환형 함수명() const: 함수 내에서의 데이터는 상수화가 적용됨. 1) 코드 안정성2) 상수 객체는 상수 멤버 함수만 호출할 수 있음.
객체 내 데이터들의 영역 멤버 데이터는 각 객체의 메모리 영역에 속함. 멤버 함수는 "객체와는 상관없이 코드 영역에 속함. " problem : Point 클래스를 만들고, print 함수를 만들고, print 함수의 주소를 한번 출력해보자ㅣ.
: 한 클래스가 기반 클래스의 기능을 물려 받는 것을 말함. 재사용성을 가져옴. 코드의 중복을 방지함.기존 클래스에서 새로운 기능을 추가할 수 있음. 다형성을 설계하기 위한 기본 과정: 파생클래스가 접근할 수 있게 하는 접근 지정자. : 파생 클래스의 생성자 호출시,
개념1) 기반 객체의 포인터로 파생 클래스를 참조할 수 있음. 2) 기반 객체의 참조로 파생 클래스를 참조할 수 있음. 왜 이것이 가능한 것인가? : 기반 클래스와 파생 클래스의 메모리 구조를 때문임. 업캐스팅으로 기반 클래스의 멤버는 접근할 수 있음.but 파생클래스
1) virtual 키워드 : 파생클래스에서 기반 클래스의 함수를 재정의했다는 것을 명시하기 위해 붙이는 것이 좋음.2) override 키워드: c++11 부터 나왔음. 파생 클래스의 재정의 함수 뒤에 붙여서 재정의함을 명시하는 것이 좋음.but , c++11부터 나
: virtual 함수인데, 구현부가 없고, 선언부가 = 0으로 끝남. : 순수 가상함수가 한개 이상 있는 클래스 객체 생성 불가함.포인터 변수는 가능함. 추상으로부터 파생한 클래스도 마찬가지로, 선언된 것이나 다름 없으므로, 구현부를 제공해야 함.: 파생 클래스에게
: 실행시간에 타입의 정보를 얻을 때 사용하는 기술 ㅇㅇ
: '+' ,'-' , '\*'의 연산자 도 함수로 구현할 수 있음. 1) 기본 타입은 일반적인 덧셈을 수행함. 2) a, b중 한개라도 사용자 정의 타입일 경우, operator+ 를 찾게 됨. \- 가) 방법1. 멤버 함수를 검색함. a.operator+(b
cout에 대해서 생각을 해보면, 모든 기본 타입을 받아서 출력하고 있음.1) 모든 기본 타입에 대한 연산자 오버로딩이 되어 있음. 2) ostream이라는 클래스의 전역 객체임을 알 수 있음. 3) 유저 타입의 cout을 만들 수 있음. cout.operator(3)
ㅇㅇㅇㅇ
전위형, 후위형을 구별해야 함. 1) 전위형은 인자가 없음.2) 후위형은 구별하기 위해 int 타입을 한개 가지도록 함. ✨1) 반환값에 유의해야함. -> 참조 반환타입으로 만들어야 함.c++의 규칙, 값반환은 복사를 발생시킴.확인해보기 Point p;\++++p; 를
1) 복사 생성자.: 객체를 처음으로 생성할 시에, 복사 생성자를 이용하는 초기화1번)Point p;Point p2(p)2번)Point p;Point p2 = p;2) 대입 연산자. : 초기화 이후에 대입을 할 경우에 호출되는 연산자.Point p;Point p2;p2
: 객체이지만, 포인터처럼 동작하는 객체'-> 연산자' 와, '. 연산자' 를 이용해 객체 내부에 있는 포인터 객체에 접근할 수 있음. 소멸자를 이용해 포인터 객체를 해제할 수 있음. 실제 포인터 객체를 따로 쓸 경우, 객체가 아니라서, 유저가 관리해야 함. 포인터가
ㅇㅇㅇㅇ
ㅇㅇㅇ
: 예상치 못한 오류를 잡아내는 수단. 함수가 실패하면, throw 키워드를 사용해 예외를 던짐.\-> 던져진 예외를 처리하지 않으면 프로그램은 종료됨. 1) try ~ catch를 작성하고, try 문안에서 실행할 함수를 작성하자. 2) 함수가 어떤 타입을 반환하든
함수의 주소를 출력하기 위해서: 함수의 시그니처를 맞춰야 함.동일한 이름의 함수가 2개 있을 때\-> "함수 포인터 타입으로 캐스팅" 을 하자! 예시 코드 1번.예시 코드 2번: template 함수가 있을 경우. 비록 호출하는 곳이 없더라도, 컴파일 시에 "템플릿 파
인자 기반 탐색
4개의 형변환이 있음. c언어에서의 형변환을 대체하는 친구상속 관계에서의 형변환에 사용함. 그런데 그에 대한 책임은 전적으로 프로그래머에게 있다. 하향 형변환 예제 코드 \->