zoukankan      html  css  js  c++  java
  • 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成员函数是能够改动它的


  • 相关阅读:
    第八次作业-谈谈Java web学习小结
    第七周作业--可行性研究与程序系统的结构
    第六次作业-数据库连接
    第五次作业-系统实现可能需要用到的技术,及学习相关技术的心得
    第四次作业-软件需求分析过程与需求分类
    第三次作业-前端与后台数据交换问题
    第二次作业-软件工作量估算方法
    第一次作业
    捣鼓一个Ajax请求管理器
    动动手,写个knockout的分页模板
  • 原文地址:https://www.cnblogs.com/llguanli/p/8553597.html
Copyright © 2011-2022 走看看