>  기사  >  백엔드 개발  >  반드시 이해해야 할 C++ 인터뷰 질문 선정

반드시 이해해야 할 C++ 인터뷰 질문 선정

php是最好的语言
php是最好的语言원래의
2018-08-06 16:13:212710검색

C++ 면접 질문의 본질

1.#🎜 🎜# 생성자를 가상 함수로 선언할 수 없는 이유는 무엇인가요?

분석: 가상 함수는 가상 호출 방식을 사용하기 때문에 가상 호출은 부분적인 정보만 알 수 있음을 의미합니다

작동 메커니즘

에서는 인터페이스만 알고 객체의 정확한 유형은 모르는 함수를 호출할 수 있습니다.

그러나 생성자를 호출하여 객체를 생성하려면 객체의 정확한 유형을 알아야 합니다.

따라서 생성자는 가상 함수가 될 수 없습니다.

2.C++#🎜🎜 #에서 가상 함수로 선언할 수 없는 함수는 무엇인가요? Analytic: 일반 함수(비멤버 함수), 생성자, 인라인 멤버 함수, 정적 멤버 함수, 친구 함수.

(1) 가상 함수는 기본 클래스와 파생 클래스에 사용되며 일반 함수는 사용할 수 없습니다.

(2) 가상 함수는 가상 호출 메서드를 사용하므로 생성자는 사용할 수 없습니다. #🎜 🎜#

(3) 인라인 멤버 함수의 본질은 호출 위치에서 코드를 직접 확장하는 것입니다

(4) 상속 시 정적 멤버 함수는 상속할 수 없습니다. 동적 연결이 없기 때문에 하나의 클래스에

(5) 친구 함수는 클래스의 멤버 함수가 아니므로 상속될 수 없습니다

3# 🎜🎜#

. 클래스의 정적 멤버 및 비정적 멤버 차이점은 무엇입니까? 답변: 클래스의 정적 멤버는 하나만 있습니다. 정적 멤버는 모든 클래스의 인스턴스 개체에 의해 공유됩니다. 정적 멤버 함수와 정적 멤버 변수는 사용하기 전에 초기화해야 합니다. 정적 멤버 함수는 정적 멤버 함수와 비정적 멤버 함수로 액세스할 수 있지만 정적 멤버 함수는 클래스와 정적 멤버 변수에 속하므로 정적 멤버 변수에만 액세스할 수 있습니다. 이 포인터가 없습니다. 모든 객체에는 하나의 비정적 멤버가 있습니다.

4 오버로딩과 다시 쓰기의 차이점은 무엇입니까(재지정, 일부 책에서는 이를 "덮어쓰기"라고도 함)?

오버로딩: 동일한 이름을 가진 함수가 여러 개 존재할 수 있다는 의미이며, 이러한 함수의 매개변수 목록이 다릅니다(어쩌면 개수가 다를 수 있음). 매개변수가 다르거나 매개변수 유형이 다르거나 둘 다 다를 수도 있습니다.) 재작성(Rewriting): 하위 클래스가 복잡한 클래스의 가상 함수를 재정의하는 방법을 말합니다. 구현 원칙에서: 오버로딩: 컴파일러는 함수의 다른 매개변수 목록을 기반으로 동일한 이름을 가진 함수의 이름을 수정한 다음, 동일한 이름을 가진 이러한 함수는 (적어도 컴파일러의 경우) 다른 함수가 됩니다. 예를 들어, 동일한 이름을 가진 두 개의 함수가 있습니다: function func(p: 정수): 정수 및 function func(p: 문자열): 정수;. 그런 다음 컴파일러에 의해 수정된 함수 이름은 int_func, str_func와 같을 수 있습니다. 이 두 함수에 대한 호출은 컴파일러 간에 결정되었으며 정적입니다. 즉, 해당 주소는 컴파일 타임(초기 바인딩)에 바인딩되므로 오버로딩은 다형성과 아무 관련이 없습니다! 재작성: 다형성과 정말 관련이 있습니다. 하위 클래스가 상위 클래스의 가상 함수를 재정의하면 상위 클래스 포인터는 할당된 다른 하위 클래스 포인터에 따라 하위 클래스에 속한 함수를 동적으로 호출합니다. 이러한 함수 호출은 컴파일 중에 확인할 수 없습니다. 서브클래스는 제공할 수 없습니다.) 따라서 이러한 함수 주소는 런타임에 바인딩됩니다(후기 바인딩)

5 멤버 함수, 전역 함수 및 친구 함수의 차이점을 간략하게 설명합니다.

멤버 함수는 이 클래스에 의해 인스턴스화된 객체에 의해서만 호출될 수 있습니다. [정적 멤버 제외] 전역 함수는 어디서든 호출할 수 있습니다.

Friend 함수는 이 클래스의 개체와 친구 클래스에서 호출할 수 있습니다.

