您的位置:首页 > 编程语言 > C语言/C++

c++ primer阅读笔记-12章-2

2014-04-03 22:29 239 查看
1、尽管在成员函数内部显式引用this 通常是不必要的,但有一种情况下必须这样做:当我们需要将一个对象作为整体引用而不是引用对象的一个成员时。最常见的情况是在这样的函数中使用this:该函数返回对调用该函数的对象的引用。

2、在普通的非 const 成员函数中,this 的类型是一个指向类类型的 const 指针。可以改变 this 所指向的值,但不能改变 this 所保存的地址(this中的地址虽然不可以改变,但是地址中的内容却可以变)。在 const 成员函数中,this 的类型是一个指向 const 类类型对象的 const
指针。既不能改变 this 所指向的对象,也不能改变 this 所保存的地址。不能从 const 成员函数返回指向类对象的普通引用。const 成员函数只能返回*this 作为一个const 引用。

3、如果将 display 定义为const 成员,就可以在非const 对象上调用display(非const对象可以调用const成员)。但不能将对display 的调用嵌入到一个长表达式中。像下面的代码将是非法的:

Screen myScreen;
// this code fails if display is a const member function
// display return a const reference; we cannot call set on a const
myScreen.display().set('*');//set(char)是非const成员函数


问题在于这个表达式是在由 display 返回的对象上运行set。该对象是const,因为display 将其对象作为
const 返回。我们不能在const 对象上调用set。

4、有时(但不是很经常),我们希望类的const数据成员可以被修改或者在const成员函数中可以修改数据成员。这一点可以通过将它们声明为mutable 来实现。
类的作用域

1、一些成员使用成员访问操作符来访问,另一些直接通过类使用作用域操作符(::)来访问。一般的数据或函数成员必须通过对象来访问。定义类型的成员(定义了一种数据类型),如Screen::index,使用作用域操作符来访问(为什么?)。

2、在定义于类外部的成员函数中,形参表和成员函数体都出现在成员名之后。这些都是在类作用域中定义,所以可以不用限定而引用其他成员。

3、与形参类型相比,返回类型出现在成员名字前面。如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外。如果返回类型使用由类定义的类型,则必须使用完全限定名。

4、当然,类作用域中使用的名字并非必须是类成员名。类作用域中的名字查找也会发生在其他作用域中声明的名字。在名字查找期间,如果类作用域中使用的名字不能确定为类成员名,则在包含该类或成员定义的作用域中查找,以便找到该名字的声明。

5、类成员声明的名字查找。按以下方式确定在类成员的声明中用到的名字。a: 检查出现在名字使用之前的类成员的声明。b:如果第 1 步查找不成功,则检查包含类定义的作用域中出现的声明以及出现在类定义之前的声明。

6、编译器按照成员声明在类中出现的次序来处理它们。通常,名字必须在使用之前进行定义。而且,一旦一个名字被用作类型名,该名字就不能被重复定义。

7、类成员定义中的名字查找。按以下方式确定在成员函数的函数体中用到的名字。首先检查成员函数局部作用域中的声明。如果在成员函数中找不到该名字的声明,则检查对所有类成员的声明。如果在类中找不到该名字的声明,则检查在此成员函数定义之前的作用域中出现的声明。
8、类成员遵循常规的块作用域名字查找。下面的函数使用了相同的名字来表示形参和成员,这是通常应该避免的。
// Note: This code is for illustration purposes only and reflects bad practice
// It is a bad idea to use the same name for a parameter and a member
int height;
class Screen {
public:
void dummy_fcn(index height) {
cursor = width * height; // which height? The parameter
}
private:
index cursor;
index height, width;
};


这样做的目的是展示如何确定名字:查找 dummy_fcn 的定义中使用的名字height 的声明时,编译器首先在该函数的局部作用域中查找。函数的局部作用域中声明了一个函数形参。
9、搜索完函数作用域之后,会在在类作用域中查找。当编译器不能在函数内查找该名字,接着就会在 类中查找
10、类作用域之后,在外围作用域中查找。如果编译器不能在函数或类作用域中找到,就在外围作用域中查找。出现在Screen 定义之前的全局作用域中声明了一个名为height 的全局声明。然而,该对象被屏蔽了。
11、在文件中名字的出现处确定名字。当成员定义在类定义的外部时,名字查找的第 3 步不仅要考虑在Screen 类定义之前的全局作用域中的声明,而且要考虑在成员函数定义之前出现的全局作用域声明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: