常类型
一、先看看c语言中的const
const int a = 10;
int *ptr = (int *)&a;
*ptr = 100;
cout<<a<<endl;
结果竟然是100,所以C语言中的const 是一个冒牌货,可以绕过地址去修改它的值;但在C++中是无法修改的,但同样的代码可编译。
二、先看看c++语言中的const
在c++中看到
const int a = 10;
编译器会做一件事:将a 放入符号表(你可以理解为一个字典项)。
重点:在C语言中编译器是对变量a分配内存空间的,但是在c++中只有当取地址(&)时,或者为全局变量在其它文件中使用是才分给其分配存储空间。
2.1常引用
int a = 5;
const int &b = a;
b = 12;//非法。
2.1常引用做函数参数:
int add(const int &i,const int &j)
{
i = i+20;//非法。
return i+j;
}
2.3const 赋值:
int &a = 10;//错误
//但是下面(加const以后)就为正确。
const int &a = 10;//正确。
三、const->面向对象
使用const说明的数据成员称为常数据成员。如果在一个类中说明了常数据成员,那么构造函数就只能通过成员初始化列表对该数据成员进行初始化,而其他任何函数都不能对该成员赋值。
话不多说,直接上代码!
class Date{
private:
const int year;
const int month;
const int day;
public:
Date(int y, int m, int d);
void showDate();
};
Date::Date(int y, int m, int d) :year(y), month(m), day(d)//成员初始化列表
{}
void Date::showDate()
{
cout << year << "." << month << "." << day << endl;
}
int main()
{
Date d1(1998, 4, 28);
d1.showDate();
system("pause");
}
如果有以下语句则是非法的:
Date::Date(int y,int month,int day)
{
year = y;//非法
month = m; //非法
day = d; //非法
}
3.1常成员函数:
格式:
类型说明符 函数名(参数表) const
例如:void showdate() const;
在声明函数和定义函数时都要加const,因为它是函数的一部分。
记住两点即可:
1.如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用普通的成员函数。常成员函数是常对象的唯一接口。
2.常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数,这就证明了在常成员函数中绝对不会更新数据成员的值。
3.关键字const 可以用于区分重载函数
4.我说错了是三点