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;
}
};