#include <iostream>
using
namespace std;
int main()
{
int a=123;
int*
const p=&a;
cout<<*p<<endl;
//123
*p=456;
cout<<a<<endl;
//456
return 0;
}
现在是const p指向一个int类型的数据,这里const修饰的是指针p.
所以说是p的值不允许改变。
如:
#include <iostream>
using
namespace std;
int main()
{
int a=123;
int b=789;
int*
const p=&a;
cout<<*p<<endl;
//123
*p=456;
cout<<a<<endl;
//456
p=&b;
//error:p不允许修改,只读指针
return 0;
}
自然而然的大家就能理解下面的代码了:
#include <iostream>
using
namespace std;
int main()
{
int a=123;
int b=789;
const
int*
const p=&a;
cout<<*p<<endl;
//123
*p=456;
//error
p=&b;
//error
return 0;
}
5.const结合引用
引用大家可能不陌生
#include <iostream>
using
namespace std;
int main()
{
int a=123;
int &b=a;
b=456;
//b可以看作是a的别名,指向同一个内存
cout<<a;
//456
return 0;
}
有点像const指针:
比较下
#include <iostream>
using
namespace std;
int main()
{
int a=123;
int &b=a;
b=456;
//b可以看作是a的别名,指向同一个内存
int*
const c=&a;
*c=789;
cout<<a;
//789
return 0;
}
不过引用因此了指针存储地址的特性,比较隐蔽,看作别名,在c++中可是大行其道啊。常常使用。
注意:引用定义时需要初始化,而且之后不能再引用其他变量。
看一下const和引用使用:
#include <iostream>
using
namespace std;
int main()
{
int a=123;
const
int &b=a;
//b=456;//error:b引用的地方不可以修改
a=456;
//不过通过a是可以修改的,只是说不能由b修改
return 0;
}
6.const与函数
看看这个
#include <iostream>
using
namespace std;
void f(
int i)
{
cout<<i*i<<endl;
}
int main()
{
int a=11;
f(a);
//121
return 0;
}
这里我们的函数只是输出参数的计算值,传递参数的方式是copy方式。
接着换成引用方式:
#include <iostream>
using
namespace std;
void f(
int &i)
{
cout<<i*i<<endl;
}
int main()
{
int a=11;
f(a);
//121
return 0;
}
#include <iostream>
using
namespace std;
void f(
const
int &i)
{
cout<<i*i<<endl;
}
int main()
{
int a=11;
f(a);
//121
return 0;
}
于是
如果
void f(const int &i)
{
i=12;//error
cout<<i*i<<endl;
}
会报错的。
其实函数的返回值也可以用const限制的,什么,这个还需要吗?
看看下面的代码:
#include <iostream>
using
namespace std;
int f(
int &i)
{
i=12;
return i;
}
int main()
{
int a=11;
cout<<f(a);
//12
return 0;
}
没有什么特殊之处吧,接着改改:
#include <iostream>
using
namespace std;
int& f(
int &i)
{
i=12;
return i;
}
int main()
{
int a=11;
cout<<f(a);
//12
return 0;
}
返回引用,结果没什么变化吧。
但是现在f(a)返回了a的引用,可能会有被修改的危险!!!
#include <iostream>
using
namespace std;
int& f(
int &i)
{
i=12;
return i;
}
int main()
{
int a=11;
f(a)=33;
cout<<a;
//33
return 0;
}
这里f(a)可以做左值,有时候我们并不希望这样的事情发生,于是const发挥了:
#include <iostream>
using
namespace std;
const
int& f(
int &i)
{
i=12;
return i;
}
int main()
{
int a=11;
f(a)=33;
//error
return 0;
}
7.const对象和const 成员函数
#include <iostream>
using
namespace std;
class Test
{
private:
int i;
public:
Test(
int ii){i=ii;};
void setVal(
int i){
this->i=i;}
void echoVal(){cout<<i<<endl;}
};
int main()
{
Test a(123);
a.setVal(456);
a.echoVal();
//456
return 0;
}
没有什么特殊之处吧.
但是如果我们想要const Test a(123);这样的常量对象,他的成员不允许修改,编译器可以实现这些,只需标识其成员只读即可。
#include <iostream>
using
namespace std;
class Test
{
private:
int i;
public:
Test(
int ii){i=ii;};
void setVal(
int ii){i=ii;}
void echoVal()
const{cout<<i<<endl;}
};
int main()
{
const Test a(123);
a.echoVal();
//123
return 0;
}