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方法中,这也就是为什么在静态函数无法调用成员变量的原因了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。