const修饰符
在C语言中有:#define MAX 20这种方式来定义变量,c++中用const来定义变量和#define的作用相同,消除了#define的不安全性(操作符优先级引起的不安全问题)。
且c++中一些数据是共享的,破坏了数据的安全性,常类型的引入,既保证了数据共享,又防止数据被修改,常类型的值在程序运行期间是不能被改变的。
const和指针使用
分为三种:
const char *p = "abcdef"; //指向常量的指针,不允许改变指针指的内容
char* const p = "abcdef";//常指针,不能改变指向
const char* p= "abcdef";//指向常量的常指针,指向和所指内容均不能改变
常引用
常引用,所引用的对象不能被修改。若常引用作为函数形参时,在函数体中则不能改变形参的值,否则就会在编译时出错。
int a = 10;
const int &b = a; //b是一个常参数,b不能被修改
常引用做形参
int add(const int& i,const int & j)
{
i = i+30; //不允许操作
j = j-10; //不允许操作
return i+j;
}
常对象
对象被const修饰,则对象为常对象,对象中的数据为常量且定义常对象必须初始化,在整个生命周期(运行期间)中数值不能被改变。
- 常对象只能调用它的常成员函数,普通成员不能调用
- 初始化的值不能被修改
class Date
{
public:
Date(int y)
{
year = y;
}
void display()
{
cout << year << endl;
}
void set_year(int n)
{
year = n;
}
private:
int year;
};
int main()
{
const Date d(2018); //定义常对象,且赋初值
d.display(); //错误,因为常对象不能调用普通成员
d.set_year(2019); //错误,因为常对象数值不能被修改
system("pause");
return 0;
}
常数据成员
- 在一个类中有常成员变量的话,c++规定构造函数只能通过初始化列表来进行初始化,其他任何函数不能对其赋值操作 ,是非法的
原因:
//初始化类成员有两种方式:构造函数体中初始化和参数列表
class Date
{
public:
Date(int y)
{
year = y; //赋值方式
}
private:
int year;
}
//初始化列表
class Date
{
public:
Date(int n)
:year(n);
private:
int year;
};
//const 变量在只能初始化,不能赋值,其次就是性能问题,参数列表初始化少一次调用默认构造函数,对于内置类型影响不大,但对于数据密集型来说,很适用。
常成员函数
class Date
{
public:
Date(int y)
{
year = y;
}
void display()const; //声明常成员函数,定义时也需要加const关键字
private:
int year;
}
Date::void display() const
{
cout<<year<<endl;
}
int main()
{
Date d(2018);
d.display(); //调用时不需要const
}
总结:
- 常对象只能调用常函数
- 常数据可以被常成员函数和普通函数调用
- 常成员函数可以访问常数据成员,但不能修改其值,也可以访问普通成员