C++ 기초
Hello, World!
1
int main() { } // 최소한의 C++ 실행 프로그램
해당 코드는 어떠한 인수agrument도 입력받지 않고 어떤 기능을 하지도 않은 가장 기본적인 main함수를 정의합니다. 모든 C++ 프로그램은 main()이라는 전역 함수를 딱 하나 포함해야 합니다. 프로그램은 main함수를 실행하며 시작됩니다.
1
2
3
4
5
6
7
import std.core; // 표준 라이브러리 모듈(STanDarD Library Module)를 사용합니다.
// C++20 이상에서 사용가능합니다.
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
해당 코드는 “Hello, World!”를 출력하는 간단한 프로그램입니다.
std::: 표준 라이브러리 네임스페이스에 정의되어 있음을 나타냅니다.cout: “Character OUTput”의 약자로, 표준 출력 스트림을 나타내는 객체object 입니다.
함수
함수는 이름과 반환 값 타입, 사용할 매개 변수, 본문으로 정의됩니다.
1
2
3
4
double sqrt(double) // 타입: double(double), 기본적인 함수 선언
double sqrt(double n) {
return n * n;
} // 타입: double (double), 기본적인 함수 정의
double: 배정밀도 부동 소수점 타입을 반환합니다.sqrt: 함수 이름을 정의합니다.double n: 매개변수parameters n를 사용합니다.{ ... }: 함수가 수행할 실제 작업을 정의합니다. 해당 코드에서는 n × n을 해 반환합니다.함수를 사용하는 이유
- 재사용성Reusability : 한 번 작성된 함수는 필요할 때 마다 여러번 호출해 사용할 수 있습니다.
- 모듈성Modularity : 복잡한 프로그램을 여러 작은 모듈(함수)로 나눠 전체 구도가 명확해지고 이해 하기 쉬워집니다.
- 유지보수 용이성Maintenance : 잘 작성된 함수는 이름만으로도 기능을 알 수 있으므로 관리하기 쉬워집니다.
- 추상화Abstraction : 함수 내부의 구조를 알지 못해도, 입력과 출력 값만 알고 사용하면 됩니다.
함수 더보기
함수 오버로딩overloading : 같은 이름을 하나 다른 타입의 매개 변수들을 받는 여러개의 함수를 정의하는 기능입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import std.core;
int add(int a, int b){
return a + b;
} // int 2개를 받아 더하는 함수
double add(double a, double b){
return a + b;
} // double 2개를 받아 더하는 함수
int add(int a, int b, int c){
return a + b + c;
} // int 3개를 받아 더하는 함수
int main(){
add(2, 3); // add(int, int), 5
add(2.0, 3.0); // add(double, double), 5.0
add(1, 2, 3); // add(int, int, int)
add(1.0, 2.0, 3.0) // Error: add(double, double, double)은 정의되지 않음
return 0;
}
함수 주의점
호출 할 수 있는 함수가 두개 이상이면 모호한 호출ambiguous call이 발생해 컴파일 에러가 발생합니다.
1
2
3
4
5
6
int add(int, int)
double add(double, double)
int main(){
add(2, 3); // Error: add(int, int), add(double, double) 둘 중 결정할 수 없어 컴파일 오류를 발생시킵니다.
}
변수
변수variable는 값을 저장하고 사용 할 수 있는 공간입니다.
1
2
int num; // 정수형 변수 num
float real; // 단정밀도 부동 소수점형 변수 real
타입
C++는 여러가지 기본적인 타입을 제공합니다.
- 기본 데이터 타입fundamental type
void: 특별한 타입으로 값을 받지 않는 타입입니다.std::nullptr_t: 특별한 타입으로 어떤 객체도 가리키지 않는nullptr의 타입입니다.- 정수형 타입
bool: 참(True1) 혹은 거짓(False0)을 갖습니다.- 문자형 타입
char-128~127 : 1Byte; 문자 표현 및 작은 정수을 표현합니다.
- 정수형 타입
short-32768~32767 : 2Byte; 정수를 표현합니다.int-21,4748,3648~21,4748,3647 : 4Byte; 정수를 표현합니다long long-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 : 8Byte; 큰 정수를 표현합니다.- 해당 타입들은
signed(부호 있음; 기본값),unsigned(부호 없음; 0 ~ $2$4 * Byte의 범위를 갖습니다.)
- 부동 소수점형 타입
float3.40×1038~1.18×1038 : 4Byte; 단정밀도 부동 소수점을 표현합니다.double1.80×10308~2.23×10-308 : 8Byte; 배정밀도 부동 소수점를 표현합니다.long double최대 1.19×104932~3.36×10-4932 : 8, 12, 16 Byte; 매우 높은 단정밀도를 가지나 컴파일러에 따라 달라질 수 있습니다. 사용을 권장하지 않습니다.
- 복합 속성 타입compound types
- 포인터pointers : T* 형태로 다른 객체나 함수의 메모리 주소를 저장합니다.
- 참조references : 이미 존재하는 객체의 별명alias처럼 동작합니다.
- lvalue : T& 형태로 메모리 주소를 가지는 객체로, 메모리에 저장된 값을 참조합니다.
- rvalue : T&& 형태로 임시 객체나 수정 불가능한 값을 나타냅니다.
x = 1 + 2;에서 x는 lvalue, 1 + 2는 rvalue입니다.
- 배열arrays : T[N] 형태로, 같은 타입 T의 원소 N개를 연속된 메모리 공간에 저장합니다.
- 함수function : 함수의 반환 타입과 매개 변수 타입을 정의합니다.
- 클래스class :
class나struct키워드로 정의하며, 데이터 멤버와 멤버 함수를 하나로 묶는 사용자 지정 타입입니다. - 공용체uni on :
union키워드로 정의하며, 여러 멤버가 같은 메모리 공간을 공유하며 한 시점에는 하나의 멤버만 활성화됩니다. - 열거enumeration :
enum이나enum class키워드로 정의하며, 명명된 정수 상수들의 집합입니다. cpprefence.com을 참조했습니다.
타입 변환
타입 변환type conversion은 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 과정입니다.
- 암시적 타입 변환implicit type conversion
- 자동 타입 변환이라고도 하며 컴파일러가 자동적으로 타입을 변환합니다.
- 작은 타입에서 큰 타입으로 변환시 사용됩니다. ex) int -> double
double d1 = 1;d1에는 1.0이 저장됩니다.
- 명시적 타입 변환explicit type conversion
- 개발자가 직접 타입을 변환합니다.
- 주로 큰 타입에서 작은 타입으로 변환 시 사용됩니다. 정보의 손실이 발생합니다. ex) double -> int
int n1 = 1.3;n1에는 1이 저장되며 0.3이 손실됩니다.
연산
변수는 여러 연산자로 연산될 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
a + b // 덧셈
a - b // 뺄셈
-a // 단항 뺄셈
a % b // 나머지(Mod)
a==b // a, b는 서로 같다.
a < b // a는 b보다 작다.
a!=b // a, b는 서로 다르다.
a & b // 비트 AND 연산
a | b // 비트 OR 연산
a ^ b // 비트 XOR 연산
^a // 비트 보수 연산
a && b // 논리 AND 연산 (a 이고 b)
a || b // 논리 OR 연산 (a 거나 b)
!a // 논리 NOT 연산
a += b // a = a + b
a ++ // a = a + 1
a %= b // a = a % b
a.b // a 객체의 멤버 b
a->b // a가 가르키는 객체의 멤버 b
a[b] // 배열 a의 b번째 인덱스
a << b // a의 비트를 b만큼 왼쪽으로 이동
// 또는 b 스트림을 a로 출력
a >> b // a의 비트를 b만큼 오른쪽으로 이동
// 또는 b 스트림에 a로 입력
초기화
C++에서 객체를 사용하기 위해선 초기화intialization를 통해 값을 넣어야 합니다.
1
2
3
4
5
int n1 = 1; // int n1에 1을 초기화
int n2 (2); // int n2에 2를 초기화
int n3 {3}; // int n3에 3을 초기화
vector<int> nums {1, 2, 3, 4}; // 벡터 nums를 초기화
초기화는 = 연산자, ()연산자 또는 {}연산자c++ 11 이상을 사용해 진행할 수 있습니다.
초기화 주의사항
{} 연산자는 명시적 타입 변환을 제거해 타입 변환으로 인한 정보 손실을 막습니다.
1
2
3
int n1 = 1.3; // int n1에 1 저장
int n2 (2.3); // int n2에 2 저장
int n3 {3.4}; // Error
상수
상수constant는 값을 한번 초기화한 후 더는 값을 바꿀 수 없는 변수입니다.
const에 의한 선언const는 값을 변경할 수 없는 변수를 정의할 때 사용됩니다.1 2
const int num = 10; num = 20; // Error: num은 상수이므로 변경 할 수 없습니다.
정의 될 때 반드시 초기화해야합니다. 런타임에 평가됩니다. 포인터와 결합해 상수로 사용할 수 있습니다.
1 2 3 4
int a = 10; int* const ptr = &a; // a의 주소값을 갖는 포인터 상수입니다. *ptr = 20; // ptr이 가리키는 값은 변경할 수 있습니다. ptr = &a; // Error: ptr의 주소값은 변경할 수 없습니다.
constexpr에 의한 선언constexpr는 컴파일 타임 상수를 정의할 때 사용됩니다. 해당 상수는 컴파일 시점에 확정 할 수 있어야합니다. 함수에 사용해 상수 함수로 사용 할 수 있습니다.1 2 3 4 5 6 7 8 9 10 11 12
constexpr int add(int a, int b){ return a + b; } int main(){ const int a {1}, b {2}; // 컴파일 시점에 초기화되는 a, b 상수 int c {3}, d {4}; // 런타임 시점에 초기화되는 c, d 변수 constexpr int result1 = add(a, b); // result1: 3 constexpr int result2 = add(a, b); // Error: c, d가 컴파일 시점에 정의되지 않았습니다. int result3 = add(c, d); // result3 : 7 return 1; }
constexpr로 정의된 함수는 컴파일 시점 뿐 아니라 런타임 시점에서도 사용할 수 있습니다.consteval에 의한 선언c++20 이상에서 사용가능consteval은 컴파일 상수 함수를 정의하는 데 사용되며, 해당 함수는 컴파일 시점에서만 사용가능합니다.1 2 3 4 5 6 7 8 9 10
consteval int add(int a, int b){ return a + b; } int main() { const int a {1}, b {2}; constexpr int result1 = add(a, b); // result1: 3 int result2 = add(a, b); // Error: consteval 상수 함수는 런타임에 사용될 수 없습니다. return 1; }
consteval을 사용하면 반드시 상수를 컴파일 시점에 계산하게 하는 효과가 있습니다.상수 더보기
const객체와 멤버 함수const객체는 초기화된 이후 상태가 변경되지 않습니다.const멤버 함수는 객체의 상태를 변경하지 않습니다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
import std.core; class MyClass{ public: int value; MyClass(int v): value(v) {} int getValue() const { return value; } // const 멤버 함수 void setValue(int v) { value = v; } int changeValue(int v) const { value = v; return value; } // Compile Error: const 멤버 함수는 객체의 상태를 변경할 수 없습니다. }; int main() { const MyClass obj(1); // const 객체로 선언됩니다. std::cout << obj.getValue(); // 1이 출력됩니다. obj.setValue(2); // Error: const 객체는 상태를 변경할 수 없습니다. return 0; }
const포인터와 참조const T*: 상수 T에 대한 포인터로 포인터는 변경 가능하지만, 가리키는 값은 변경 할 수 없습니다.T* const: 상수 포인터로 포인터는 변경할 수 없지만, 가리키는 값은 변경 할 수 있습니다.const T&: 상수 T에 대한 참조로 값을 변경할 수 없습니다.T& const: C++에서는 참조에const를 **적용할 수 없습니다. ** ```cpp int a {10}, b {20}; const int& ref1 = a; // 상수 a에 대한 참조 ref1 // int& const ref2 = a; Error: C++은 상수 참조를 허용하지 않습니다.
ref1 = b; // 상수 a에 대한 참조 ref1의 값을 변경할 수 없습니다. ```
const매개 변수const매개 변수는 함수가 매개 변수의 값을 변경할 수 없게 보장합니다.- 기본적인 상수 매개 변수
const를 매개 변수이 적용하면 매개 변수를 변경할 수 없게 됩니다.1 2 3 4 5 6 7 8 9 10
import std.core; void printValue(const int x) { x = 10; // Error: const 매개 변수는 값을 변경할 수 없습니다. std::cout << x << std::endl; } int main() { int a = 5; printValue(a); // 5 출력 }
상수 참조 매개 변수
const참조를 사용하여 객체나 배열등의 큰 자료의 복사본을 만들지 않고, 원본을 훼손하지 않으며 매개 변수로 전달할 수 있습니다. ```cpp import std;void printArray(const std::vector
& arr) { arr[0] = 10; // 오류! const 참조 매개 변수는 값을 변경할 수 없습니다. std::cout << arr << std::endl; } int main() { std::vector
a = std::vector (1000); printArray(a); // 벡터 a 출력 } ```import std.core;
- 기본적인 상수 매개 변수
int add(int a, int b){ return a + b; } // int 2개를 받아 더하는 함수
double add(double a, double b){ return a + b; } // double 2개를 받아 더하는 함수
int add(int a, int b, int c){ return a + b + c; } // int 3개를 받아 더하는 함수
int main(){ add(2, 3); // add(int, int), 5 add(2.0, 3.0); // add(double, double), 5.0 add(1, 2, 3); // add(int, int, int) add(1.0, 2.0, 3.0) // Error: add(double, double, double)은 정의되지 않음 return 0; }
1
2
3
4
5
6
7
8
9
### 함수 주의점
호출 할 수 있는 함수가 두개 이상이면 모호한 호출<span style="color: grey;"><sup>ambiguous call</sup></span>이 발생해 컴파일 에러가 발생합니다.
```cpp
int add(int, int)
double add(double, double)
int main(){
add(2, 3); // Error: add(int, int), add(double, double) 둘 중 결정할 수 없어 컴파일 오류를 발생시킵니다.
}
변수
변수variable는 값을 저장하고 사용 할 수 있는 공간입니다.
1
2
int num; // 정수형 변수 num
float real; // 단정밀도 부동 소수점형 변수 real
타입
C++는 여러가지 기본적인 타입을 제공합니다.
- 기본 데이터 타입fundamental type
void: 특별한 타입으로 값을 받지 않는 타입입니다.std::nullptr_t: 특별한 타입으로 어떤 객체도 가리키지 않는nullptr의 타입입니다.- 정수형 타입
bool: 참(True1) 혹은 거짓(False0)을 갖습니다.- 문자형 타입
char-128~127 : 1Byte; 문자 표현 및 작은 정수을 표현합니다.
- 정수형 타입
short-32768~32767 : 2Byte; 정수를 표현합니다.int-21,4748,3648~21,4748,3647 : 4Byte; 정수를 표현합니다long long-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 : 8Byte; 큰 정수를 표현합니다.- 해당 타입들은
signed(부호 있음; 기본값),unsigned(부호 없음; 0 ~ $2$4 * Byte의 범위를 갖습니다.)
- 부동 소수점형 타입
float3.40×1038~1.18×1038 : 4Byte; 단정밀도 부동 소수점을 표현합니다.double1.80×10308~2.23×10-308 : 8Byte; 배정밀도 부동 소수점를 표현합니다.long double최대 1.19×104932~3.36×10-4932 : 8, 12, 16 Byte; 매우 높은 단정밀도를 가지나 컴파일러에 따라 달라질 수 있습니다. 사용을 권장하지 않습니다.
- 복합 속성 타입compound types
- 포인터pointers : T* 형태로 다른 객체나 함수의 메모리 주소를 저장합니다.
- 참조references : 이미 존재하는 객체의 별명alias처럼 동작합니다.
- lvalue : T& 형태로 메모리 주소를 가지는 객체로, 메모리에 저장된 값을 참조합니다.
- rvalue : T&& 형태로 임시 객체나 수정 불가능한 값을 나타냅니다.
x = 1 + 2;에서 x는 lvalue, 1 + 2는 rvalue입니다.
- 배열arrays : T[N] 형태로, 같은 타입 T의 원소 N개를 연속된 메모리 공간에 저장합니다.
- 함수function : 함수의 반환 타입과 매개 변수 타입을 정의합니다.
- 클래스class :
class나struct키워드로 정의하며, 데이터 멤버와 멤버 함수를 하나로 묶는 사용자 지정 타입입니다. - 공용체union :
union키워드로 정의하며, 여러 멤버가 같은 메모리 공간을 공유하며 한 시점에는 하나의 멤버만 활성화됩니다. - 열거enumeration :
enum이나enum class키워드로 정의하며, 명명된 정수 상수들의 집합입니다. cpprefence.com을 참조했습니다.
타입 변환
타입 변환type conversion은 하나의 데이터 타입을 다른 데이터 타입으로 변환하는 과정입니다.
- 암시적 타입 변환implicit type conversion
- 자동 타입 변환이라고도 하며 컴파일러가 자동적으로 타입을 변환합니다.
- 작은 타입에서 큰 타입으로 변환시 사용됩니다. ex) int -> double
double d1 = 1;d1에는 1.0이 저장됩니다.
- 명시적 타입 변환explicit type conversion
- 개발자가 직접 타입을 변환합니다.
- 주로 큰 타입에서 작은 타입으로 변환 시 사용됩니다. 정보의 손실이 발생합니다. ex) double -> int
int n1 = 1.3;n1에는 1이 저장되며 0.3이 손실됩니다.
연산
변수는 여러 연산자로 연산될 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
a + b // 덧셈
a - b // 뺄셈
-a // 단항 뺄셈
a % b // 나머지(Mod)
a==b // a, b는 서로 같다.
a < b // a는 b보다 작다.
a!=b // a, b는 서로 다르다.
a & b // 비트 AND 연산
a | b // 비트 OR 연산
a ^ b // 비트 XOR 연산
^a // 비트 보수 연산
a && b // 논리 AND 연산 (a 이고 b)
a || b // 논리 OR 연산 (a 거나 b)
!a // 논리 NOT 연산
a += b // a = a + b
a ++ // a = a + 1
a %= b // a = a % b
a.b // a 객체의 멤버 b
a->b // a가 가르키는 객체의 멤버 b
a[b] // 배열 a의 b번째 인덱스
a << b // a의 비트를 b만큼 왼쪽으로 이동
// 또는 b 스트림을 a로 출력
a >> b // a의 비트를 b만큼 오른쪽으로 이동
// 또는 b 스트림에 a로 입력
초기화
C++에서 객체를 사용하기 위해선 초기화intialization를 통해 값을 넣어야 합니다.
1
2
3
4
5
int n1 = 1; // int n1에 1을 초기화
int n2 (2); // int n2에 2를 초기화
int n3 {3}; // int n3에 3을 초기화
vector<int> nums {1, 2, 3, 4}; // 벡터 nums를 초기화
초기화는 = 연산자, ()연산자 또는 {}연산자c++ 11 이상을 사용해 진행할 수 있습니다.
초기화 주의사항
{} 연산자는 명시적 타입 변환을 제거해 타입 변환으로 인한 정보 손실을 막습니다.
1
2
3
int n1 = 1.3; // int n1에 1 저장
int n2 (2.3); // int n2에 2 저장
int n3 {3.4}; // Error
상수
상수constant는 값을 한번 초기화한 후 더는 값을 바꿀 수 없는 변수입니다.
const에 의한 선언const는 값을 변경할 수 없는 변수를 정의할 때 사용됩니다.1 2
const int num = 10; num = 20; // Error: num은 상수이므로 변경 할 수 없습니다.
정의 될 때 반드시 초기화해야합니다. 런타임에 평가됩니다. 포인터와 결합해 상수로 사용할 수 있습니다.
1 2 3 4
int a = 10; int* const ptr = &a; // a의 주소값을 갖는 포인터 상수입니다. *ptr = 20; // ptr이 가리키는 값은 변경할 수 있습니다. ptr = &a; // Error: ptr의 주소값은 변경할 수 없습니다.
constexpr에 의한 선언constexpr는 컴파일 타임 상수를 정의할 때 사용됩니다. 해당 상수는 컴파일 시점에 확정 할 수 있어야합니다. 함수에 사용해 상수 함수로 사용 할 수 있습니다.1 2 3 4 5 6 7 8 9 10 11 12
constexpr int add(int a, int b){ return a + b; } int main(){ const int a {1}, b {2}; // 컴파일 시점에 초기화되는 a, b 상수 int c {3}, d {4}; // 런타임 시점에 초기화되는 c, d 변수 constexpr int result1 = add(a, b); // result1: 3 constexpr int result2 = add(a, b); // Error: c, d가 컴파일 시점에 정의되지 않았습니다. int result3 = add(c, d); // result3 : 7 return 1; }
constexpr로 정의된 함수는 컴파일 시점 뿐 아니라 런타임 시점에서도 사용할 수 있습니다.consteval에 의한 선언c++20 이상에서 사용가능consteval은 컴파일 상수 함수를 정의하는 데 사용되며, 해당 함수는 컴파일 시점에서만 사용가능합니다.1 2 3 4 5 6 7 8 9 10
consteval int add(int a, int b){ return a + b; } int main() { const int a {1}, b {2}; constexpr int result1 = add(a, b); // result1: 3 int result2 = add(a, b); // Error: consteval 상수 함수는 런타임에 사용될 수 없습니다. return 1; }
consteval을 사용하면 반드시 상수를 컴파일 시점에 계산하게 하는 효과가 있습니다.상수 더보기
const객체와 멤버 함수const객체는 초기화된 이후 상태가 변경되지 않습니다.const멤버 함수는 객체의 상태를 변경하지 않습니다.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
import std.core; class MyClass{ public: int value; MyClass(int v): value(v) {} int getValue() const { return value; } // const 멤버 함수 void setValue(int v) { value = v; } int changeValue(int v) const { value = v; return value; } // Compile Error: const 멤버 함수는 객체의 상태를 변경할 수 없습니다. }; int main() { const MyClass obj(1); // const 객체로 선언됩니다. std::cout << obj.getValue(); // 1이 출력됩니다. obj.setValue(2); // Error: const 객체는 상태를 변경할 수 없습니다. return 0; }
const포인터와 참조const T*: 상수 T에 대한 포인터로 포인터는 변경 가능하지만, 가리키는 값은 변경 할 수 없습니다.T* const: 상수 포인터로 포인터는 변경할 수 없지만, 가리키는 값은 변경 할 수 있습니다. ```cpp int a {10}, b {20}; const int* ptr1 = &a; // 상수 a에 대한 포인터 ptr1 int* const ptr2 = &a; // a에 대한 상수 포인터 ptr2
*ptr1 = 11; // Error: 상수 a를 변경 할 수 없습니다. ptr1 = &b; // 상수 b에 대한 포인터로 변경할 수 있습니다. *ptr2 = 11; // 상수 포인터 ptr2가 가리키는 변수 a의 값을 변경할 수 있습니다. ptr2 = &b; // Error: 상수 포인터 ptr2가 가리키는 주소값을 변경할 수 없습니다.
1 2 3 4 5 6 7 8
- `const T&` : **상수 T에 대한 참조**로 값을 변경할 수 없습니다. - `T& const` : C++에서는 참조에 `const`를 **적용할 수 없습니다. ** ```cpp int a {10}, b {20}; const int& ref1 = a; // 상수 a에 대한 참조 ref1 // int& const ref2 = a; Error: C++은 상수 참조를 허용하지 않습니다. ref1 = b; // 상수 a에 대한 참조 ref1의 값을 변경할 수 없습니다.const매개 변수const매개 변수는 함수가 매개 변수의 값을 변경할 수 없게 보장합니다.- 기본적인 상수 매개 변수
const를 매개 변수이 적용하면 매개 변수를 변경할 수 없게 됩니다.1 2 3 4 5 6 7 8 9 10
import std.core; void printValue(const int x) { x = 10; // Error: const 매개 변수는 값을 변경할 수 없습니다. std::cout << x << std::endl; } int main() { int a = 5; printValue(a); // 5 출력 }
- 상수 참조 매개 변수
const참조를 사용하여 객체나 배열등의 큰 자료의 복사본을 만들지 않고, 원본을 훼손하지 않으며 매개 변수로 전달할 수 있습니다.1 2 3 4 5 6 7 8 9 10 11
import std; void printArray(const std::vector<int>& arr) { arr[0] = 10; // 오류! const 참조 매개 변수는 값을 변경할 수 없습니다. std::cout << arr << std::endl; } int main() { std::vector<int> a = std::vector<int>(1000); printArray(a); // 벡터 a 출력 }
- 기본적인 상수 매개 변수