C++学习9const和引用
第一个表示const在*后面,表示指针是const,那么指针不能++,但是指针指向的内存里的东西是可以变化的
第二个const在*前面表示,指针指的内存是const的,指针指向的内存里的东西是不能变的。是说,不能通过这个指针变量去修改指针指向的内存的内容。
char * s=”hello”//这个虽然没有用const,但是这个字符串是const的。这段地址是不能写的,不能修改。
s[0]=’B’;//error
如果写成:
char s[ ]=”hello”;
s[0]=’B’
这样写是对的
因为这中是拷贝了一份hello到堆栈里,但是之前那种写法是“hello”是在全局空间,很靠前不能修改。
在使用const*的时候,能够保证函数调用的变量不被修改,并且还能直接调用这个量,这样速度比较快(不用堆栈出zhan)
下图中在类的.cpp中函数{}前加const,表示函数里不能改变变量的值。表示这个函数是safe for const object ,函数不去改变数据的值
如果在在对象前面加const,那么对象里面的值是不能修改的
那么这个对象里面的函数(可能会修改对象里的数的值),在函数的后面加const那么这个函数不修改函数变量里的值。
Int get_day() const;
Int get_dat() const{return day};
Class A
{
constint I;
public:
A():i(0){};
voidf(){cout<<f()<<endl;}
void f()const{cout<<”f()const”<<endl}//虽然参数形式一样,但是可以overload
}
Int main()
{
const A a;//因为a是const所以会调用const的函数
a.f();
return 0;
}
!如果成员变量i是const, constint I;那么要在初始化列表中初始化,因为这个量不能改变
引用references
C++的对象有很多方式去访问
对象有三种放的地方
char c;//char变量
char* p=&c/指针
char& r=c//一个引用,引用在定义的时候就初始化,必须是个变量
引用: type & refname =name
int x=3;
int& y=x;
const int& z=x;//表示通过z不能修改x,和const的指针是一样的意思
void f(int& x);
f(y);//意味着调用f函数对y进行的操作,会变化y对应的变量
void func(int &)
func(i*3)//error 因为只是一个临时的结果而没有变量的名字,所以不可能绑到函数里
eg:
______________________________
int* f(int*x)
{
(*x)++;
return x;
}
等价于
int &g(int& x)
{
x++;
return x;//跟上面的相比看起来简单了很多
}
int x;
Int & h()
{
int q;
//!return q ;;//error
return x;
}
int main()
{
inta=0;
f(&a);//ugly 但是显而易见
g(a);//clean 但是hidden
h()=16;//因为返回是一个引用,那么引用是可以赋值的
*k()=10;
}
_______________________________________
!!注意由于调用有&的函数的时候,由于调用没有&标志,所以实际上
Intg(int& x){}和int g(int x)是一样的,所以不能这样定义两个函数
不能&给&;int a=0;int &a=x; int & b=a//error
Reference的实质是指针const,只是看起来没有*,比指针简洁。
指针可以有别名 void f(int * &p);
但是不能有指针类型的别名int &*p//error
没有指针类型的数组