C++学习笔记之类&对象(三)

https://www.runoob.com/cplusplus/cpp-this-pointer.html

1、this指针

this指针指向当前对象的实例
每个对象都可以通过this指针指向自己的地址

this是一个隐藏的指针,可以在类的成员函数中使用,也可以指向调用对象
当对象的成员函数被调用时,编译器会隐式传入该对象的地址作为this指针

需要注意,友元函数没有this指针,因为其不是类的成员函数

class Rect
{
public:
    void setLength(int length);
    void setWidth(int width);
    void print();
private:
    int width;
    int length;
};

void Rect::setLength(int length)
{
    this->length = length;
}

void Rect::setWidth(int width)
{
    this->width = width;
}

void Rect::print()
{
    std::cout << "length=" << this->length << ", " << "width=" << this->width << std::endl;
}

int main()
{
    Rect rect;
    rect.setLength(10);
    rect.setWidth(8);
    rect.print();
}

在这里插入图片描述
setLength()setWidth()方法中,使用this指针指向类中的成员变量,为其进行赋值
很常用的一点是,我们可以在对成员变量进行赋值的时候,将外部变量和成员变量起相同的名字进行赋值,然后使用this指针指向成员变量,并以此进行区分,防止命名冲突

2、指向类的指针

指向类的指针与其他指针一样,需要在使用之前进行初始化,并且也如同结构体指针一样,使用->来访问其中的成员

指向类的指针指向一个类的对象,可以访问对象的成员变量成员函数

2.1、指针初始化

class Rect
{
public:
    void setLength(int length);
    void setWidth(int width);
    void print();
private:
    int width;
    int length;
};

void Rect::setLength(int length)
{
    this->length = length;
}

void Rect::setWidth(int width)
{
    this->width = width;
}

void Rect::print()
{
    std::cout << "length=" << this->length << ", " << "width=" << this->width << std::endl;
}

int main()
{
    Rect rect;
    rect.setLength(10);
    rect.setWidth(8);
    Rect *p = &rect;   // 指针初始化,指向对象rect
    p->print();   // 调用对象的成员函数
}

在这里插入图片描述

2.2、动态内存分配

指向类的指针也可以使用动态内存分配

int main()
{
    Rect rect;
    rect.setLength(10);
    rect.setWidth(8);
    Rect *p = new Rect;    // 动态内存分配
    p->setWidth(8);
    p->setLength(12);
    p->print();   
    delete p;    // 内存释放
}

在这里插入图片描述

2.3、指向类的指针作为函数参数

void printRectInfo(Rect* p) {   // 接收指针作为参数
    p->print();
}

int main()
{
    Rect rect;
    rect.setLength(10);
    rect.setWidth(8);
    printRectInfo(&rect);   // 地址传入
}

在这里插入图片描述

3、类的静态成员

可以使用static关键字将类的成员定义为静态成员函数
在将成员定义为静态成员之后,无论创建多少个类的对象,静态成员都只有一个副本

静态成员在类的所有对象中是共享的,如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零
不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符::来重新声明静态变量从而对它进行初始化

class Rect
{
public:
    static int count;   // 不能在这里初始化
    Rect(int length, int width);
private:
    int width;
    int length;
};

int Rect::count = 0;   // 初始化

Rect::Rect(int length, int width)
{
    this->length = length;
    this->width = width;
    count++;   // 记录创建对象的数量
}

int main()
{
    Rect rect1(12, 6);
    Rect rect2(10, 8);
    Rect rect3(6, 3);
    cout << "count=" << Rect::count << endl;
}

在这里插入图片描述

3.1、静态成员函数

如果将成员函数声明为静态的,那就可以将函数与类的具体对象分离,仅仅与类本身有关
静态成员函数即使在类对象不存在的情况下也能被调用只要使用类名加范围解析运算符 :: 就可以调用

静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数

静态成员函数有一个类范围,不能访问类的 this 指针,可以使用静态成员函数来判断类的某些对象是否已被创建

静态成员函数vs普通成员函数

  • 静态成员函数没有this指针,因此只能访问静态成员(很重要)
  • 普通成员函数有this指针,因此可以访问类中的任何成员
class Rect
{
public:
    Rect(int length, int width);
    int static getCount();   // 静态成员函数
private:
    int width;
    int length;
    static int count;  
};

int Rect::count = 0;   // 初始化

Rect::Rect(int length, int width)
{
    this->length = length;
    this->width = width;
    count++;   // 记录创建对象的数量
}

int Rect::getCount()
{
    return count;    // 只能访问静态成员
}

int main()
{
    Rect rect1(12, 6);
    Rect rect2(10, 8);
    Rect rect3(6, 3);
    cout << "count=" << Rect::getCount() << endl;    // 调用类的静态函数
}

在这里插入图片描述

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部