인터뷰에서 나는 다음과 같은 질문에 직면했습니다.
친구가 콘솔에 피보나치 수를 인쇄하는 단일 소스 코드 파일을 제공했습니다. main () 블록은 비어 있고 내부에 명령문이 없습니다.
이것이 어떻게 가능한지 설명하십시오 (힌트 : 글로벌 인스턴스!)
나는 이것에 대해 정말로 알고 싶습니다. 어떻게 그런 일이 가능할 수 있는지!
답변
다음과 같이 구현 될 가능성이 높습니다.
void print_fibs()
{
//implementation
}
int ignore = (print_fibs(), 0);
int main() {}
이 코드에서 전역 변수 ignore
는 main()
함수에 들어가기 전에 초기화되어야 합니다. 이제 전역을 초기화하려면 print_fibs()
무엇이든 할 수있는 곳에서 실행해야합니다.이 경우에는 피보나치 수를 계산하고 인쇄합니다! 나는 다음 질문에서 비슷한 것을 보여주었습니다.
이러한 코드는 안전하지 않으며 일반적으로 피하는 것이 가장 좋습니다. 예를 들어 std::cout
객체 print_fibs()
가 실행될 때 초기화되지 않을 수 있습니다. 그렇다면 std::cout
함수에서 무엇을할까요? 그러나 다른 상황에서 이러한 초기화 순서에 의존하지 않는 경우 초기화 함수를 호출하는 것이 안전합니다 (C 및 C ++에서 일반적으로 사용됨).
답변
도움이 되었기를 바랍니다
class cls
{
public:
cls()
{
// Your code for fibonacci series
}
} objCls;
int main()
{
}
따라서 클래스의 전역 변수가 선언 되 자마자 생성자가 호출되고 여기에 피보나치 시리즈를 출력하는 논리를 추가합니다.
답변
네 가능합니다. 객체 생성자에서 피보나치 수를 계산하는 객체의 전역 인스턴스를 선언해야합니다.
답변
나는 당신이 말하는 것과 같은 몇 가지 예를 알고 있습니다. 그것을 얻는 한 가지 방법은 템플릿 메타 프로그래밍을 사용하는 것입니다. 이를 사용하여 일부 컴퓨팅 프로세스를 컴파일로 이동할 수 있습니다.
여기 에서 피보나치 수에 대한 예를 얻을 수 있습니다.
정적 클래스 생성자에서 사용하고 주 함수에 코드를 작성할 필요없이 숫자를 작성할 수 있습니다.
도움이 되었기를 바랍니다.
답변
전역 / 정적 변수를 초기화하는 동안 상황이 발생할 수 있습니다. 코드는 응용 프로그램 시작시 트리거됩니다.
답변
파일 범위 객체에 대한 모든 [*] 생성자는 객체가 main
아닌 파일 범위 변수에 대한 모든 이니셜 라이저 표현식과 마찬가지로 에 도달하기 전에 호출 됩니다.
편집 : 또한 모든 파일 범위 개체에 대한 all [*] 소멸자는 main
종료 후 생성의 역순으로 호출 됩니다. 이론적으로 피보나치 프로그램을 객체의 소멸자에 넣을 수 있습니다.
[*] ‘all’은 프로그램이 직접 연결되지 않은 라이브러리를 동적으로로드 및 언로드하는 동작을 무시합니다. 기술적으로는 기본 C ++ 언어 밖에 있습니다.