const成员函数总结
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成员函数总结的更多相关文章
- const成员函数
尽管函数名和参数列表都相同,void foo( ) const成员函数是可以与void foo( )并存的,可以形成重载! 我们假设调用语句为obj.foo(),如果obj为non-const对象,则 ...
- c++ 学习之const专题之const成员函数
一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象: ...
- 关于 const 成员函数
成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如 ...
- C++ Const成员函数
一些成员函数改变对象,一些成员函数不改变对象. 例如: int Point::GetY() { return yVal; } 这个函数被调用时,不改变Point对象,而下面的函数改变Point对象 ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- c++中的const参数,const变量,const指针,const对象,以及const成员函数
const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...
- 拷贝构造函数和const成员函数
实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip ...
- 12.C++-构造函数与析构函数调用顺序,const成员函数,const对象
单个对象创建时,构造函数的调用顺序 1.首先判断该对象的类是否拥有父类,若有则先调用父类的构造函数 2.判断该对象的成员是否是其它类的成员,若是则调用成员变量的构造函数(调用顺序和声明顺序相同) 3. ...
- const 成员函数
我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如 #include <iostream> using namespace std; class F ...
- Item 16: 让const成员函数做到线程安全
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果我们在数学领域里工作,我们可能会发现用一个类来表示多项式会很方 ...
随机推荐
- win10系统中virtualbox无法安装64位系统
win10系统中virtualbox无法安装64位系统 先总结下如果想在虚拟机中安装64位的Linux系统,最好能满足这几个条件: 64位CPU 64位操作系统 64位的虚拟机软件 开启BIOS虚拟化 ...
- json分享
JSON是什么? JavaScript Object Notation (JSON) is a text format for the serialization of structured data ...
- python的re模块常用方法
正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身.一个正则表达式模式中的字母和数字匹配同样的字符串. 多数字母和数字前加一个反斜杠时会拥有不同的含义. 标点符号只 ...
- Lenovo笔记本电脑进入BIOS的方法
使用NOVO键开机进入BIOS的操作方法 适用范围:2012年后发布的部分笔记本产品,含:IdeaPad全系列.Lenovo G系列部分IdeaPad U或S系列,YOGA/FLEX全系列产品Leno ...
- EasyUI 动态更新列
function UpdateRow() { var rows = $('#tbpmgridList').datagrid('getChecked'); var productid = ''; for ...
- ajax 下拉加载更多效果
1.生成HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- BZOJ 4815 [Cqoi2017]小Q的表格 ——欧拉函数
把式子化简一波. 发现一个比较厉害的性质:每个点只能影响到行列下标$gcd$与它相同的点. 然后就可以计算$\sum_{g<=k}f(g,g)*\sum_{i<=k}\sum_{j< ...
- 虚拟机搭建--hyper-V使用教程
http://jingyan.baidu.com/article/4e5b3e19695d9f91901e24bb.html
- 树状数组求第K大(From CLJ)
; <<log2[n];p;p>>=) if(a[ret+p]<=kth) kth-=a[ret+=p]; return ret;
- CentOS 7 使用iptables 开放端口
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.service system ...