C++:类内static成员

原创 2015年07月07日 20:53:59

static成员是与类相关的,而不是与类的各个对象保持关联。

实际上,这在一定程度上减少了资源开销。

想象类内某const int size,每个对象的值都应当是相同的,如果单纯的将其定义为const成员,那么每一个对象都会有一个size的副本,浪费资源。

由于类内static是整个类的所有对象共享,所以它没有this指针

由于是类内static,所以static也会有不同的访问权限。

public static

static data and static function

这种用法并不常见,看下面的例子:

`#include <iostream>
using namespace std;
class Test
{

public:
    static int x;
    static void fun(){
        cout << "Calling public static function fun()" << endl;
    }
};

int Test::x = 10;//类内声明,类外定义

int main()
{
    Test test;

    cout << Test::x << endl;
    cout << test.x << endl;
    test.fun();
    Test::fun();
    return 0;
}

其中x和fun()是static成员,访问权限是public。这意味着该类的对象从类外即可轻松访问x和fun()。
注意这里强调,static function 是没有this指针的,所以test.fun()实际上只是通过test调用了Test类的fun(),和test并无关系。
test.x同理。
可见这种调用方式可能会产生歧义,因此更建议使用ClassName::static data的调用方式。

private static

private static是最为常用的方式。
因为访问权限是static,所以有很好的封装性。对于类内经常用到的操作,可以将其抽象成一个工具函数(tool function)方便使用
,因为这个tool function是属于整个类的,因此将其编写为static更能节省空间。

#include <iostream>
using namespace std;

class Test
{
private:
    static int maxSize;
    static void toolFunction();//do something in the class
public:
    static void accessMaxSize(); 
};
int main()
{
    Test test;

    return 0;
}

maxSize是private data,那么以前的test.maxSizeTest::masSize这两种用法都不能访问maxSize
对于这种数据想要完成访问操作,需要定义一个public static method,正如类中的static void accessMaxSize()

static const 成员

这里是比较容易弄混的地方,看下面这个例子。

#include <iostream>
using namespace std;

class Test
{
private:
    static const int maxSize = 5;
    int array[maxSize];
public:
    Test(){
    cout << &maxSize << endl;
    }

};

int main()
{
    Test test;

    return 0;
}

Test类中声明了一个static const int maxSize,并且赋予初值,作为成员array[]的长度参数,直到这里一切都OK,但是
你会发现,上述代码无法通过编译。

编译器提示
**undefined reference toTest::maxSize’|**`

使用未定义的成员?
等等?我们不是给予了初值了吗?
实际上,如果去掉上述代码的构造函数部分的cout << &maxSize << endl;语句编译器就会开心的放你通过。

这很奇怪,为什么对maxSize取地址编译器就报错呢?
这意味着编译器没有给maxSize分配空间,也就是说,maxSize未定义!

Effective C++ 是这样解释的:

我们看到的static const int maxSize = 5是一个声明式而非定义式。c++要求对任何一个东西提供定义式,但是如果是class专属常量且为static且为integral(ints,chars,bools),则需特殊处理,只要不取它的地址,编译器一切都ok。

最好的解决办法是,在类外提供一个定义式

const int Test::maxSize;

需要注意的是,不要const int Test::maxSize = someValue,即便这个someValue是5也不可以,编译器会提示

error: duplicate initialization of 'Test::maxSize'|

触发重定义错误。

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++static类成员,static类成员函数

1.static类成员 在C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何...
  • u014453898
  • u014453898
  • 2017年03月20日 14:33
  • 590

c++类模板遇上static关键字

前言:  在c++中我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。如...
  • ydxlt
  • ydxlt
  • 2016年04月10日 21:42
  • 2545

C++类中的静态数据成员--static

使用静态成员的目的是为了解决数据共享的的问题。
  • lanzhihui_10086
  • lanzhihui_10086
  • 2014年09月08日 17:32
  • 2321

C++ 类中的static成员的初始化和特点

C++ 类中的static成员的初始化和特点在C++的类中有些成员变量初始化和一般数据类型的成员变量有所不同。以下测试编译环境为:gcc version 5.4.0 20160609 (Ubuntu ...
  • men_wen
  • men_wen
  • 2017年03月21日 15:53
  • 807

C++ static、const和static const类型成员变量声明以及初始化

C++ static、const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间。 st...
  • u012543266
  • u012543266
  • 2013年11月03日 22:07
  • 18240

C++ 作用域与生命周期 静态static

1⃣️静态局部变量   作用域不变,生命周期延长至程序运行结束 2⃣️静态全局变量    作用域变小,不能extern引用,生命周期不变 类中的静态成员:成员函数,成员变量都是使用对象来进行调用,...
  • zhanghow
  • zhanghow
  • 2016年10月22日 14:56
  • 437

C++ static成员变量与static成员函数

一 静态数据成员:  类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/priva...
  • pamchen
  • pamchen
  • 2013年03月04日 09:49
  • 1435

关键字static的作用是什么? C++类中的静态成员变量和静态成员函数的作用

本文转自《面试宝典》 1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时,仍维持上次的值;...
  • taotaoah
  • taotaoah
  • 2016年10月17日 22:12
  • 1350

C++类的三种数据成员:常量(const)、静态(static)、普通 的赋值方式

讲解了C++类的三种数据成员【常量(const)、静态(static)、普通】的正确赋值姿势...
  • theusProme
  • theusProme
  • 2017年02月19日 13:18
  • 2012

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分为静态变量、非静态变量两种。 静态成员:静态
  • kerry0071
  • kerry0071
  • 2014年05月14日 18:22
  • 23521
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++:类内static成员
举报原因:
原因补充:

(最多只允许输入30个字)