• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C/C++静态类和this指针详解及实例代码

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

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c c++ c#区别,c和c++的区别,c语言和c++有什么区别,c/c++,c语言与c++的区别等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

1、静态类

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

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

int main(void){

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

  return 0;
}

</div>

静态成员变量

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

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

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

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

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

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

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

</div>

静态函数

static void outPut();
</div>

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

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

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

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

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

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

(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;
}

</div>

book1和book2两个对象都有自己的数据成员pages,在调用outputPages时均输出自己的成员数据,那二者是如何区分的呢?答案是this指针。

在每个类的成员函数(非静态成员函数)都隐含一个this指针,指向被调用对象的指针,其类型为当前类的指针类型。

所以类似于上面的outputPages()方法,编译器将其解释为:

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

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

</div>

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);
  }
}

</div>

这里说明一下,this表示当前对象的引用,另this不能用在static方法中,这也就是为什么在静态函数无法调用成员变量的原因了。

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C/C++ 中堆和栈及静态数据区详解
  • C/C++中运算符的优先级、运算符的结合性详解
  • C/C++ 中sizeof('a')对比详细介绍
  • C/C++中的typedef和#define详解
  • C/C++中宏定义(#define)
  • C/C++函数参数传递机制详解及实例
  • C/C++ 公有继承、保护继承和私有继承的对比详解
  • C/C++静态类和this指针详解及实例代码
  • C/C++中提高查找速度的小技巧
  • C/C++ ip地址与int类型的转换实例详解

相关文章

  • 2017-05-28VC6.0常用快捷键大全
  • 2017-05-28C++条件及循环语句的综合运用实例
  • 2017-05-28用C++实现strcpy(),返回一个char*类型的深入分析
  • 2017-05-28C语言 volatile与const同时使用应注意的问题
  • 2017-05-28C++学生信息管理系统
  • 2017-05-28C++空类默认函数详细解析
  • 2017-05-28有关C++中类类型转换操作符总结(必看篇)
  • 2017-05-28深入解析C++中的函数模板和函数的默认参数
  • 2017-05-28C++中实现队列类链式存储与栈类链式存储的代码示例
  • 2017-05-28如何给随机数加密

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 讲解C++的do while循环和循环语句的嵌套使用方法
    • 深入理解二叉树的非递归遍历
    • 深入解析C++ STL中的常用容器
    • c++中for双循环的那些事
    • 探讨++i与i++哪个效率更高
    • C语言使用stdlib.h库函数的二分查找和快速排序的实现代码
    • C++运算符重载规则详解
    • C++实现的分布式游戏服务端引擎KBEngine详解
    • C++ 中静态成员函数与非静态成员函数的区别
    • DSP中浮点转定点运算--定点数的加减乘除运算

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有