• 静态数据 成员和静态函数


      一:

    静态数据成员的出现是为了解决这样一类的问题的:让所有的对象共享一个对象。

    比如,现在定义一个银行卡的类,有两个数据成员,money的总数num 和 利率rate。因为rate对于所有的对象是一样的,如果所有的对象

    都有一个rate数据成员(如下面的类),就会使效率降低:

    1 class card{
    2 public:
    3 int num;//总数
    4 int rate;//利率
    5 card (int num,int rate):num(num),rate(rate){}
    6 };

    二:静态数据成员的声明,定义,和访问:

         要在类内部声明,在外部定义和初始化(就像全局对象那样,即使是private的也是这样的),访问的话可以通过对象访问,也可以通过对象的

         指针访问,还可以通过类来访问(因为静态数据成员和静态函数式不属于任何对象的,他是属于类的)

         

    #include<iostream>
    #include<string>
    using namespace std;
    class boy{
        public:
    boy(string name):name(name){cout<<this->name<<endl;}
            ~boy(){}
            static int getnumber()
            {
                num++;
    
                return num;
            }
            string name;
            static int num;
    
    };
    int boy::num=0;//在外面定义和初始化,必须加类型
    int main()
    {
        boy a("abc");
        cout<<boy::getnumber()<<endl;
        boy b("def");
        cout<<b.num<<endl;//静态数据成员的访问时有两种方式
                          //1 通过类来访问 boy::getnumber()
                          //2 通过对象来访问
        cout<<boy::getnumber()<<endl;
    
        //system("pause");
        return 0;
    }

    三:静态函数,非静态函数,的访问问题:

        静态函数只能访问静态数据成员,同时他不能调用非静态函数

       但是非静态函数可以访问静态数据成员和非静态数据成员,同时可以调用静态函数,

       静态函数的访问和静态数据成员的访问差不多。

       

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    class boy{
        public:
    		boy(int a=0):i(a){}//函数后面不要加;
    		int i;
    		static int j;
    	    void mm()
    		{
    			i++;
    			j++;
    cout<<"非静态的"<<i<<endl<<"静态的"<<j<<endl;//非静态函数可以访问静态数据成员和非静态数据成员
    			gg();//非静态函数可以访问静态函数
    		}
    		static void gg()
    		{
    		//	i++; 静态函数不能访问非静态数据成员
    		     ++j;
    			// mm(); 静态函数不能访问非静态函数
    			cout<<"静态的"<<j<<endl;
    
    		}
    
    };
    int boy::j=0;// 外面定义时 不加static 而且要有类型说明
    int main()
    {
    	boy k;
        k.mm();//通过对象访问
        k.gg();
    	boy * p;
    	p=&k;
    	p->gg();//通过指针访问
    	p->mm();
    	boy::gg();//通过类访问
    	system("pause");
    	return 0;
    }
    

      

         四:一些细节:

         静态数据成员可以是本类的类型,非静态数据成员不行

         静态数据成员可以作为函数的参数,但是非静态的不可以。

         静态数据成员和静态函数即使没有对象也可以访问。

         

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    class boy{
    	 static int age;
    	 int num;
        public:
    		 boy(int num):num(num){}//构造函数不能加返回值得类型,包括void
    	void	 get(int i=age){cout<<i<<endl;}//静态数据成员可以作为函数的参数
    	//void     get2(int i=num){cout<<i<<endl;}//普通数据成员不能作为函数的参数
    };
    int boy::age=0;
    class girl{
    	static girl a;//静态数据成员可以使本类的类型
    //	girl b;  但是普通数据成员不可以是本类的类型
    	int age;
        public:
    		girl(int age):age(age){}
    		int get(){return age;}
    		int get2(){return a.age;}
    	
    };
    girl girl::a(2);// 虽然是priveat的,但还是在外面定义,并初始化,注意初始化
    class mm{
          public :
    		static  mm a;
    		mm(int age):age(age){}
    	    int age;
    };
    mm  mm::a(2);
    int main()
    {
    	boy a(2);
    	a.get();
    	girl b(3);
    //	cout<<b.age<<endl;//private的不能访问
    	cout<<b.get()<<endl;
    cout<<b.get2()<<endl;//同理 static 也有private  protect     public之分只有public类型的可以访问
    	//cout<<girl::a.get()<<endl;  private不能访问
    	cout<<mm::a.age<<endl;//静态成员 即使还没有对象也可以访问 
    	system("pause");
    	return 0;
    }
    

      

        

  • 相关阅读:
    mui中slider的上拉刷新下拉加载
    Ubuntu桌面版忘记密码
    RabbitMQ环境搭建
    .net core读取appsettings.json的配置
    .net core实现efcore增删改查
    .net core使用EFCore
    SQL nullif函数
    .net core项目IIS发布步骤
    .net core使用Session的方法
    js向数组指定位置插入一个对象
  • 原文地址:https://www.cnblogs.com/cs1003/p/2810354.html
Copyright © 2020-2023  润新知