>  기사  >  백엔드 개발  >  C++ 학습에 대한 기본 지식 - 이 포인터, 정적 멤버, 상수 멤버 함수

C++ 학습에 대한 기본 지식 - 이 포인터, 정적 멤버, 상수 멤버 함수

php是最好的语言
php是最好的语言원래의
2018-08-08 11:29:501968검색

1. 이 포인터

1. C++ 프로그램을 C 프로그램으로 변환

class CCar {                          struct CCar {
    public:                                int price;
    int price;                        };
    void SetPrice(int p);             void SetPrice(struct CCar * this,int p){
};                                        this->price = p;
void CCar::SetPrice(int p){           }
    price = p; //this->price = p;
}                                     int main() {
int main(){                               struct CCar car;
    CCar car;                             SetPrice( & car,20000);
    car.SetPrice(20000);                  return 0;
    return 0;                         }
}

2. 이 포인터의 기능: 비정적 멤버 함수에서 해당 함수가 작동하는 개체에 대한 포인터를 나타내는 데 직접 사용할 수 있습니다.

3. this 포인터와 정적 멤버 함수: 정적 멤버 함수는 특정 개체에 특별히 영향을 미치지 않으므로 이 포인터는 정적 멤버 함수에서 사용할 수 없습니다.

2. 정적 멤버

  • 정적 멤버: static 키워드가 있는 멤버 설명 앞에 .

  • 모든 개체에는 일반 멤버 변수의 자체 복사본이 있는 반면 정적 멤버 변수에는 전체 개체가 공유되는 복사본이 하나만 있습니다. sizeof 연산자는 정적 멤버 변수를 계산하지 않습니다.

  • 일반 멤버 함수는 개체에 대해 구체적으로 작동해야 하는 반면, 정적 멤버 함수는 개체에 대해 구체적으로 작동하지 않으며 개체를 통하지 않고 액세스할 수 있습니다.

class CRectangle{
    private:
        int w, h;
        static int nTotalArea; // 静态成员变量
    public:
        CRectangle(int w_,int h_);
        ~CRectangle();
        static void PrintTotal(); // 静态成员函数
};

1. 정적 멤버에 액세스하는 방법:

  • 클래스 이름::멤버 이름 CRectangle::PrintTotal();

  • 객체 이름.멤버 이름 CRectangle r;

  • Pointer->멤버 이름 CRectangle * p = &r; 중요:
  • 정적 멤버 변수는 본질적으로 전역 변수입니다. 객체가 존재하지 않더라도 클래스의 정적 멤버 변수는 여전히 존재합니다
  • 정적 멤버 변수는 클래스를 정의하는 파일에서 한 번 설명하거나 초기화해야 합니다. 그렇지 않으면 컴파일은 통과할 수 있지만 링크는 통과할 수 없습니다. 정적 멤버 함수에서는 비정적 멤버 변수에 액세스할 수 없으며 비정적 멤버 함수를 호출할 수 없습니다. 3. 멤버 개체 및 닫힌 클래스 1. 정의: 예 멤버 객체의 클래스를 둘러싸는 클래스라고 합니다
class CTyre{             // 轮胎类
    private:
        int radius;      // 半径
        int width;       // 宽度
    public:
        CTyre(int r,int w):radius(r),width(w) { }
};
class CEngine{           // 引擎类
};
class CCar {             // 汽车类
    private:
        int price;       // 价格
        CTyre tyre;
        CEngine engine;
    public:
        CCar(int p,int tr,int tw );
};
CCar::CCar(int p,int tr,int w):price(p),tyre(tr, w){};
int main(){
    CCar car(20000,17,225);
    return 0;
}

위의 예에서 CCar 클래스가 생성자를 정의하지 않으면 다음 명령문으로 인해 컴파일 오류가 발생합니다. 컴파일러가 car.tyre의 방식을 이해하지 못하기 때문입니다. 초기화됩니다. car.engine 초기화에는 문제가 없습니다. 기본 생성자를 사용하면 됩니다. 닫힌 클래스 개체를 생성하는 모든 문은 컴파일러가 개체의 멤버 개체가 초기화되는 방법을 이해할 수 있도록 해야 합니다. 구체적인 방법은 다음과 같습니다. 닫힌 클래스 생성자의 초기화 목록을 통해.

    2. 폐쇄형 클래스 생성자와 소멸자의 실행 순서
  • 폐쇄형 클래스 객체가 생성되면 모든 객체 멤버의 생성자가 먼저 실행된 후 폐쇄형 클래스의 생성자가 실행됩니다.
  • 객체 멤버의 생성자 호출 순서는 멤버 초기화 목록에 나타나는 순서에 관계없이 객체 멤버가 클래스에서 선언되는 순서와 일치합니다.
  • Closed 클래스의 객체가 소멸되면 Closed 클래스의 소멸자가 먼저 실행된 다음 멤버 객체의 소멸자가 실행됩니다. 순서는 생성자의 호출 순서와 반대입니다.

