从this指针区别const方法、static方法、与普通方法

来源:互联网 发布:mac winebottler msi 编辑:程序博客网 时间:2024/05/22 12:25

this指针区别const方法、static方法、与普通方法

什么是this指针

当定义了一个类的多个对象之后,每个对象都有属于自己的数据成员,而同一类的不同对象拥有一份成员函数的副本,成员函数中有一个隐含的参数,名为this的指针,称为自引用指针。当对象调用对应的成员函数时,系统就将该对象的地址赋给this指针,成员函数以此来确定是谁调用的它。

 

Const的作用

l Const可以修饰变量,比如const int a=0;代表变量a是一个常量,不允许被改变。并且常量a必须被初始化。

l Const可以修饰数组,代表数组的状态为只读。

l Const可以修饰指针的指向,int *const p=&a; 指向整型的常指针,它指向a之后不允许被改变,再指向其他的变量。p的值不能改变,*p(a)的值可以改变。

l Const可以修饰指针指向的值,int const *p=&a;指向整型常量的指针p*p(a)的值不能被改变。p的值可以改变

l 当在函数中使用constconst可以修饰参数,如果参数是值,则const无意义,如果参数是一个指针,或者是引用,例如 拷贝构造函数 Test(const Test &t){} const修饰的是引用t,为保证参数的安全,使其不会再函数内部被改变。

l Const可以修饰返回值,如果返回值是值,则const无意义,如果返回值是指针,表示该指针不能被改动,只能把指针赋给const修饰的同类型的指针。

l Const可以修饰成员方法,void fun()const{}代表在此函数中不允许对其数据成员做修改。在函数自己内部修改或者是调用普通成员方法修改数据成员都不可以!

 

Static的作用

l Static修饰局部变量,使变量从自动变量à静态变量,改变了其生存期。这种方式申明的变量在程序执行前分配内存,但是程序运行到其所在行才会对其进行初始化,如果没有初始化,系统会默认将其初始化为0,并且只初始化一次。当函数每次调用,不再重新附初值,而是保留上次的值。在整个程序执行期间,此变量一直存在。

l Static修饰全局变量,就构成了静态的全局变量,限制了其作用域,即只在定义该变量的源文件内有效。其他文件不能使用该变量。

l Static修饰函数,例如static int fun(){} 代表产生不能被其他文件调用,fun是一个内部函数。

l 当在类中定义个static成员变量,例如static int count;代表这个变量是属于类的成员变量,一个类只有一份此static成员变量,是所有对象共享的,但不属于任何一个对象,如果sizeof(一个对象),这个大小是不包括静态成员变量在内的。类中定义的static成员变量需要在类外初始化,(因为它不属于任何对象,不再构造函数内部进行初始化)例如int Person ::count=0;

l Static修饰成员方法时,该成员方法的作业域依然是类作用域,但是这个方法中没有我们的自引用指针this,不需要依赖对象去调用。调用方式例如 类::fun();或者也可以用对象.fun()。静态成员方法在类外定义时不需要加static,与普通成员方法的写法无异。

 

普通成员方法、static方法、const方法之间的关系

l 普通成员方法有this指针,并且可以通过this改变该对象的数据成员

l Static成员方法没有this指针,该方法可以不依赖对象调用。

l Const成员方法有const *this常指针,不能改变方法内部的数据成员。

三个成员方法的调用关系中,遵循着以下的准则,

l this指针的可以调动没有this指针。即函数不需要this,但是我调用时提供this,这是没关系的。

l 没有this指针的不可以调动需要this指针。即函数需要this,但是我调用时没有提供,则不允许。

l Const修饰的this指针必须保证在此函数中不允许对其数据成员做修改。在函数自己内部修改或者是调用普通成员方法修改数据成员都不可以!

Const成员方法与数据变量之间的关系

Const成员方法 可以访问普通成员变量,常成员变量以及静态成员变量,但是不能修改。若要修改,需要在普通成员变量前加mutable,其作用是突破const的作用。

static成员方法与数据成员之间的关系

static成员方法只能调用static成员变量。因为没有this指针,不能调用普通变量,以及常成员变量。

普通成员方法与数据成员之间的关系

可以访问静态成员变量,(不需要this指针)。可以修改。

可以访问常成员变量,不能修改。它是const常性的。

 

 

阅读全文
0 0
原创粉丝点击