`

c++静态成员小结,c++,static

 
阅读更多

类中的静态成员真是个让人爱恨交加的特性。我曾经在面试时,被主考官抓住这个问题一阵穷追猛打,直把我问的面红耳赤,败下阵来。所以回来之后,我痛定思痛,决定好好总结一下静态类成员的知识点,以便自己在以后面试中,在此类问题上不在被动。
静态类成员包括静态数据成员和静态函数成员两部分。

一 静态数据成员:

类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点:

1.静态数据成员的定义。
静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。
其定义方式与全局变量相同。举例如下:

xxx.h文件
class base{
private:
static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
};

xxx.cpp文件
const int base::_i=10;//定义(初始化)时不受private和protected访问限制.

注:不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

2.静态数据成员被 类 的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。举例如下:
class base{
public :
static int _num;//声明
};
int base::_num=0;//静态数据成员的真正定义

class derived:public base{
};

main()
{
base a;
derived b;
a._num++;
cout<<"base class static data number _num is"<<a._num<<endl;
b._num++;
cout<<"derived class static data number _num is"<<b._num<<endl;
}
// 结果为1,2;可见派生类与基类共用一个静态数据成员。

3.静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。举例如下:
class base{
public :
static int _staticVar;
int _var;
void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员
void foo2(int i=_var);//错误,_var为普通数据成员
};

4.★静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。举例如下:

class base{
public :
static base _object1;//正确,静态数据成员
base _object2;//错误
base *pObject;//正确,指针
base &mObject;//正确,引用
};

//neiloid 注: 这个原因应该是因为指针,引用都有固定大小的空间,所以可以这样分配。而静态成员为什么也可以呢??这个还需要查一下!

5.★这个特性,我不知道是属于标准c++中的特性,还是vc6自己的特性。
静态数据成员的值在const成员函数中可以被合法的改变。举例如下:

class base{
public:
base(){_i=0;_val=0;}

mutable int _i;
static int _staticVal;
int _val;
void test() const{//const 成员函数

_i++;//正确,mutable数据成员
_staticVal++;//正确,static数据成员
_val++;//错误

}
};
int base::_staticVal=0;

二,静态成员函数
静态成员函数没有什么太多好讲的。

1.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。举例如下:
class base{
static int func1();
int func2();
};

int (*pf1)()=&base::func1;//普通的函数指针
int (base::*pf2)()=&base::func2;//成员函数指针


2.静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

3.静态成员函数不可以同时声明为 virtual、const、volatile函数。举例如下:
class base{
virtual static void func1();//错误
static void func2() const;//错误
static void func3() volatile;//错误
};


最后要说的一点是,静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问

分享到:
评论

相关推荐

    C++静态成员函数与静态成员变量小结

    "C++静态成员函数与静态成员变量小结" 静态成员在C++中扮演着重要的角色,包括静态数据成员和静态函数成员两部分。静态成员是指在类体中使用static修饰符声明的成员,可以直接使用类名+静态成员名访问该静态成员。...

    c++静态成员使用实例

    在C++编程语言中,静态成员是一个非常重要的概念,它为类提供了一种共享数据和功能的方法。静态成员不依赖于任何对象实例,而是属于类本身。本篇将通过两个实例——静态成员函数和静态数据成员,深入探讨它们在C++中...

    C++静态成员函数小结

    C++静态成员函数小结 静态成员函数是C++中一个非常重要的概念,特别是在类设计和对象编程中。静态成员函数可以分为两部分:静态数据成员和静态函数成员。 一、静态数据成员 静态数据成员是类中的全局变量,它们...

    C++静态成员变量和静态成员函数

    ### C++静态成员变量与静态成员函数详解 #### 静态成员变量 在C++中,静态成员变量是类的一个特殊成员,它被所有该类的对象所共享。这意味着无论创建多少个对象,静态成员变量都只有一个副本存在于内存中。 **...

    C++类与对象:static静态数据成员静态成员函数.doc

    ### C++类与对象:static静态数据成员与静态成员函数详解 #### 静态成员函数:类的公共工具箱 在C++编程语言中,类的**静态成员函数**扮演着一种特殊的角色,它既不属于任何特定的对象实例,而是整个类的属性。...

    C++ 静态成员变量 嵌套类分配回收内存

    在深入探讨"C++ 静态成员变量与嵌套类的内存分配回收"这一主题之前,我们首先需要理解几个核心概念:静态成员变量、嵌套类以及它们在内存管理中的角色。 ### C++中的静态成员变量 静态成员变量是类的一个特性,它...

    C++静态成员函数的说明及使用

    C++中的静态成员函数是一种特殊类型的成员函数,它不依赖于类的实例存在,而是直接与类本身相关联。在理解和使用静态成员函数时,有以下几个关键知识点: 1. **定义**: 静态成员函数的定义与普通成员函数不同,...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    关于C++静态成员函数访问非静态成员变量的问题

    当我们讨论"关于C++静态成员函数访问非静态成员变量的问题"时,我们需要深入理解这两种类型的成员函数的工作原理。 首先,静态成员函数是属于类的,而不是类的实例或对象。这意味着它们可以在没有创建任何对象的...

    详解c++ 静态成员变量

    C++中的静态成员变量是一种特殊的成员,它们不与任何特定的对象实例相关联,而是属于类本身。静态成员变量的声明通常在类定义内部,而定义和初始化则需要在类的外部进行,这是因为它们的生命周期贯穿整个程序,而...

    C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...

    面向对象c++静态成员的使用

    ### 面向对象C++静态成员的使用 在C++编程语言中,静态成员是类的一个重要特性,它能够帮助我们实现某些特定的功能,比如跟踪类实例的数量、共享资源等。下面我们将通过一个具体的例子来详细了解静态成员的定义、...

    C++静态成员和友元, 喜欢的可以下

    C++静态成员和友元 C++中的静态成员和友元是两个重要的概念,它们在编程中扮演着重要的角色。 一、静态成员 静态成员是指所有类对象公有的成员变量或函数,它们可以被所有类对象共享。静态成员的定义和使用方式有...

    C++静态成员函数访问非静态成员的几种方法

    大家都知道C++中类的成员函数默认都提供了this指针,在非静态成员函数中当你调用函数的时候,编译器都会“自动”帮你把这个this指针加到函数形参里去。当然在C++灵活性下面,类还具备了静态成员和静态函数,即 ...

    C++静态成员函数不能调用非静态成员变量(详解)

    在C++编程语言中,静态成员函数和非静态成员函数有着显著的区别,这些差异主要体现在它们的作用域、存储方式以及如何访问类的成员。本文将深入探讨为什么C++的静态成员函数不能调用非静态成员变量,并通过示例进行...

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

    ### C++类中的静态成员变量和静态成员函数的作用 #### 静态成员变量与静态成员函数概述 在C++编程语言中,类是面向对象编程的基础,它允许程序员定义包含数据成员(变量)和成员函数(方法)的复合数据类型。其中...

    全局数据管理—使用C++类的静态成员取代全局数据

    为了解决这些问题,C++引入了静态成员的概念,它提供了一种更安全、更可控的方式来管理全局数据。 静态成员分为静态数据成员和静态成员函数。在标题“全局数据管理—使用C++类的静态成员取代全局数据”中,重点在于...

    吕鑫:【C++语法与数据结构第06天】【第3堂课】静态成员变量与静态成员函数(面试题)

    1、讲解static静态局部变量的原理与特点; 2、讲解static静态全局变量的原理与特点; 3、讲解static静态成员变量的原理与特点; 4、讲解static静态成员函数的原理与特点;

    C++静态成员

    ### C++中的静态成员 #### 一、静态成员的基本概念 在C++中,静态成员是一种特殊的成员,它不属于任何特定的对象实例,而是属于整个类。这意味着无论创建多少个类的实例,静态成员都只有一份拷贝。静态成员包括...

    C++ 中静态成员函数与非静态成员函数的区别

    C++ 中静态成员函数与非静态成员函数的区别 在 C++ 编程语言中,静态成员函数和非静态成员函数是两种不同的函数成员,它们在类中的定义、访问和使用方式存在着本质的区别。 一、静态成员函数 静态成员函数是类的...

Global site tag (gtag.js) - Google Analytics