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. dp的两个不错的题

    C - Cheapest Palindrome Keeping track of all the cows can be a tricky task so Farmer John has instal ...

  2. 信息安全试验-DES加密!

    信息安全试验二--DES加密算法 本渣表示没有理解原理,照着书上敲了一发,运行无误! 吐槽:手动S盒简直丧心病狂,扩展置换表全是手动输入,加密原理还是很好理解,两次异或,先混淆. 此代码数据由老师给出 ...

  3. Selenium WebDriver高级用法

    Selenium GitHub地址 选择合适的WebDrvier WebDriver是一个接口,它有几种实现,分别是HtmlUnitDrvier.FirefoxDriver.InternetExplo ...

  4. Thread.getContextClassLoader() is null

    Java threads created from JNI code in a non-java thread have null ContextClassloader unless the crea ...

  5. BZOJ 1855 [Scoi2010]股票交易 ——动态规划

    DP方程是比较简单的,主要有三种:什么都不做.买入.卖出. 发现买入卖出都是$\Theta (n^3)$但是转移方程都是线性的,而且决策和当前的情况是分开的. 所以可以单调队列优化. 复杂度$\The ...

  6. Redis常见配置redis.conf

    redis的配置文件.相信学过SSH或SSM的读者都知道,配置文件的使用在当下开发已十分普遍,希望大家要熟悉习惯这 种开发方式,废话不多说,来开始我们今天的内容吧. 首先得找到 redis 的配置文件 ...

  7. 转 CListCtrl::InsertColumn、InsertItem、SetItemText;

    将数据写入到CListCtrl 向CListCtrl中写入数据,一般使用3个成员方法: CListCtrl::InsertColumn; CListCtrl::InsertItem; CListCtr ...

  8. 【bzoj2393】Cirno的完美算数教室 数论容斥

    Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数 ...

  9. STL学习笔记(一) 容器

    0.前言随机访问迭代器: vector.string.dequeSTL的一个革命性的方面就是它的计算复杂性保证 条款01:慎重选择容器类型 c++提供的容器:标准STL序列容器:vector.stri ...

  10. 16.1116 NOIP 考前模拟(信心题)

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...