C++:关于class member声明为static的情况
来源:互联网 发布:oracle12c数据库安装 编辑:程序博客网 时间:2024/06/09 21:01
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)
- C++:关于class member声明为static的情况
- python的static class method and member
- template class static member initialize
- Static Member of Derived Class
- class static member 重名问题
- static member variable and static member function in a class
- 关于c++类中的static data member的问题
- static data member in a class
- 不能声明为虚函数的情况
- class声明为final的好处
- 将class声明为final的好处
- C语言的静态变量声明static
- 类中静态变量未定义导致undefined reference to static class member问题的解决方法
- 关于static声明变量
- 指向Class Member的指针
- 关于C/C++中 Class, Struct, enum的定义声明位置
- Reading Effictive java: static member class (SMC) and nonstatic member class(NSC)
- 关于class 和public class声明类的区别
- GDI windows 编程
- Font Include Sass Mixin
- json的用法
- 阿里云服务器架设OA服务器
- 配置hadoop-1.2.1,含三个节点的集群
- C++:关于class member声明为static的情况
- Cocos2d-x3.0自己写的项目编译笔记
- 记录自己的第一个上线项目
- PowerPCB gerber out时*.rep,*.pho,*.drl,*.lst各表示什么意思,在制板时哪些文件是制板商所需要的?
- PAT A 1079. Total Sales of Supply Chain (25)
- 手机打字测速软件简版
- 十四周项目三
- C语言获取文件大小
- 14-2-形状类族的中的纯虚函数(OJ版)