C++学习9const和引用

const
注意:本笔记来自网易云课堂学习

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 ,函数不去改变数据的值

C++学习9const和引用

如果在在对象前面加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

没有指针类型的数组