之前也写过相关的文章讨论const关键字,但在不断学习后还是发现自己对它的认识还是不够,为此在此学习const的用法。
在阅读下面的内容之前可以先看看往期的博文:优快云https://mp.youkuaiyun.com/mp_blog/creation/editor/123943107
话不多说,先上代码:
#include<iostream>
using namespace std;
class A
{
private:
const int a; // 常对象成员,只能在初始化列表赋值
//int a;
public:
// 构造函数
/*int text(int m)
{
a = m;
}*/
A() : a(0) { cout << a << endl; }
A(int x) : a(x) { }; // 初始化列表
// const可用于对重载函数的区分
int getValue(); // 普通成员函数
int getValue()const ; // 常成员函数,不得修改类中的任何数据成员的值
};
int main()
{
A a;
system("pause");
return 0;
}
别小看这一段代码,里面包含的内容是很多的。
1.private:
const int a;
我们知道这是在类内定义了一个int型常量,那么我们怎么给它赋初值呢?
首先在类里面这个数据是私有的,这意味着我们没办法通过类外定义对象,用对象给它赋值,一般情况我们都是在类内用成员函数给它赋值或者直接在构造函数里赋值,现在我们把两种方法都试一试。
1.1成员函数赋值
public:
// 构造函数
int text(int m)
{
a = m;
}
软件是visual studio,结果提示两个错误:
第二个错误我们后面再说,第一个错误告诉我们在成员函数里面给常量赋值是不行的
即使改为
int text(int m)const;
或者
int text(const int m) //错误
或者
int text(int m):a(m){ }; //错误
我们知道如果不给成员赋初值,编译器会给我们一个默认的构造函数和析构函数,用来给成员赋值,但在这里我们发现出现了问题,默认的构造函数没办法给常对象成员赋值。系统报错说我们无法引用“A”的默认构造函数。
1.2构造函数赋值
public:
A(const int m)
{
a = m;
}
结果同样错误,错误类型也相同,但是用初始化列表赋值就可以。
public:
A() : a(0) { cout << a << endl; }
A(int x) : a(x) { }; // 初始化列表
所以我们得到一个结论:常对象成员,只能在初始化列表赋值。
2.const可以用作函数重载的区分
int getValue(); // 普通成员函数
int getValue()const ; // 常成员函数,不得修改类中的任何数据成员的值
在之前了解的函数重载的方法是函数的参数列表的参数个数不同,参数类型不同,同时函数的返回值类型是不能作为函数重载的条件的,今天又学到一个,之前一直没有注意到这一点,它的用法也可以参考我之前的文章。
但不需要注意的是,构造函数不能用这样的方法重载,上面说的参数个数和类型还是适用于构造函数的,但const不行。
否则会出现如上错误。