天天看点

C++ const 和 static 成员const数据成员const 成员函数static 数据成员static 成员函数

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;
}
           
C++ const 和 static 成员const数据成员const 成员函数static 数据成员static 成员函数

static 成员函数

  • 如果成员函数只访问静态数据成员,那么用哪个对象调用这个函数都没有关系。这样的函数成员可以声明为静态成员函数。
  • 静态成员函数的声明在类定义中,加static 关键字,在类外定义静态成员函数时不需要static 关键字。
  • 静态成员函数可以用成员访问,也可以直接用类名限定函数名调用。
  • 静态成员函数没有默认this 指针,所以不能访问非静态成员,也不能调用非静态成员函数。

继续阅读