new로 할당된 메모리를 삭제하려면 delete를 사용하세요. delete[]를 사용하여 new[]로 할당된 메모리를 삭제하면 배열 요소의 소멸자가 호출됩니다. 내부 데이터 유형에는 소멸자가 없으므로 큰 문제는 아닙니다. 괄호 없이 delete를 사용하면 delete는 단일 객체를 가리키는 것으로 생각하고, 그렇지 않으면 배열을 가리키는 것으로 생각합니다.

6. 상속의 장점과 단점.

클래스 상속은 컴파일 타임에 정적으로 정의되며 직접 사용할 수 있습니다. 클래스 상속을 사용하면 상위 클래스의 구현을 더 쉽게 변경할 수 있습니다. 그러나 클래스 상속에도 몇 가지 단점이 있습니다. 첫째, 상속은 컴파일 타임에 정의되므로 상위 클래스에서 상속된 구현은 런타임에 변경할 수 없습니다. 설상가상으로 부모 클래스는 일반적으로 자식 클래스의 동작 중 적어도 일부를 정의하며 부모 클래스에 대한 모든 변경 사항은 자식 클래스의 동작에 영향을 미칠 수 있습니다. 상속된 구현이 새로운 문제를 해결하는 데 적합하지 않은 경우 상위 클래스를 다시 작성하거나 보다 적합한 다른 클래스로 대체해야 합니다. 이러한 종속성은 유연성과 궁극적으로 재사용성을 제한합니다. (추가 예정)

7. C++(객체 지향 기능)의 속성은 무엇인가요? #🎜🎜 ##🎜🎜 #캡슐화, 상속 및 다형성.

객체 지향 프로그래밍 언어에서 캡슐화는 재사용 가능한 구성 요소를 사용하여 소프트웨어 시스템을 구성하는 기능입니다. 이는 시스템의 재사용성을 지원할 뿐만 아니라 시스템 메시지 전달의 확장성을 향상시키는 데도 도움이 됩니다. 공통 메시지를 보내고 다른 메소드를 호출하는 것이 가능합니다. 캡슐화는 정보 은폐를 달성하는 기술이며 그 목적은 클래스의 정의와 구현을 분리하는 것입니다.

8. 언제 "상수 따옴표"를 사용해야 합니까? 참조를 사용하여 프로그램의 효율성을 높이고 함수에 전달된 데이터가 함수에서 변경되지 않도록 보호하려면 다음을 수행해야 합니다. 상수 참조를 사용하십시오. 상수 참조 선언 방법: const 유형 식별자 및 참조 이름 = 대상 변수 이름

const int &ra=a =1;

a=1; //올바름

예제 2 string foo()

void bar(string & s )

그러면 다음 표현식은 올바르지 않습니다.

bar(foo())

bar("hello world")

이유는 다음과 같습니다. foo( )와 "hello world" 문자열은 모두 임시 개체를 생성하며 C++에서는 이러한 임시 개체가 const 유형입니다. 따라서 위의 표현식은 const 유형 객체를 non-const 유형으로 변환하려고 시도하는 것이며 이는 불법입니다. 참조 매개변수는 const로 정의되어야 합니다.

9. ASSERT()는 무엇에 사용되나요?

답: ASSERT()는 프로그램을 디버깅할 때 자주 사용되는 매크로입니다. 괄호 안의 표현식이 FALSE(0)이면,

프로그램이 오류를 보고하고 실행을 종료합니다. 표현식이 0이 아니면 다음 문을 계속 실행합니다. 이 매크로는 일반적으로 프로그램에 명백한 불법 데이터가 나타나는지 여부를 결정합니다. 그렇다면 심각한 결과를 피하기 위해 프로그램을 종료하고 오류 검색을 용이하게 합니다. 예를 들어 프로그램에서 변수 n은 0이 아니어야 합니다. 10#다형성을 구현하는 방법 ?

분석: ① 기본 클래스에 대한 참조는 파생 클래스의 인스턴스를 가리킬 수 있습니다.

② 포인터 기본 클래스는 파생 클래스 인스턴스

11을 가리킬 수 있습니다. 간략하게 설명해주시겠어요? ① 캡슐화: 추상적인 객관적인 내용을 클래스로 만들고, 각 클래스는 자체 데이터 및 메서드에 대한 액세스 제어(비공개, 보호, 공개)를 구현합니다# 🎜 🎜#② 상속: 일반화된 상속에는 세 가지 구현 형태가 있습니다:

구현 상속(추가 코딩 없이 기본 클래스의 속성과 메서드를 사용할 수 있는 기능을 나타냄) #🎜🎜 ##🎜 🎜#시각적 상속(하위 폼은 상위 폼의 모양과 구현 코드를 사용함)

인터페이스 상속(속성 및 메서드만 사용, 구현은 하위 클래스 구현보다 지연됨).

처음 두 가지(클래스 상속)와 후자(객체 조합 => 인터페이스 상속 및 순수 가상 함수)는 두 가지 기능 재사용 방식을 구성합니다.

