const 成员函数:

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作不论什么改变。

在设计类的时候。一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。

所以 const keyword对成员函数的行为作了更加明白的限定:有 const 修饰的成员函数(指 const 放在函数參数表的后面,而不是在函数前面或者參数表内),仅仅能读取数据成员,不能改变数据成员;没有 const 修饰的成员函数。对数据成员则是可读可写的。

准确的说const是修饰this指向的对象的,

比如:

class A

{

public:

    fun(int);

};

这里fun函数事实上有两个參数,第一个是A*const this, 还有一个才是int类型的參数,假设我们不想fun函数改变參数的值。能够把函数原型改为fun(const int),但假设我们不同意fun改变this指向的对象呢?由于this是隐含參数,const没法直接修饰它,就加在函数的后面了,const修饰*this是本质。至于说“表示该成员函数不会改动类的数据。否则会编译报错”之类的说法仅仅是一个现象。根源就是由于*this是const类型的。

通过程序实例来说明const成员函数的特性(分析见程序):

#include<iostream>
#include<string> using namespace std; class Student
{
public:
Student(string str=NULL,double sco=0.0);
void set_student(string str,double sco);
string get_name() const;
double get_score() const;
void display();
void display() const;//增加const的成员函数能够与不加const的同名函数重载
private:
string name;
double score;
}; Student::Student(string str,double sco)
{
name=str;
score=sco;
} void Student::set_student(string str,double sco)//须要改变数据成员,不能加const
{
name=str;
score=sco;
} string Student::get_name() const//不须要改变数据成员。一般要加const
{
return name;
} double Student::get_score() const//不须要改变数据成员,一般要加const
{
return score;
} void Student::display()
{
cout<<"调用非const:"<<endl;
cout<<"name:"<<name<<",score:"<<score<<endl;
} void Student::display() const
{
cout<<"调用const:"<<endl;
cout<<"name:"<<name<<",score:"<<score<<endl;
} void display(const Student &stu)//外部函数:假设对象非cons型。则无论get_name()与get_socre()函数是否为const成员函数。都能够调用,
// 假设对象为const型,则get_name()与get_socre()函数必须为const成员函数
{
cout<<"外部函数:"<<endl;
cout<<"name:"<<stu.get_name()<<",score:"<<stu.get_score()<<endl;
} int main()
{
Student stu1("lanzhihui",89.1);
stu1.display();//假设存在非const型的成员函数,则调用非const型的成员函数
//假设仅仅存在const型的成员函数,则调用const型的成员函数 stu1.set_student("wangdan",19.9);
stu1.display(); const Student stu2("wangqian",19.3);
stu2.display();//必须调用const型的成员函数 display(stu1);
display(stu2); system("pause");
return 0;
}

小节:

a.const对象仅仅能訪问const成员函数,而非const对象能够訪问随意的成员函数,包含const成员函数.

b.const对象的成员是不可改动的,然而const对象通过指针维护的对象却是能够改动的.

c.const成员函数不能够改动对象的数据,无论对象是否具有const性质.它在编译时,以是否改动成员数据为根据,进行检查.

d.作为一种良好的编程风格,在声明一个成员函数时,若该成员函数并不正确数据成员进行改动操作。应尽可能将该成员函数声明为const 成员函数。

e.然而加上mutable修饰符的数据成员,对于不论什么情况下通过不论什么手段都可改动,自然此时的const成员函数是能够改动它的

const成员函数总结的更多相关文章

  1. const成员函数

    尽管函数名和参数列表都相同,void foo( ) const成员函数是可以与void foo( )并存的,可以形成重载! 我们假设调用语句为obj.foo(),如果obj为non-const对象,则 ...

  2. c++ 学习之const专题之const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...

  3. 关于 const 成员函数

    成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如 ...

  4. C++ Const成员函数

    一些成员函数改变对象,一些成员函数不改变对象. 例如:  int Point::GetY() { return yVal; }  这个函数被调用时,不改变Point对象,而下面的函数改变Point对象 ...

  5. C++类的const成员函数、默认的构造函数、复制形参调用函数(转)

    C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...

  6. c++中的const参数,const变量,const指针,const对象,以及const成员函数

    const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...

  7. 拷贝构造函数和const成员函数

    实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip   ...

  8. 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象

    单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...

  9. const 成员函数

    我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如 #include <iostream> using namespace std; class F ...

  10. Item 16: 让const成员函数做到线程安全

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方 ...

随机推荐

  1. 【SQL Server】SQL常用系统函数

    SQL常用系统函数 函数类型 函数表达式 功能 应用举例 字符串函数 SubString(表达式,起始,长度) 取子串 SubString('ABCDEFG',3,4) Right(表达式,长度) 右 ...

  2. 最短路POJ 1062 昂贵的聘礼

    C - 昂贵的聘礼 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit St ...

  3. E. Lost in WHU。矩阵快速幂!

    E. Lost in WHU 比赛的时候一直不知道样例怎么来的,然后和队友推了一下,然后还是没什么思路,样例手推很困难,然后我随口枚举了几个算法dp.广搜.快速幂.比赛结束问了谷队长结果真的是用快速幂 ...

  4. POJ 1971-Parallelogram Counting,暴力1063ms!

    Parallelogram Counting 刚学hash还不会用,看到5000ms的时限于是想着暴力来一发应该可以过.以前做过类似的题,求平行四边形个数,好像是在CF上做的,但忘了时限是多少了,方法 ...

  5. PTA 09-排序3 Insertion or Heap Sort (25分)

    题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/676 5-14 Insertion or Heap Sort   (25分) Accor ...

  6. 【Luogu】P1578奶牛浴场(DP,枚举)

    题目链接 枚举极大子矩形.详情请见本题题解:I_AM_HelloWord 代码如下 #include<cstdio> #include<cctype> #include< ...

  7. 【DFS序+树状数组】HDU 3887 Counting Offspring

    http://acm.hdu.edu.cn/showproblem.php?pid=3887 [题意] 给定一棵树,给定这棵树的根 对于每个结点,统计子树中编号比他小的结点个数 编号从小到大一次输出 ...

  8. 【bzoj1854】[Scoi2010]游戏 - 并查集

    lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备最多只能使 ...

  9. Jerasure库接口简介及性能测试

    http://blog.chinaunix.net/uid-20196318-id-3277600.html Jerasure库提供Reed-Solomon和Cauchy Reed-Solomon两种 ...

  10. 关于 最短路条数 和 边不可重复最短路条数问题 /hdu3599(边不可重复最短路)

    原先一直在做一道省赛题,由于题意错误理解成球最短路条数,误打误撞敲了最短路条数,又发现hdu3599(多校)求边不可重复最短路条数.下面说说俩种问题解法: 最短路条数: 求一个图一共一几条最短路径,思 ...