以下的每一点会给出代码示例说明
一、c++成员函数后的const有以下特点:
1.隐含的this指针以const 类名的类型传递
2.const 只能声明成员函数,不能声明静态函数
(static函数不能有const修饰符,const 成员函数是包含this指针的,这明显不被static函数允许)
3.const 成员函数不能修改对象的任意非静态成员
4.const 成员函数不能调用非const 成员函数
二、另外,const对象与const成员函数相关的内容
1.由const 类名构造的对象只能调用 const方法
2.const对象的构造函数和析构函数无需用关键字const声明
1-1
//error C2662: “Text::print”: 不能将“this”指针从“const Text”转换为“Text &”
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void printconst(void)const{cout<<"hello"<<endl;}
void print(void){cout<<"hello"<<endl;}
private:
int k;
};
//上面定义了类Text的一常量对象
int main(void)
{
a.printconst(); //ok
a.print(); //error
//上面a.print()调用是非法的
return 0;
}
1-2
//error C2272: “printconst”: 静态成员函数上不允许修饰符
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void static printconst(void) const{cout<<"hello"<<endl;}
void print(void){cout<<"hello"<<endl;}
private:
int k;
};
int main(void)
{
Text a;
a.printconst();
return 0;
}
1-3
//error C2166: 左值指定 const 对象
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void printconst(void) const{cout<<"hello"<<endl; k=1;}
void print(void){cout<<"hello"<<endl;}
private:
int k;
};
int main(void)
{
Text a;
a.printconst();
return 0;
}
而静态成员可以修改:
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void printconst(void) const{k=1000;cout<<k<<endl;}
void print(void){cout<<"hello"<<endl;}
private:
static int k;
};int Text::k=500;
const Text a;
int main(void)
{
a.printconst();//ok
cin.get();
return 0;
}
输出:1000
1-4
//error C2662: “Text::print”: 不能将“this”指针从“const Text”转换为“Text &”
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void printconst(void) const{cout<<"hello"<<endl;print();}
void print(void){cout<<"hello"<<endl;}
private:
int k;
};
int main(void)
{
Text a;
a.printconst();
return 0;
}
2-1
//error C2662: “Text::print”: 不能将“this”指针从“const Text”转换为“Text &”
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void printconst(void) const{cout<<"hello"<<endl;}
void print(void){cout<<"hello"<<endl;}
private:
int k;
};
const Text a;
int main(void)
{
a.printconst();//ok
a.print();//error
return 0;
}
2-2
#include "stdafx.h"
#include "iostream"
using namespace std;
class Text{
public:
void printconst(void) const{cout<<k<<endl;}
void print(void){cout<<"hello"<<endl;}
Text()
{
k=500; //修改成功
}
private:
int k;
};
const Text a;
int main(void)
{
a.printconst();//ok
cin.get();
return 0;
}
输出: 500