본문 바로가기
C++/기초(두들낙서)

[C++] 명품 C++ 5장 문제 정리 (찝어준것만)

by Meaning_ 2022. 10. 13.
728x90
반응형

💖 뭔가 오류가 뜬다! 💖

 

생성자 잘 만들어줬는지 확인해볼 것!!

 

#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
728x90
반응형

댓글