생성자와 소멸자의 정의를 클래스 선언에 함부로 두지 마라. Inline 은 inline 이 아니며 생성자의 기본 의미에 영향을 주지 않으며 inline 이 아니기 때문에 기본 클래스의 시공이 수행되지 않습니다. 분석 외부의 생성자는 여전히 인라인일 수 있습니다. 생성자가 너무 복잡하면 클래스 정의에 기록되고 인라인으로 연결되지 않습니다.
제 생각에는 C++ 가 구현과 인터페이스 분리를 제창하고, 성명서에는 필요한 매개변수만, 심지어 매개변수 유형만, 매개변수는 없다고 생각합니다. 성명서에 쓰면 함수체에 코드를 보여 주고 싶지 않다. 아마도 너는 너의 것을 다시 쓸 수 있을 것이다. H 직접 및 재컴파일을 통해 개인 구성원을 직접 제어할 수 있으므로 패키징에 도움이 되지 않습니다. C++ 는 범용 특정 컴파일러의 구현을 가능하게 하도록 설계되었습니다. 신고서를 넣다. 에서 비밀번호 저장 옵션을 선택할 수 있습니다. Cpp, 컴파일 생성 Obj, 삭제. Cpp 파일 (또는 사용자에게 배포하지 마십시오.) 사용자는 이것만 있으면 됩니다. Obj 와. 그들은 자신의 프로그램에서 그것을 사용할 수 있다. 생성자가 클래스 정의 내에 직접 코드를 제공하는 것은 사용자가 자유롭게 변경할 수 있도록 하는 것과 같습니다. 다른 일반 기능보다 더 부정적인 영향을 미칠 수 있습니다.
생성자, 분석 함수 및 가상 함수를 연결할 수 있습니까? 무슨 의미가 있습니까? 문법적으로 오류가 없다. 먼저 생성자, 분석 함수, 가상 함수를 모두 인라인 함수로 선언할 수 있다는 것을 파악해야 합니다. 이는 문법적으로 정확합니다.
포인터나 참조를 통해 객체를 참조할 때 가상 함수에 대한 호출은 동적으로 구문 분석되어야 하기 때문에 인라인을 할 수 없습니다. 원인: 스택 프로그램은 실행까지 호출할 실제 코드 (즉, 동적) 를 알지 못합니다. 호출자가 스택된 후 생성된 파생 클래스에서 코드를 가져올 수 있기 때문입니다. 따라서 컴파일러에서 가상 함수 호출 대상인 객체의 "정확한 클래스" 를 알고 있는 경우에만 인라인 가상 함수 호출을 연결할 수 있습니다. 이 문제는 컴파일러에 객체에 대한 포인터나 참조가 아닌 실제 객체가 있는 경우에만 발생합니다. 즉, 로컬 오브젝트, 전역/정적 오브젝트 또는 posite 에 완전히 포함된 오브젝트입니다.
나는 묻고 싶다: 컴파일러에서 자동으로 생성된 합성분석함수는 자원 석방을 하는 일을 하는가? 감사합니다. 자원을 석방해야 한다면 분석 함수를 직접 써야 합니다.
생성자에서 데이터베이스 연결을 엽니다. JAVA 는 구문 분석 함수 없이 하위 클래스의 생성자를 자동으로 해제하는 방법은 무엇입니까? 생성자 public student (string name, intage, string school) {super (); 이것은 기본 문이므로 this.name = namethis.age = age 를 호출할 필요가 없습니다. This.school = 학교; }
Java 에서 누가 먼저 주 함수와 생성자를 로드하는지, 물론 주 함수가 먼저 로드됩니다.
프로그램의 입구가 주요 기능이다.
생성자에 관해서는. 。 이 클래스를 사용하고 싶을 때만. 즉, new 가 이 클래스에서 나올 때까지 로드되지 않습니다.
제가 갈게요. 뒤에 있는 사람은 왜 생성자를 말합니까? 。 。 주요 기능은 정적입니다. 。 막 설치했을 때 설치했어요!
생성자, 구문 분석 함수, 속성 등 ~ ~ 네임스페이스 gXlogic 를 표시하는 주석이 있는 c# 프로그램이 필요합니다.
{
공용 클래스 GetLogicDisposedList
{
# 영역 멤버 변수
공용 문자열 PeancyTimeL 은 위반 시점부터
공용 문자열 PeancyTimeH 잘못된 시간이 만료되었습니다.
공용 문자열 DisposeTimeL 처리 시간
Public string DisposeTimeH 처리 시간
공용 문자열 PlateType 번호판 유형
공용 문자열 번호판 번호 번호판 번호
공용 문자열 PeancyAdress 불법 장소
공통 문자열 방향 걷는 방향
공용 문자열 PeancyType 불법 활동
공통 문자열 DisposedPerson 처리기 (데이터가 처리기 유형-처리기인 경우)
# 끝 영역
공용 GetLogicDisposedList ()
{
PeancyTimeL =
PeancyTimeH =
DisposeTimeL =
DisposeTimeH =
PlateType =
PlateNumber =
PeancyAdress =
Derection =
PeancyType =
DisposedPerson =
}
이것은 생성자이며 소멸자 C# 는 거의 사용되지 않습니다. 이것에 대해 알고 싶다면 C++
String 클래스의 생성자 및 소멸자를 작성합니다. 클래스 String 의 프로토타입은 클래스 string {public: string (constcharstring 의 소멸자 함수) 으로 알려져 있습니다.
String::~String(void)
{
[] m _ data 삭제
M_data 는 내부 데이터 유형이므로 delete m _ data 로도 쓸 수 있습니다
}
문자열의 일반 생성자
String::String(const char *str)
{
If(str==NULL)
{
M _ data = newchar [1]; 공판까지 더하는 게 낫겠다.
* m _ data =' \ 0
}
기타
{
Intlength = strlen (str);
M _ data = new char[ 길이+1]; 공판까지 더하는 게 낫겠다.
Strcpy(m_data, str);
}
}
생성자 복사
String::String (String & amp 상수 기타)
{
Intlength = strlen (other.m _ data);
M _ data = new char[ 길이+1]; 공판까지 더하는 게 낫겠다.
Strcpy(m_data, other.m _ data);
}
할당 함수
현과 현. String:: operate = (const string & 기타)
{
자기 분배를 검사하다
(this = =& 기타)
반환 * this
원래 메모리 리소스를 비웁니다.
[] m _ data 삭제
새 메모리 리소스를 할당하고 컨텐츠를 복사합니다.
Intlength = strlen (other.m _ data);
M _ data = new char[ 길이+1]; 공판까지 더하는 게 낫겠다.
Strcpy(m_data, other.m _ data);
항목에 대한 참조를 반환합니다.
반환 * this
}
[재 인쇄] 생성자를 가상 함수로 선언 할 수없는 이유는 무엇입니까? 구문 분석 함수는 가상 함수로 선언할 수 있고, 구문 분석 함수는 가상 함수로 선언할 수 있으며, 경우에 따라 가상 함수로 선언해야 합니다.
생성자 및 소멸자에서 가상 함수를 호출하지 않는 것이 좋습니다.
생성자가 가상 함수로 선언할 수 없는 이유는 객체를 구성할 때 1 은 객체의 실제 유형을 알아야 하고, 가상 함수의 동작은 실행 시 실제 유형을 결정하기 때문입니다. 객체를 구성할 때 객체가 아직 성공적으로 구성되지 않았기 때문입니다. 컴파일러에서 객체를 인식하지 못합니다.
의 실제 유형은 클래스 자체, 클래스의 파생 클래스 또는 더 깊은 파생 클래스입니다. 확실하지 않아요. 。 。
가상 함수의 실행은 가상 함수 테이블에 따라 달라집니다. 하지만
가상 함수 테이블은 생성자에서 초기화됩니다
즉, 초기화 vptr 은 올바른 가상 함수 테이블을 가리킵니다. 객체 구성 중에 가상 함수 테이블이 초기화되지 않았습니다.
초기화할 수 없습니다.
컴파일러에서 기본 클래스의 생성자를 호출할 때 기본 클래스의 객체를 구성하려고 하는지 파생된 클래스의 객체를 구성하려고 하는지 알 수 없습니다.
소멸자는 가상 함수의 역할을 합니다. 즉, 클래스 상속에서 기본 클래스 포인터가 파생 클래스를 가리키는 경우 기본 클래스 포인터 delete 가 가상 함수로 정의되지 않으면 파생 클래스의 일부를 구문 분석할 수 없습니다. 예: #include "stdafx.h "
# include "stdio.h" 클래스 a {public: a (); 가상 ~ a (); } A::A(){}A::~A(){
Printf ("클래스 APN 삭제"); }
클래스 b: 공용 a {공용: b (); ~ b (); } B::B(){ }B::~B(){
Printf ("클래스 bpn 삭제"); }
Int main(int argc, char* argv[]){
A * b = 새 b; B 삭제 0 을 반환합니다 }
결과는 클래스 b 를 삭제하는 것입니다.
클래스 a 삭제
A 의 가상이 삭제되면 삭제 클래스 A 가 됩니다. 즉, 파생 클래스의 나머지 내용은 삭제되지 않습니다. 즉, 파생 클래스의 가상 함수는 호출되지 않습니다.
따라서 클래스의 상속 시스템에서 기본 클래스의 구문 분석 함수가 가상 함수로 선언되지 않으면 메모리 누수가 발생하기 쉽습니다. 따라서 기본 클래스일 수 있는 클래스를 설계하면 가상 함수로 선언해야 합니다. 심비안의 CBase 처럼 말이죠.
참고: 1.
생성자를 정의하면 컴파일러에서 기본 생성자를 생성하지 않습니다.
2. 상위 클래스에 가상 함수가 있는 하위 클래스가 아닌 경우 컴파일러에서 생성하는 소멸자는 거짓이 아닙니다. 이 경우 함수의 가상 특성은 상위 클래스에서 가져옵니다.
3. 가상 함수가 있는 클래스에는 거의 반드시 가상 구조 함수가 있을 것이다.
4. 클래스가 기본 클래스가 될 수 없는 경우 소멸자를 가상 함수로 선언하지 마십시오. 허함수는 공간을 소모한다. 5.
구문 분석 함수가 비정상적으로 종료되면 구문 분석이 불완전하게 되어 메모리 누수가 발생할 수 있습니다. 관리 클래스를 제공하는 것이 가장 좋습니다. 관리 클래스에서 구문 분석을 위한 메서드를 제공하는 것이 좋습니다. 호출자는 이 메서드의 결과에 따라 다음 작업을 결정합니다. 6.
생성자에서 가상 함수를 호출하지 마십시오. 기본 클래스를 구성할 때 가상 함수는 비가상 함수이며 파생 클래스로 들어가지 않고 정적 바인딩입니다. 하위 클래스의 객체를 구성할 때 먼저 호출되는 것은 하위 클래스가 아직 구성 및 초기화되지 않은 기본 클래스의 생성자입니다. 기본 클래스를 구성할 때 가상 함수를 호출하면 초기화되지 않은 객체를 호출하는 것은 매우 위험하므로 C++ 에서 상위 클래스의 객체를 구성할 때 하위 클래스의 가상 함수 구현을 호출할 수 없습니다. 그렇다고 네가 그런 프로그램을 쓸 수 없다는 뜻은 아니다.
이렇게 쓰면 컴파일러에서 오류를 보고하지 않습니다. 다만 이렇게 쓰면 컴파일러에서 하위 클래스의 구현을 호출하는 대신 기본 클래스의 구현을 호출합니다. 소멸자에서 가상 함수를 호출하지 마십시오. 소멸자는 먼저 하위 클래스 소멸자를 호출하여 구성 객체의 하위 클래스 부분을 분석한 다음 기본 클래스의 소멸자를 호출하여 기본 클래스 부분을 구문 분석합니다. 기본 클래스의 구문 분석 함수에서 가상 함수를 호출하면 구문 분석된 하위 클래스 객체의 함수를 호출할 수 있으므로 매우 위험합니다. 8.
파생 클래스의 복사 함수를 작성할 때 기본 클래스의 복사 함수를 호출하여 기본 클래스의 일부를 복사하는 것을 잊지 마십시오.
생성자, 구문 분석 함수, = 작업 오버로드 및 인쇄 함수, 테스트 # include 가 포함된 복잡한 클래스를 작성합니다
네임스페이스 STD 사용
클래스 복합체 {
쌍실
듀얼 imag
공용:
복수형 (double pr= 1, double pi= 1){
Real = primag = pi
Cout & lt& lt "건설 대상 ... \ n ";;
}
~ Complex(){ cout & lt;; & lt "객체 파괴 ... \ n ";; }
복합& 연산자 = (const complex & C){
(this = = & ampc)
반환 * this
Real = c.real 입니다
Imag = c.imag
반환 * this
}
Void 표시 () {
Cout & lt& ltreal & lt& lt(imag & gt=0? "+":"""< & ltimag & lt& lt "나"<& ltendl
}
}
Int main(){
복수 c 1(3.3, -4.4), C2;
C2 = c1;
C1.display ();
C2.display ();
0 을 반환합니다
}