3 다형성: 상위 개체를 하나 이상의 하위 개체와 동일하게 설정하는 기술입니다. 할당 후 상위 개체는 현재 할당된 하위 개체의 특성에 따라 다른 방식으로 작동할 수 있습니다. 간단히 말해서, 이는 하나의 문장입니다. 하위 클래스 유형의 포인터를 상위 클래스 유형의 포인터에 할당할 수 있습니다.

보충 질문: 다형성의 역할은 무엇인가요?

주로 두 가지:

1. 코드를 모듈화할 수 있도록 구현 세부 사항을 숨깁니다.

2. 인터페이스 재사용: 클래스를 상속하고 파생할 때 패밀리의 모든 인터페이스가 사용되는지 확인하세요. . 클래스 인스턴스의 특정 속성에 대한 올바른 호출입니다. ㅋㅋㅋ

)? ① 오버로딩: 동일한 이름을 가진 여러 함수가 존재할 수 있지만 이러한 함수의 매개변수 목록이 다르다는 의미입니다(매개변수 개수가 다를 수도 있고, 매개변수 유형이 다를 수도 있고, 둘 다일 수도 있습니다). 다른). ② 재작성: 하위 클래스가 상위 클래스의 가상 기능을 재정의하는 방법을 말합니다. 구현 원칙 측면에서: ① 오버로딩: 컴파일러는 함수의 다른 매개변수 목록을 기반으로 같은 이름을 가진 함수의 이름을 수정하고, 그런 다음 같은 이름을 가진 이 함수는 다른 함수가 됩니다(적어도 컴파일러의 경우). ) 의). 이 유형의 함수에 대한 호출은 컴파일 중에 결정되며 정적입니다. 즉, 해당 주소는 컴파일 타임(초기 바인딩)에 바인딩되므로 오버로딩은 다형성과 아무 관련이 없습니다! ② 재작성: 다형성과 정말 관련이 있습니다. 하위 클래스가 상위 클래스의 가상 함수를 재정의하면 상위 클래스 포인터는 할당된 다른 하위 클래스 포인터에 따라 하위 클래스에 속한 함수를 동적으로 호출합니다. 이러한 함수 호출은 컴파일 중에 확인할 수 없습니다. 서브클래스는 제공할 수 없습니다.) 따라서 이러한 함수 주소는 런타임에 바인딩됩니다(후기 바인딩)13다형성의 역할은 무엇인가요?

주로 두 가지가 있습니다:

① 코드를 모듈화할 수 있도록 구현 세부 사항을 숨깁니다. 코드 재사용을 위해 코드 모듈을 확장합니다.

② 인터페이스 재사용: 클래스를 상속하고 파생할 때 클래스가 사용되는지 확인합니다. 모든 클래스 인스턴스의 특정 속성에 대한 올바른 호출입니다.

14

, C++의 빈 클래스, 기본적으로 생성되는 클래스 멤버 함수:

class
{
  public:
    Empty();                         // 缺省构造函数
    Empty(const Empty&);             // 拷贝构造函数
    ~Empty();                        // 析构函数
    Empty& operator=(const Empty&);  // 赋值运算符
    Empty* operator&();              // 取值运算符
    const Empty* operator&() const;  // 取值运算符const
};
15

.

프로세스 간 통신 방법에는 공유 메모리, 파이프(명명된 파이프/명명되지 않은 파이프), 소켓, 메시지 큐, 신호, 세마포어, 메모리 매핑 등이 포함됩니다.

16교착상태에 필요한 4가지 조건은?

상호 배타적, 유지 관리 요청, 양도 불가능, 루프.

17

클래스의 정적 멤버와 비정적 멤버의 차이점은 무엇인가요?

이 클래스에 속하는 각 클래스에는 단 하나의 정적 멤버만 있습니다. 클래스의 비정적 멤버의 각 개체에는 하나의 복사본이 있습니다. 18얕은 복사란 무엇인가요? 딥 카피란 무엇입니까?

얕은 복사는 원본 개체와 복사 개체가 엔터티를 공유한다는 의미이며 참조된 변수만 다릅니다(다른 이름). 한 개체를 변경하면 다른 개체에도 영향을 미칩니다.

전체 복사는 원본 개체와 복사된 개체가 서로 독립적이며 한 개체의 변경 사항이 다른 개체에 영향을 미치지 않음을 의미합니다.

일반적으로 얕은 복사란 해당 개체의 포인터를 복사하는 것입니다. 전체 복사는 해당 객체를 복사합니다.

19、Windows 프로그래밍 스레드를 동기화하는 여러 가지 방법이 있나요? (중요)

Atomic lock, 임계 섹션(세그먼트), 이벤트, 뮤텍스(바디), 세마포어, 대기 가능 타이머

20 "참조"란 무엇인가요? "참조"를 선언하고 사용할 때 어떤 문제에 주의해야 합니까?

