常数据成员

  • 值在程序运行期间不可变
  • 定义格式:
    const 类型 数据成员名称;
  • 初始化:只能通过构造函数中的初始化列表进行

常成员函数

  • 不能修改对象成员值的函数
  • 定义格式:
    类型 成员函数名称(参数列表) const;
  • 常成员函数不能调用类中非常成员函数
  • 静态成员函数不能定义为常成员函数
  • 如果对象为常量,则只能调用其常成员函数

静态数据成员

静态数据成员只有一份,由该类所有对象共享

  • 声明格式:
    static 类型 静态数据成员名称;
  • 仅声明,不在对象上分配空间
  • 定义格式:
    类型 类名称::静态数据成员名称 = 初始值;
  • 必须在外部初始化,初始化动作与访问控制无关

静态成员函数

  • 在类而不是对象上调用
  • 目的:访问类的静态数据成员,若要访问类的非静态数据成员,必须指定对象或者使用指向对象的指针(静态成员函数没有缺省的this指针)
// 类声明
class A
{
public:
static int f();
static int g( const A & a );
private:
static int count;
int num;
};

// 类定义
int A::count = 0;
int A::f()
{
return count;
}
int A::g( const A & a )
{
return a.num;
}

静态常数据成员

  • 值在程序运行期间不可变,且只有唯一副本
  • 声明格式:
static const 类型 数据成员名称;
  • 定义格式:需在类外定义
  • 初始化:可以在类内声明时初始化(只允许对整形常量在类内设定初值,且可能某些旧式编译器不支持),也可以在类外定义时初始化
class A
{
private:
static const int count;
};
const int A::count = 10;
//or
class A
{
private:
static const int count = 10;
};
const int A::count;

友元函数和友元类

  • 慎用->会破坏类的数据封装和信息隐藏
  • 类的友元可以访问该类对象的私有与保护成员
  • 友元可以是函数、其他类成员函数,也可以是类
  • 定义格式:
friend 函数或类声明;
  • 两个类的友元关系不可逆,除非互为友元
  • 友元没有访问控制,所以不需要public private protect等修饰,修饰了也都一样
class Circle
{
friend double Get_Radius();
friend class Globe; // 将Globe类所有成员函数声明为友元
private:
double radius;
};