집 >백엔드 개발 >C#.Net 튜토리얼 >C++ 학습에 대한 기본 지식 - 이 포인터, 정적 멤버, 상수 멤버 함수
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;
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 초기화에는 문제가 없습니다. 기본 생성자를 사용하면 됩니다. 닫힌 클래스 개체를 생성하는 모든 문은 컴파일러가 개체의 멤버 개체가 초기화되는 방법을 이해할 수 있도록 해야 합니다. 구체적인 방법은 다음과 같습니다. 닫힌 클래스 생성자의 초기화 목록을 통해.
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; }
class B{ friend class A; // 声明A为友元类 };
5. 상수 멤버 함수
상수 멤버 함수를 정의하고 선언할 때 const 키워드를 사용해야 합니다
class Sample { private : int value; public: Sample() { } void SetValue() { } }; const Sample Obj; // 常量对象 Obj.SetValue (); //错误,常量对象只能使用构造函数、析构函数和有const说明的函数(常量方法)
2. 상수 멤버 함수 오버로딩: 이름과 매개변수 목록이 같지만 하나는 const이고 다른 하나는 그렇지 않은 두 함수는 오버로딩된 것으로 간주됩니다.
3. 가변 멤버 변수:
(1) 함수: mutable이 다음으로 설정됩니다. const 의 제한을 깨면 mutable로 수정된 변수는 const 함수에서도 항상 변경 가능한 상태가 됩니다.
class CTest{ public: bool GetData() const{ m_n1++; return m_b2; } private: mutable int m_n1; bool m_b2; };
관련 권장 사항:
위 내용은 C++ 학습에 대한 기본 지식 - 이 포인터, 정적 멤버, 상수 멤버 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!