C++ 프로그래밍

    객체 생성되는 것과 안 되는 것

    객체 생성되는 것과 안 되는 것

    객체 생성인 것(생성자 소멸자 호출됨) Point point; //객체 생성 Point list[10]; //배열 객체 생성 객체 생성이 아닌 것(생성자 소멸자 호출안됨) Point& q = p; //객체의 참조자는 새로운 객체를 만드는 것이 아님 Circle* pc; //객체의 포인터는 새로운 객체를 만드는 것이 아님 Point* plist[10]; //객체의 포인터 배열은 새로운 객체를 만드는 것이 아님 여기서 포인터 객체는 동적할당에 필요합니다. Circle* pc = new Circle(); new 연산자는 data_type 크기의 메모리 블럭을 할당하여 그 블럭의 시작 주소를 반환합니다. 동적 생성을 하면 그때 생성자를 한번 호출합니다.

    멤버 초기화 리스트

    멤버 초기화 리스트

    생성자의 가장 큰 특징 중 하나인 멤버 초기화 리스트(member initialization list)는 생성자 함수 헤더와 함수 몸체 사이에 :를 넣고 클래스의 멤버 변수와 매개변수를 "멤버(매개변수)"의 형태로 나열하는 것입니다. class Complex { double real, imag; public: Complex(double r = 0, double i = 0) : real(r), imag(i) {} }; void main() { Complex a(2.0, 4.0); //객체 초기화 } 여기서 real(r)은 real = r과 똑같이 동작합니다. 이제 함수 블록에 멤버의 초기화 코드를 적을 필요가 없게 됩니다. 이 방법은 얼핏 보면 초기화 방법의 변경에 지나지 않는 것이라고 보이지만 사실 매우..

    생성자와 멤버 함수의 유사점과 차이점

    생성자와 멤버 함수의 유사점과 차이점

    유사점 클래스의 멤버 변수와 멤버 함수를 마음대로 사용할 수 있다. 함수 중복을 사용할 수 있다. 디폴트 매개변수도 지원한다. 여러 생성자를 한꺼번에 정의하는 강력한 효과가 있다 차이점 생성자는 일반적인 멤버 함수에 비해 다음과 같은 차이가 있습니다. 생성자는 반환형이 없다. void도 사용할 수 없다. 함수의 이름이 클래스와 동일하다. 생성자는 객체가 생성될 때 오직 한 번만 호출된다. 다른 멤버 함수와는 달리 일단 생성된 객체에서 다시 생성자를 호출할 수는 없다. 생성자가 하나도 정의되어 있지 않으면 컴파일러가 자동으로 기본 생성자(default constructor)를 제공한다. 대부분의 경우 생성자는 고용 접근 권한 public을 갖도록 권한다. 멤버 초기화 리스트(member initializa..

    구조체에서 클래스로

    구조체에서 클래스로

    C언어로 잘 만들어진 구조체와 관련 함수들을 클래스로 변경하는 것 자체는 크게 어렵지 않습니다. Complex라는 구조체와 관련 함수를 4번의 변화로 클래스로 변경해 보겠습니다. 1. 구조체와 일반 함수로 구현된 Version1 #pragma once #include struct Complex { doublereal; doubleimag; }; extern void setComplex(Complex &c, double r, double i) { real = r; imag = i; } extern voidreadComplex(char* msg = " 복소수 ="); extern voidprintComplex(char* msg = "복소수 = "); extern voidaddComplex(Complex a,..

    참조자의 반환

    참조자의 반환

    여기 글에서는 참조형과 참조에 의한 호출은 생략하겠습니다. 이해하는데 그렇게 어렵지 않고 참조형은 그냥 변수를 여러 별명으로 부르는 방법이기 때문입니다. 다른 블로그나 책을 추천합니다. 참조는 꼭 익히길 바랍니다. 저는 참조자의 반환을 잘 이해하지 못했었기 때문에 이 파트만 다루도록 하겠습니다. 함수에서 참조자를 반환할 수도 있습니다. 참조자를 반환하면 반환 과정에서 복사가 일어나지 않고 참조가 일어납니다. 물론, 이때 반환되는 변수는 함수가 끝나도 자동으로 소멸되지 않아야 합니다. 위의 줄에서??? 가 뜨는 분들을 위해 조금 설명하겠습니다. ヾ(^▽^*))) 괜찮습니다 저도 몰랐거든요. 전 책을 2번째 보고 난 후에 알게 되었어요. 참조 매개변수가 그 값을 복사하는 게 아니고 전달 인자의 별명을 매개변..

    함수로 배열을 전달, 반환

    함수로 배열을 전달, 반환

    함수로 배열을 전달하는 방법은 함수를 호출할 때 전달인자(argument)에 배열의 시작주소를 전달하는 것입니다. 하지만, 이제 함수에서 전달 받게 되면 방법이 두가지로 나뉘어지게 됩니다. 배열명[]로 받는 방법과 포인터로 받는 방법 #include //배열의 길이를 같이 전달 해줘야 한다. int findMaxValue(int a[], int len) { int maxVal = a[0]; for (int i = 1; i

    클래스의 멤버 변수나 멤버 함수를 static으로 처리하는 경우

    클래스의 멤버 변수나 멤버 함수를 static으로 처리하는 경우

    클래스 내에서 멤버 변수 앞에 static을 붙인걸 정적 멤버 변수라고 합니다. 클래스에서 선언했던 모든 멤버 변수들은 "객체 단위의 멤버"로 객체들 마다 각기 다른 값을 가질 수 있는 독립된 변수입니다. 예를 들어, Point라는 클래스를 만들고 객체 p1,p2,p3라는 객체를 선언하면 메모리 공간이 각각 생깁니다. 하지만 정적 멤버 변수는 객체마다가 아닌 클래스 단위로 존재합니다. 그렇다면, 왜 정적 멤버 변수가 필요할까요? 이유는 프로그램에서 Point 클래스의 객체가 현재 몇 개인지 알고 싶을 때 클래스의 버전이나 개발 정보를 클래스에 남기고 싶을 때 등등이 있습니다. 정적 멤버 변수에 대해 더 자세하게 말하면 클래스 내부에서 정의하지만 일반 멤버 변수와 달리 객체마다 생기는 자료가 아니라 클래스..

    C++의 Static을 알아보자

    C++의 Static을 알아보자

    static은 정말 중요합니다. 제가 느끼기로 편리함과 위험성을 동시에 가지지만 제대로 알고 써야하기 때문입니다. 이 static 키워드는 변수나 함수에 대해 지정할 수 있는데, 다음과 같이 세가지 경우가 있습니다. 지역변수를 static으로 처리하는 경우 전역변수나 함수를 static으로 처리하는 경우 클래스의 멤버 변수나 멤버 함수를 static으로 처리하는 경우 세 개 모두 자주 쓰는 것 같습니다. 마지막 세 번째는 이 글에서 말고 클래스 카테고리에서 다루겠습니다. 링크를 걸어두겠습니다. (저는 이 책을 보기 전에 static을 구별하는 법을 모르고 있었습니다. 그냥 값이 유지되는 변수로만 생각하고 있었어요 이제 알았으니 됬죠.. 뭐...!( •̀ ω •́ )✧) 1. 정적 지역변수 변수의 가시 범..

    변수의 가시 범위와 생존기간

    변수의 가시 범위와 생존기간

    변수와 함수는 밀접하게 관련되어 있습니다. 예를 들어, 함수가 끝나면 지역 함수 내의 변수들과 매개변수들은 모두 자동으로 소멸됩니다. 모든 변수는 다음의 세 가지 속성이 있고, 이러한 속성에 따라 여러 가지로 분류할 수 있습니다. 범위(visibility): 코드 내에서 변수가 의미 있는 영역 생존기간(lifetime): 만들어지는 시점과 소멸되는 시점 연결(linkage): 외부에서 선언된 변수를 사용하는 방법 지역변수와 전역변수 변수는 의미를 갖는 범위에 따라 지역변수와 전역변수로 나눌 수 있습니다. 지역(local) 변수 중괄호 { }로 정의되는 블록 안에서 선언되는 변수로 블록 범위(block scope)를 갖는다. 함수 안에서 선언된 변수가 대표적인데, 변수가 선언된 블록(함수 몸체) 안에서만 ..