C++中級-(靜態成員和物件丶this指標丶常函式和物件、成員函式和物件)
阿新 • • 發佈:2021-01-12
類物件作為類成員
#include <iostream> #include <string> using namespace std; //c++類中的成員可以是另一個類的物件,稱為物件成員。 class A { public: A() { cout << "A side \n"; }; ~A() { cout << "Release A \n"; }; }; class B { public: A a;//使用A作為物件成員 B() { cout << "B side \n"; }; ~B() { cout << "Release B \n"; }; }; // int main() { B b; return 0; }
靜態成員變數
#include <iostream> #include <string> using namespace std; //C++中使用靜態成員變數來實現多個物件共享資料的目標,是一種特殊的成員變數。 class Person { public: Person(string name, int age, int score) {}; static int cont;//獨立佔一份記憶體 private: stringname; int age; int score; }; //成員變數必須在類宣告的外部初始化,static 成員變數的記憶體既不是在宣告類時分配, //也不是在建立物件時分配,而是在(類外)初始化時分配.沒有在類外初始化的 static 成員變數不能使用 int Person::cont = 0; void dofun() { //通過類訪問。 Person::cont = 10; //通過物件訪問。 Person p("sd", 33, 60); cout << p.cont << endl; return; }int main() { dofun(); return 0; }
靜態成員函式
#if 0 #include <iostream> #include <string> using namespace std; /*編譯器在編譯一個普通成員函式時,會隱式地增加一個形參 this, 並把當前物件的地址賦值給 this,所以普通成員函式只能在建立物件後通過物件來呼叫,因為它需要當前物件的地址。 而靜態成員函式可以通過類來直接呼叫,編譯器不會為它增加形參 this,它不需要當前物件的地址,所以不管有沒有建立物件,都可以呼叫靜態成員函式。 */ /*普通成員函式有 this 指標,可以訪問類中的任意成員; 而靜態成員函式沒有 this 指標, 只能訪問靜態成員(包括靜態成員變數和靜態成員函式)*/ /* 所有物件共享同一個函式 只能訪問靜態成員變數 */ class Person { public: static void getcount() { age = 22;//靜態函式內部能訪問 //score = 60;//非靜態變數不能被訪問,因為靜態獨佔記憶體。 cout << "Static func" << endl; } static int age;//靜態變數 int score;//非靜態變數 }; int Person::age = 0; void dofun() { //1.類訪問 Person::getcount(); //2.物件訪問 Person p; p.getcount(); return; } int main() { dofun(); return 0; } #endif // 0
成員變數和成員函式分開儲存
#if 0 #include <iostream> using namespace std; /* Person p */ /*1. cout << "空類物件佔用記憶體:" << sizeof(p) << endl; 佔1位元組,C++為區分空間物件位置所以分配一份空間 */ class Person { }; /*2. cout << "空類物件佔用記憶體:" << sizeof(p) << endl; 4位元組。int age屬於類物件中的資料 */ class Person2 { int age; }; /*3. cout << "空類物件佔用記憶體:" << sizeof(p) << endl; 4位元組。函式成員不屬於類物件中的資料。 */ class Person3 { int age; void func() {}; }; void Enter() { Person p; } int main() { Enter(); return 0; } #endif // 0
常函式和常指標
#include <iostream> using namespace std; /*如果一個成員函式中沒有呼叫非常量成員函式, 也沒有修改成員變數的值,那麼將其寫成常量成員函式 */ class Person { public: void func() const//1.常函式 { //age = 10;//常函式內部不能訪問this->age。 score = 60;//常變數,只有常函式可以訪問 cout << score << endl; } int age; mutable int score; //常變數,只有常函式可以訪問 }; int main() { const Person p1;//常物件只能呼叫常函式 p1.func(); Person p; p.func(); return 0; }
This指標
#if 0 #include <iostream> using namespace std; /*this 是一個指標,它指向當前物件,通過它可以訪問當前物件的所有成員。 要用->來訪問成員變數或成員函式。 理解成python中的self。 */ class Person { public: int age; Person(int age) { this->age = age;//this指向當前類中的age }; }; int main() { Person p(18); cout << p.age << endl; return 0; } #endif // 0