zoukankan      html  css  js  c++  java
  • 【C/C++语法外功】类的静态成员理解

    例1  孙鑫視頻學習  Oct.27th 2009  Skyseraph

    例子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!"<<endl;

    }

    static void output2()

    {

    //y1 =0;                                //知识点6:静态成员函数中不可以调用非静态数据成员

    //y2 =0;                                //知识点2:静态数据成员必须初始化,且必须在类外初始化

    cout<<"I am a static member function"<<endl;

    }

    //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"<<endl;

    }*/

    int main(char argc,char** argv)

    {

    cout<<"通过对象访问"<<endl;

    point a,b;

    a.output1();

    a.output2();

    point*c; //基础: 待议~~

    c->output1();

    c->output2();

    cout<<"通过类名直接访问"<<endl;

    //point::output1();                        //知识点1:静态成员用类名或对象访问,非静态成员用对象访问 //错误

    point::output2();

    //cout<<a.x1<<endl; //基础:访问私有类  //错误

    cout<<a.y2<<endl;   //知识点3:类的静态数据成员被所有类的对象共享

    //cout<<b.x1<<endl;

    cout<<b.y2<<endl;

    return -1;

    }

    SkySeraph Oct.28th 2010 HQU

    Author:         SKySeraph

    Email/GTalk: zgzhaobo@gmail.com    QQ:452728574

    From:         http://www.cnblogs.com/skyseraph/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,请尊重作者的劳动成果。

  • 相关阅读:
    洛谷P1710 地铁涨价
    洛谷P1371 NOI元丹
    洛谷P2409 Y的积木
    洛谷P3392 涂国旗
    洛谷P3370 【模板】字符串哈希
    洛谷P3379 【模板】最近公共祖先(LCA)
    洛谷P3372 【模板】线段树 1
    洛谷P3373 【模板】线段树 2
    Android(java)学习笔记31:泛型高级之通配符
    Android(java)学习笔记30:泛型接口的概述和使用
  • 原文地址:https://www.cnblogs.com/skyseraph/p/1865277.html
Copyright © 2011-2022 走看看