C++지방 소결 을 모 를 수도 있어 요.
6429 단어 이 가능 하 다,~할 수 있다,...
class People{
public:
People(std::string name,int age,int height);
private:
std::string m_sName;
int m_iAge;
int m_iHeight;
}
//
People::People(std::string name,int age,int height)
{
m_sName=name;
m_iAge=age;
m_iHeight=height;
}
//
People::People(std::string name,int age,int height)
:m_sName(name),m_iAge(age),m_iHeight(height)
{}
C++규정 에 따 르 면 대상 의 구성원 변수 초기 화 동작 은 구조 함수 본체 에 들 어가 기 전에 발생 한다.구조 함수 에서 구성원 변수 할당 은 초기 화 가 아니 라 할당 입 니 다.값 을 할당 할 때 먼저 기본 구조 함 수 를 m 로 호출 합 니 다.sName,m_iAge,m_iHeight 는 초기 값 을 부여 한 다음 에 즉시 할당 연산 자 를 호출 하여 새 값 을 부여 합 니 다.구성원 초기 목록 은 각 구성원 변 수 를 복사 구조 함수 로 하 는 실제 인삼 입 니 다.그래서 할당 값 이 초기 화 에 비해 한 걸음 더 많은 것 은 할당 연산 자 를 사용 하여 할당 하 는 것 임 을 알 수 있 습 니 다.그래서 초기 화 효율 이 할당 효율 보다 훨씬 높 습 니 다.하지만 내 장 된 유형 에 대해 서 는 효율 이 같다.2.빈 종 류 를 생각해 보 세 요.빈 종 류 를 설명 하면 C+컴 파일 러 는 무엇 을 할 까요?컴 파일 러 는 복사 구조 함수,할당 연산 자 와 분석 함수,그리고 기본 구조 함 수 를 설명 합 니 다.모든 이 함수 들 은 Public 이 고 inline 함수 입 니 다.컴 파일 러 가 쓴 할당 구조 함수 와 할당 연산 자 는 단순히 소스 대상 의 모든 non-static 변 수 를 대상 대상 에 복사 할 뿐 구체 적 으로 비트 복사 입 니 다.구조 함 수 를 설명 하면 컴 파일 러 는 기본 구조 함 수 를 만 들 지 않 습 니 다.복사 구조 함수 와 할당 연산 자 를 지원 하지 않 으 려 면 어떻게 합 니까?성명 하지 않 습 니까?위의 설명 대로 컴 파일 러 가 자동 으로 생 성 되 어 있 습 니 다.컴 파일 러 가 자동 으로 복사 구조 함수(Public)를 만 드 는 것 을 막 기 위해 private 라 고 설명 할 수 있 습 니 다.private 는 다른 사람의 사용 을 막 는 데 성 공 했 지만 안전 하지 않 습 니 다.클래스 구성원 함수 와 우 원 함 수 는 private 의 복사 구조 함수 와 할당 연산 자 를 호출 할 수 있 기 때 문 입 니 다.private 에서 만 복사 함수 와 할당 연산 자 를 설명 한다 면,누 군가 클래스 구성원 함수 와 member 함 수 를 통 해 호출 하면 연결 오 류 를 얻 을 수 있 습 니 다.그렇다면 여기 서 오 류 를 컴 파일 할 때 나 타 낼 수 있 을 까?복사 함 수 를 private 로 만 설명 하고 자신 이 없 으 면 할 수 있 습 니 다.분명히 복사 함수 와 할당 연산 자 를 private 의 기본 클래스 로 계승 하면 됩 니 다.기본 클래스 는 다음 과 같 습 니 다.
class NonCopyable{
protected:
NonCopyable (){}
~ NonCopyable (){}
private:
NonCopyable (const NonCopyable &);
NonCopyable & operater=(const NonCopyable &);
};
이 유 는 클래스 구성원 함수 나 친구 함수 가 복사 대상 을 시도 하기 때 문 입 니 다.컴 파일 러 는 복사 구조 함수 와 할당 연산 자 를 만 들 고 기본 클래스 의 대응 함 수 를 사용 하지만 거부 당 합 니 다.기본 클래스 는 private 이기 때 문 입 니 다.3.+함수 아래 에'*+'와'++*'에서 당신 이 모 르 는 것 을 말 해 보 세 요.c++는 접미사 형식 자체 플러스 함수 에 int 형식 매개 변수 가 있 습 니 다.함수 가 호출 될 때 0 을 int 매개 변수 로 전달 하 는 값 을 이 함수 에 전달 합 니 다.접두사 형식 자체 함수,유형 매개 변 수 는 요구 하지 않 기 때문에+함 수 는 접두사 형식 과 접두사 형식 으로 구분 할 수 있 습 니 다.구체 적 인 코드 는 다음 과 같다.
class UPInt{
public
UPInt& operator++( ) ; //++
const UPInt operator++( int ); //++
UPInt& operator --( ); // --
const UPInt operator --( int ) //--
UPInt& operator +=( int ); //
...
};
UPInt & UPInt::operator++( )
{
*this += 1;
return *this;
}
const UPInt UPInt :: operator++( int )
{
UPInt oldValue = *this;
++(*this);
return oldValue;
}
접미사 함수 가 반환 매개 변수 유형 const 를 사용 하 는 것 은 다음 코드 가 효력 이 발생 하지 않도록 하기 위해 서 이다.
UPInt i;
i++++;
이때 처음으로 cosnt 대상 을 호출 하고 다시 호출 한 다음 에 이 함 수 는 non-const 구성원 함수 이기 때문에 const 대상 은 이 함 수 를 호출 할 수 없다.그러면 i++++는 효력 이 발생 하지 않 는 다.효율 문 제 를 말씀 드 리 면 접미사+함수 가 임시 대상 을 만들어 서 값 을 되 돌려 주 는 것 을 볼 수 있 습 니 다.이 임시 대상 은 구 조 를 거 쳐 마지막 에 분 석 됩 니 다.접두사+함 수 는 이러한 임시 변수 가 없고 그런 조작 이 없습니다.따라서 프로그램 에서 접 두 사 를 사용 하면 효율 이 더욱 높 아 지고 임시 변수의 구조 와 분석 동작 이 없습니다.4.가상 분석 함수 가 다 중 성질 을 가 진 base class 는 virtual 분석 함 수 를 설명 해 야 합 니 다.왜 그 러 세 요?다음 예 보기
class base
{ ... }
class derived:public base
{... }
base * p= new derived;
이 기본 클래스 의 분석 함수 가 virtual 이 아니 라 고 가정 합 니 다.p 지침 을 사용 하고 삭제 할 때 무슨 일이 일어 날 지 생각 합 니 다.기본 클래스 의 분석 함수 가 non-virtual 이기 때문에 기본 클래스 의 분석 함 수 를 직접 호출 하지 않 고 계승 클래스 의 기본 클래스 만 삭제 하면 계승 대상 의 다른 메모리 가 소각 되 지 않 아 자원 이 누 출 됩 니 다. 이 를 virtual 이 라 고 밝 히 면 다 중 태 성 이 발생 하고 계승 류 를 가리 키 는 지침 을 호출 하면 전체 계승 류 가 삭 제 됩 니 다.5.전달 방식 인용 부족 한 경우 c++값 전달 방식 으로 대상 을 함수 로 전달 합 니 다.함수 매개 변 수 는 모두 실제 실제 인삼 의 복사 본 을 초기 값 으로 하고 호출 단 에서 얻 은 것 은 함수 반환 값 의 첨부 파일 입 니 다.이 복사 본 들 은 모두 복사 구조 함수 에 의 해 생산 된다.다음 과 같은 예
class Person{
public:
Person();
virtual ~Person();
...
private:
std::string name;
std::string address;
}
class Student:public Person{
public:
Student();
~Student();
...
private:
std::string schoolName;
std::string schoolAddress;
};
를 보면 한 함수 가 학생
bool validateStudent(Student s);
Student plato;
bool platoIsOK=validateStudent(plato);
이 세 줄 의 코드 를 분석 하 는 지 검증 하면 컴 파일 러 는 도대체 무엇 을 했 습 니까?먼저 Student 의 copy 구조 함 수 를 호출 한 다음 plato 를 블 루 북 으로 s 를 초기 화 합 니 다.vaidate Student 가 되 돌아 오 면 소각 되 기 때문에 비용 은'1 회 Student copy 구조 함수 호출,1 회 Student 분석 함수 호출'입 니 다.Student 대상 내부 에 string 대상 이 두 개 있어 서 string 대상 을 두 개 만 들 었 습 니 다.Student 는 Person 대상 을 계승 하고 그 안에 두 개의 string 대상 이 있다.그래서 by value 방식 으로 학생 대상 을 전달 하고 전체적인 원 가 는'6 차 구조 함수 와 6 차 분석 함수'입 니 다!by reference 방식 으로 파 라 메 터 를 전달 하 는 것 도 대상 의 절단 문 제 를 피 할 수 있다.derived class 대상 이 by value 방식 으로 전달 되 고 base class 대상 으로 간주 되면 base class 의 copy 구조 함수 가 호출 되 어 derived class 대상 이 모두 잘 리 고 base class 대상 만 남 습 니 다.다음 코드 를 보면 인용 매개 변 수 를 전달 하여 다 중
class Window{
public:
...
std::string name() const;
virtual void display() const;
};
class WindowWithScrollBars:public Window{
public:
...
virtual void display() const;
};
// Windos , display
// WindowWithScrollBars , display
//
void printNameAndDispaly(const Window& w)
{
std::cout<<w.name();
w.display();
}
c+컴 파일 러 의 바 텀 을 엿 볼 수 있 습 니 다.reference 는 포인터 로 이 루어 지기 때문에 pass by reference 가 진정 으로 전달 하 는 것 은 지침 입 니 다.대상 이 내장 형 이 라면 패스 by value 는 패스 by reference 보다 효율 이 높다.