분석 함수와 구조 함수
34738 단어 c#
구조 함수의 역할은 모든 대상의 데이터 구성원이 언제의 초기 값을 가지고 있는지 확보하는 것이다.
분석 함수의 역할은 메모리와 자원을 회수하는 것이다. 일반적으로 구조 함수나 대상의 생명기 내에 얻은 자원을 방출하는 데 쓰인다.
일반적으로 우리는 구조와 분석의 순서를 안다.
구조는 클래스 차원의 가장 뿌리에서부터 시작하여 각 층에서 먼저 기류의 구조 함수를 호출한 다음에 구성원 대상의 구조 함수를 호출한다.분석은 구조와 상반된 순서에 따라 엄격하게 집행되고 이 순서는 유일하며 그렇지 않으면 컴파일러가 자동으로 분석 과정을 집행할 수 없다.
구조 함수와 분석 함수는 모두 컴파일러가 은밀하게 호출한 것이다.이 함수들의 호출 순서는 프로그램의 실행이 실례화 대상에 들어갈 때와 떠날 때 있는 역할 영역의 순서에 달려 있다.일반적으로 분석 함수의 호출 순서는 구조 함수의 호출 순서와 상반되지만 대상의 저장 클래스는 분석 함수의 호출 순서를 바꿀 수 있다.
전역 역할 영역에서 정의된 대상에 대한 구조 함수는 파일의 모든 다른 함수 (main 포함) 가 실행되기 전에 호출됩니다. (그러나 서로 다른 파일의 전역 대상 구조 함수의 실행 순서를 보장할 수 없습니다.)대응하는 분석 함수는main을 종료한 후에 호출됩니다.
exit 함수는 프로그램을 즉시 종료시키고 자동 대상의 분석 함수를 실행하지 않습니다.이 함수는 입력 오류나 프로그램이 처리하는 파일을 열 수 없을 때 프로그램을 종료하는 데 자주 사용됩니다.
abort 함수는 exit 함수와 기능이 비슷하지만, 프로그램이 즉시 종료되고, 대상의 분석 함수를 호출할 수 없습니다.abort 함수는 일반적으로 프로그램의 비정상적인 종료를 나타내는 데 쓰인다.
자동 국부 변수의 구조 함수는 프로그램의 실행이 대상을 정의하는 위치에 도달했을 때 호출되고, 대응하는 분석 함수는 프로그램이 이 대상의 작용역을 떠날 때 호출된다. (즉 이 대상을 정의하는 코드가 실행을 완성했다.)자동 대상에 들어가고 떠나는 역할 영역을 실행할 때마다 그 구조 함수와 분석 함수를 호출합니다.프로그램이 exit나 abort 함수를 호출하여 종료하면 자동 대상의 분석 함수를 호출하지 않습니다.
정적 국부 대상의 분석 함수는 이 대상이 정의된 위치에 처음 도착했을 때만 한 번만 호출됩니다.대응하는 분석 함수는main이 종료되거나 프로그램이 exit 함수를 호출할 때 호출됩니다.
글로벌 객체 및 정적 객체는 작성 시 반대 순서로 제거됩니다.프로그램이 exit 함수를 호출해서 종료되면 정적 대상의 분석 함수를 호출하지 않습니다.
다음 데모는 몇 개의 작용 영역이 다른 메모리 클래스의CreateAndDestory 클래스의 대상, 그들의 구조 함수와 분석 함수의 호출 순서를 보여 준다.
-
#include
-
#include
-
using
namespace
std;
-
-
class Demo
-
{
-
public:
-
Demo(
int,
string);
//
-
~Demo();
//
-
private:
-
int objectID;
//ID number for object
-
string message;
//message describing object
-
};
-
-
Demo::Demo(
int ID,
string messagestring)
-
{
-
objectID = ID;
//set object’s ID number
-
message = messagestring;
//set object’s descriptive message
-
-
cout<<
“Object “<
” constructor runs “<endl;
-
}
-
-
Demo::~Demo()
-
{
-
cout<1 || objectID==
6 ?
“
” :
“”);
-
-
cout<<
“Object “<
” destructor runs “<endl;
-
}
-
-
void create(void);
-
-
Demo first(1,“(main )”);
// first 。 main
-
// ,
-
-
int _tmain(
int argc, _TCHAR* argv[])
-
{
-
cout<<
“
main :”<<
endl;
-
Demo second(2,“(main )”);
-
static Demo third(3,“(main )”);
-
-
create();
-
-
cout<<
“
main : ”<<
endl;
-
Demo fourth(4,“(main )”);
-
cout<<
“
main : ”<<
endl;
-
system(
“pause”);
-
return
0;
-
}
-
-
void create(void)
-
{
-
cout<<
“
create : ”<<
endl;
-
Demo fifth(5,“(cerate )”);
-
static Demo sixth(6,“(cerate )”);
-
Demo seventh(7,“(cerate )”);
-
cout<<
“
cerate : ”<<
endl;
-
}
:
Object 6 destructor runs (cerate )
Object 3 destructor runs (main )
Object 1 destructor runs (main )
:
Main 3 ,second ,fourth , , third 。 , 。
mian , fourth , second 。 third , 。 third , first , 。
Create 3 , fifth seventh ,sixth 。 create , seventh , fifth 。 sixth , 。 sixth , third first , 。
:《c++ 》 P259-262
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.