(重要)静态成员:

(重要)静态成员:
类的静态成员:声明为static的类成员(成员数据或成员函数)称为类的静态成员。
类静态成员(成员函数)可用类名::静态成员(成员函数)或者对象.静态成员(成员函数)来访问。表示其为类方法。
类静态成员变量必须在类外定义,定义时不加static.
类的静态成员函数没有默认的this指针,因此它里面不能使用任何非静态成员。
static在c++中的第五种含义:用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量

struct ListNode
{
        ListNode(const int& data = int())
        : _pPre(0)
        , _pNext(0)
        , _data(data)
        {}
        ListNode* _pPre;
        ListNode* _pNext;
        int _data;
};
class Test
{
public:
        Test()
        {
               cout << "Test" << endl;
        }
        ~Test()
        {
               cout << "~Test" << endl;
        }
        static int getCount()
        {
               return g_count;
        }
        Test*operator&()
        {
               return this;
        }
        const Test*operator&()const
        {
               return this;
        }
        int& operator*()//返回data
        {
               return _pCur->_data;
        }
        int* operator->()
        {
               return &(operator*());
        }
private:
        static int g_count;
        int a;
        ListNode* _pCur;
};
int Test::g_count = 0;//静态成员变量的定义
int main()
{
        Test t1;
        const Test t2;
        int ret=t1.getCount();
        cout << ret << endl;
        cout << &t1 << endl;
        cout << &t2 << endl;
        system("pause");
        return 0;
}

不能用const的原因:
这是C++的规则,const修饰符用于表示函数不能修改成员变量的值,该函数必须是含有this指针的类成员函数,函数调用方式为thiscall,而类中的static函数本质上是全局函数,调用规约是__cdecl或__stdcall,不能用const来修饰它。一个静态成员函数访问的值是其参数、静态数据成员和全局变量,而这些数据都不是对象状态的一部分。而对成员函数中使用关键字const是表明:函数不会修改该函数访问的目标对象的数据成员。既然一个静态成员函数根本不访问非静态数据成员,那么就没必要使用const了。

什么时候使用静态数据成员和静态函数呢?

  • 定义数据成员为静态变量,以表明此全局数据逻辑上属于该类。
  • 定义成员函数为静态函数,以表明此全局函数逻辑上属于该类,而且该函数只对静态数据、全局数据或者参数进行操作,而不对非静态数据成员进行操作。

  • static的第一种含义:修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。

  • static的第二种含义:修饰局部变量时,表明该变量的值不会因为函数终止而丢失。
  • static的第三种含义:修饰函数时,表明该函数只在同一文件中调用。
  • static的第四种含义:修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。
  • static的第五种含义:修饰类成员函数,如上。

const修饰类成员
const使用的场景:
const修饰形参,一般和引用同时使用:如拷贝构造函数
const修饰返回值。

//const int*p1 = &a;//p1为常量指针,不能通过p1来修改它所指向的内容。
        //int*p2 = p1;//所以该表示错误
            //int const*p1 = &a0
            //int*p2 = p1;//所以该表示错误
            int*const p1 = &a;//p1为指针常量,不能让p1所指向其他的内存模块
            int*p2 = p1;//该表示正确,*p2可以改变*p1的内容
        const如果在*左边,表示指针指向的内容不可修改,const如果在*右边,表示指针本身不可修改。
     const修饰的成员变量必须在函数的初始化列表中初始化。
     const修饰非静态类成员函数实际含有隐藏的this指针,表示在类中不可以对类的任何成员进行修改。
     在const修饰的成员函数中要对类的某个数据成员进行修改,该数据成员定义声明必须加mutale关键字。
class ConClass{
private
:
int idata;
string sdata;
mutable int mdata; //mutable关键字使得该变量在const成员函数中可以被修改
public:
ConClass(int a, string b) {
idata = a;
sdata = b;
}
void print() const{ //const成员函数,只能被常量对象,常量对象的引用或指针调用
cout << idata << " " << sdata << endl;
}
void setData(int _idata, string _sdata) //要修改对象,不能为const成员函数
{
idata = _idata;
sdata = _sdata;
}
void change(int _mdata) const{
mdata = _mdata; //可以修改
}

猜你喜欢

转载自blog.csdn.net/xiaodu655/article/details/81100664
今日推荐