服务器之家

服务器之家 > 正文

C/C++静态类和this指针详解及实例代码

时间:2021-04-30 15:31     来源/作者:C语言教程网

 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方法中,这也就是为什么在静态函数无法调用成员变量的原因了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
返回顶部

800
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40