变量和基本类型
const限定符
它用来限定一个变量是只读的,即不可变的。
const和指针
常量指针
- 不能通过指针修改指针所指向的变量的值
- 但是指针可以用指向别的变量
int a =5;
const int *p=&a;//不能通过指针修改指向的变量的值
int b=10;
p=&b;//指针可以指向别的变量
指向常量的指针(指针常量)
如果关键字const出现在星号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号俩边,表示被指物和指针俩者都是常量。
- 指针常量的值不能被修改,不能存一个新的地址,不能指向别的变量
- 可以通过指针修改他所指向的变量的值。
int a= 5;
int *const p = &a;
*p = 20; //可变
int b = 10;
p=&b;//不fun可变
const和函数
const int func(const int a) const;
- 修饰返回值 const int func();不能修改返回值。
- 修饰函数参数 int func(const int a); 函数体内不能修改a的值。
- 修饰类的成员函数 int function() const; 函数体内不能修改成员变量的值。
const对象
- 不能修改成员变量值
- 只能调用const成员函数,不能调用普通函数。
顶层const
- 顶层const:指针本身是常量。
- 底层const:指针所指的对象是一个常量。
int i = 0;
int *const p1 = &i; //不能改变p1的值,这是个顶层const
const int ci = 42; //不能改变ci的值,这是个顶层const
const int *p2 = &ci; //允许改变p2的值,这是个底层const
const int *const p3 = p2; //靠右的const是顶层const,靠左的是底层const
const int &r = ci; //用于声明引用的const都是底层const
const_cast
- 用于修改类型的const属性,只能改变运算对象的底层const。
- 变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改
void function(){
const int a = 5;
int *p;
p = const_cast<int*>(&a);
(*p)++;
cout<<"a:"<<a<<endl;
cout<<"p:"<<<<*p<<endl;
const int b = 7;
int &r = const_cast<int &>(b);
r++;
cout<<"b:"<<b<<endl;
}
输出:
a:5
p:6
b:8
explicit
可以抑制内置类型隐式转换,所以在类的构造函数中,只需用于类内的单参数构造函数前面。由于无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。
例1:
class Demo
{
public:
Demo(int i = 5)
{
m_a = i;
}
private:
int m_a;
};
int main()
{
Demo d;
//我们会发现,我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
d = 10;
//实际上,10被隐式转换成了下面的形式,所以才能这样.
//d = Demo temp(10);
return 0;
}
例2:
class Demo
{
public:
//这里用explicit关键词来修饰类构造函数.
explicit Demo(int i = 5)
{
m_a = i;
}
private:
int m_a;
};
int main()
{
Demo d;
d = 10;//这样直接赋值,会被提示错误,因为explicit抑制隐式转换的进行
return 0;
}
this指针
- 每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
- 友元函数没有 this 指针,因为友元不是类的成员。只有成员函数才有 this 指针。