当前位置: 首页 > 编程笔记 >

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

温翔宇
2023-03-14
本文向大家介绍C/C++静态类和this指针详解及实例代码,包括了C/C++静态类和this指针详解及实例代码的使用技巧和注意事项,需要的朋友参考一下

 C/C++静态类和this指针详解

1、静态类

C++的静态成员不仅可以通过对象来访问,还可以直接通过类名来访问。

class CBook{
public:
  static double price;//需要通过类外来进行初始化
}

int main(void){

  CBook book;
  book.price;//通过对象来访问
  CBook::price//通过类名来访问

  return 0;
}

静态成员变量

对应静态成员有以下几点需要注意:

(1)静态数据成员可以是当前类的类型,而其他数据成员只能是当前类的指针或应用类型。

class CBook{
public:
  static double price;
  CBook book;//非法定义,不允许在该类中定义所属类的对象
  static CBook m_book;//正确
  CBook *book;//正确
};

(2)静态数据成员可以作为其他成员函数的默认参数(不同的数据类型不能作为参数)。

class CBook{
public:
  int pages;
  static double price;

  //定义一个函数,以静态数据作为默认参数
  void outPutInfo(int data = price){
    //实现
  }

  //错误定义,普通数据不能作为默认参数
  void outPutPage(int data = pages){
    //实现
  }
};

静态函数

static void outPut();

(1)类的静态成员函数只能访问静态数据成员,不能访问普通数据成员(因为没有this指针)。

(2)静态成员函数不能定义为const成员函数(即静态成员函数末尾不能加上const关键字)

static void outPut() const;//错误定义

(3)在定义静态成员函数时,如果函数的实现位于类体外,则在函数的实现部分不能再标识static关键字。

//错误的定义
static void CBook::outPutInfo(){
  //实现
}

关于静态类我们在总结一下:

(1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致 了它仅能访问类的静态数据和静态成员函数。

(2)不能将静态成员函数定义为虚函数。

2、this

C++

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()方法,编译器将其解释为:

//函数调用
book1.outputPages(&book1);

//函数实现
void outputPages(CBook *this){//隐含的this指针
  cout<<this->pages<<endl;//使用this指针访问数据成员
}

Java

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

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

 类似资料:
  • 本文向大家介绍C++中this指针用法详解及实例,包括了C++中this指针用法详解及实例的使用技巧和注意事项,需要的朋友参考一下 C++中this指针用法详解及实例 概要: 本文简单介绍this指针的基本概念,并通过一个实际例子介绍this指针用于防止变量命名冲突和用于类中层叠式调用的两个用法。 this指针概览 C++中,每个类 对应了一个对象,每个对象指向自己所在内存地址的方式即为使用thi

  • 本文向大家介绍C语言 数组指针详解及示例代码,包括了C语言 数组指针详解及示例代码的使用技巧和注意事项,需要的朋友参考一下 数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element)。数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存。以int arr[] = { 99, 15, 100, 888, 252 };为例,该数组在内存中的分布如下图所示

  • 本文向大家介绍C语言 二级指针详解及示例代码,包括了C语言 二级指针详解及示例代码的使用技巧和注意事项,需要的朋友参考一下 指针可以指向一份普通类型的数据,例如 int、double、char 等,也可以指向一份指针类型的数据,例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。 假设有一个 int 类型的变量 a,p

  • 本文向大家介绍C++ 静态成员的类内初始化详解及实例代码,包括了C++ 静态成员的类内初始化详解及实例代码的使用技巧和注意事项,需要的朋友参考一下 C++ 静态成员的类内初始化详解及实例代码 一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了。 我们来看如下代码: 我们需要判断上面的静态数据成员的声明和定义有没有错误,并解释原因。

  • 本文向大家介绍C++智能指针实例详解,包括了C++智能指针实例详解的使用技巧和注意事项,需要的朋友参考一下 本文通过实例详细阐述了C++关于智能指针的概念及用法,有助于读者加深对智能指针的理解。详情如下: 一、简介 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没

  • 本文向大家介绍C++ 通过指针实现多态实例详解,包括了C++ 通过指针实现多态实例详解的使用技巧和注意事项,需要的朋友参考一下  C++ 通过指针实现多态实例详解 1.父类(DBConnector) 1)DBConnector.h 2)DBConnector.cpp 2.子类1(MySqlConnector) 1)MSSqlConnector.h 2)MSSqlConnector.cpp 3.子类