const成员函数总结

const 成员函数:

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

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

所以 const 关键字对成员函数的行为作了更加明确的限定:有 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成员函数是可以修改它的

时间: 2024-09-30 09:02:51

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

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

实验原因 说明如何使用const描述保护类数据不会意外修改. 编译环境 vc6sp6 + win7x64 工程下载 copyConstruction_constMemberFunction.zip 使用非const成员函数,引起的拷贝构造函数报错 [cpp] view plain copy class CStudent { /// 常量定义 public: enum {NAME_SIZE_MAX = 64}; /// 构造, 拷贝构造, 析构函数 public: CStudent(); CStu

const成员函数

本文结论: const对象.指向const对象的指针或引用只能用于调用其const成员函数. 实例说明: class A { public: void mf1(){ cout<<"Function Call"<<endl; } void mf2() const{ cout<<"const Function Call"<<endl;} }; int main() { A a; a.mf1(); //ok a.mf2();

C++类const成员函数

c++类中可以用const关键字来声明不修改对象的成员函数,它使用时需要注意: 1.常量对象只能调用const成员函数 2.非常量对象可以调用const成员函数 以下列代码为例,来解释: 1 class Person{ 2 public: 3 void print(){ 4 cout<<"I am a common function!"<<endl; 5 } 6 void show()const{ 7 cout<<"I am a const

mutable用于修改const成员函数中的成员变量

http://no001.blog.51cto.com/1142339/389840/ mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词. 在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中. 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的.但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式、auto_ptr与单例模式、const成员函数、const 对象、mutable修饰符

C++ Primer 学习笔记_24_类与数据抽象(10)--static 与单例模式.auto_ptr与单例模式.const成员函数.const 对象.mutable修饰符 前言 [例]写出面向对象的五个基本原则? 解答:单一职责原则,开放封闭原则,依赖倒置原则,接口隔离原则和里氏替换原则 里氏替换原则:子类型必须能够替换他们的基类型. 设计模式分为三种类型:创建型模式.结构型模式和行为型模式 一.static 与单例模式 1.单例模式 单例模式的意图:保证一个类仅有一个实例,并提供一个访问它

(转)函数后面加const--C++ const成员函数

类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const.所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者参数表内),只能读取数据成员,不能改变数据成员:没有 const 修饰的成员函数,对数据成员则是可读可写的.

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

const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whenever you need”. 1.用const 修饰函数的参数 如果参数作输出用,不论它是什么数据类型,也不论它采用“指针传递”还是“引用传递”,都不能加const 修饰,否则该参数将失去输出功能.const 只能修饰输入参数: 如果输入参数采用“指针传递”,那么加const 修饰可以防止意外地

C++中const对象和const成员函数

1?  成员函数可以声明成const函数(声明后加const) 2?  对于const对象,只能调用const成员函数 3?  Const函数和非const函数可以形成重载 4?  对于非const对象的函数调用优先选择非const成员函数 5?  对于类中的mutable数据成员,可以被const成员函数修改 // // main.cpp // Const // // Created by 06 on 15/1/24. // Copyright (c) 2015年 黄永锐. All right

关于 const 成员函数

成员函数如果是const意味着什么? 有两个流行概念:物理常量性和逻辑常量性. C++对常量性的定义采用的是物理常量性概念,即const 成员函数不可以更改对象内任何non-static成员变量.例如: 1 class CTextBlock 2 { 3 public: 4 ...... 5 std::size_t length() const; 6 7 private: 8 char* pText; 9 std::size_t textLength; 10 bool lengthIsValid;

const 成员函数

我们知道,在成员函数中,如果没有修改成员变量,应该给成员函数加上 const 修饰符,例如 1 #include <iostream> 2 3 using namespace std; 4 5 class Foo 6 { 7 public: 8 Foo(int x) : _x(x) {} 9 int getX() const { return _x; } 10 private: 11 int _x; 12 }; 13 14 int main() 15 { 16 Foo f(1); 17 cou