const数据成员
定义一个常量,企图修改这个值会导致编译错误,必须在定义时初始化。 不允许将const 地址赋值给非const 指针。 const 指针指向const 对象时,本身地址不能变,但是指向的地址可以变化。 const 指针指向非const 对象时,指向的地址不能变,但是指向对象的值可以变。
int main ( )
{
int const a = 1 , b = 2 ;
int c = 3 ;
int const * p = & a, * q = & c;
p = & b; c = 4 ;
return 0 ;
}
const 成员函数
一个类的对象也可以用const 限定为常量。 只有声明为const 的成员函数才可以被const 对象调用。 声明const 成员函数的形式:
返回类型\quad 成员函数名(参数表) const; 定义const 成员函数形式:
返回类型\quad 成员函数名(参数表) const { 函数体 } const 成员函数不能修改类的数据成员,也不能调用其他非const 成员函数。 其他成员函数可以调用const 成员函数。 const 成员函数隐含的this 指针是const X*
class X {
int m;
public:
X ( int v = 0 ) : m ( v) { }
void set ( int v) { m = v; }
int get ( ) const { return m; }
} ;
int main ( )
{
const X b ( 5 ) ;
cout<< b. get ( ) << endl;
return 0 ;
}
static 数据成员
类的静态数据成员在整个类中只有一份,被这个类的所有对象所共同访问。从逻辑上讲,静态成员属于类,非静态成员属于对象。 静态数据成员没有进入程序的全局作用域只是在类的作用域中。 静态数据成员存放于静态存储区,由类所有对象共享,生命周期不依赖于对象。 由于static 数据成员不是某个特定对象的,因而不能在构造函数中初始化,应该在类定义之外初始化。初始化时要使用类名限定,但是不用出现static关键字。
静态数据成员的访问
成员访问运算符“ . ”或“ -> ”,通过对象或指针访问。 直接用类名字限定的静态成员名字访问。
#include <iostream>
using namespace std;
class X{
static int count;
int m;
public:
X ( int mm = 0 ) { count++ ; m = mm; }
X ( const X& a) { count++ ; m = a. m; }
~ X ( ) { count-- ; }
int getCount ( ) { return count; }
} ;
int X: : count = 0 ;
int main ( )
{
X a ( 5 ) , b;
X c = a;
cout<< "a.count=" << a. getCount ( ) << " b.count=" << b. getCount ( ) << endl;
X d = b;
cout<< "count变为" << a. getCount ( ) << endl;
return 0 ;
}
static 成员函数
如果成员函数只访问静态数据成员,那么用哪个对象调用这个函数都没有关系。这样的函数成员可以声明为静态成员函数。 静态成员函数的声明在类定义中,加static 关键字,在类外定义静态成员函数时不需要static 关键字。 静态成员函数可以用成员访问,也可以直接用类名限定函数名调用。 静态成员函数没有默认this 指针,所以不能访问非静态成员,也不能调用非静态成员函数。