1. 程式人生 > 實用技巧 >C++中級-(靜態成員和物件丶this指標丶常函式和物件、成員函式和物件)

C++中級-(靜態成員和物件丶this指標丶常函式和物件、成員函式和物件)

類物件作為類成員

#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:
    string
name; 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