特殊用途的成员
一、常成员:
1.常数据成员:
在类中定义的不能修改器值的一些数据成员,类似于变量,但是有自己的地址,
一经赋值,不能修改,不同的对象其常数据成员的值可以不同。
-
定义方法:
const 类型 成员
2.常成员函数:
使用const 来保护成员数据不被成员函数改变。
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数
(静态成员函数,构造函数除外)
- 定义:
类型 函数名(参数表)const
- 注意:
const参与函数重载
3.常对象:
对象在初始化后不需要修改值。
- 常对象只能调用:
.常成员函数
.静态成员函数
.构造函数
普通对象既可以调用非常成员函数,也可以调用常成员函数
定义常对象时必须初始化
- 定义:
const 类名 对象名【(参数表)】;
类名 const 对象名【(参数表)】;
二、静态成员:
- 声明为static的类数据成员称做静态数据成员
- 声明为static的类成员函数称做静态成员函数
能在类的范围内共享数据。
-
静态成员不属于某一个单独的对象,而是为类的所有对象所共有
-
根据静态存储的特点:
当对象不存在时,仍可以访问该静态成员。 -
静态成员函数的作用:
为了能处理静态数据成员:保证在不依赖于某个对象的情况下,访问静态数据成员。
- 声明方法: static 类型名 变量名;
-
类的静态数据成员有单独的存储区,不管创建了多少该类的对象,所有对象的静态数据成员共享该存储区,即该类的所有对象维护该成员的同一个拷贝。静态数据成员属于类,在类的范围内有效。
可以是公有或私有 -
静态数据成员的存储空间需单独分配,且只分配一次为静态数据成员分配存储空间称为静态数据成员的定义。
-
不能在成员初始化列表中进行初始化,必须在类外定义和初始化,用(::)来指明所属的类:
类型 类名::静态数据成 [=初始化值] //必须进行声明
-
如果未进行初始化,则编译器自动赋初值(默认值是0)
- sizeof运算符不计算静态成员变量
使用静态数据成员可以节省内存,因为它是所有对象所公有的,
因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。
#include <iostream>
using namespace std ;
class counter
{static int num; //私有静态数据成员
public :
void setnum
( int i) { num=i; }
void shownum(){ cout<< num << '\t' ; }
};
int counter :: num=0 ;
//在类外定义和初始化
int main ()
{ counter a,b ;
a.shownum() ; b.shownum();// 0 0
a.setnum(10) ;
a.shownum(); b.shownum();// 10 10
}
输出结果:
注意:
- 静态成员函数在类外定义时不用static前缀。
- 静态成员函数主要用来访问同一类中的静态数据成员。
- 私有静态成员函数不能在类外部或用对像访问。
- 可以在建立对象之前处理静态数据成员。
- 编译系统将静态成员函数限定为内部连接:与现行文件相连接的其他文件中的同名函数不会与该函数发生冲突,维护了该函数使用的安全性,这是使用静态成员函数的另一个原因。
- 静态成员函数中没有this指针。
- 静态成员函数不能直接访问类中的非静态数据成员。如有需要,可以通过指向对象的指针或对象的引用访问该对象的非静态成员。
三、友元
- 友元是一种定义在类外部的普通函数,能够访问类中的私有成员,
- 作用:提高运行效率
- 缺点:破坏了类的封装性和隐蔽性
- 说明前加关键字friend
- 友元关系不是对称关系也不是传递关系
- 普通函数B声明为类A的友元,在类A体中用friend对其(函数B)进行声明,此函数就称为本类( 类A)的友元函数
- 声明:
friend 类型 B(函数参数)
- 友元函数(函数B)可以访问这个类(类A)的私有成员。