답변: 참조는 대상 변수의 "별칭"(별칭)입니다. 참조 작업은 변수를 직접 작업하는 것과 동일한 효과를 갖습니다. 참조를 선언할 때 초기화하는 것을 잊지 마세요. 참조가 선언된 후에는 대상의 원래 이름과 참조 이름이라는 두 가지 이름을 갖는 대상 변수 이름과 동일합니다. 참조 이름은 더 이상 다른 변수 이름의 별칭으로 사용할 수 없습니다. 참조를 선언한다고 해서 새 변수가 정의되는 것은 아닙니다. 이는 참조 이름이 대상 변수 이름의 별칭이라는 의미일 뿐입니다. 따라서 참조 자체는 저장 단위를 차지하지 않으며 시스템에서는 이를 수행합니다. 참조에 저장 단위를 할당하지 마십시오. 배열에 대한 참조를 생성할 수 없습니다.

21. "참조"와 포인터의 차이점은 무엇인가요?

포인터는 포인터 변수를 통해 객체를 가리킨 후 자신이 가리키는 변수에 대해 간접적으로 동작합니다. 프로그램에서 포인터를 사용하면 프로그램 읽기가 어려워집니다. 참조 자체는 대상 변수의 별칭이며 참조에 대한 작업은 대상 변수에 대한 작업입니다. 게다가 위에서 언급한 함수에 ref와 포인터를 전달하는 것에는 차이점이 있습니다.

22. 연관, 집계(Aggregation) 및 구성(Composition)의 차이점은 무엇인가요?

에는 UML의 몇 가지 개념이 포함됩니다. 연관은 "학생"과 "교사"와 같은 두 클래스 간의 일반적인 연결을 나타냅니다. 집계는 상대적인 관계인 has-a 관계를 나타냅니다. 느슨한 관계에서는 집계 클래스가 집계 클래스를 담당할 필요가 없습니다. 아래 그림과 같이 빈 다이아몬드를 사용하여 집계 관계를 나타냅니다.

구현 관점에서 집계는 다음과 같이 표현할 수 있습니다.

class A {...} class B { A* a; .....}

그리고 조합은 포함-a 관계를 나타내며 상관 관계는 집계보다 더 강합니다. 조합 클래스와 조합 클래스는 동일한 수명을 갖습니다. 사이클, 결합 클래스는 결합 관계를 표현하기 위해 단단한 다이아몬드를 사용합니다.

구현 형식은 다음과 같습니다.

class A{...} class B{ A ...}

23. 객체지향 세 가지 기본 특성과 간략하게 설명하자면?

1. 추상적인 객체를 클래스로 만들고 각 클래스는 자체 데이터 및 메서드에 대한 보호(개인, 보호, 공개)를 구현합니다. 상속: 일반화된 상속에는 세 가지 구현 형식이 있습니다. (추가 코딩 없이 기본 클래스의 속성과 메서드를 사용할 수 있는 기능을 의미), 시각적 상속(자식 폼이 상위 폼의 모양과 구현 코드를 사용함), 인터페이스 상속(속성과 메서드만 사용, 구현이 상위 폼에 비해 지연됨) 하위 클래스 구현) ). 처음 두 가지(클래스 상속)와 후자(객체 조합 => 인터페이스 상속 및 순수 가상 함수)는 함수 재사용의 두 가지 방법을 구성합니다.

3. 다형성: 상위 개체를 하나 이상의 하위 개체와 동일하게 설정하는 기술입니다. 할당 후 상위 개체는 현재 할당된 하위 개체의 특성에 따라 다른 방식으로 작동할 수 있습니다. . 간단히 말하면 한 문장입니다. 하위 클래스 유형의 포인터를 상위 클래스 유형의 포인터에 할당할 수 있습니다.

24 다형성의 역할? 두 가지 주요 사항이 있습니다. 1. 코드를 모듈화할 수 있도록 구현 세부 사항을 숨깁니다. 코드 재사용을 위해 코드 모듈을 확장합니다. 2. 인터페이스 재사용: 클래스를 상속하고 파생할 때 클래스 중 하나가 있는지 확인합니다. 클래스 인스턴스의 특정 속성에 대한 올바른 호출이 사용됩니다.

25 C++ 프로그램에서 C 컴파일러로 컴파일된 함수를 호출할 때 왜 extern "C" 문을 추가해야 합니까?

//extern은 함수 및 전역 변수의 범위를 나타내는 C/C++ 언어의 키워드입니다. 이 키워드는 선언된 함수 및 변수가 이 모듈이나 다른 모듈에서 사용될 수 있음을 컴파일러에 알려줍니다.

// extern “ C 컴파일 시 C++, C 및 기타 언어의 혼합 프로그래밍을 구현하기 위한 목적으로 다음 코드를 컴파일하고 연결함을 컴파일러에 알려줍니다.

26." "참조"와 포인터의 차이점은 무엇입니까? 포인터는 포인터 변수를 통해 객체를 가리킨 후 포인터가 가리키는 변수에 대해 간접적으로 동작합니다. 프로그램에서 포인터를 사용하면 프로그램의 가독성이 떨어지고 참조 자체가 대상 변수의 별칭이며 참조에 대한 작업은 대상 변수에 대한 작업입니다. 위에서 언급한 함수에 ref와 포인터를 전달하는 것의 차이점

