常函数
C++常成员函数用法
在一个普通成员函数后面加上const修饰,就是常成员函数
返回值 函数名(形参表)const {函数体}
注: (函数声明和实现分离时)const是函数声明的一部分,在函数的实现部分也需要加上const
作用
特点:
①可以使用数据成员,不能进行修改,对函数的功能有更明确的限定;(本类数据成员有“mutable”关键字修饰时可以通过常成员函数修改。);
②常成员函数不能用来更新类的任何成员变量,也不能调用类中未用const修饰的成员函数,只能调用常成员函数。即常成员函数不能更改类中的成员状态,这与const语义相符。
③常函数能修改传入自身的形参以及内部定义的局部变量;
④常函数的this指针是const Class*型;
⑤常对象只能调用常函数,不能调用普通函数;
意义
在实现只读作用的函数中,可以防止程序员不小心修改了成员变量的值。
注意
一、普通成员函数才有常函数。C++中构造函数,静态成员函数,析构函数,全局成员函数都不能是常成员函数。
构造成员函数的用途是对对象初始化,成员函数主要是用来被对象调用的,如果构造函数被设置成const,就不能更改成员变量,失去了其作为构造函数的意义。
同理析构函数要释放成员所以也不能声明常函数。
全局成员函数和静态成员函数static其函数体内部没有this指针,所以也不能是常成员函数
二、常函数中的this指针是常指针,不能在常成员函数中通过this指针修改成员变量的值
三、非const对象可以调用常函数,也能调用非常函数。但是常对象只能调用常函数,不能调用非常函数(常对象也包括常指针和常引用)
四、函数名和形参表相同的常函数和非常函数构成重载关系,此时,常对象调用常函数,非常对象调用非常函数
静态成员
一、静态数据成员
1.静态数据成员定义
在类中声明静态数据成员很简单,是用static关键字表明即可,在类中只能声明可是不能定义哈!
要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0(定义时一定要在全局作用域中定义,一定不要在类中定义!)
另外,不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。
2.特性
-
在类中的静态数据,属于类共享,不属于对象独有
-
即使没有定义对象,静态成员也是存在的
-
静态数据成员在类中说明,在类外定义并且会给他分配内存空间
-
可以通过对象去访问静态成员,但是这里容易让人产生误解,以为他们是成员变量(静态成员是被所有对象共享的,所以也可以去修改它) 我们一般通过 类名::静态成员 去访问它们
-
他的生存周期一直存在于整个程序的生命周期
6.静态数据成员被类的所有对象共享,包括该类的派生类对象,基类对象和派生类对象共享基类的静态数据成员。例子如下:
class Base{public://静态数据成员static int a;};
class Derived : public Base{};
int Base::a;
#include
int main()
{
Base B;Derived D;
B.a++;std::cout << B.a << std::endl;D.a++;std::cout << D.a <<std::endl;}
7.静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以,直接看例子:
class Test{
public:
static int a;int b;//静态数据成员
void fun_1(int i = a);//正确
void fun_2(int i = b);//报错};
8.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用。
直接看例子
class Test{
public:
static Test a;//正确 静态数据成员
Test b;//报错
Test *pTest;//正确
Test &m_Test;//正确
static Test *pStaticObject;//正确};
9.静态数据成员在const函数中可以修改,而普通的数据成员是不能修改的
const修饰的时当前this指针所指向的对象是const,但是静态数据成员不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的数据成员,所以可以更改。
二、静态成员函数
静态成员函数的声明也很简单,就是在类的成员函数前加上static关键字即可。
和静态成员一样,静态成员函数也是属于类的,它并不属于任何对象,当调用静态成员函数时应该使用类名和域运算符“∷”,当然也可以使用对象调用操作,但是这样的操作并不意味着静态成员函数属于这个对象,它只是被这个对象共享而已
特性
-
静态成员函数属于一个类,而不属于类中的任何对象
-
静态成员函数的说明和定义与静态数据成员一样。函数可以实现在类体内,也可以实现在类体外
-
静态成员函数在实现中,可以直接使用静态成员,不能直接访问非静态成员,但是可以通过对象来使用非静态成员(此时非静态成员已经定义)
4.静态成员函数不能调用非静态成员函数,但是反过来是可以的(因为非静态成员函数只有在类对象建立以后才可以调用)
5.静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)
6.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。
类在定义后并不分配存储空间,而是在定义类的对象的时候才分配存储空间,相反静态的数据成员和静态的成员函数是已经在内存中开辟了内存空间了,所以静态数据成员可以独立的访问在任何类对象没有建立起来都可以访问,并且静态成员函数不可以调用非静态成员函数,因为非静态成员函数只有在类对象建立以后才可以调用,相反则是可以的。
C语言的static和C++static总结
static在C中的用法,对于C++来说是全盘接受的。两者的不同就在于C++中的类使用。
c语言中static的语义
1.static变量:
1).静态局部变量
a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与局部变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。
b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。
2).静态全局变量
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
2.static函数(也叫内部函数):
只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。
- 在C语言中,由于没有类的概念,所以没有静态成员一说,在c中static的作用主要有2个:
一是隐藏功能,对于static修饰的函数和全局变量而言,其作用于局限于所在的文本,不能被其他文本内的函数使用
二是保持持久性功能,对于static修饰的局部变量而言,其存储区变更到静态存储区,程序结束不销毁
并且,因为存放在静态区,全局和局部的static修饰的变量,都默认初始化为0。
更多精彩内容请关注公众号:同年新月