본문 바로가기

728x90
반응형

C++

(31)
[C++] friend, friend 함수 friend friend 키워드는 private 멤버의 접근을 허용해 주는 선언이다.friend 키워드는 클래스 내에 어디 존재하든 상관이 없다. private 영역에 존재해도 되고 public 영역에 존재해도 상관없다는 의미이다. 따라서 아래 코드처럼 작성하는 것이 가능하다. class Men {private: int age; friend class Women;public: Men (int num = 0) : age(num) { }};위 코드처럼 Men class에서 Women class에 friend 선언을 해주면 Women class에서도 age에 접근하는 것이 가능하다. 따라서 아래 코드처럼 사용하는 것이 가능하다. class Women {private: char name[20];p..
[C++] 연산자 오버로딩을 활용한 객체의 대입 복사 생성자를 활용한 객체의 대입 아래 코드처럼 복사 생성자를 활용하여 깊은 복사를 구현할 수도 있다. class Bag {private: int* data; size_t used; size_t capacity;public: Bag(size_t capacity) { data = new int[capacity]; this->capacity = capacity; used = 0; } Bag(const Bag& source) // 복사 생성자를 활용한 깊은 복사 { data = new int[source.capacity]; capacity = source.capacity; used = source.used; copy(source.data, source.used); } void copy(const ..
[C++] 연산자 오버로딩 (멤버함수와 전역함수에 의한 연산자 오버로딩) 연산자 오버로딩 연산자 오버로딩은 주로 클래스를 다룰 때 함께 사용한다. 다음과 같은 코드를 작동시켰을 때에는 제대로 동작하지 않는다. #include class Pos{private: int x = 10; int y = 10;};int main(){ Pos a; Pos b; Pos c = a + b; return 0;}  그러나 위 코드를 생성자와 연산자 오버로딩을 통해 정상적으로 동작하게 만들 수 있다.+ 연산자에 대해서 재정의를 해주는 것이다.  Pos(int x, int y) { this->x = x; this->y = y; } Pos operator+(const Pos& a) { Pos PlusPos(x ..
[C++] 객체 내에서 static 변수, static 멤버함수 객체 내에서 staitc 지역변수 static 변수를 클래스 안에서 선언할 수도 있다. static 변수는 객체를 생성할 때마다 각 개체에 부여되는 것이 아니라 프로그램이 시작할 때부터 메모리가 할당되며객체와 독립적으로 존재한다. 또한 모든 객체가 같은 static 변수를 공유한다. 다음 코드를 통해 이를 확인할 수 있다. #include using namespace std;class testclass {private: static int num;public: testclass() { num++; } void shownum() { cout   따라서 위 코드의 결과는 다음과 같다. 그런데 static 멤버변수를 정의하는 방법이 조금 독특할 것이다.아래 코드와 같이 클래스 내부에서 초기화하는 것이 아니..
[C++] 얕은 복사, 깊은 복사 얕은 복사 디폴트 복사 생성자는 멤버 대 멤버의 복사를 진행한다. 이때 일어나는 복사 방식을 얕은 복사라고 한다. 이를 좀 더 자세히 설명하기 위해 아래 코드를 사용해 보겠다. #include #include using namespace std;class student {private: char* name; int age;public: student(const char* myname, int myage) { int len = strlen(myname) + 1; name = new char[len]; strcpy_s(name, len, myname); age = myage; } ~student() { delete []name; cout   위 코드에서 person1을 생성한 후 인자를 전달하는 ..
[C++] explicit 묵시적 형 변환 앞선 포스팅에서 설명했던 대입을 사용한 객체의 초기화와 괄호를 사용하여 인자를 전달하는 초기화는 결과적으로 같다고 했다. 이렇게 되는 이유는 대입을 사용해도 묵시적으로 괄호를 사용한 것처럼 변환되기 때문이다. 묵시적 형 변환을 사용하면 편리하긴 하지만 코드가 자동으로 변환되는 것이 항상 좋은 일은 아니다. 따라서 묵시적 형 변환을 금지하고 싶다면 explicit 키워드를 사용할 수 있다.      explicit explicit 키워드는 생성자를 선언할 때 생성자 앞에 붙여서 사용할 수 있다. class AAA {private: int num;public: explicit AAA(int n) :num(n) { }} 위 코드와 같이 작성했다면 아래와 같은 선언은 불가능하게 된..
[C++] 복사 생성자를 활용한 객체의 대입 객체의 대입 만약 한 클래스의 객체를 2개를 생성할 때 하나의 객체에 다른 하나의 객체를 대입하면 어떻게 될까? 예를 들어 testclass의 객체 test1을 선언하고 testclass test2 = test1; 과 같은 형태로 객체를 생성하는 것이다. 직관적으로 코드의 의도를 보았을 때 test1의 모든 멤버 변수를 복사하여 test2의 멤버 변수에 대입하려는 코드인 것 같다. 그런데 이게 실제로 될까 라는 의문이 생기는데 놀랍게도 이것은 가능하다.       디폴트 복사 생성자 따로 대입을 위한 생성자를 선언하지 않았더라도 이것이 가능한 이유는 클래스에 디폴트 복사 생성자가 존재하기 때문이다. 예시로 클래스 하나를 작성해 보겠다. class testclass {private: int num1; in..
[C++] this 포인터, 메서드 체이닝(Method Chaining), *this의 의미 this class 내부에서 this는 자기 자신의 주소를 나타내는 포인터를 말한다. 따라서 아래 코드처럼 this와 객체의 주소를 출력해 보면 같은 값이 나오는 것을 확인할 수 있다. #include using namespace std;class testclass {public: testclass() { cout    메서드 체이닝 (Method Chaining) 메서드 체이닝이란 메서드를 꼬리 물듯 호출하는 디자인 패턴을 말한다. 아래 코드처럼 this 지시자를 활용하면 이러한 코드를 작성할 수 있다. #include #include using namespace std;class SelfRef{private: int num;public: SelfRef(int n) :num(n) { cout  ..

728x90
반응형