C/C++静态类和this指针详解
1、静态类
C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class CBook{ public : static double price; //需要通过类外来进行初始化 } int main( void ){ CBook book; book.price; //通过对象来访问 CBook::price //通过类名来访问 return 0; } |
静态成员变量
对应静态成员有以下几点需要注意:
(1)静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或应用类型。
1
2
3
4
5
6
7
|
class CBook{ public : static double price; CBook book; //非法定义,不允许在该类中定义所属类的对象 static CBook m_book; //正确 CBook *book; //正确 }; |
(2)静态数据成员可以作为其他成员函数的默认参数(不同的数据类型不能作为参数)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class CBook{ public : int pages; static double price; //定义一个函数,以静态数据作为默认参数 void outPutInfo( int data = price){ //实现 } //错误定义,普通数据不能作为默认参数 void outPutPage( int data = pages){ //实现 } }; |
静态函数
1
|
static void outPut(); |
(1)类的静态成员函数只能访问静态数据成员,不能访问普通数据成员(因为没有this指针)。
(2)静态成员函数不能定义为const成员函数(即静态成员函数末尾不能加上const关键字)
1
|
static void outPut() const ; //错误定义 |
(3)在定义静态成员函数时,如果函数的实现位于类体外,则在函数的实现部分不能再标识static关键字。
1
2
3
4
|
//错误的定义 static void CBook::outPutInfo(){ //实现 } |
关于静态类我们在总结一下:
(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。
(2)不能将静态成员函数定义为虚函数。
2、this
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class CBook{ public : int pages; void outputPages(){ cout<<pages<<endl; } }; int main(){ CBook book1,book2; book1.pages = 10; book2.pages = 20; book1.outputPages(); book2.outputPages(); return 0; } |
book1和book2两个对象都有自己的数据成员pages,在调用outputPages时均输出自己的成员数据,那二者是如何区分的呢?答案是this指针。
在每个类的成员函数(非静态成员函数)都隐含一个this指针,指向被调用对象的指针,其类型为当前类的指针类型。
所以类似于上面的outputPages()方法,编译器将其解释为:
1
2
3
4
5
6
7
|
//函数调用 book1.outputPages(&book1); //函数实现 void outputPages(CBook * this ){ //隐含的this指针 cout<< this ->pages<<endl; //使用this指针访问数据成员 } |
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
/** * 本示例为了说明this的三种用法! */ package test; public class ThisTest { private int i= 0 ; ThisTest( int i){ //(1)this.i表示成员变量i,i表示参数 this .i=i+ 1 ; } ThisTest(String s){ System.out.println( "String constructor: " +s); } ThisTest( int i,String s){ //(2)this调用第二个构造器 this (s); this .i=i++; } public ThisTest increment(){ this .i++; //(3)返回的是当前的对象 return this ; } public static void main(String[] args){ ThisTest tt0= new ThisTest( 10 ); ThisTest tt1= new ThisTest( "ok" ); ThisTest tt2= new ThisTest( 20 , "ok again!" ); System.out.println(tt0.increment().increment().increment().i); } } |
这里说明一下,this表示当前对象的引用,另this不能用在static方法中,这也就是为什么在静态函数无法调用成员变量的原因了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!