C++中const成员函数和const对象
2016-08-17 18:21
309 查看
一、C++中函数和对象
1.const数据成员:跟const常量一样,只是一个在类里(而且是在构造函数里),一个在类外而已,都必须初始化。
2.const成员函数:即普通成员函数后再加const。它可以读取数据成员的值,但不能修改它们。若要修改
时,数据成员前必须加mutable。以指定其可被任意更改。mutable是ansi c++考虑到实际编程时,可能一定要修改const对象中的某个数据成员而设的。const成员函数可以被相同参数表的非const成员函数重载。
3.普通对象:可以调用任意成员函数。见下面的例子
4.const对象:仅能调用const成员函数,但是构造函数和析构函数是唯一不是const成员函数却可以被const对象调用的成员函数。
二、例1
三、例2
非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员:
const Set s;
s.AddElem(10); // 非法: AddElem 不是常量成员函数
s.Member(10); // 正确
但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。它们也能给常量的数据成员赋值。
四、最后一个例子
五、More to Tell
1.将const放在函数参数表和函数体之间是指定const成员函数,对于普通函数不可如此指定,也没有任何意义。
2.关键字const必须同样的出现在函数实现里,否则编译器会将这个函数实现当作另外一个重载版本(非const成员函数)
3.非const成员函数可以调用const成员函数,但是const成员函数不允许掉用非const成员函数,因为它可能会修改const对象成员的值。
4.对于类内有const函数与非const函数重载的情况,非const成员调用该函数编译器默认调用非const版本,那么如何调用const版本的函数呢?其实只需要转型就可以了。
1.const数据成员:跟const常量一样,只是一个在类里(而且是在构造函数里),一个在类外而已,都必须初始化。
2.const成员函数:即普通成员函数后再加const。它可以读取数据成员的值,但不能修改它们。若要修改
时,数据成员前必须加mutable。以指定其可被任意更改。mutable是ansi c++考虑到实际编程时,可能一定要修改const对象中的某个数据成员而设的。const成员函数可以被相同参数表的非const成员函数重载。
3.普通对象:可以调用任意成员函数。见下面的例子
4.const对象:仅能调用const成员函数,但是构造函数和析构函数是唯一不是const成员函数却可以被const对象调用的成员函数。
二、例1
class Point { public: int GetX() const; int GetY() const; void SetPt (int, int); void OffsetPt (int, int); private: int xVal, yVal; }; int Point::GetY() const//const 成员函数应该在函数原型说明和函数定义中都增加const 限定: { return yVal; }
三、例2
class Set { public: Set (void){ card = 0; } bool Member(const int) const; void AddElem(const int); //... private: int card; }; bool Set::Member (const int elem) const { //... }
非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员:
const Set s;
s.AddElem(10); // 非法: AddElem 不是常量成员函数
s.Member(10); // 正确
但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。它们也能给常量的数据成员赋值。
四、最后一个例子
class A{ public: const int a; int b; A(int n1,int n2):a(n1),b(n2){} void printA(){//非const成员函数printA cout<<a<<endl; } void printB()const{//const成员函数printB cout<<b<<endl; } }; int main() { const A a1(2,3);//定义一个const成员,它可以使用构造函数初始化const成员a和非const成员b A a2(4,5);//定义一个非const成员,可以使用构造函数初始化const成员a和非const成员b a1.printA();//编译不通过,非const成员函数被const对象使用 a2.printA();//编译通过,非const成员函数只是指定调用它的对象得是const //-----作为const成员函数printB,保证自己不修改成员a1,但不对a1做指定,a1可以是const也可以是非const a1.printB(); a2.printB(); }
五、More to Tell
1.将const放在函数参数表和函数体之间是指定const成员函数,对于普通函数不可如此指定,也没有任何意义。
2.关键字const必须同样的出现在函数实现里,否则编译器会将这个函数实现当作另外一个重载版本(非const成员函数)
3.非const成员函数可以调用const成员函数,但是const成员函数不允许掉用非const成员函数,因为它可能会修改const对象成员的值。
4.对于类内有const函数与非const函数重载的情况,非const成员调用该函数编译器默认调用非const版本,那么如何调用const版本的函数呢?其实只需要转型就可以了。
class A{ public: const int a; int b; A(int n1,int n2):a(n1),b(n2){} void printA(){//非const成员函数printA cout<<a<<endl; } void printA()const{//const成员函数printB cout<<b<<endl; } }; int main() { A a2(1,10);//定义一个非const成员,可以使用构造函数初始化const成员a和非const成员b a2.printA();//默认调用非const版本,结果为1 static_cast<const A>(a2).printA();//强制转型为const对象,调用const版本,结果为10 }
相关文章推荐
- C++ 重载运算符 友元函数
- Leetcode 29. Divide Two Integers (Medium) (cpp)
- 华为上机题汇总(十八)
- 类,对象
- 非常实用全面的 C++框架,库类等资源
- C++中引用(&)的用法和应用实例
- C++ 输出代码所在的文件、行数以及函数名称
- c++ 继承和多态
- c\c++中__asm__ __volatile__内嵌汇编用法简述
- 在 Ubuntu 上安装 Codelite
- 每天一个c++小程序(2):二维数组动态创建
- C++语言(四)——类与对象
- const 全局变量
- c++ string转int,int转string
- C++ “error LNK1169: 找到一个或多个多重定义的符号” 解决方法
- 关于数组指针,指针数组,双重数组,二维矩阵,字符串数组,双重字符指针的理解
- 0.个人框架开源起始
- c++字符中格式化
- c++ 关于map的遍历 删除
- ubuntu 安装 librdkafka