第11章数据共享和成员特性
2017/12/26
目录
静态成员
友元
成员其他特性
this指针
综合应用实例
2
C++实用教程
如果类的某些属性希望他的所有对象共享,怎么办?
数据共享途径:
途径一:全局变量或全局对象
具有局限性
破坏程序模块结构
属于程序,而不属于类
途径二:静态成员
静态成员
3
C++实用教程
静态成员
静态成员是类中的成员,是类的一部分,在类外不可访问,从而起到保护作用。
静态成员有静态数据成员和静态成员函数之分。
静态数据成员与静态变量相似,具有静态生存期,是在类中声明的全局数据成员,能被同一个类的所有对象所共享。
公有静态成员函数不仅可以通过类对象来访问,还可通过“类名::静态成员函数”的形式在程序中直接调用。
4
C++实用教程
静态数据成员
使用静态数据成员可以节省内存,因为它只存储一处,供所有对象共享。静态数据成员的值是可修改的,但它对每个对象都是一样的。
1. 定义和使用
与静态变量相似,静态数据成员是静态存储(static)的,它必须按下列两个步骤进行:
在类中使用关键字static声明静态数据成员。
在类外为静态数据成员分配内存空间并初始化。
其定义格式如下:
<数据类型><类名>::<静态数据成员名>=<值>
5
C++实用教程
[例Ex_StaticData] 静态数据成员的使用示例
#include <iostream>
using namespace std;
class CSum
{
public:
CSum(int a = 0, int b = 0) // A
{
nSum += a+b;
}
int getSum()
{
return nSum;
}
void setSum(int sum)
{
nSum = sum;
}
private:
static int nSum;
};
int CSum::nSum = 0;
int main()
{
CSum one(10, 2), two;
cout<<"one: sum = "<<()<<endl;
cout<<"two: sum = "<<()<<endl;
(5);
cout<<"one: sum = "<<()<<endl;
cout<<"two: sum = "<<()<<endl;
return 0;
}
6
C++实用教程
2. 几点说明
(1)静态数据成员是类中的成员,它的访问属性同普通数据成员一样,可以为public、private和protected。
(2)静态数据成员的实际定义和初始化本身是不受public、private和protected等访问属性限制的。
(3)静态数据成员可看成是类中声明、类外定义的静态全局变量,具有静态生存期,在程序中从实际定义时开始产生,到程序结束时消失。
(4)当静态数据成员为public时,在类外对该成员的访问和引用可通过对象,也可直接引用。
<类名>::<静态数据成员名>
7
C++实用教程
例:
class CSum
{
//…
public:
Static int nSum;
};
int CSum::nSum=0;
int main()
{
CSum one;
=10;
CSum::nSum=12;
cout<<<<endl;
return 0;
}
8
C++实用教程
静态成员函数
静态成员函数和静态数据成员一样,都属于类的静态成员,但它们都不专属于某个对象,而是所有对象所共享的成员。对公有(public)静态成员函数来说,除可用对象来引用外,也可通过“类名::成员”直接来引用。
在类中,静态数据成员可以被成员函数或静态成员函数所引用。但反过来,静态成员函数却不能直接引用类中说明的非静态成员。
9
C++实用教程
例:
class CSum
{
public:
static void ChangeData(int data)
{
nSum=data; //Error
}
public:
int nSum;
};
CSum::ChangData(5);
静态成员函数只能引用静态数据成员。
10
C++实用教程
ch11 数据共享和成员特性 来自淘豆网m.daumloan.com转载请标明出处.