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

 

posted @ 2021-01-12 20:51  y0um  阅读(175)  评论(0编辑  收藏  举报

新人优惠服务器