例1 孙鑫視頻學習 Oct.27th 2009 Skyseraph
成都网站制作、网站建设、外贸网站建设介绍好的网站是理念、设计和技术的结合。创新互联拥有的网站设计理念、多方位的设计风格、经验丰富的设计团队。提供PC端+手机端网站建设,用营销思维进行网站设计、采用先进技术开源代码、注重用户体验与SEO基础,将技术与创意整合到网站之中,以契合客户的方式做到创意性的视觉化效果。
例子1.0
#include "iostream"
class Point
{
public:
void output() {}
static void init() {} //静态函数,不属于某个具体的对象,即在未产生Point任何对象时,这个类已经存在于程序的代码区
}
void main()
{
/*法一
Point pt; //构造对象
pt.init();
pt.output();
*/
//法二
Point::init();/
Point::output();//错误
}
说明:法一正确;法二执行错误,原因:
//静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间,故可以用类名::函数名或类名:变量名来访问;
//而非静态成员函数和非静态成员属于对象的方法和数据,也就是应该先产生类的对象,然后通过类的对象去引用。
修改1.1:
class Point
{
public:
void output() {}
static void init() {x=0;y=0;}
private:
int x,y;
}
void main()
{ Point::init();//错误:在静态成员函数中不能调用非静态成员
}
说明:在静态成员函数中不能调用非静态成员(静态成员函数和静态成员变量);反之在非静态成员函数中可以调用静态成员,可以在修改void output(){ init(); };检验
内存模型:无论采取什么样的操作,程序代码都是在内存中执行的,只有在内存中占有一席之地,我们才能访问它。
修改1.2
在int x,y;前加static,编译无错,链接时出错
说明:对于静态成员变量,必须对其进行初始化,且必须在类外进行此操作
加上:int Point::x=0;int Point::y=0; OK!
例2 自编小程序 再次理解static Oct28th 2010 skyseraph
#include "iostream"
using namespace std;
class point
{
public:
void point::output1()
{
x1 =0;
x2 =0; //知识点7:非静态成员函数中可以调用静态数据成员
cout<<"I am not a static member function!"< } static void output2() { //y1 =0; //知识点6:静态成员函数中不可以调用非静态数据成员 //y2 =0; //知识点2:静态数据成员必须初始化,且必须在类外初始化 cout<<"I am a static member function"< } //void output3(int data=x1) {} //知识点5:静态数据成员可以作为成员函数的默认参数,而非静态成员函数不可以 void output4(int data=x2){} //static void output() const; //知识点9:静态成员函数不能使用const关键字 //point a1; static point a2; //知识点4:在定义类成员时,静态数据成员允许定义类的所属对象,非静态数据成员只能是当前类的指针或引用类型 point *a3; public: int y1; //y1=0 基础:不能直接对类的数据成员初始化 static int y2; private: int x1; static x2; }; int point::x2=1; //知识点2:静态数据成员必须初始化,且必须在类外初始化 int point::y2=1; /* //问题:加上这段,编译始终不能通过,不知什么地方出现了问题,待议~ void output2() //基础:对于方法/类的成员函数 的定义可以放在类中或者类外 //知识点8:在定义静态成员函数时,如果是在类外实现,那么不能再加static关键字 { //y1 =0; //知识点6:静态成员函数中不可以调用非静态数据成员 //y2 =0; //知识点2:静态数据成员必须初始化,且必须在类外初始化 cout<<"I am a static member function"< }*/ int main(char argc,char** argv) { cout<<"通过对象访问"< point a,b; a.output1(); a.output2(); point*c; //基础: 待议~~ c->output1(); c->output2(); cout<<"通过类名直接访问"< //point::output1(); //知识点1:静态成员用类名或对象访问,非静态成员用对象访问 //错误 point::output2(); //cout< cout< //cout< cout< return -1; }
本文标题:【C/C++语法外功】类的静态成员理解
文章位置:http://lswzjz.com/article/jhjppp.html