首页 > 代码库 > C++:关于class member声明为static的情况

C++:关于class member声明为static的情况

2014.5.27

reference: C++ primer 5th, $7.6:Static Class Members

TOPIC 1:一个类中的member(data member和function member)可以声明为static,需要申明为static的情况有一下原因:

1:使用的客观需要:需要某个member是associated with the class,not with individual objects(如银行class中的prime interest rate这个member)

2:为了efficiency的考虑:

因为“the static members of a class exist outside any object. ”, “static members will be shared by all the objects”。所以,生成的每个object占用的空间只包含non-static member的空间之和。

3:“Much more importantly”, 如果class需要某个member的值在所有object中“保持同步”,则将这个member声明为static可以使保持同步不会出错。(如将bank类中的prime interest rate声明为static,则当rate改变时,所有object也可以跟着变)

我:感觉1和3都是针对data member的,因为对于function member,各个object一定是同步的?

这就留了一个问题(还不是很清楚,是在看数据结构:Sartaj时产生的,因它声明了static member function):将一个member function声明为static是处于什么目的?

(可能的回答:

网上一篇文章:说因为static member function不传递this,不识别对象个体,所以通常用来对类的静态成员操作)


TOPIC 2:member fuction是static时,会与non-static 的member function在“this”上带来不同

1:一般情况下,member function没有声明为static时,这个member function是associated with object。当调用这个function时(形式:object.func),compiler会传这个object的address给这个函数的implicit parameter:this

但是,当member function是static时,"static member functions are not bound to any object"。所以不会有compiler给它的implicit parameter传递一个地址--》更进一步,“static member function don‘t have a "this" pointer”

(参考材料:7.1.2关于‘this’,7.6,:关于static)


2:因为static member function对于‘this’带来了一些不一样,因此有关‘this’的东西都会发生改变。因此一个直接的改变就是static member function不能声明为const。分析如下:

因为将一个class的member function声明为const产生的实际作用是改变了‘this’这个参数的类型(由default的Sales_data*const类型--》const函数中的constSales_data*const类型)。也即default情况下(没有声明member fucntion为const时),this指针本身不能修改,是const,只能指向object.func中的object。但在const func情况下,this指针不能修改,是const;而且this指向的object也不能通过this来修改(但是在其他地方不用this还是可以修改object)--》简单来说,就是class的member function声明为const是通过‘this’来起作用的。

因此,当class的member function声明为static时,它没有‘this’这个parameter,我们也就不能声明这个static member是const了!

(参考材料:7.1.2关于const与‘this’的关系,7.6,:关于static


TOPIC 3:(未完结,积累中)class的static member在使用上带来哪些不同?

1:对于一个non-static 的member,需要用object.member来调用;

但对于static的member,用class::member来调用。

与此同时,虽然static members不是object的一部分,我们还是可以用object来调用static member,即object.member

(参考材料:7.6)