책 "전문가를 위한 C++" - 1.2 C++의 고급기능
프로그래밍/c,c++ 2021. 1. 28. 11:29"전문가를 위한 C++" 내용 정리
www.yes24.com/Product/Goods/77669043
string
#include <string>
#include <iostream>
using namespace std;
int main() {
string myString = "Hello, world";
cout << "string is " << myString << endl;
cout << "second char is " << myString[1] << endl;
return 0;
}
포인터와 동적 메모리 - malloc 과 free 대신 new, delete 사용
int* intPtr = nullptr;
intPtr = new int;
*intPtr = 5;
delete intPtr;
intPtr = nullptr;
동적으로 배열 할당하기
int arraySize = 8;
int* myArray = new int[arraySize];
delete[] myArray;
myArray = nullptr;
널 포인터 상수 - NULL 은 0 인지 널 포인터 인지 구분이 되지 않음
#include <iostream>
using namespace std;
void func(char* str) {
cout << "char* " << endl;
}
void func(int num) {
cout << "int " << endl;
}
int main() {
// func(NULL);
func(0);
func(nullptr);
return 0;
}
스마트 포인터
스마트 포인터를 사용하면 지정한 객체가 스코프를 벗어나면 메모리가 자동 해제됨(return 문 마다 메모리 해제 필요없음)
std::unique_ptr
#include <iostream>
#include <memory>
using namespace std;
class Employee {
public:
int salary;
~Employee() { cout << "~Employee" << endl; }
};
int main() {
auto employee = make_unique<Employee>();
if (employee) {
cout << "salary " << employee->salary << endl;
}
auto employees = make_unique<Employee[]>(3);
cout << "salary arr " << employees[0].salary << endl;
return 0;
}
std::shared_ptr 대입연산이 발생할때마다 레퍼런스카운터 증가, 스코프를 벗어 나면 감소, 레퍼런스 카운터가 0 이 되면 메모리 해제됨
auto employee = make_shared<Employee>();
if (employee) {
cout << "salary " << employee->salary << endl;
}
const 상수 - #define 대신 const 를 사용한다.
레퍼런스 전달 - 일반 변수 처럼 사용하지만 내부적으로 해당 변수에 대한 포인터로 동작한다
int x = 42;
int& refer = x;
#include <iostream>
using namespace std;
void inc(int& i) {
i++;
}
int main() {
int a = 3;
inc(a);
inc(3); // ERROR
cout << "a = " << a << endl;
return 0;
}
타입 추론 - auto, decltype
#include <string>
#include <iostream>
using namespace std;
const string message = "TEST";
const string& foo() {
return message;
}
int main() {
auto f1 = foo();
cout << "f1 = " << f1 << endl;
f1.append("a");
cout << "f1 = " << f1 << endl;
cout << "msg = " << message << endl;
const auto& f2 = foo();
cout << "f2 = " << f2 << endl;
f2.append("a");
cout << "f2 = " << f2 << endl;
cout << "msg = " << message << endl;
return 0;
}
#include <string>
#include <iostream>
using namespace std;
const string message = "TEST";
const string& foo() {
return message;
}
int main() {
int x = 123;
decltype(x) y = 456;
decltype(foo()) f2 = foo();
cout << "f2 = " << f2 << endl;
f2.append("a");
cout << "f2 = " << f2 << endl;
cout << "msg = " << message << endl;
return 0;
}