class CTyre {
    public:
        CTyre() { cout << "CTyre contructor" << endl; }
        ~CTyre() { cout << "CTyre destructor" << endl; }
};
class CEngine {
    public:
        CEngine() { cout << "CEngine contructor" << endl; }
        ~CEngine() { cout << "CEngine destructor" << endl; }
};
class CCar {
    private:
        CEngine engine;
        CTyre tyre;
    public:
        CCar( ) { cout << “CCar contructor” << endl; }
        ~CCar() { cout << "CCar destructor" << endl; }
};
int main(){
    CCar car;
    return 0;
}
//输出结果:
CEngine contructor
CTyre contructor
CCar contructor
CCar destructor
CTyre destructor
CEngine destructor

4. Friends

1. 친구는 친구 기능과 친구 클래스의 두 가지 유형으로 나뉩니다.

(1) 친구 기능: 클래스의 친구 기능은 클래스 멤버

class CCar ;     //提前声明 CCar 类,以便后面的CDriver 类使用
class CDriver{
    public:
    void ModifyCar( CCar * pCar) ;         // 改装汽车
};
class CCar{
    private:
        int price;
        friend int MostExpensiveCar( CCar cars[], int total); // 声明友元
        friend void CDriver::ModifyCar(CCar * pCar);     // 声明友元,可包括构造、析构函数
};
void CDriver::ModifyCar( CCar * pCar){
    pCar->price += 1000;                        // 汽车改装后价值增加
}
int MostExpensiveCar( CCar cars[],int total){   // 求最贵汽车的价格                           
    int tmpMax = -1;
    for( int i = 0;i < total; ++i )
    if( cars[i].price > tmpMax)
    tmpMax = cars[i].price;
    return tmpMax;
}
    의 개인 속성에 접근할 수 있습니다. (2) 친구 클래스: A가 B의 친구 클래스인 경우 A의 멤버 함수는 B의 비공개 멤버에 액세스할 수 있습니다. 친구 클래스 간의 관계는 전송되거나 상속될 수 없습니다.
  • class B{
        friend class A;      // 声明A为友元类
    };

    5. 상수 멤버 함수

  • 1 . 함수: 객체의 값이 변경되는 것을 원하지 않으면 객체 정의 시 앞에 const 키워드를 추가하면 됩니다
  • 클래스의 멤버 함수 설명 뒤에 const 키워드를 추가하면 됩니다. 멤버 함수는 상수 멤버 함수가 됩니다.
  • 속성 값은 상수 멤버 함수 내에서 변경할 수 없으며, 상수 멤버 함수가 아닌 함수도 호출할 수 없습니다.

상수 멤버 함수를 정의하고 선언할 때 const 키워드를 사용해야 합니다

class Sample {
    private :
        int value;
    public:
        Sample() { }
        void SetValue() {  }
};
const Sample Obj;  //  常量对象
Obj.SetValue ();   //错误,常量对象只能使用构造函数、析构函数和有const说明的函数(常量方法)

2. 상수 멤버 함수 오버로딩: 이름과 매개변수 목록이 같지만 하나는 const이고 다른 하나는 그렇지 않은 두 함수는 오버로딩된 것으로 간주됩니다.

3. 가변 멤버 변수:

(1) 함수: mutable이 다음으로 설정됩니다. const 의 제한을 깨면 mutable로 수정된 변수는 const 함수에서도 항상 변경 가능한 상태가 됩니다.

    (2) 응용: 클래스의 멤버 함수가 객체의 상태를 변경하지 않는 경우 일반적으로 const로 선언됩니다. 그러나 때로는 const 함수에서 클래스 상태와 관련이 없는 일부 데이터 멤버를 수정해야 하는 경우 이러한 데이터 멤버를 mutable로 수정해야 합니다.
  • class CTest{
        public:
            bool GetData() const{
                m_n1++;
                return m_b2;
            }
        private:
            mutable int m_n1;
            bool m_b2;
    };

    관련 권장 사항:

  • C++ 정적 멤버 및 상수 멤버 사용

  • C++ 검토 요점 요약 5 정적 멤버 변수 및 멤버 함수

위 내용은 C++ 학습에 대한 기본 지식 - 이 포인터, 정적 멤버, 상수 멤버 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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