c++成员函数后的const

来源:互联网 发布:周围神经炎知乎 编辑:程序博客网 时间:2024/05/19 00:43

以下的每一点会给出代码示例说明

 

一、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();//okcin.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();//oka.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();//okcin.get();    return 0;}

输出: 500

0 0