1. Bool Bar(const int x[], const int y[],int z[]);
解释:给x,y标上const后,编译器可知此函数循环,每个不同迭代内容不相关,可并行执行;
否则,由于指针z可能指向x/y,引起内存重叠,z[i]修改会改变x[]/y[]数据,循环的不同迭代间有数据依赖关系,不可用并行指令优化。
2. 类中将const成员函数声明为常量函数,表面它不会修改任何类成员的值;常用来做存取器;
class Rectangle
{
public:
int GetLength() const {return itsLength;}
private:
int itsLength;
}
3. 指针常量与常量指针:
int const *p1 = &b; //const 在前,定义为常量指针
int *const p2 = &c; //*在前,定义为指针常量
常量指针p1:指向的地址可以变,但内容不可以重新赋值,内容的改变只能通过修改地址指向后变换。
p1 = &a是正确的,但 *p1 = a是错误的。
指针常量p2:指向的地址不可以重新赋值,但内容可以改变,必须初始化,地址跟随一生。
p2= &a是错误的,而*p2 = a 是正确的。
4. 若声明了一个指向常量对象的指针,那么此指针只能调用常量函数:
class Rectangle
{
public:
Rectangle();
~Rectangle();
void SetLength(int length) {itsLength = length;}
int GetLength() const {return itsLength;}
void SetWidth(int width){itsWidth = width;}
int GetWidth() const{return itsWidth;}
private:
int itsLength;
int itsWidth;
}
Rectangle::Rectangle():itsWidth(5),itsLength(10) {}
Rectangle::~Rectangle() {}
int main()
{
Rectangle *pRect = new Rectangle;
const Rectangle *pConstRect = new Rectangle; //pConstRect为指向常量对象Rectangle的指针
Rectangle *const pConstPtr = new Rectangle; //pConstPtr为指向Rectangle对象的常量指针
std::cout << pRect->GetWidth()<<endl;
std::cout << pConstRect->GetWidth()<<endl;
std::cout << pConstPtr->GetWidth()<<endl;
pRect->SetWidth(10);
//pConstRect->SetWidth(10);
pConstPtr->SetWidth(10);
std::cout << pRect->GetWidth()<<endl;
std::cout << pConstRect->GetWidth()<<endl;
std::cout << pConstPtr->GetWidth()<<endl;
}
上述pConstRect被声明为指向常量Rectangle的指针,用其来调用非常量成员函数是非法的;
而pConstPtr被声明为指向Rectangle的常量指针,指针为常量不能指向其他对象,但指向的Rectangle不是常量。