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 / const / auto

1. auto 类型的成员变量可以使用默认构造函数初始化 2. const 类型成员变量:如果显示的写出了构造函数,则必须在构造函数中初始化,如果没有写构造函数,则可以正常编译 3.static ...

C++ VS C#(12):函数的重载,类成员的static修饰,属性

C++和C#在函数的重载,类成员的static修饰,属性这三方面的区别
  • norains
  • norains
  • 2011年04月04日 12:07
  • 2884

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

为了能方便访问静态数据成员,C++定义了一种特殊的成员函数来

c++类static成员

c++类的staic成员包含变量和函数两方面,我总是比较健忘,一段时间不写c++,又有点忘记了,总结下会好一些的,staic成员共同的特点是类,不属于任何对象。网上也有好多文章谈论这些,不过今天除了谈...

关于C++中类的static和const成员

1. static成员变量 类的static成员变量,当在头文件中声明后,应该再在类的源文件中定义一下: 如在Test.h中有如下代码: #pragma once class Test { pr...

C++类的const, static 和inline成员函数(变量)

在C++类的声明中包含多个函数或变量的声明或定义。这些函数和变量可以分为以下几类,这几类并不是完全没有交集的,常量成员函数可以是内联成员函数,内联成员函数也可以是常量成员函数: 普通成员函数和变量 ...

c++-类的static成员

有时我们需要一种所有的类对象所共享的成员,例如可以统计类对象的个数:...

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

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

【C++面向对象】类的静态成员函数(static member functions)

一、静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用。而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象。类对象提供this指针给...

C++ 类static 成员的使用

静态成员属于类,但不属于对象所有。例如类A中含有一个静态成员static a,那么所有的A的对象都可以共享a          静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++:类内static成员
举报原因:
原因补充:

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