C++中static和const

static静态成员

  • Static意为静态成员,若Static修饰的成员位于C++类中,那么Static就实现了同一个类,多个对象共享数据,协调行为的目的。
  • 静态变量具有全局变量的优势,又不会像全变量一样被滥用。C++中用于管理静态变量,就需要用到静态函数。
  • C++中类的静态成员,属于类,也属于对象,但终归属于类。(比较绕,直接记做属于类)

特点

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

C++中static和const_第1张图片

//示例
#include 
using namespace std;
class A
{
    public:
    static int share;  //Static变量的声明
};
int A::share = 5;     //Static变量的初始化

int main()
{
    A x;
    cout<

Static函数

C++为了管理静态成员,提供了静态函数,静态函数对外提供接口。并且静态函数只能访问静态成员。

  • 静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员, 完成对静态数据成员的封装。
  • staitc 修饰成员函数,仅出现在声明处,不可在定义处。
  • 静态成员函数只能访问静态数据成员。原因:非静态成员函数在调用时 this指针被当作参数传进。而静态成员函数是属于类,不属于对象,没有 this 指针。
//示例
#include 
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;
}

Const变量

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

Const单变量初始化

const int a = 1;

Const变量在类中初始化

  • 采用初始化列表进行初始化
  • 初始化列表先与本对象的构造函数执行
  • 初始化列表与成员的声明顺序相同的
//方法一:
#include 
using namespace std;
class A
    public:
    void A(int i)data(i)
    {
        cout<
using namespace std;
class A
    public:
    void dis()
    {
        cout<
using namespace std;
class A
    public:
   void A(int i)data(i)
    {
        cout<

错误示范

#include 
using namespace std;
class A
    public:
    void dis()
    {
        cout<

当用该类去定义对象时就会显示出错,,提示没有初始化const成员data,且提示data为只读。

错误示范!!!!!
#include 
using namespace std;
class A
    public:
    void A()
    {
        data = 100;  //错误的写法
    }
    private:
        const int data;
};

const成员位于类中成员时会成为只读属性(只读:不能出现在“=”的左边)。所以也不可以直接在类的构造函数中去初始化const成员。

//当然你也可以把const定义为局部变量,语法OK,但一般一旦定义const都是作为全局的。局部的就和普通局部变量一样了,没有多大意义。
#include 
using namespace std;
class A
    public:
    void A()
    {
        const int data = 100;  //正确
    }
};

Const函数

  • const 修饰函数放在声明之后,实现体之前。
  • const 修饰函数不能修改类内的数据成员变量。
  • const 修饰函数只能调用 const 函数。非 const 函数可以调用 const 函数。
  • const 修饰的全局函数在定义和声明处都需要 const 修饰符。
class Screen 
{  
public:  
   char get() const;  
};  
char Screen::get() const
 {  
   //do something
}  

Const对象

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

你可能感兴趣的:(c++,开发语言,蓝桥杯)