const 关键字一般认为是常量的意思,但实际上在C++中const表示在运行时只读的意思。
常成员函数
const修饰的成员函数就是常成员函数
常成员函数的特点:
1不能调用非const的成员函数
2不能修改非const的成员变量
建议只要类的成员函数不修改属性值就尽量使用常成员函数,以提升程序的安全性,例如getter等
demo
//const修饰成员函数表示该函数为常成员函数
#include <iostream>
using namespace std;
class Test
{
private:
int number = 0;
public:
void show1() // 非const的成员函数
{
cout << "非const的成员函数" << endl;
}
void show2() const // 常成员函数
{
cout << "const的成员函数" << endl;
}
// 常成员函数
void test_const() const
{
// show1(); 错误-----不能调用非const的成员函数
show2(); //只能调用常成员函数
// number++; 错误-----可以调用非const的成员变量,但是不能修改其数值
cout << number << endl;
}
};
int main()
{
Test t;
t.test_const();
return 0;
}
2 常量对象
使用const修饰对象,表示该对象为常量对象
常量对象的特点:
1不能修改常量对象的任何属性值
2不能调用任何非const的成员函数
demo
#include <iostream>
using namespace std;
class Student
{
public:
string name; // 为了测试,解除“隐藏”
Student(string name):name(name){}
void set_name(string name)
{
this->name = name;
}
string get_name() const
{
return name;
}
};
int main()
{
Student s1("张三");
s1.set_name("唐姗");
cout << s1.get_name() << endl;
Student const s2("李四"); // const修饰对象-----常量对象
// s2.set_name("李楠"); 错误---不能调用任何非const的成员函数
cout << s2.get_name() << endl;
const Student s3("王五"); // const修饰对象-----常量对象
// s3.name = "王晓龙"; 错误---不能修改对象的任何属性值
cout << s3.name << endl;
return 0;
}
3 常成员变量
const修饰成员变量,表示该成员变量为常成员变量
常成员变量的特点:
1该成员变量不能在程序运行期间被修改
2可以在声明处赋初值,也可以通过构造初始化列表赋初值(编译期间)
demo
#include <iostream>
using namespace std;
class City
{
public:
const string name = "济南"; // const修饰成员变量(属性)-----常成员变量
City(string name):name(name){} // 可以在声明时直接赋予初始值,或通过构造初始化列表赋值
void set_name(string name)
{
// this->name = name; 错误
}
string get_name() const
{
return name;
}
};
int main()
{
City c("北京"); // 可以在声明时直接赋予初始值,或通过构造初始化列表赋值
// c.name = "北京"; 该成员变量不能在程序运行时被修改
cout << c.name << endl; // 北京
cout << c.get_name() << endl; // 北京
return 0;
}v
4 const修饰静态成员变量
const修饰静态成员与非静态成员的用法基本一致
比较特殊的在于静态成员变量被const修饰后,可直接在类内赋初值
省去静态成员变量类内声明类外初始化
#include <iostream>
using namespace std;
class Test
{
public:
static const int a = 1;
};
int main()
{
cout << Test::a << endl;
return 0;
}
5、
#include <iostream>
using namespace std;
class Test
{
public:
void test_const(int a,const int b)
{
a++;
// b++; 错误
cout << a << " " << b << endl;
}
};
int main()
{
Test t;
t.test_const(1,1); // 2 1
return 0;
}
const修饰局部变量
const修饰局部变量,表示该局部变量不能被修改,建议给函数参数尽量使用const修饰
另外,引用参数应该在能被定义为const的情况下,尽量定义为const,这样可以达到引用的安全性
demo