const修饰符声明的数据成员在初始化后不能被修改。非静态成员函数也可以包含const。
位置:参数列表之后,函数体开始之前。类外部的定义也必须加上该修饰符。
例子:
class person{
....
int print_age() const;
private:
int age;
};
int person::print_age() const
{cout<<"age is"<
->成员选择运算符。使用指针访问结构体的成员。
结构指针->成员名 或者 (*结构指针).成员名
. 成员访问运算符
结构变量.成员名称
当引用一个的数据成员其引用代码又在类外时,在表达式中总要指明该类一个具体实例,编译器才能知道要访问哪一个数据成员.例如,以下代码首先打印属于对象test1的数据成员n,然后打印属于对象*ptest2的n,CTest是一个类:
CTest test1;
CTest *ptest2=new CTest;
//...
cout< cout<n<<'\n';
然而,在一个类的成员函数内部引用一个数据成员却不能指明一个类的具体实例:
class CTest
{
public:
int n;
int getn()
{
return n;
}
};
那么,编译器怎样决定引用哪一个实例对象的n拷贝呢?为了分辨,编译器实际上给成员函数传递一个隐藏的对象指针.此指针指向函数调用所要引用的对象.该函数隐式的使用这个指针,例如,在以下调用:
CTest test;
test.getn();
中,编译器传给getn一个隐藏的指向test对象的指针,getn隐式的使用这个指针,访问属于对象test的成员n.
利用C++的关键字this可以直接访问这个隐藏的指针.事实上,对于类X,它的每一成员函数中都隐式的声明了this指针:
X * const this;
此指针指向该成员函数所在的对象的地址(即函数"当前"引用的对象).在test.getn()调用中,getn()中的this指针指向的就是test对象.而对于
CTest test1;
test1.getn();
getn()中的this指针,指向的是test1对象.
由于this指针被声明为* const,它是一个指针常量,因此不能改变它的值(在低版本的C++中,修改this指针是可以的),但可以改变它所指对象的值.例如:
int CTest::chargethis() //假定changethis在CTest中已有声明
{
CTest temp;
this=temp; //非法
//...
}
利用this指针,getn可重写如下:
int CTest::getn()
{
return this->n; //等价于return n;
}
在数据成员的名字前加上表达式this->是合法的但没有什么效果,因为this指针的使用本来就是隐式的,它只引用数据成员.
如果需要访问全局数据或函数,而它们的名字又和数据成员或成员函数的名字相同,则必须在名字前面加上作用域分辨符" :: ".例如:
int n=0; //全局n
class CTest
{
int n; //数据成员n
int demo()
{
cout<<::n<<'\n'; //打印全局n
cout< }
};
阅读(2837) | 评论(0) | 转发(0) |