C++学习(三)_常成员函数

常成员函数

声明: 函数名(参数表)const;

说明:

  1. const是函数类型的一部分,在实现部分也要带该关键字。const关键字可以用于对重载函数的区分.
  2. 如果将一个对象定义为常对象,则通过该对象只能调用它的常成员函数,而不能调用其他普通函数。但普通函数可以调用常成员函数。
  3. 常成员函数不能更新类的成员变量,也不能调用该类中没有用const修饰的成员函数,只能调用常成员函数。

例一:定义一个square类,这个类有w和h两个私有属性,通过调用getArea()方法可以得到矩形的面积.

#include 

using namespace std;

class square{
private:
    int w, h;
public:
    int getArea() const; //带const修饰的方法
    int getArea();       //不带const修饰的方法
    square(int w, int h) : w(w), h(h){};    //构造函数
};

int square::getArea() const    //实现部分也带该关键字
{
    return w * h;
}

int square::getArea()
{
    return w * h;
}

int main()
{
    const square a(3,4);
    cout << a.getArea() << endl;
    square b(2,4);
    cout << b.getArea() << endl;
    
    return 0;
}

运行上述代码,发现程序正常运行.

C++学习(三)_常成员函数_第1张图片

从上方程序可以看出,我们在square类中定义了两个getArea()方法,一个用const修饰,一个没有。

所以,可得结论1:const是函数类型的一部分,在实现部分也要带该关键字。const函数可以用于重载函数的区分.


例二:将带有const的getArea()方法注释掉,观察程序运行结果

#include 

using namespace std;

class square{
private:
    int w, h;
public:
//  int getArea() const; //带const修饰的方法
    int getArea();       //不带const修饰的方法
    square(int w, int h) : w(w), h(h){};    //构造函数
};

//int square::getArea() const    //实现部分也带该关键字
//{
//    return w * h;
//}

int square::getArea()
{
    return w * h;
}

int main()
{
    const square a(3,4);
    cout << a.getArea() << endl;
//  square b(2,4);
//  cout << b.getArea() << endl;
    
    return 0;
}

程序无法正常运行.

因此,我们可得结论2:常对象无法调用没有用const修饰的成员函数.


例三:我们分别将带有const的函数和不带const函数注释掉,观察程序运行结果

#include 

using namespace std;

class square{
private:
    int w, h;
public:
    int getArea() const; //带const修饰的方法
    int getArea();       //不带const修饰的方法
    square(int w, int h) : w(w), h(h){};    //构造函数
};

int square::getArea() const    
{
    return w * h;
}

int square::getArea()
{
    return w * h;
}

int main()
{
    //const square a(3,4);
    //cout << a.getArea() << endl;
    square b(2,4);
    cout << b.getArea() << endl;
    
    return 0;
}

程序在两种情况下均可正常运行

所以,得到结论3:普通对象既可以调用有const修饰的函数也可以调用没有const修饰的成员函数.


例四:分别在带const修饰和不带const修饰的getArea()函数下添加上赋值语句"w = 10, h = 10;"

#include 

using namespace std;

class square{
private:
    int w, h;
public:
    int getArea() const; //带const修饰的方法
    int getArea();       //不带const修饰的方法
    square(int w, int h) : w(w), h(h){};    //构造函数
};

int square::getArea() const    
{
    w = 10;
    h = 10;
    return w * h;
}

int square::getArea()
{
    w = 10;
    h = 10;
    return w * h;
}

int main()
{
    const square a(3,4);
    cout << a.getArea();
    square b(3,4);
    cout << b.getArea();

    return 0;
}

程序运行错误.

所以得结论4:常成员函数不能更新类的成员变量.


例5:在getArea函数中调用const修饰的函数和非const修饰的函数

#include 

using namespace std;

class square{
private:
    int w, h;
public:
    int getArea() const; //带const修饰的方法
    int getArea();       //不带const修饰的方法
    void show() const;   //带const修饰的show
    void show2();        //不带const修饰的show2
    square(int w, int h) : w(w), h(h){};    //构造函数
};

void square::show() const {
    cout << "show.." << endl;
}

void square::show2(){
    cout << "show2.." << endl;
}

int square::getArea() const   
{

    show();
    //show2();
    return w * h;
}

int square::getArea()
{
    w = 10, h = 10;
    return w * h;
}

int main()
{
    const square a(3,4);
    cout << a.getArea();

    return 0;
}

运行发现程序能够调用用const修饰的show()函数,无法调用没有用const修饰的show2()函数

结论5:常成员函数不能调用该类中没有用const修饰的成员函数,只能调用常成员函数.

以上即为我对c++常成员函数的理解。

如有错误,敬请指正.

你可能感兴趣的:(C++学习(三)_常成员函数)