C++ 3-1

BakJeonghyun·2022년 9월 12일
0

전공C++

목록 보기
5/20

예제

3-7

Circle 클래스에서 소멸자를 작성한 사례와 생성자와 소멸자가 실행되는 사례

<실행 결과>
반지름 1 원 생성
반지름 30 원 생성
반지름 30 원 소멸
반지름 1 원 생성

#include <iostream>
using namespace std;

class Circle {
public:
	int radius;
    
	Circle();
    Circle(int r);
    ~Circle();
};
Circle::Circle() : Circle(1){}
Circle::Circle(int r) {
	radius = r;
    cout<<"반지름 "<<radius<<" 원 생성"<<endl;
}
Circle::~Circle() {
	cout<<"반지름 "<<radius<<" 원 소멸"<<endl;
}

int main() {
	Circle donut;
    Circle pizza(30);
    return 0;
}

3-8

지역 객체와 전역 객체의 생성 및 소멸 순서

#include <iostream>
using namespace std;

class Circle {
public:
	int radius;
	Circle();
    Circle(int r);
    ~Circle();
    double getArea();
};

Circle::Circle() : Circle(1) {}

Circle::Circle(int r) {
	radius = r;
    cout<<"반지름 "<<radius<<" 원 생성"<<endl;
}

Circle::~Circle() {
	cout<<"반지름 "<<radius<<" 원 소멸"<<endl;
}

double Circle::getArea() {
	return 3.14*radius*radius;
}

Circle globalDonut(1000);
Circle globalPizza(2000);

void f() {
	Circle fDonut(100);
    Circle fPizza(200);
}

int main() {
	Circle mainDonut;
    Circle mainPizza(30)
	return 0;
}

3-9

다음 소스에서 컴파일 오류가 발생하는 곳은 어디인가?

#include <iostream>
using namespace std;

class PrivateAccessError {
private:
	int a;
    void f();
    PrivateAccessError();
public:
	int b; 
    PrivateAccessError(int x);
    void g();
};

PrivateAccessError::PrivateAccessError() {
	a = 1;	//(1)
    b = 1;	//(2)
}
PrivateAccessError::PrivateAccessError(int x) {
	a = x;	//(3)
    b = x;	//(4)
}
void PrivateAccessError::f() {
	a = 5;	//(5)
    b = 5;	//(6)
}
void PrivateAccessError::g() {
	a = 6;	//(7)
    b = 6;	//(8)
}

int main() {
	PrivateAccessError objA;	//(9)
    PrivateAccessError objB(100);	//(10)
    objB.a = 10;	//(11)
    objB.b = 20;	//(12)
    objB.f();	//(13)
    objB.g();	//(14)
}

답: main()에서 클래스 PrivateAccessError의 private 멤버를 호출한 경우에 컴파일 오류가 날 것이다.
(9) : private인 생성자를 호출함.
// PrivateAccessError()는 private이므로 main()에서 호출할 수 없다.
(11) : private인 멤버 변수 호출함.
// a는 PrivateAccessError 클래스의 private 멤버이므로 main()에서 접근할 수 없다.
(13) : private인 멤버 함수 호출함.
//f()는 PrivateAccessError 클래스의 private 멤버이므로 main()에서 호출할 수 없다.

인라인 함수

odd() 함수를 inline으로 선언하면, 컴파일러는 odd()를 호출하는 main() 함수를 아래처럼 변형한다. 그러고 나서 컴파일러는 변형된 코드를 컴파일한다. 컴파일 되고 나면 인라인 함수 odd()는 사라지고 odd()를 호출한 곳에 x%2만 존재한다. 이제 odd() 함수 호출에 대한 오버헤드가 사라졌다.

#include <iostream>
using namespace std;

inline int odd(int x) {
	return (x%2);
}
int main() {
	int sum = 0;
	
    for(int i=1; i<=10000; i++) {
    	if(odd(i))
        	sum += i;
    }
    cout<<sum;
}

||||||||||||||||||||||||||||||||||||||||||||||||

#include <iostream>
using namespace std;

int main() {
	int sum = 0;
    
    for(int i=1; i<=10000; i++) {
    	if((i%2))
        	sum += i;
    }
    sum += i;
}

멤버 함수의 인라인 선언과 자동 인라인

생성자를 포함하여 클래스의 모든 멤버 함수가 인라인으로 선언될 수 있다. C++에서는 멤버 함수의 크기가 작은 경우, 클래스의 선언부에 직접 구현하여도 무방하다.
컴파일러는 클래스의 선언부에 구현된 멤버 함수들에 대해서 inline 선언이 없어도 인라인 함수로 자동 처리한다.

아래 두 코드는 사실상 같다.

class Circle {
private:
	int radius;
public:
	Circle();
    Circle(int r);
    double getArea();
};

inline Circle:Circle() {
	radius = 1;
}

Circle::Circle(int r) {
	radius = r;
}

inline double Circle::getArea() {
	return 3.14*radius*radius;
}

class Circle {
	...
    
	Circle() {radius = 1;}	//자동 인라인 함수
    
    double getArea() {return 3.14*radius*radius;}	//자동 인라인 함수
}

3-10

앞서 다룬 Circle 클래스를 C++ 구조체를 이용하여 재작성하라.
<실행 결과>
면적은 28.26

클래스 이용

#include <iostream>
using namespace std;

class Circle {
	int radius;
public:
    Circle(int r) { radius = r; }
    double getArea();
};

double Circle::getArea() {
	return 3.14*radius*radius;
}

int main() {
	Circle waffle(3);
    cout << "면적은 " << waffle.getArea() << endl;
    return 0;
}


구조체 이용

#include <iostream>
using namespace std;

struct StructCircle {	//C++ 구조체 선언
private:
    int radius;
public:
    StructCircle(int r) { radius = r; }	//구조체의 생성자
    double getArea();
};

double StructCircle::getArea() {
	return 3.14*radius*radius;
}

int main() {
	StructCircle waffle(3);
    cout << "면적은 " << waffle.getArea() << endl;
    return 0;
}

profile
I just got started a blog.

0개의 댓글