23. New delete와 malloc free의 차이점은 무엇입니까?

둘 다 malloc을 사용하여 동적 메모리 작업을 수행합니다. 함수는 메모리 할당 바이트 수를 지정해야 하며 개체를 초기화할 수 없습니다. New는 개체의 생성자를 자동으로 호출합니다. delete는 개체의 소멸자를 호출하지만 free는 개체의 소멸자를 호출하지 않습니다.24

오버로드된 멤버 함수의 특징: (1) 동일한 범위(동일한 클래스 내) (2) 함수 이름은 동일합니다. (3) 매개변수는 다릅니다. (4) virtual 키워드는 선택 사항입니다.
25


Override는 파생 클래스 함수 적용 범위를 나타냅니다. (1) 다양한 범위(파생 클래스에 위치) (2) 함수 이름은 동일합니다. (3) 매개변수는 동일합니다. (4) 기본 클래스 함수에는
26
이 있어야 합니다.

VC를 사용하여 프로그램을 개발하면 C2001, c2005, c2011 등 여러 가지 공통 오류가 발생하는데, 이러한 오류가 발생하는 이유는 무엇입니까? 진행 중에 LNK2001 오류의 오류 메시지가 나타납니다. 주로 다음과 같습니다. unresolved external 기호 "symbol"(unresolved external "symbol") 링커가 모든 라이브러리 및 개체 파일에서 참조된 항목을 찾을 수 없는 경우 함수, 변수 또는 레이블이 이 오류 메시지를 생성합니다 , 오류에는 두 가지 이유가 있습니다. 첫째, 참조된 함수, 변수가 존재하지 않거나 철자가 잘못되었거나 잘못 사용되었습니다.

둘째, 연결 라이브러리의 다른 버전이 사용되었을 수 있습니다.

종종 LNK2005가 발생합니다. 오류 - 중복 정의 오류는 실제로 LNK2005 오류를 해결하는 것이 어렵지 않습니다.

27

소개 STL을 살펴보고 STL이 벡터를 구현하는 방법을 자세히 설명하겠습니다. STL(표준 템플릿 라이브러리) 컨테이너 알고리즘 반복자로 구성됩니다. STL에는 다음과 같은 장점이 있습니다. 데이터 검색이나 데이터 정렬과 같은 일련의 알고리즘을 쉽게 구현할 수 있습니다. 프로그램을 디버깅할 때 더 안전하고 편리합니다. 사람들도 STL을 사용하여 UNIX 플랫폼에서 작성합니다. STL은 크로스 플랫폼이기 때문에 코드도 쉽게 이해할 수 있습니다.

        벡터는 본질적으로 동적 배열로, 데이터 증가에 따라 배열 공간을 동적으로 늘립니다.

28

템플릿과 컨테이너를 소개합니다. 달성하는 방법? (현장에서 구현해볼 수 있도록 예시를 드릴지도 모르겠습니다.)

템플릿은 비교적 오래되었다고 할 수 있지만, 현재의 제네릭 프로그래밍은 본질적으로 템플릿 프로그래밍입니다.

보편적이고 일반화된 아이디어를 구현합니다.

STL에는 7개의 주요 컨테이너가 있습니다: vector, list, deque, map, multimap, set, multiset.

29 : 다형성 구현의 원리를 간략하게 설명합니다.

컴파일 시기 프로세서는 클래스에 가상 함수가 있음을 발견하면 즉시 이 클래스에 대한 가상 함수 테이블vtable을 생성합니다. 가상 기능 테이블의 각 항목은 해당 가상 기능에 대한 포인터입니다. 또한 컴파일러는 가상 함수 테이블을 가리키는 포인터 vptr를 이 클래스에 암시적으로 삽입합니다(vc 컴파일러의 경우 클래스의 첫 번째 위치에 삽입됨). 이 클래스의 생성자를 호출하면 클래스 생성자에서 컴파일러는 vptrvtable과 관련된 코드를 암시적으로 실행하고 vptr을 해당 vtable으로 가리킵니다. , 클래스를 이 클래스의 vtable과 연결합니다. 또한 클래스의 생성자가 호출되면 기본 클래스에 대한 포인터가 이제 특정 클래스에 대한 this 포인터가 되었습니다. 이러한 방식으로 올바른 vtable을 얻을 수 있습니다. 이 this 포인터. 이런 방식으로만 우리는 함수 본문과 진정으로 연결할 수 있습니다. 이것이 동적 바인딩이자 다형성을 구현하는 기본 원리입니다.

30: 객체 지향에 대한 자신의 이해에 대해 이야기해 주세요.

