码迷,mamicode.com
首页 > 编程语言 > 详细

C++之Static与Const

时间:2018-08-21 10:52:48      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:this 指针   赋值   包含   沟通   clu   ret   ref   成员变量   alt   

目录

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函数

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


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


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


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

三、Const对象

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

C++之Static与Const

标签:this 指针   赋值   包含   沟通   clu   ret   ref   成员变量   alt   

原文地址:https://www.cnblogs.com/retry/p/9509403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!