. 객체포인터 


  (1) 객체 포인터 변수선언방법

아주 간단하다 만들고자 하는 타입과 만들고자 하는 변수의 이름앞에 *(aesterik)을 붙여서 만들어준다.

ex) Circle *p;

Circle 타입의 객체에 대한 포인터 변수 p를 만들어준다.

  (2) 포인터변수에 주소지정방법

포인터 변수에 객체의 주소를 지정하기 위해 & 연산자를 사용한다. 객체 이름 앞에 & 연산자를 사용하면 해당 객체의 주소가 반환된다.

ex) p = &abc;

abc라는 객체의 주소를 포인터 변수 p에 지정시킨다.

  (3) 포인터를 이용한 객체 멤버접근

일반적으로 객체들의 맴버에 접근 할때는 . 연산자를 사용한다. 덫붙여 객체 포인터로 맴버에 접근을 할때에는 -> 연산자 화살표 같이 생긴 이 연산자를 사용한다.

ex)

d = donut.getArea(); 객체가 맴버에 접근할 때 . 연산자를 사용한다

d = p->getArea(); 객체 포인터로 맴버에 접근할때 -> 연산자를 사용한다.

d = (*p).getArea(); 위의 코드와 같은 결과.


총 예제 및 소스코드


#include <cstdlib>

#include <iostream>


using namespace std;


class Circle {

int radius;

public:

Circle() { 

radius = 1; 

}

Circle(int r) { 

radius = r; 

}  

double getArea();

}; 


double Circle::getArea() {

return 3.14*radius*radius;

}


int main(int argc, char *argv[])

{

    Circle donut; //기본생성자 호출 반지름이 1 

Circle pizza(30); //매개변수 1개 생성자 호출 반지름이 매개변수로 들어오는 값  

cout << donut.getArea() << endl;

Circle *p; //포인터 변수 p 선언 

p = &donut; //포인터 변수에 기본생성자로 만들어진 donut 객체의 주소를 지정 

cout << p->getArea() << endl; //p가 가리키고 있는 donut 객체의 면적 출력 

cout << (*p).getArea() << endl;

p = &pizza; //포인터 변수에 매개변수 1개 포함한 생성자로 만들어진 pizza 객체의 주소를 지정 

cout << p->getArea() << endl; //p가 가리키고 있는 pizza 객체의 면적 출력 

cout << (*p).getArea() << endl;

    

    system("PAUSE");

    return EXIT_SUCCESS;

}


2, 객체배열


  (1) 객체 배열 선언방법

객체 배열은 원소가 객체라는 점을 제외하고 일반 배열과 크게 다르지 않다. 객체 배열을 선언하는 방법은 만들고자 하는 객체 타입과 배열의 이름, 크기를 지정해주면 된다. 이때 객체 배열 선언문은 반드시 기본 생성자를 호출한다.

  (2) 객체 배열을 이용한 멤버접근

객체 배열을 사용하여 맴버에 접근하는 방법은 원소 객체와 맴버 사이에 . 연산자를 사용하면 된다.

  (3) 객체배열 소멸순서

#include <cstdlib>

#include <iostream>


using namespace std;


class Circle {

int radius;

public:

Circle() { 

radius = 1; 

}

Circle(int r) { 

radius = r; 

}  

void setRadius(int r) {

radius = r;

}

double getArea();

}; 


double Circle::getArea() {

return 3.14*radius*radius;

}


int main(int argc, char *argv[])

{

    Circle circleArray[3] = { Circle(10), Circle(20), Circle() }; //매개 변수가 있는 생성자로 객체 2개가 생성되고 그다음 기본 생성자에 의해 생성된다. 

    

    for(int i = 0 ; i < 3 ; i++){

    cout << "Circle " << i << "의 면적은 " << circleArray[i].getArea() << endl;

}

    //main 함수가 종료 되고 나면 객체 배열이 소멸되며 높은 인덱스에서부터 원소 객체가 순차적으로 소멸된다. 

    system("PAUSE");

    return EXIT_SUCCESS;

}


3. 객체배열 예제정리 (프로그램 4-9) 주석


(1)동적생성 (주석 1번)

(2)객체배열을 동적생성 -> 초기화 (주석 2번)

(3)동적할당받은 메모리반납 (주석 3번)



#include <iostream>

#include <cstdlib>


using namespace std;


class Circle{

int radius;

public:

Circle(); //기본 생성자 

Circle(int r); //매개변수 포함 생성자 

~Circle(); //소멸자 

void setRadius(int r){

radius = r;

}

double getArea(){

return 3.14 * radius * radius;

}

};


