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方法中,这也就是为什么在静态函数无法调用成员变量的原因了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关文章
VS Code C/C++环境配置教程(无法打开源文件“xxxxxx.h”或者检测到 #include 错误,请更新includePath)(POSIX API)
这篇文章主要介绍了VS Code C/C++环境配置教程(无法打开源文件“xxxxxx.h” 或者 检测到 #include 错误。请更新includePath) (POSIX API),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-08-13Windows配置VSCode+CMake+Ninja+Boost.Test的C++开发环境(教程详解)
这篇文章主要介绍了Windows配置VSCode+CMake+Ninja+Boost.Test的C++开发环境,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-12- 这篇文章主要介绍了 C/C++如何获取当前系统时间的实例详解的相关资料,这里提供了几种实现方法,帮助大家实现这样的功能,需要的朋友可以参考下...2020-04-25
- 本文主要介绍了C#中的静态成员、静态方法、静态类的基础的使用,并做了相关的代码演示,供初学者参考。...2020-06-25
- 本篇文章是对C/C++中多线程的学习心得总结进行了详细的分析介绍,需要的朋友参考下...2020-04-25
- 这篇文章主要介绍了SQLite教程(二):C/C++接口简介,本文讲解了C/C++接口概述、核心对象和接口、参数绑定等内容,需要的朋友可以参考下...2020-07-11
- 这篇文章主要介绍了C/C++ 中gcc和g++的对比与区别的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C/C++ 公有继承、保护继承和私有继承的区别的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要给大家介绍了关于c#中单例类与静态类的区别以及使用场景的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-09
- 今天小编就为大家分享一篇关于C/C++从零开始的cmake教程,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...2020-04-25
C/C++: Inline function, calloc 对比 malloc
以下是对c/c++中的malloc函数与calloc函数的区别以及它们之间的联系进行了介绍,需要的朋友可以过来参考下...2020-04-25- 这篇文章主要介绍了使用docker部署一个简单的c/c++程序的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-22
- 这篇文章主要介绍了浅析C#静态类,静态构造函数,静态变量 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 这篇文章介绍了C#跨平台开发之使用C/C++生成的动态链接库,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2022-01-17
- 这篇文章主要涉及了C/C++ 编译器优化的简单介绍,具有一定参考价值。如有不对之处,欢迎指出。...2020-04-25
- 这篇文章主要介绍了C/C++ 中堆和栈及静态数据区详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C/C++实现快速排序的方法,这几天在找工作,被问到快速排序,结果想不出来快速排序怎么弄的;回来搜索了一下,现在记录下来,方便以后查看。...2020-04-25
- 这篇文章主要介绍了C/C++ 动态数组的创建的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的功能,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C/C++函数参数传递机制详解及实例的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C/C++ 数组和指针及引用的区别的相关资料,这里从汇编的角度来分析他们之间的区别,需要的朋友可以参考下...2020-04-25