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 = 1;*q = 3;
p = &b; c = 4; // *p = 2; *q = 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 指针,所以不能访问非静态成员,也不能调用非静态成员函数。