분석: 객체 지향은 먼저 문제가 여러 부분으로 구성되어 있다고 판단하여 모든 문제를 처리하는 것으로 이해될 수 있습니다. 부분은 실제로 객체입니다. 그런 다음 이러한 개체를 개별적으로 디자인하고 최종적으로 전체 프로그램을 얻습니다. 전통적인 프로그래밍은 대부분 기능적 아이디어를 기반으로 고려하고 설계하는 반면, 객체지향 프로그래밍은 객체 관점을 기반으로 문제를 고려합니다. 그렇게 하면 프로그램을 더욱 간결하고 명확하게 만들 수 있습니다.

설명: 가장 많이 문의되는 "객체 지향 프로그래밍 기술 "은 객체 지향 기술의 한 구성 요소일 뿐입니다. 객체지향 기술을 활용하는 것은 객체지향 분석, 설계 및 프로그래밍 기술뿐만 아니라 필요한 모델링 및 개발 도구의 도움이 필요한 포괄적인 기술 문제입니다.

31 C++에서 템플릿 클래스를 사용하는 이유.

분석:

1) 동적으로 증가하고 감소하는 데이터 구조를 생성하는 데 사용할 수 있습니다.

2) 유형 독립적이므로 재사용성이 높습니다.

3) 런타임 대신 컴파일 타임에 데이터 유형을 확인하여 유형 안전성을 보장합니다.

4) 플랫폼 독립적이고 이식 가능합니다.

5) 기본 데이터 유형에 사용할 수 있습니다.

32 기능 템플릿 클래스 템플릿의 차이점은 무엇입니까?

답변: 함수 템플릿의 인스턴스화는 함수 호출을 처리할 때 컴파일러에 의해 자동으로 완료되는 반면, 클래스 템플릿의 인스턴스화

는 프로그래머가 프로그램에서 명시적으로 지정해야 합니다.

33.Winsock 연결 설정의 주요 구현 단계는 무엇입니까?(매우 중요, 문의해야 함)

답변: 서버 측: socker()소켓 설정, 바인딩( bind) 듣고(listen) accept()

을 사용하세요.

클라이언트 연결을 기다리는 중입니다.

클라이언트: socker()소켓을 설정하고 서버에 연결(connect)한 다음 send()recv(

)을 사용합니다.

) , 데이터 교환이 완료될 때까지 소켓에 데이터를 쓰고 읽습니다. closesocket() 소켓을 닫습니다.

서버 측: accept()은 클라이언트 연결을 찾고, 새 소켓을 설정하고, 다시 연결을 기다리기 시작합니다

. 새로 생성된 소켓은 send()recv()를 사용하여 데이터 교환이 완료될 때까지 데이터를 쓰고 읽으며, closesock

et()을 사용하여 소켓을 닫습니다.

34 프로세스와 스레드의 차이점.

답변: 스레드는 프로세스 내의 실행 단위를 의미하며 프로세스 내에서 예약 가능한 엔터티이기도 합니다. 프로세스와의 차이점:

(1) 예약: 스레드는 예약 및 할당의 기본 단위입니다.

(2) 동시성: 프로세스를 동시에 실행할 수 있을 뿐만 아니라 동일한 프로세스의 여러 스레드도 동시에 실행할 수 있습니다.

(3) 리소스 소유: 프로세스는 리소스를 소유하는 독립적인 단위이며, 스레드는 시스템 리소스를 소유하지 않지만 프로세스에 속한 리소스에 접근할 수 있습니다.

(4) 시스템 오버헤드: 프로세스를 생성하거나 취소할 때 시스템이 리소스를 할당하고 재활용해야 하므로 따라서 스레드를 생성하거나 취소하는 데 드는 시간보다 시스템 오버헤드가 훨씬 더 큽니다.

35. C++ 유형은 안전한가요?

답변: 아니요. 서로 다른 유형의 두 포인터를 캐스팅할 수 있습니다(재해석 캐스팅 사용). C#은 유형에 안전합니다.

  1. VC를 사용하여 프로그램을 개발하면 C2001, c2005, c2011 등 여러 가지 일반적인 오류가 있는데 이러한 오류의 원인은 무엇입니까?

37 매크로와 인라인 함수의 차이점

분석: 인라인 함수와 매크로는 프로그램이 함수 호출을 통해 구현되는 것이 아니라 프로그램에서 확장됩니다. 함수를 호출하면 확장됩니다(컴파일 중에 완료됨). 매크로의 경우에도 마찬가지입니다.

차이점은 다음과 같습니다. 인라인 함수는 유형 감지 및 컴파일 중에 명령문이 올바른지 여부와 같은 컴파일 기능을 완료할 수 있습니다. 매크로 확장 시간과 인라인 기능도 다릅니다(런타임 중에 확장됨)

38 win32에서 메시지 루프 Windows 프로그램의 진입점은 어디에 있습니까? Windows 메시지 메커니즘 프로세스 작성

분석: Windows 프로그램의 진입점은 WinMain() 함수입니다.

Windows 애플리케이션 메시지 처리 메커니즘:

A 운영 체제는 애플리케이션의 창 메시지를 수신하고 메시지를 애플리케이션의 메시지 대기열로 전달합니다.

