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 rights reserved.
//

#include <iostream>
using namespace std;

//员工类
class Employee{
    string name;
    int age;
    mutable int x;//注意这个关键字的作用哦
    
public:
    Employee(string name,int age):name(name),age(age){
       // name = name;//这样区分不开
    }
    
    //
    void setName(string name){
        this->name = name;
    }
    
    string getName() const{
        return name;
    }
    
    
    
    void show(){
        cout << name << "今年" << age << "岁了" << endl;
      //  name = "2345";
    }
    
#pragma 注意  const加在前面,修饰的是返回值
    const void show1(){
        cout << name << "今年" << age << "岁了" << endl;
        //  name = "2345";
    }
    
#pragma 我们想修饰一个函数让它具有常量性  应该把const加在参数后面
    void show2() const{
        cout << name << "今年" << age << "岁了" << endl;
       // this->name = "1234567";//const函数中不能修改普通成员变量
        x = 100;//被mutable修饰的变量可以在const函数中修改
    }
    
#pragma 函数重载:  const函数 与 非 const函数可以形成函数重载的关系
    
};

//主函数
int main(int argc, const char * argv[])
{

    //创建对象
    Employee em("张三",18);
    em.show();
    em.setName("王五"); //这里是修改了成员变量
    em.show();
    em.setName("dfghj");
    em.getName();
    
#pragma 如果我这个对象是一个const类型的对象  会如何?em2能够调用show方法吗?
    const Employee em2("李斯",21);
   // em2.show(); //不能调用。 为什么?  因为
    
    /*
     const类型的对象,说明这个对象里面的所有成员变量都不允许修改
     但是在调用show方法的时候,show方法里面现在的确是没有修改,但是可以修改。那么我就不放心了,你说你不修改,可是你可以修改
     在em2调用show方法的时候,把em2隐式传进去,然后再show方法里面就可以通过this->拿到对象获取变量
     */
    
#pragma 怎样才可以让它去调用?  只要保证在这个函数里真的不去修改任何变量  
    //怎么去保证?  我把这个函数修饰成const
    
    em2.show2();//const对象只能调用const类型的成员函数
    em.show2();//普通的对象也能调用
    
#pragma 所以说在一些函数里面没有修改成员变量的函数  还是加上const好. getter方法可以加,setter方法不能加
    em2.getName();
    //em2.setName("dfghj");//不能调用
    return 0;
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。