《C++ Primer》第五版,中文版。269 页。
相似的,静态成员函数也不与任何对象绑定在一起,它们不包含 this 指针。作为结果,静态成员不能声明成 const 的,而且我们也不能在 static 函数体内使用this 指针。
相似的,静态成员函数也不与任何对象绑定在一起,它们不包含 this 指针。作为结果,静态成员不能声明成 const 的,而且我们也不能在 static 函数体内使用this 指针。
解决方案
10
原因是static成员不是任何对象的组成部分,所以static成员不能被声明为const,毕竟将成员声明为const就是承诺不会修改该函数所属对象.
const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数——this指针由原来的Class* const变为const Class* const类型,使得在该成员函数内不能修改成员属性,除非该属性被mutable修饰。
而static类函数并没有隐式的this指针,原因是其本质上还是属于C函数——满足__cdecl调用协定。
而成员函数被称为__thiscall,带有隐式的this指针参数。
const用于后置修饰函数时只用于限定成员函数,意味着将被修饰的成员函数的隐式参数——this指针由原来的Class* const变为const Class* const类型,使得在该成员函数内不能修改成员属性,除非该属性被mutable修饰。
而static类函数并没有隐式的this指针,原因是其本质上还是属于C函数——满足__cdecl调用协定。
而成员函数被称为__thiscall,带有隐式的this指针参数。
15
C++ 与类作用域
是语言划分的,只在源程序中起作用
而C++是编译型语言
这意味着 类作用域 只在编译期间有用,
编译后,类中的函数,要不就成为inline 函数,直接嵌入到调用处
要不就生成C 函数差不多的函数
这样静态成员函数,和非静态成员函数的差异,
就是this 指针这个隐藏参数有没有,怎么样传递的问题
静态函数无须 类的对象,就可以调用,因此不需要this 指针参数,
来表示调用者身份
成员函数,需要通过类对象(或指向它的指针,引用)来调用
因此需要一个参数,来表示调用这个函数时候,对应的对象
C++采用隐藏的指针参数 this,表示调用成员函数时候,对应的那个对象
原因是,这个参数 实际调用的时候
这个 对象(或指针,引用)在函数前面,不在实参表内部,
所以C++隐式传递这个参数,形参表中也隐藏了这个参数。
但是这个参数确确实实传递过来了,所以成员变量可以使用它
C++ 规定这个参数是个指针,参数名为 this
是语言划分的,只在源程序中起作用
而C++是编译型语言
这意味着 类作用域 只在编译期间有用,
编译后,类中的函数,要不就成为inline 函数,直接嵌入到调用处
要不就生成C 函数差不多的函数
这样静态成员函数,和非静态成员函数的差异,
就是this 指针这个隐藏参数有没有,怎么样传递的问题
静态函数无须 类的对象,就可以调用,因此不需要this 指针参数,
来表示调用者身份
成员函数,需要通过类对象(或指向它的指针,引用)来调用
因此需要一个参数,来表示调用这个函数时候,对应的对象
C++采用隐藏的指针参数 this,表示调用成员函数时候,对应的那个对象
原因是,这个参数 实际调用的时候
这个 对象(或指针,引用)在函数前面,不在实参表内部,
所以C++隐式传递这个参数,形参表中也隐藏了这个参数。
但是这个参数确确实实传递过来了,所以成员变量可以使用它
C++ 规定这个参数是个指针,参数名为 this