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. JAVA连接MYSQL8.0问题

    title: java连接mysql8.0问题 date: 2018-07-08 19:27:38 updated: tags: description: keywords: comments: im ...

  2. 高性能MySQL(第三版)

    一.MySQL架构与历史 1.2.2 锁粒度 表锁:写锁的优先级高于读锁:写锁的请求可以插入到读锁的前面,但读锁的请求却不能插入到写锁的前面: 行级锁:行级锁只在存储引擎层实现,在服务器层没有实现: ...

  3. python数据类型小结

    变量 变量是 为了存储程序 运算过程中的一些中间结果,为了方便日后调用. 变量的命名规则1.要有描述性2.变量名只能_,数字,字母组成,不可以是特殊字符(#)3.不能以中文为变量名4.不能以数字开头5 ...

  4. 九度oj 题目1340:小A的计算器

    题目描述: 以往的操作系统内部的数据表示都是二进制方式,小A新写了一个操作系统,系统内部的数据表示为26进制,其中0-25分别由a-z表示. 现在小A要在这个操作系统上实现一个计算器,这个计算器要能实 ...

  5. BZOJ 1095 [ZJOI2007]Hide 捉迷藏 ——动态点分治

    [题目分析] 这题好基啊. 先把分治树搞出来.然后每个节点两个堆. 第一个堆保存这个块里的所有点(即分治树中的所有儿子)到分治树上的父亲的距离. 第二个堆保存分治树子树中所有儿子第一个堆的最大值. 建 ...

  6. 关于java读取文件IO流学习总结(一)

    IO流的分类: 1.根据流的数据对象来分: 高端流:所有的内存中的流都是高端流,比如:InputStreamReader 低端流:所有的外界设备中的流都是低端流,比如InputStream,Outpu ...

  7. 【leetcode dp】Dungeon Game

    https://leetcode.com/problems/dungeon-game/description/ [题意] 给定m*n的地牢,王子初始位置在左上角,公主在右下角不动,王子要去救公主,每步 ...

  8. net3:Button的CommandName使用,AdRotator,BulletedList的使用

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  9. Java 并发编程中的 Executor 框架与线程池

    Java 5 开始引入 Conccurent 软件包,提供完备的并发能力,对线程池有了更好的支持.其中,Executor 框架是最值得称道的. Executor框架是指java 5中引入的一系列并发库 ...

  10. centos tomcat 关于日志

    一.实时查看tomcat的日志 1.先切换到tomcat5/logs 2.tail -f catalina.out 3.这样运行时就可以实时查看运行日志了 例如: cd /tomcat7/logs t ...