코딩하렴

C++ DAY3 class와 생성자 함수

by 으렴

복습

int *p = new int; 동적메모리는 할당한 순간에 포인터가 잡아야한다

이 동적 메모리는 사라지지 않는다. delete로 삭제해야 한다.

요즘은 메모리가 커서 옛날처럼 걱정은 없지만, 임베디드같은 작은 컴퓨터를 다루는 곳에서는 주의 해야한다.


JAVA의 경우 동적메모리를 할당하면 저절로 지워줌.

객체가 사라질때에는 무조건 소멸자를 불러야 함.


메모리를 할당할때

int *p = new int[1]; 이렇게 할당하면

delete []p; 로 지울 수 있기 때문에 이젠 이렇게 쓰길 권한다.


오버로딩(oveloding) : 동일한 함수명으로 여러개의 함수를 제공.


객체지향은 항상 사용자 기준으로 생각해야한다.(사용자들은 같은 돈이라도 성능이 좋지않으면 구매하지 않는다.)

사용자에게 일관된 서비스를 제공 할 수 있음(다형성)


문법적으로 선언부에만 정의 한다. 동시에 다 주면 빵빵터진다.



절차지향 : 내가 무언가를 하는 것. 사람이 생각하는 행동하기

객체지향 : 사람이 생각하는 현실세계에서 존재하는 모든 것(객체 : 사람이 표현할 수 있는)을 구현하기 위해

확장성, 유지보수을 위하여


개념을 잘 잡아야 객체 지향스럽게  코딩 할 수 있다.




Class : 객체(사람이 정의 할 수 있는 것). 추상화를 시켜서 구체화를 시킴.



class A

{

member variablie;        //field 라고 부름     //생성자 함수 -디폴트

//복사 생성자함수 -디폴트


member funnction;        //method            //소멸자 -디폴트

//대입 연산자 함수 -디폴트


}; 자바랑 다른점이 세미콜론을 붙여야 한다.


class밖에 함수 생성가능! → 외부함수


class안에 main이 들어가지 않음.



생성자 함수


1. 객체 등록시 자동 호출 되어지는 함수

역할 : 객체 필드 초기화(쓰레기값방지), 생성자가 호출되지 않으면 에러가 뜬다.

객체등록(디폴트)


2. 접근지정자를 주로 public으로 지정.(꼭은 아님)


접근 지정자(3가지,private, protected, public)가 있음.

private(비공개) : class내의 멤버함수들에게만 접근이 허용됨. 

protected(보호) : class내의 멤버 함수와 이 클래스를 상속 받은 파생 클래스의 멤버함수에게만 접근이 허용.

public(공개) : class내외를 막론하고 프로그램의 모든 함수들에게 접근을 허용.

3. 오버로딩이 가능. (명시적, 암시적)


4. const member function으로 만들 수 없다.


5. 리턴타입이 없다.


6. 함수이름이 클래스명과 동일하다.


7. 디폴트 생성자 함수는 생성자 함수를 명시적으로 제공하지 않을 경우에만 제공된다.


필드를 포인터로 사용했다? : 메모리를 가리키라 (동적메모리를 할당하라)


public:    
명시한 순간 다른 접근지정자를 지정하기 전까지 public(접근지정자 안적었다면 전부가됨).
접근지정자를 명시하지 않는다면 기본적으로 private로 지정된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<iostream>
using namespace std;
class A
{
public:                
    A()
    {
        cout<<"생성자얌"<<endl;
    }
};
void main()
{
    A aa;
}
cs


여기서 aa는 stack메모리에 잡힌다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
using namespace std;
class A
{
    int a;
public:                
    A()
    {
        a=0;
        cout<<"생성자얌"<<"\t"<<a<<endl;
    }
    A(int i)
    {
        a=i;
        cout<<"두번째 생성자얌"<<"\t"<<a<<endl;
    }
};
void main()
{
    A aa;
    A bb(9);
}
cs

 

명시적 오버로딩

 

 


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
class A
{
    int a;
public:                
    A(int i=0)
    {
        a=i;
        cout<<"디폴트 매개변수사용"<<"\t"<<a<<endl;
    }
};
void main()
{
    A aa;
    A bb(9);
}
cs

암시적 오버로딩





값을 입력 받아서 그 값 만큼 배열을 할당하도록 만들려면

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
using namespace std;
class A
{
    int a;
    int *p;
public:                
    A(int a=1)
    {
        p= new int [a];
        for(int i=0;i<a;i++)
        {
            p[i]=i;
            cout<<p[i]<<endl;
        }
    }
};
void main()
{
    A aa;
    A bb(5);
}
 
cs

 


메인에서 클래스 생성자를 호출한다.

그리고 a의 값을 받아서 그것을 동적 배열로 할당하고

확인하기위해 for문을 돌려서 0부터 1까지 넣고 출력하도록 명령한 코드이다.

이 코드의 출력 값은 0,0,1,2,3,4 이다.

for문을 통하여 맨 첫 번째 배열에 0을 넣으라는 명령을 넣었다.

main의 A aa;는 생성자의 초깃값을 호출한 명령이다.

초기값은 1이므로 배열은 1개가 생성이 되고 for문으로 배열안에 0이라는 값이 넣어졌기 때문에 0이 두번 출력 된 것이다.

'Programming Language > C and Cpp' 카테고리의 다른 글

C++ DAY4 static method  (0) 2018.03.08
C++ 복사 생성자 / 소멸자 함수  (0) 2018.03.08
C++ 명시적 오버로딩 / 암시적 오버로딩  (0) 2018.03.06
C++ DAY2 성적 입출력 프로그램  (0) 2018.03.06
setw() 함수  (0) 2018.03.05

사이트의 정보

코딩하렴

으렴

활동하기