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;
}
지역 객체와 전역 객체의 생성 및 소멸 순서
#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;
}
다음 소스에서 컴파일 오류가 발생하는 곳은 어디인가?
#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;} //자동 인라인 함수
}
앞서 다룬 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;
}