Circle::Circle(){

radius = 1;

cout << " 생성자 실행 radius = " << radius << endl;


Circle::Circle(int r){

radius = r;

cout << " 생성자 실행 radius = " << radius << endl;

}


Circle::~Circle(){

cout << " 소멸자 실행 radius = " << radius << endl;

}



int main(int argc, char** argv) {

//객체 배열 생성 - 동적할당 (new) -> 힙(heap) 영역에 생성

Circle *pArray = new Circle[3]; //객체 배열을 동적 생성 한다. 동적할당을 받으면 배열의 주소가 포인터로 넘어 온다 그렇기 때문에 객체 포인터로 주소를 받는다.*1 //객체 배열을 동적으로 생성한다. 객체 배열을 생성할때에는 초기화 시키기 위해 자동으로 기본생성자 함수가 호출이 된다.*2

//반지름을 설정

for(int i=0 ; i<3 ; i++){

pArray[i].setRadius(10);

}

//객체 배열의 면적을 출력

for(int i=0 ; i<3 ; i++) {

cout << pArray[i].getArea() << endl;

}

 

Circle *p = pArray; //*p는 pArray의 주소를 대입

 

for(int i=0 ; i<3 ; i++) {

cout << p->getArea() << endl;

p++; //다음 주소로 증가  

}

 

delete[]  pArray; //힙 영역에 할당받은 객체 배열 공간을 반납하는 구문 

//객체를 동적으로 생성 하고 반환 할때는 delete만 사용하면 되지만

//객체 배열을 반환할때는 delete 뒤에 반드시 [] 를 붙여줘야 한다. *3

return 0;

}


4. string 배열 예제 정리


(1) 객체 생성 비교


#include <iostream>

#include <cstdlib>

#include <string>


using namespace std;


int main(int argc, char** argv) {

//1. 객체생성 (정적 할당) 

string str = "I love";

str.append(" C++"); //접근시 . 연산자를 사용하여 접근한다

cout << str << endl; //append 함수는 문자열울 추가하는 함수이다. 

cout << "\n"; //실행결과 : I love c++ 

 

//2. 객체생성 (동적 할당) - heap 영역에 할당되어진다. 포인터를 받는다. 

string *p = new string("C++"); //선언부의 *은 주소를 저장 

cout << "*p = " << *p << endl; //실행부의 *은 주소의 내용을 출력 

//실행결과 : p* = c++ 

p->append(" Great!! "); //접근시 -> 연산자로 접근

cout << "*p = " << *p << endl; //실행결과 : p* = c++ Great!!

return 0;

}


(2) 예제 4-12 string 배열 선언과 문자열 키 입력 응용 예제 소스


#include <iostream>

#include <cstdlib>

#include <string>


using namespace std;


int main(int argc, char** argv) {

string names[5];

for(int i=0 ; i<5 ; i++){

cout << " 이름 >> ";

getline(cin, names[i], '\n');

}

string latter = names[0];

for(int i=1 ; i<5 ; i++){

if(latter < names[i]){

latter = names[i];

}

}

cout << " 사전에서 가장 뒤에 나오는 문자열은 " << latter << endl;

return 0;

}




(3) 문자열 다루기


#include <iostream>

#include <cstdlib>

#include <string>


using namespace std;


int main(int argc, char** argv) {


// 1. 문자열 치환 =연산자 

string a = "Java", b= "C++";

cout << " a = " << a << " b = " << b << endl; //실행결과 a = Java b = c++ 

a=b;

cout << " 치환 후 a = " << a << ", b = " << b << endl; //치환 후 실행결과 a=c++, b=c++

// 2. 문자열 비교 compare()

string name = "Hong";

string subName = "GilDong";

int res = name.compare(subName);

if(res==0){

cout << "두 문자열이 같다." << endl;

}

else if(res < 0){ //name 이 alphabet순서에서 앞에 나올경우 

cout << name << " < " << subName << endl;

}

else{ //name 이 alphabet순서에서 뒤에 나올경우 

cout << name << " > " << subName << endl;

}


// 3. 문자열 삽입 insert()

cout << "012345678901234567890\n";

a = "I love C++";

a.insert(2, "really "); // 실행결과 012345678901234567890

// I really love C++ 

// 4. 문자열길이 Length()

int len = a.length();

cout << "문자열의 길이 = " << len << endl; //실행결과 문자열의 길이 = 17

// 5. 문자열삭제 erase()

a.erase(0, 7); //0번 인덱스 부터 7개를 지운다. 6번 인덱스까지 지운다. 

cout << "문자열 0~7까지 삭제" << a << endl; //실행결과 문자열 0~7까지 삭제y love C++

// 6. 문자열일부분 추출 substr()

cout <<    "012345678901234567890\n";

b = "I love C++";

string c = b.substr(2,4); //2번 인덱스부터 4개를 추출한다. 

cout << "c = " << c << endl;

// 7. 문자열 검색 find() 

cout <<    "012345678901234567890\n";

b = "I love love C++";

int index = b.find("love");

cout << "love의 인덱스는 " << index << endl; //실행결과 2 why? 동일한 단어는 처음 나온 단어의 인덱스만 찾는다. 

index = b.find("love", index+1); 

cout << "love의 인덱스는 " << index << endl;

// 8. 인덱스번호를 지정해서 문자를 읽는 방법 at() 

char ch1 = b.at(12);

cout << "12번 인덱스의 문자는 " << ch1 << endl;

return 0;

}


'basic > C++' 카테고리의 다른 글

6. 함수중복과 static멤버  (0) 2018.05.15
5. 함수와 참조, 복사생성자  (0) 2018.05.03
3. 클래스와 객체  (0) 2018.03.22
2. C++ 프로그래밍의 기본  (0) 2018.03.13
1. C++ 시작  (0) 2018.03.08

+ Recent posts