static方法 和 const方法

Posted kelamoyujuzhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了static方法 和 const方法相关的知识,希望对你有一定的参考价值。

静态成员

由关键字static修饰说明的类成员,称为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用的内存中。

静态成员又分为静态成员函数,静态成员数据

静态数据

技术分享图片
#include<iostream>
using namespace std;

class Test
{
    friend void fun(Test &t);
public:
    Test(int d=0)
    {
        count++;
        data = d;
    }
    ~Test()
    {
        count--;
    }
private:
    int data;
    static int count;
};

int Test::count = 0;

void fun(Test &t)
{
    cout << "t.data = " << t.data << endl;
    cout << "Object count = " << Test::count << endl;
}

int main()
{
    Test t1(100);
    Test t2(200);
    fun(t1);
}
View Code

技术分享图片

静态成员数据在类外初始化

静态函数

技术分享图片
#include<iostream>
using namespace std;

class Test
{
    friend void fun(Test &t);
public:
    Test(int d=0)
    {
        count++;
        data = d;
    }
    ~Test()
    {
        count--;
    }
    void show1()
    {
        cout << "data = " << data << endl;
        cout << "Object count = " << Test::count << endl;
    }
    static void show2()
    {
        cout << "Object count = " << Test::count << endl;
    }
private:
    int data;
    static int count;
};

int Test::count = 0;

void fun(Test &t)
{
    cout << "t.data = " << t.data << endl;
    cout << "Object count = " << Test::count << endl;
}

int main()
{
    Test t1(100);
    Test t2(200);
    fun(t1);
}
View Code

静态方法只能访问静态变量,不能访问普通变量

普通方法技能访问静态变量,也能访问普通变量

为啥会这样呢?

对于类的普通成员函数,该函数必须经由一个对象去激活(有一个this指针)。

但是这条对于static修饰的成员函数(静态方法)不适用,静态方法没有this指针。我们代码里面访问data,实际上事以this->data这种方式,而静态函数连this都没有,他怎么能访问data呢?

技术分享图片
#include<iostream>
using namespace std;

class Test
{
    friend void fun(Test &t);
public:
    Test(int d=0)
    {
        count++;
        data = d;
    }
    ~Test()
    {
        count--;
    }
    void show1()
    {
        cout << "data = " << data << endl;
        cout << "Object count = " << Test::count << endl;
    }
    static void show2()
    {
        cout << "Object count = " << Test::count << endl;
    }
    void show3()
    {
        show1();
        show2();
    }
    static void show4()
    {
        show2();
    }

private:
    int data;
    static int count;
};

int Test::count = 0;

void fun(Test &t)
{
    cout << "t.data = " << t.data << endl;
    cout << "Object count = " << Test::count << endl;
}

int main()
{
    Test t1(100);
    Test t2(200);
    fun(t1);
}
View Code

静态方法只能访问静态方法,不能访问普通方法

普通方法技能访问静态方法,也能访问普通方法

原因同上

const方法

技术分享图片
#include<iostream>
using namespace std;

class Test
{
    friend void fun(Test &t);
public:
    Test(int d=0)
    {
        count++;
        data = d;
    }
    ~Test()
    {
        count--;
    }
    //void change(Test * const this)  导致this为常量
    void change()
    {
        data--;
        cout << endl;
    }
    //void change(Test * const this)const  演变成
    //void change(const Test * const this)  导致*this 和 this都是常量
    void change()const
    {
        //data--;
        cout << endl;
    }

private:
    int data;
    static int count;
};

int Test::count = 0;

void fun(Test &t)
{
    cout << "t.data = " << t.data << endl;
    cout << "Object count = " << Test::count << endl;
}

int main()
{
    Test t1(100);
    Test t2(200);
    fun(t1);
}
View Code

const常方法限定该函数不能修改类的数据成员

技术分享图片
#include<iostream>
using namespace std;

class Test
{
    friend void fun(Test &t);
public:
    Test(int d=0)
    {
        count++;
        data = d;
    }
    ~Test()
    {
        count--;
    }
    void show1()
    {
        cout << endl;
    }
    void show2() const
    {
        cout << endl;
    }
    //void change1(Test * const this)  导致this为常量
    void change1()
    {
        show1();
        show2();
    }
    //void change2(Test * const this)const  演变成
    //void change2(const Test * const this)  导致*this 和 this都是常量
    void change2()const
    {
        //show1();
        show2();
    }

private:
    int data;
    static int count;
};

int Test::count = 0;

void fun(Test &t)
{
    cout << "t.data = " << t.data << endl;
    cout << "Object count = " << Test::count << endl;
}

int main()
{
    Test t1(100);
    Test t2(200);
    fun(t1);
}
View Code

普通方法能够调用常方法

常方法不能调用普通方法

以上是关于static方法 和 const方法的主要内容,如果未能解决你的问题,请参考以下文章

小胖说事28------iOS中extern,static和const差别和使用方法

php中const和static的区别和联系

static关键字,const常量

php类中的$this,static,const,self这几个关键字使用方法

PHP5中Static和Const关键字

java中static和non static到底区别在哪儿呢?