第12章 类(5)

12.1.5 类对象

定义对象时,将为其分配存储空间,但(一般而言)定义类型时不进行存储分配。

定义了一个新的类型,但没有进行存储分配。当我们定义一个对象时,编译器分配了足以容纳一个该类对象的存储空间。对象名指的就是那个存储空间。

每个对象具有自己的类数据成员的副本。修改对象的数据成员不会改变任何其他同类型对象的数据成员。

1. 定义类类型的对象

定义了一个类类型之后,可以按以下两种方式使用。

将类的名字直接用作类型名。

指定关键字class或struct,后面跟着类的名字。

2. 为什么类的定义以分号结束

类的定义以分号结束。分号是必需的,因为在类定义之后可以接一个对象定义列表。定义必须以分号结束。

通常,将对象定义成类定义的一部分是个坏主意。这样做,会使所发生的操作难以理解。对读者而言,将两个不同的实体(类和变量)组合在一个语句中,也会令人迷惑不解。

12.2 隐含的this指针

成员函数具有一个附加的隐含形参,即指向该类对象的一个指针。这个隐含形参命名为this,与调用成员函数的对象绑定在一起。成员函数不能定义this形参,而是由编译器隐含地定义。成员函数的函数体可以显式使用this指针,担不是必须这么做。如果对类成员的引用没有限定,编译器会将这种引用处理成通过this指针的引用。

1. 何时使用this指针

尽管在成员函数内部引用this通常是不必要的,但有一种情况下必须这么做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。最常见的情况是在这样的函数中使用this:该函数返回对调用该函数的对象的引用。

2. 返回 *this

函数的return语句可以返回*this。在这些函数中,this是一个指向非常量类对象的指针。如同任意的指针一样,可以通过对this指针解引用来访问this指向的对象。

class Class1
{
public:
	Class1* Method1()
	{
		return this;
	}
	Class1& Method2()
	{
		return *this;
	}
};
3. 从const成员函数返回*this

在普通的非const成员函数中,this的指针是一个指向类类型的const指针。可以改变this所指向的值,但不能改变this所保存的地址。在const成员函数中,this的类型是一个指向const类类型对象的const指针。既不能改变this所指向的对象,也不能改变this所保存的地址。

不能从const成员函数返回指向类对象的普通引用。const成员函数只能返回*this作为一个const引用。

class Class1
{
public:
	const Class1* Method1() const 
	{
		return this;
	}
	const Class1& Method2() const
	{
		return *this;
	}
};

4. 基于const的重载

基于一个指针形参是否指向const可以重载一个函数。const对象只能使用const成员。非const对象可以使用任一成员,但非const版本是一个更好的匹配。

5. 可变数据成员

有时(担不是经常),我们希望类的数据成员(甚至在const成员函数内)可以修改。这可以通过将它们声明为mutable来实现。

可变数据成员永远不能为const,甚至当它是const对象的成员时也如此。因此,const成员函数可以改变mutable成员。要将数据成员声明为可变的,必须将关键字mutable放在成员声明之前。

class Class1
{
private:
	mutable int counter;
public:
	const Class1& Method2() const
	{
		this -> counter++;
		return *this;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值