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)

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

时间: 2024-10-24 00:42:10

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

java静态类声明--java类可以声明为static吗

原文:http://www.javaworld.com/article/2077372/learn-java/static-class-declarations.html 为了理解static关键字在类声明中的使用,首先我们需要了解类声明.有两种类,一种是top-level class:一种是inner class. Top-level classes top-level class可以被声明为包成员,每一个top-level类对应于一个文件名与类名相同的java文件. 因为top-level

有些方法为什么会声明称static静态的

有些方法在调用的时候,没有必要都要先实例化一下,只需要:[类名. 静态方法 ]就行了. 哪些方法的调用没有必要实例化呢?网上找了个例子: 举个例子:Car类,1.静态方法Run(),Car.Run(); //访问方式:类.方法(); 静态方法也可以叫做类方法2.非静态方法Color()Car car1 = new Car();car1.Color(); //实例化后才可以访问,具体到某部车才有颜色car1.Run(); //实例化后,也可以访问静态方法,(不推荐)假如想知道你的车是怎么跑得(调用

[C++] static member variable and static const member variable

static member variable[可读可写] 可以通过指针间接修改变量的值 static const member variable[只读] 压根就不可以修改变量的值,会报错

将函数声明为Static的作用

表示静态函数,它为所有类共有的.调用该函数直接使用类名加上修饰符,如:Windows win;Windows::W_SIZE();而不是:win.W_SIZE();静态函数只能处理静态数据成员,不能处理非静态程序,如:class Window{public:static void W_SIZE();private: int a; static int s;}; Window::W_SIZE(){ a = 2; //错误,不能处理非静态成员 s = 1; //正确}

C++中得sort函数的比较函数(第三个参数)为什么要声明为static

sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错. 因为:非静态成员函数是依赖于具体对象的,而std::sort这类函数是全局的,因此无法再sort中调用非静态成员函数.静态成员函数或者全局函数是不依赖于具体对象的, 可以独立访问,无须创建任何对象实例就可以访问.同时静态成员函数不可以调用类的非静态成员. 原文地址:https://www.cnblogs.com/inception6-lxc/p/8446731.html

spring 注解 事务,声明事务共存的情况下,先后顺序

最近在项目中,因为已配置全局声明式事务.不知道是否本来就配得有问题,导致一个多线程插入的方法会因为连接池不够用而导致失败. 就打算试试用注解式事务,然后发现不起作用,就想是不是嵌套事务的问题.然后找到这个哥们的文章,就解决了问题.这里转载一份 转载:http://blog.csdn.net/jeep_ouc/article/details/43056977 COME FROM 首先先看配置文件: <!-- hibernate --> <bean id="sessionFacto

C++: static member have to be defined seperately

如果这样写c++的单例: class Singleton { private: static Singleton * singleton; private: Singleton() { } public: static Singleton *getinstance() { if(singleton == NULL) { Singleton::singleton = new Singleton(); } return singleton; } }; int main() { Singleton *

Virtual Member Functions &amp; Static Member Function

如果一个 normalize() 是一个 virtual member function, 那么以下的调用: ptr->normalize(); 将会被内部转化为: (*ptr->vptr[1])(ptr); 其中:vptr 表示由编译器生成的指针, 指向 virtual table, 它被安插在每一个声明有(或继承自) virtual functinos 的 class object 中. 事实上其名称也会被 mangled, 因为在一个复杂的 class 派生体系中, 可能存在多个 vpt

用static声明的函数和变量小结

static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static告知编译器,自己仅仅在变量的作用范围内可见.这一点是它与全局变量的区别.Tips: A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度: B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度: C.设计和使用访问动态