본문 바로가기

728x90
반응형

C++/C++ 문법

(29)
[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  ..
[C++] 객체 배열 객체 배열 객체를 배열로 선언하는 것도 가능하다. testclass라는 이름의 클래스를 선언했다고 했을 때 testclass의 객체 5개를 배열로 선언하는 방법은 아래 코드와 같다.testclass arr[5]; 물론 배열로 선언을 해도 생성자는 실행된다. 따라서 아래 코드를 실행시켜 보면 "Hello, world!"가 5번 출력되는 것을 확인할 수 있다. #include using namespace std;class testclass {public: testclass() { cout   그러나 생성자에 인자를 전달할 때 초기화를 아래 코드처럼 해야 하기 때문에선언한 객체 중 일부는 전달하고 일부는 전달하지 않는 것은 불가능하다. testclass arr[5] = {0, 1, 2, 3, 4};   또..
[C++] 멤버 이니셜라이저 (Member Initializer), const 멤버변수 초기화 멤버 이니셜라이저 멤버 이니셜라이저를 사용하면 객체가 아닌 멤버의 초기화가 가능하다. class TestClass {private: int num1; int num2;public: TestClass(int n1, int n2) : num1(n1), num2(n2) { cout  위 코드에서 : num(n) 이 멤버 이니셜라이저인데 생성자의 인자로 n1, n2 를 전달받으면num1, num2 의 선언과 동시에 대입하겠다는 의미이다. 즉, 초기화를 하겠다는 의미이다.             멤버 이니셜라이저의 활용 멤버 이니셜라이저를 사용할 때 선언한 후 대입하는 것이 아니라초기화를 진행하게 되기 때문에 const 멤버변수의 초기화도 가능하다. class TestClass {private: const in..

728x90
반응형