this指针 & const & static

this

this指针表示类中的当前对象,在调用函数时,首先会将对象的地址传给this指针。对象主要是通过私有数据成员进行区分来判定。公有函数为所有对象所使用,且不占内存空间。

#

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int d=0):data(d)
    {}
    //void fun(Test * const this)
    void fun()
    {
        data = 100;
    }
    //void fun(const Test * const this)
    void fun()const
    {
        //data =100;
    }
    ~Test()
    {}
private:
    int data;

};

void main()
{
    Test t(10);
    Test t2;
    t.fun();
    t2.fun();
}

这里写图片描述

声明:一个成员函数声明三点在逻辑上互不干扰的事情

1、该函数可以访问类中的私有成员
2、该函数属于类的作用域
3、该函数必须由一个类的对象去激活(对象的类部有一个this指针)

#

1、友缘函数,可以满足第一条
2、静态函数可以满足前两条,静态函数没有this指针

static

特点

1、 类的静态成员,属于类中所用对象所共享的,不属于某一个对象,因此没有this指针,并且只在公共内存 中 保存了一份。
2、 静态成员必须在类外声明:返回值 类名::静态成员=0
3、访问方式:cout<<类名::静态成员<<endl;

#include<iostream>
using namespace std;
//声明公共类和函数
class Test;
void show(Test &other);
class Test
{
    friend void show(Test &other);
public:
    //static 成员不属于对象,属于一个类 为所用对象所共享
    //Test(int d,int c):data(d),count(c)
    //构造对象时,count++
    Test(int d=0):data(d)
    {
        count++;
    }
    //析构对象时count--
    ~Test()
    {
        count--;
    }
private:
    int data;
    static int count;//object number

};

int Test::count=0;
//将show()声明为Test类的友缘类,则可以访问该类的私有成员。
void show(Test &other)
{
    cout<<"data="<<other.data<<endl;
    //cout<<"Test number"<<other.count<<endl;
    cout<<"object number="<<Test.count<<endl;
}
void main()
{
    Test t(10);
    Test t1;
    show(t);
}

这里写图片描述

void fun() & static void fun()

1、普通成员函数,可以访问静态成员函数,也可以访问普通成员函数。
2、静态成员函数不能访问普通成员函数,只能访问静态成员函数。
原因:在类中,静态成员和静态方法中都没有this指针!!
类中的静态方法和静态成员没有this指针。普通方法中,void fun(Test * const this) 提供了this指针,静态方法中 static void fun()没有使用this,则普通方法调用静态方法可以;然而静态方法不能给普通方法传递this 指针 因此静态方法不能调用普通方法。

#

#include<iostream>
using namespace std;
class Test
{
public:
    Test(int d=0):data(d)
    {
        count++;
    }
    ~Test()
    {
        count--;
    }
public:
    //void print(Test * const this)

    /* void print()
    {
        cout<<this->data<<endl;
        cout<<Test::count<<endl;
    }
    */
    //静态方法没有this指针,不能访问类的非静态成员
     static void print()
     {
         //count<<this->data<<endl;
         cout<<Test::count<<endl;
         show();
     }
     void show()
     {
         print();
     }
private:
    int data;
    static int count;

};
//静态成员函数在类外初始化,静态成员函数不属于某一个类
int Test::count=0;
void main()
{
    Test t(10);
    //print(&t)
    t.print();
}

*当成分水岭,然后进行判断哪个不变

int const *p;//const修饰P指向的值
const int *p;//与上面相同
int * const p;//修饰P的指向
const int * const p;//p的指向和p的指向的值

#

#include<iostream>
using namespace std;
void main()
{
    int a=10;
    int b=20;
    //int const *p=&a;
    //*p=100;
    int const *p=&b;
    cout<<*p<<endl;
    int * const q=&b;
    *q=100;
    cout<<b<<endl;
    int const * const pi =&a;
    cout<<a<<endl;
}   

这里写图片描述

const

const和#define为常量,二者区别:

1、const常量会进入程序的调试,通过编译器判断数据类型得到相应值
2、#define 只是简单的简单的体会,没有检查数据类型的作用
3、const,可以用于设置全局常量、类的常量成员、函数
4、在整个类中都用的恒定常量,只能通过枚举

void fun() & void fun()const构成重载

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int d=0):data(d)
    {}
    //由上面知,this指针不能b改变,但所指的值可以修改
    //void fun(Test * const this)
    void fun()
    {
        data = 100;
    }
    //1.this指针不能修改 2.*this对象也不能修改,即对象的私有数据不能修改
    //void fun(const Test * const this)
    void fun()const
    {
        //data =100;
    }
    ~Test()
    {}
private:
    int data;

};
void main()
{
    //在构造对象之前,会产生this指针,将对象的地址传给了this指针。即this指针表示该当前的对象地址
    Test t(10);
    t.fun();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值