💖 뭔가 오류가 뜬다! 💖
생성자 잘 만들어줬는지 확인해볼 것!!
#2
참조로 전달하기
매개변수에는 자료형& 변수
인자로는 그냥 변수 n 넣어주면 된다.
void half(double& n) {
n = 10;
n/=2;
}
int main() {
double n = 20;
half(n);
cout << n << endl;
}
원래 참조가 아니라 기본적인 변수를 사용하였다면 n이 half함수를 빠져나갔을 때 n/2한 값이 공유되는게 아니라 소멸되었을것! 그리고 함수를 빠져나가면 함수에서 변경된 값이 변경이 안됐을 것임. (그냥 20임)
#4
ref를 통해 매개변수 big의 값을 공유한다!
bool bigger(int a, int b, int& big) {
if (a == b) {
return true;
}
else {
if (a > b) {
big = a;
}
else {
big = b;
}
return false;
}
}
int main() {
int a;
int b;
int bigRef = 0;
int& big = bigRef;
cin >> a;
cin >> b;
bigger(a, b, big);
cout << big << endl;
ref가 없었다면 0이 나옴!
bool bigger(int a, int b, int big) {
if (a == b) {
return true;
}
else {
if (a > b) {
big = a;
}
else {
big = b;
}
return false;
}
}
int main() {
int a;
int b;
int bigRef = 0;
int& big = bigRef;
cin >> a;
cin >> b;
bigger(a, b, big);
cout << big << endl;
}
#6
변수가 참조로 반환된다는것은!
변수가 참조로 반환(return by reference)되면 변수에 대한 참조가 호출자에게 반환된다.
그런 다음 호출자는 이 참조를 사용해서 변수를 계속 수정할 수 있다.
참조로 반환은 빠르므로 구조체와 클래스를 반환할 때 유용하다.
출처: https://boycoding.tistory.com/219 [소년코딩:티스토리]
//find란 원소 공간에 대한 참조 리턴 a[i]공간의 참조 리턴
char& find(char a[], char c, bool& success) {
int len = sizeof(a);
for (int i = 0; i < len; i++) {
if (a[i] == c) {
success = true;
return a[i];
}
}
success = false;
}
int main() {
char s[] = "Mike";
bool b = false;
char& loc = find(s, 'M', b);
if (b == false) {
cout << "M을 발견할 수 없다." << endl;
return 0;
}
loc = 'm';
cout << s << endl;
}
#8
this라는 건 결국에 객체 자신에 대한 포인터
포인터를 통해 멤버변수에 접근하려니 화살표가 붙는거!
this는 멤버함수에서만 사용 가능하고 정적멤버함수에서는 사용할 수 없다!
this를 사용하는 경우는
1. 매개변수랑 멤버변수명이 같을 때
2. 객체 자신의 주소를 리턴해야할 때
깊은복사로 복사생성자 customize 안해주면 얕은 복사가 되므로 fail
반드시 깊은 복사해야
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
// cppworkspace.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include <iostream>
using namespace std;
class MyIntStack {
int* p;
int size;
int tos;
public:
MyIntStack();
MyIntStack(int size);
MyIntStack(const MyIntStack& s);
~MyIntStack();
bool push(int n);
bool pop(int& n);
};
MyIntStack::MyIntStack() {
}
MyIntStack::MyIntStack(int size) {
cout << "생성자 호출" << endl;
this->size = size;
tos = 0;
p = new int[size];
}
MyIntStack::MyIntStack(const MyIntStack& s) {
//
////얕은 복사 (복사 생성하면 생기는게 디폴트 복사생성자고 걔가 얕은복사)
int len = s.size;
//for (int i = 0; i < len; i++) {
// p[i] = s.p[i];
//}
//깊은 복사
p = new int[len];
size = len;
tos = s.tos;
for (int i = 0; i <len; i++) {
p[i] = s.p[i];
}
}
MyIntStack::~MyIntStack() {
delete[] p;
}
bool MyIntStack::push(int n) {
if (tos >= 9) {
//0부터 시작
return false;
}
tos++;
p[tos] = n;
return true;
}
bool MyIntStack::pop(int& n) {
if (tos < 0) {
//0부터 시작
return false;
}
tos--;
n=p[tos];
return true;
}
int main() {
MyIntStack a(10);
a.push(10);
a.push(20);
MyIntStack b = a;
b.push(30);
int n;
a.pop(n);
cout << "스택 a에서 팝한 값" << n << endl;
b.pop(n);
cout << "스택 b에서 팝한 값" << n << endl;
}
|
cs |
증감 연산자 헷갈릴때는 먼저 더하고 그다음에 반영하기 (이거때문에 에러뜸)
for (int i = 0; i < len; i++) {
p[i] = s.p[i]; //this->p[i]하면 안됨
//첫번째 방에 있는 애만 나의 매개변수
//다음 인덱스는 아님
//배열의 이름이 첫번째 인덱스의 주소값
//첫번째 인덱스에 있는 애만 잡아놓고 나머지는 new로 잡음
//결국 this의 범위는 p이고 이건 첫번째 인덱스의 주소값임
}
#12
참조로 매개변수로 받는 복사생성자가 있어야 com을 넘겨줄 수 있다!
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
// cppworkspace.cpp : 이 파일에는 'main' 함수가 포함됩니다. 거기서 프로그램 실행이 시작되고 종료됩니다.
//
#include <iostream>
using namespace std;
class Dept {
int size;//scores 배열의 크기
int* scores;//동적할당 받을 정수 배열의 주소
public:
Dept(int size) {
this->size = size;
scores = new int[size];
}
Dept(const Dept& dept);
~Dept();
int getSize() {
return size;
}
void read();//size만큼 정수를 읽어 scores배열에 저장
bool isOver60(int index);
};
void Dept::read() {
cout << "read 함수 실행" << endl;
cout << size << "개의 정수 입력" << endl;
for (int i = 0; i < size; i++) {
int num;
cin >> num;
scores[i] = num;
}
}
bool Dept::isOver60(int index) {
if (scores[index] > 60) {
return true;
}
return false;
}
Dept::Dept(const Dept& dept) {
//이걸 정의 했어야 깊은복사
int len = dept.size;
this->scores = new int[len];
this->size = len;
for (int i = 0; i < len; i++) {
this->scores[i] = dept.scores[i];
}
}
Dept::~Dept() {
delete[] scores;
}
int countPass(Dept dept) {
int count = 0;
for (int i = 0; i < dept.getSize(); i++) {
if (dept.isOver60(i)) {
count++;
}
}
cout << count << endl;
return count;
}
int main() {
Dept com(10);//여기서 객체배열이 생성
com.read();
int n = countPass(com); //이때 실행되는 것 같음
cout << "60점 이상은 " << n << "명";
}
|
cs |
'C++ > 기초(두들낙서)' 카테고리의 다른 글
[C++] 상속 (0) | 2022.11.15 |
---|---|
[C++] 다중상속 (0) | 2022.07.13 |
[C++] 상속에서의 형변환 (💢static_cast다시보기) (0) | 2022.07.12 |
[C++] 상속관계에서 생성/소멸자의 실행순서와 가상 소멸자 (0) | 2022.07.12 |
[C++] 순수가상함수와 추상클래스 (0) | 2022.07.12 |
댓글