zoukankan      html  css  js  c++  java
  • C++之Static与Const

    C++之Static与Const

    一、Static定义

    1、Static意为静态成员,若Static修饰的成员位于C++类中,那么Static就实现了同一个类,多个对象共享数据,协调行为的目的。


    2、静态变量具有全局变量的优势,又不会像全变量一样被滥用。C++中用于管理静态变量,就需要用到静态函数。


    3、C++中类的静态成员,属于类,也属于对象,但终归属于类。(比较绕,直接记做属于类)

    1.1、Static变量

    //示例
    #include <iostream>
    using namespace std;
    class A
    {
    	public:
    	static int share;  //Static变量的声明
    };
    int A::share = 5;     //Static变量的初始化
    
    int main()
    {
    	A x;
    	cout<<A::share<<endl;    //方法一:Static变量的调用
    	cout<<x.share<<<<endl;   //方法二:Static变量的调用
    	return 0;
    }
    

    1.2、static静态成员小结

    1、 共享 : static 成员变量实现了同族类对象间信息共享;
    2、 初始化:static 成员使用时必须初始化,且只能类外初始化。声明与实现分离时;只能初始化在实现部分(cpp 部分);
    3 、类大小: static 成员类外存储,求类大小,并不包含在内;
    4、 存储 : static 成员是命名空间属于类的全局变量,存储在 data 区 rw 段;
    5、 访问 :可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

    备注:static静态成员可以被类内的普通函数静态函数都可访问。

    1.2、Static函数

    • C++为了管理静态成员,提供了静态函数,静态函数对外提供接口。并且静态函数只能访问静态成员。
    //示例
    #include <iostream>
    using namespace std;
    class A
    {
    	public:
    	int a;
    	static void foo()
    	{
    		// a = 1; 错误 只能访问静态成员
    		share++;
    	}
    	static int share;
    };
    int A::share = 0;
    
    int main()
    {
    	A a;
    	a.foo();
    	A::foo();
    	return 0;
    }
    

    1.3、static静态函数小结

    1、 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。


    2、 staitc 修饰成员函数,仅出现在声明处,不可在定义处。

    方式一、class A
    {
    	static void fun()
    	{
    		
    	}
    }
    方式二、
    class A
    {
    	static void fun();
    }
    void A:: fun()  //staitc 修饰成员函数不能出现在定义处
    {
    	
    }
    

    3、 静态成员函数只能访问静态数据成员。原因:非静态成员函数在调用时 this指针被当作参数传进。而静态成员函数是属于类,不属于对象,没有 this 指针。

    二、Const

    2.1、Const变量

    1、 const 修饰数据成员,称为常数据成员。常数据成员可被普通成员函数和常成员函数来使用,不可以更改。


    2、const 常数据成员在使用前必须被初始化。也就是定义的同时就要初始化,之后不能再去赋值,只能使用。可以在类中(不推荐),或初始化参数列表中(这是在类对象生成之前唯一一次改变 const 成员的值的机会了)。


    Const单变量初始化

    const int a = 1;
    

    Const变量在类中初始化

    错误示范!!!!!
    #include <iostream>
    using namespace std;
    class A
    	public:
    	void dis()
    	{
    		cout<<data<<endl;
    	}
    	private:
    		const int data;
    };
    当用该类去定义对象时就会显示出错,,提示没有初始化const成员data,且提示data为只读。
    
    错误示范!!!!!
    #include <iostream>
    using namespace std;
    class A
    	public:
    	void A()
    	{
    		data = 100;  //错误的写法
    	}
    	private:
    		const int data;
    };
    const成员位于类中成员时会成为只读属性(只读:不能出现在“=”的左边)。所以也不可以直接在类的构造函数中去初始化const成员。
    
    //当然你也可以把const定义为局部变量,语法OK,但一般一旦定义const都是作为全局的。局部的就和普通局部变量一样了,没有多大意义。
    #include <iostream>
    using namespace std;
    class A
    	public:
    	void A()
    	{
    		const int data = 100;  //正确
    	}
    };
    

    2.2、const变量初始化小结

    const正确初始化方法 --- <采用初始化列表进行初始化>
    1、初始化列表先与本对象的构造函数执行

    2、初始化列表与成员的声明顺序相同的。

    //方法一:
    #include <iostream>
    using namespace std;
    class A
    	public:
    	void A(int i)data(i)
    	{
    		cout<<data<<endl;
    	}
    	private:
    		const int data;
    };
    int main()
    {
    	A a(200);
    	return 0;
    }
    
    //方法二:
    #include <iostream>
    using namespace std;
    class A
    	public:
    	void dis()
    	{
    		cout<<data<<endl;
    	}
    	private:
    		const int data = 100;  
    };
    int main()
    {
    	A a;
    	return 0;
    }
    
    > 第三种情况:
    //方法二:
    #include <iostream>
    using namespace std;
    class A
    	public:
       void A(int i)data(i)
    	{
    		cout<<data<<endl;
    	}
    	void dis()
    	{
    		cout<<data<<endl;
    	}
    	private:
    		const int data = 100;  
    };
    int main()
    {
    	A a(200);
    	return 0;
    }	
    //输出结果: 200  
    //那么可以得出: 最终Const变量的初始化值为确定的初始化参数列表里面的值!!
    

    2.2、Const函数

    class Screen 
    {  
    public:  
       char get() const;  
    };  
    char Screen::get() const
     {  
       //do something
    }  
    
    

    1、const 修饰函数放在声明之后,实现体之前。


    2、const 修饰函数不能修改类内的数据成员变量。


    3、const 修饰函数只能调用 const 函数。非 const 函数可以调用 const 函数。


    4、const 修饰的全局函数在定义和声明处都需要 const 修饰符。

    三、Const对象

    1、const 对象,只能调用const成员函数。

  • 相关阅读:
    雅礼集训2017day5乱写
    任意值域最长公共子序列问题
    雅礼集训2017day4乱写
    雅礼集训2017day2乱写
    SP839
    雅礼集训2017day1乱写
    CF671E
    仅维护当前区间影响类问题的线段树
    「雅礼集训 2017 Day4」编码
    Codeforces Round #503 Div. 2
  • 原文地址:https://www.cnblogs.com/retry/p/9509403.html
Copyright © 2011-2022 走看看