(2)const和static

static关键字的作用:

c/c++共有:

       1):修饰全局变量时,表明一个全局变量只对定义在同一文件中的函数可见。                         

       2):修饰局部变量时,表明该变量的值不会因为函数终止而丢失。              

       3):修饰函数时,表明该函数只在同一文件中调用。

c++独有:

       4):修饰类的数据成员,表明对该类所有对象这个数据成员都只有一个实例。即该实例归 所有对象共有。

       5):用static修饰不访问非静态数据成员的类成员函数。这意味着一个静态成员函数只能访问它的参数、类的静态数据成员和全局变量

静态局部变量特点:
(1)该变量在全局数据区分配内存(局部变量在栈区分配内存)
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化
(局部变量每次函数调用都会被被初始化)
(3)静态局部变量一般在声明处初始化,如果没有显示初始化,会被程序自动初始化为0
(局部变量不会被初始化)
(4)它始终驻留在全局数据区,知道程序运行结束。但其作用域为局部作用域,也就是不能在函数体外使用它
(局部变量在栈区,在函数结束后立即释放内存)

静态全局变量特点:
(1)静态全局变量不能被其他文件所用(全局变量可以)
(2)其他文件中也可以定义相同名字的变量,不会发生冲突(static隔离了文件,其他文件使用相同的名字的变量,也跟它没关系)

静态函数特点:
(1)静态函数不能被其他文件所用
(2)其他文件可以定义相同名字的函数,不会发生冲突

静态成员函数特点:
(1)静态成员之间可以互相访问,包括静态成员函数访问静态数据成员和访问静态成员函数
(2)非静态成员函数可以任意的访问静态成员函数和静态数据成员
(3)静态成员函数不能范问非静态成员函数和非静态数据成员
(4)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象和指向类对象指针调用静态成员函数,
也可以用类名::函数名调用

对于非静态 数据成员函数,每个对象(实例)都有自己的拷贝。
而静态数据成员被当作是类的成员,由该类型的所有对象共享访问,对该类的多个对象来说,静态数据成员只分配一次内存
静态数据成员存储在全局数据区。静态数据成员定义时要分配内存,所以不能在类声明中定义。

const关键字的作用

1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;

2)对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;

3)在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;

4)对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量;

5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

const修饰变量
(1)变量的值不能改变

const修饰指针
(1)如果const位于的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量
(2)如果const位于
的右侧,const就是修饰指针本身,即指针本身是常量

 指针常量:不能通过指针来修改变量的值。
 常量指针:一直指向该变量,不能给该指针赋予其他地址

函数中使用const
(1)const修饰函数参数
表示参数不可变

  • 若参数为引用,可以增加效率

  • const引用传递和函数按值传递的效果是一样的,但按值传递会先建立一个类对象的副本, 然后传递过去,而它直接传递地址,所以这种传递比按值传递更有效

  • const按值传递时只是外部对象的拷贝,值的改变不会对外部有什么影响,那么是不是没有什么意义:错,重要的目的就是告诉说这个变量不允许被修改,传引用效率会高一点而已。
    (2)const 修饰函数返回值
    含义和const修饰变量和指针的含义相同

类中使用const
(1)const修饰成员变量

  • 表示成员变量不能被修改,同时只能在初始化列表中赋值
    (2)const修饰成员函数

  • 该函数不能改变对象的成员变量

  • 不能调用非const成员函数,因为任何非const成员函数会有修改成员变量的企图

  • const的成员函数才能被一个const类对象调用。即const类对象只能调用const成员函数

  • const关键字不能与static关键字同时使用,因为static关键字修饰静态成员函数,静态成员函数不含有this指针,即不能实例化,const成员函数必须具体到某一实例。

const修饰类对象
对象的任何成员都不能被修改
只能调用const成员函数

问:类中的所有函数都可以声明为const函数吗。哪些函数不能?
(1)构造函数不能:

  • const修饰函数表示该函数的返回值是const类型的,改返回值只能赋值给同类型的const变量。

  • const是可以修饰类的成员函数,但是该函数不能修改数据成员。构造函数也属于类的成员函数,但是构造函数是要修改类的成员变量,所以类的构造函数不能申明成const类型的。
    (2)静态成员函数不行

static静态成员是属于类的,而不属于某个具体的对象,所有的对象共用static成员。this指针是某个具体对象的地址,因此static成员函数没有this指针。而函数中的const其实就是用来修饰this指针的,意味this指向的内容不可变,所以const不能用来修饰static成员函数

猜你喜欢

转载自blog.csdn.net/qq_40329851/article/details/114273901
今日推荐