12this和const
this指针
1.一个类的多个对象各自拥有类的数据成员的一个副本
2.类的成员函数则被其所有对象共享
3.一个类的不同对象响应相同的消息时,调用的是同一个函数
4.每个对象都有一个指向自身的this指针
5.对象调用成员函数时会将自己的this指针传递给成员函数(隐含参数)
6.成员函数访问对象的所有数据成员都是通过this指针访问,如
double Column::volume(Column *this)
{
return this-> height
* this-> circle.area();
}
// this指针可以在成员函数中显式使用
7.this指针的另外一个作用——访问对象自身(*this)
示例:
#include <iostream.h>
class Test
{public:
Test(int n = 0);
Test & setData(int n);
void print();
private:
int data;
};
Test::Test(int n)
{data = n;
}
Test & Test::setData(int n)
{data = n;
return *this;
}
void Test::print()
{cout<<"data = "<<data<<"!"<<endl;
}
main()
{Test obj1;
cout<<"obj1: ";
obj1.setData(100).print();
return 0;
}
成员函数setData返回类型是Test &,返回值是*this
一个对象调用成员函数setData将获得该对象的引用——连续调用的关键
obj1.setData(100).print(); 正确
注意:
类的静态成员函数为什么不能访问非静态数据成员?
1.静态成员函数(属于类)没有维护this指针
2.访问非静态数据成员(属于对象)需要this指针
静态成员函数为什么不能调用非静态成员函数
1.调用非静态成员函数需要一个隐含参数(this指针)
2.静态成员函数没有
const特性
1.对象应用的最低访问权原则
2.有些对象不能被修改——让它不能被修改
3.有些成员函数不需要修改对象的数据成员——不让它修改数据成员
4.const对象——不能被修改的对象
5.const成员函数——不能修改数据成员的成员函数
声明const对象
const Circle baseCircle(0, 0, 1);
声明const成员函数
void Test::print( ) const
{ cout<<"data = "<<data<<"!\n"; }
声明const数据成员
和声明普通const变量的方法相同(初始化方式不同)
const约束
const对象不能调用非const成员函数
const成员函数不能调用非const成员函数
非构造函数、析构函数不能修改const对象
示例:
class Circle
{public:
Circle(double a = 5.0,
double b = 5.0,double c = 5.0);
private:
double x, y; //x、y坐标
const double r; //半径
};
Circle::Circle(double a,double b, double c):r(c) //const数据成员的初始化
{x = a;
y = b;
}