C++中的类静态成员和静态成员函数

(1)为什么需要类静态成员?

有时候某个类的多个对象需要访问一个全局对象,在这种情况下“提供一个全局对象”比“每个类都维持一个独立的数据成员”要更为有效。而类静态成员与全局变量相比,又有两点好处:(a)不存在与程序中其他全局名字冲突的可能性;(b)可设置为private,实现信息隐藏。

(2)类静态成员的特点

对于非静态数据成员,每个类对象都有自己的拷贝,而静态数据成员对每个类类型只有一个拷贝。由于静态数据成员分配在全局数据区,因此在程序开始运行时就必须存在,故静态数据成员的空间分配和初始化不可能在main函数或其他函数中完成(因而在局部类中也不允许出现静态数据成员)。这样一来,静态数据成员的空间分配和初始化只可能有以下三种途径:(a)类的头文件:这里有类的声明。但存在一个无法回避的问题:对于静态数据成员,在程序中也只能存在一个定义,而类的头文件可能被重复引用而出现重复定义;(b)main函数前的全局数据声明和定义处:这种方法也有问题,每一个使用该类的程序都必须在此处定义一下该类的静态成员,这是不现实的;(c)类定义的内部实现:这是最为理想的方式,引用时只需包含头文件即可。

#include "account.h"
double Account::_interestRate = 0.05

(3)类静态成员的定义

在对静态数据成员进行定义时有以下几点注意事项:(a)在类定义之外定义时,静态成员的名字必须被其类名限定修饰,前不可再添加static;(b)像int等有序类型的静态数据成员可在类定义中初始化,但仍需在类定义外进行定义,但此时已不能指定初始值;

// 头文件
class Account
{
// ...
private:
static const int nameSize = 16;
static const char name[nameSize];
};
// 文本文件
const int Account::nameSize; // 必需的成员定义,此处不可再进行初始化
const char Account::name[nameSize] = "Saving Account";

(4) 类静态成员的访问:

在类的成员函数中可以直接访问该类的静态数据成员,而在非成员函数中可使用成员访问操作符或类名限定修饰的方式进行访问。

(5)静态成员函数:

静态成员函数无法访问属于具体类对象的非静态数据成员,也无法访问非静态成员函数,他只能访问静态数据成员和调用其余的静态成员函数。这样一来,就能防止类的非静态数据成员遭受窜改。静态成员函数没有this指针,任何在静态成员函数中显式或隐式地引用这个指针都将导致编译时刻错误。

时间: 2024-07-28 17:45:44

C++中的类静态成员和静态成员函数的相关文章

MFC中常用类、宏、函数的简单介绍

闲来无事,整理了一下MFC中常用的类.宏.函数. 常用类 CRect:用来表示矩形的类,拥有四个成员变量:top left bottom right.分别表是左上角和右下角的坐标.可以通过以下的方法构造: CRect( int l, int t, int r, int b ); 指明四个坐标 CRect( const RECT& srcRect ); 由RECT结构构造 CRect( LPCRECT lpSrcRect ); 由RECT结构构造 CRect( POINT point, SIZE

C++中模板类使用友元模板函数

在类模板中可以出现三种友元声明:(1)普通非模板类或函数的友元声明,将友元关系授予明确指定的类或函数.(2)类模板或函数模板的友元声明,授予对友元所有实例的访问权.(3)只授予对类模板或函数模板的特定实例的访问权的友元声明. (1)普通友元: template<class T> class A{    friend void fun(); //... };此例中fun可访问A任意类实例中的私有和保护成员 (2)一般模板友元关系 template<class type> class

为什么在构造方法中无法操作此类的静态成员

问题描述 为什么在构造方法中无法操作此类的静态成员 这是代码的一部分public static String Txt; public ChatView(){ setLayout(null); Send.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //实现发送// String str=InputArea.getText(); 可以赋给str// Txt=str; 无法赋

如何在派生类中的隐藏基类的虚拟重载函数

我创建了一个类,基类中有虚拟重载函数.我想在派生类中改写基类中的虚拟重载函数.代码如下: #include <iostream.h>class B {private: int nNumber;public: virtual void test() { cout << "B::test()\n"; } virtual void test(int x) { nNumber = x; // 将传入的参数赋值给私有成员 cout << "B::te

基于Java中Math类的常用函数总结_java

Java中比较常用的几个数学公式的总结: //取整,返回小于目标函数的最大整数,如下将会返回-2 Math.floor(-1.8): //取整,返回发育目标数的最小整数 Math.ceil() //四舍五入取整 Math.round() //计算平方根 Math.sqrt() //计算立方根 Math.cbrt() //返回欧拉数e的n次幂 Math.exp(3); //计算乘方,下面是计算3的2次方 Math.pow(3,2); //计算自然对数 Math.log(); //计算绝对值 Mat

Python中的对象,方法,类,实例,函数用法分析_python

本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. 复制代码 代码如下: class Foo(object):     static_attr = True     def method(self):         pass foo = Foo() 这段代码实际上创造了两个对象,Foo和foo.而Foo同时又是一个类,foo是这个类的实例. 在C++里类型定义是在编

成员函数-c++中关于类中的函数一些疑问

问题描述 c++中关于类中的函数一些疑问 1.网上看见两种说法,一个是函数放在code area 另一个是instruction area 请问两者一样吗,还是有什么区别 2.创建的对象中是不是有一个指针指向放在那个area的函数,那么函数在那个区域又是怎么存放的呢 3.使用拷贝构造函数的时候,怎么把成员函数拷贝过去,构造函数也要拷贝过去吗 4.创建对象用的是构造函数,那么对象创建好了之后,对象所在的内存中还有构造函数吗(就是说对象还可以使用够早函数吗) 5.还有我想知道,类的域 就是四个点,在

c++-求教QT中一个类的函数怎样才能调用另一个类的函数

问题描述 求教QT中一个类的函数怎样才能调用另一个类的函数 在fivescene.h文件中已经声明class FiveScene : public QWidget: 然后UI中的Widget也是服从这个类的调用: 我想在让mainwndow.h(头文件中已经include)负责整个界面上的按钮的操作,然后有个重新开始的按钮clicked(),我希望使得Widget界面清空: 但在实际操作中,并没有调用到FiveScene类下面的init()函数,求教应该怎么变动 (编译已通过,部分相关代码如下)

AJAX中JavaScript类的三种成员

ajax|javascript 实现类的公有成员 前面定义的任何类成员都属于公有成员的范畴,该类的任何实例都对外公开这些属性和方法. 实现类的私有成员 私有成员即在类的内部实现中可以共享的成员,不对外公开.JavaScript中并没有特殊的机制来定义私有成员,但可以用一些技巧来实现这个功能. 这个技巧主要是通过变量的作用域性质来实现的,在JavaScript中,一个函数内部定义的变量称为局部变量,该变量不能够被此函数外的程序所访问,却可以被函数内部定义的嵌套函数所访问.在实现私有成员的过程中,正

编程-java中在类定义里能实例化本类的对象吗?

问题描述 java中在类定义里能实例化本类的对象吗? 我在一本书上看到这个,这里的内容试讲java的构造方法私有化的 class Singleton { Singleton instance=new Singleton(); private Singleton() {} public void print() { System.out.println("Hello World"); } } 这个我想请教一下,为什么这里能在类定义里实例化本类的对象? 这里还列出了另一种方式: class