B 애플리케이션은 메시지 루프에서 GetMessage 함수를 호출하여 메시지에서 메시지를 검색합니다. queue 메시지를 하나씩 가져옵니다. 메시지를 가져온 후 애플리케이션은 메시지에 대해 일부 사전 처리를 수행할 수 있습니다.

C. 애플리케이션은 DispatchMessage를 호출하여 메시지를 운영 체제로 다시 보냅니다.

D. 시스템은 WNDCLASS 구조의 lpfnWndProc 멤버에 저장된 윈도우 프로시저 함수의 포인터를 사용하여 윈도우 프로시저를 호출하여 메시지를 처리합니다.

39: 프로그래밍 사양에 대한 이해나 지식에 대해 이야기해 주세요.

프로그래밍 사양은 프로그램의 타당성, 가독성, 이식성 및 테스트 가능성으로 요약될 수 있습니다.

참고: 이는 프로그래밍 사양의 일반적인 개요입니다. 면접관은 위에 제공된 예를 암송할 필요가 없습니다. 이 예에서 설명하는 문제를 이해하고 유연성, 이식성 문제를 해결할 수 있는 방법을 생각해야 합니다. 위의 예제와 일반적인 프로그래밍 습관을 결합하여 이 질문에 대답하세요.

40 스트림 연산자 오버로드가 참조를 반환하는 이유

프로그램에서 스트림 연산자 >>는 종종 연속적으로 사용됩니다. 따라서 이 두 연산자의 반환 값은 이 두 연산자를 계속 지원하는 스트림 참조여야 합니다. 다른 데이터 유형은 이 작업을 수행할 수 없습니다.

참고: 할당 연산자와 스트림 연산자를 제외하고 +, -, *, / 등과 같은 다른 연산자는 참조를 반환하면 안 됩니다. 이 네 가지 연산자의 개체는 모두 rvalue이므로 반환 값으로 개체를 구성해야 합니다.

41 상위 클래스가 가상 함수를 작성한다는 것이 사실인가요? 하위 클래스가 가상을 추가하지 않고 해당 함수를 재정의하면 다형성을 얻을 수 있나요?

virtual 수정자는 보이지 않는 상속이 됩니다. private도 통합되었지만 파생 클래스에는 액세스 권한이 없습니다. 가상을 추가할 수도 있고 추가하지 않을 수도 있습니다. 하위 클래스의 공간에는 상위 클래스의 모든 변수(정적 변수 제외)가 포함됩니다. 동일한 함수에 대해 엔터티가 하나만 있습니다(인라인 제외). 서브클래스는 가상을 추가하지 않고 함수를 재정의하여 다형성을 달성할 수도 있습니다. 하위 클래스의 공간에는 상위 클래스의 전용 변수가 있습니다. Private 변수에는 직접 접근할 수 없습니다.

42. C와 C++의 차이점은 무엇인가요?

c는 프로세스 지향적입니다(그러나 C는 객체 지향적 프로그램도 작성할 수 있습니다). 수업. 그러나 C보다 C++에서 객체 지향 프로그램을 작성하는 것이 더 쉽습니다

해당 방향에서: c는 임베디드와 같이 작은 코드 크기와 높은 효율성이 필요한 상황에 적합합니다. llinux 코어의 대부분은 c 시스템 소프트웨어이고 극도로 높은 효율성을 요구하기 때문에 작성되었습니다.

c++에는 c보다 +가 더 많다는 것도 이름에서 알 수 있습니다. 이는 c++가 c의 상위 집합임을 의미합니다. 그러면 왜 c++라고 부르지 않고 C++라고 부르나요?

에 비해 확장자가 너무 많기 때문입니다. c이므로 c 뒤에 +를 두 개 넣으면 c++가 됩니다.

C 언어는 구조화된 프로그래밍 언어이고 C++는 객체 지향 프로그래밍 언어입니다.

C++는 프로시저보다는 객체에, 논리 설계보다는 클래스 설계에 중점을 둡니다.

43 전처리기 플래그 #error의 목적은 무엇인가요?
정답을 모르신다면 참고1을 봐주세요. 이 질문은 평범한 사람과 괴상한 사람을 구별하는 데 유용합니다. 이런 질문에 대한 답을 찾기 위해 오직 괴짜만이 C 언어 교과서의 부록을 읽을 것입니다
. 물론, 당신이 괴상한 사람을 찾고 있는 것이 아니라면, 후보자는 자신이 답을 모르기를 바라는 것이 좋습니다.

44 다음 두 for 루프의 장점과 단점을 간략하게 설명해주세요.
// 첫 번째
for (i=0; i++;){if (condition)DoSomething() ; else DoOtherthing();}
// 두 번째
if (condition){for (i=0; i++;)DoSomething();}
else{for (i=0; i++ ;)DoOtherthing();}

빈칸 채우기 및 객관식 질문:

1. 다음 중 오버로드할 수 없는 연산자는 무엇입니까? ( )

A. 범위 연산자 "::"

B. 객체 멤버 연산자 "."

