C++学习笔记之类&对象(三)
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
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; // 调用类的静态函数
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » C++学习笔记之类&对象(三)
发表评论 取消回复