C. 포인터 멤버 연산자 "->"

D. : ABD가 작동하지 않을 이유가 없습니다

2.

다음 C++ 클래스 설명에서 잘못된 설명은 A. C++ 언어에 소개된 클래스는 데이터 캡슐화 메커니즘으로 주로 두 가지 역할을 합니다. 그리고 타입 정의 메커니즘

B. C++ 클래스에 정의된 데이터와 함수를 각각 데이터 멤버와 멤버 함수라고 합니다

데이터 캡슐화 메커니즘으로서 C.C++ 클래스는 정보 은닉을 달성하기 위해 데이터와 데이터에 대한 작업을 구성합니다.

D.C++ 클래스의 멤버는 공용 멤버, 보호된 멤버, 프라이빗 멤버 및 친구의 네 가지 유형으로 나눌 수 있습니다.

정답: D

3 int x = 123이라고 가정하면 명령문은 "+123"(""는 공백을 나타냄) 형식으로 출력을 생성할 수 있습니다.

A.cout

B.cout B.template C.template ; class Sample {…};

D.template Sample {…};
정답: C5

C++가 아닌 내장 유형 A와 B, 어떤 상황에서 B가 암시적으로 A로 변환될 수 있나요? [C++ 중간]

a. 클래스 B : public A { ……}

b.class B { 연산자 A( ) }

c. A( const B& }d. = ( const A& ); 분석: 첫 번째 항목 B는 A에서 공개적으로 상속되며 간접적으로 상속될 수 있습니다. 두 번째 항목: B는 A로의 암시적 변환을 구현합니다 세 번째 항목: A는 비명시적 매개변수 B(기본값을 가진 다른 매개변수를 가질 수 있음) 생성자를 구현합니다. 네 번째 항목: 할당 작업, 비록 실제 암시적은 아니지만 this 포인터는 설명을 표시해야 합니다.

정적 멤버 함수에는 이 포인터가 없습니다


7.

아래 함수 프로토타입 선언에서 (B) fun을 순수 가상 함수로 선언합니다.A void fun() =0; B virtual void fun()=0; void fun();

  1. Friend 연산자 obj>obj2는 C++ 컴파일러에서 (A)로 해석됩니다.

    1. operator>(obj1,obj2)

    2. >(obj1,obj2)

    3. obj2.operator>(obj1)

    obj1.oprator>(obj2)

9.假定AB为一个类,则执行“AB a(4),b[3],*p[2];”语句时,自动调用该类构造函数的次数为:B

A) 3  B) 4  C) 6   D) 9

10.假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为:B

A) AB operator+(AB &a,AB &b)

B) AB operator+(AB &a)

C) operator+(AB a)             

D) AB & operator+()

11.有二维字符数组char s[4][6]={"zhang","gao","tang","wang"};执行程序coutdaeeae8786145a0c6601e10ab13634c6打印结果是多少

 using namespace std;
   class A1{
   public:
    int a;
    static int b;
    A1();
    ~A1();
   };
   int main()   {
    cout << sizeof(A1) <<endl;
   }

         解析:是4, 静态变量是存放在全局数据区的, 而sizeof是计算局部栈中分配的大小。

13.死锁的处理

  解析:鸵鸟策略、预防策略、避免策略、检测与解除死锁,只要知道概念就行,不需要掌握

14. 非C++内建型别 A 和 B,在哪几种情况下B能隐式转化为A?[C++中等]

解析:a. class B : public A { ……} // B公有继承自A,可以是间接继承的

     b. class B { operator A( ); } // B实现了隐式转化为A的转化

    c. class A { A( const B& ); } // A实现non-explicit的参数为B(可有其他带默认值的参数)构造函数

    d. A& operator= ( const A& ); // 赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个

15以下代码有什么问题?[STL易]

typedef vector IntArray;

IntArray array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

// 删除array数组中所有的2

for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )

{

    if( 2 == *itor ) array.erase( itor );

}

    解析:其实里面隐藏着一个很严重的错误:当veci.erase(iter)之后,iter就变成了一个野指针,对一个野指针进行 iter++ 是肯定会出错的。

16 下列代码的输出值是多少?

class A{};

class A1{};

class B : public A{};

class C : public A, public A1{};

class D : public virtual A{};

cout << sizeof ( A ) << endl;

cout << sizeof ( B ) << endl;

cout

cout

분석: 답: 1, 1, 1, 4 설명: 빈 클래스가 차지하는 공간은 1이고, 단일 상속이 있는 빈 클래스가 차지하는 공간도 1이며, 다중 상속이 있는 빈 클래스가 차지하는 공간은 여전히 ​​1입니다. 1이지만 가상 상속에는 가상 테이블(가상 테이블 포인터)이 포함되므로 크기는 4입니다.

관련 기사:

기본 C# 면접 질문 125개와 답변 공유

#🎜🎜 #면접문제1, 면접문제

위 내용은 반드시 이해해야 할 C++ 인터뷰 질문 선정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.