变量加上const 后仍然是变量,初始化之后不能赋值,不能修改。
const int x=123;
x=27;//错误
x++;//错误
int y=x;//正确,将const赋值给non-const
y=x;//正确,同上,non-const可以修改
const int z=y;//正确,const赋值给const,但是z之后不可以再被赋值或者修改了
const int bufsize=1024;
必须要预先初始化,除非加上extern
extern const int bufsize;
编译器编译到这不知道值大小
全局变量声明,在这儿不用赋值,只是证明bufsize
存在,可以使用,在这儿不能修改
外面的bufsize
在这儿是const,不能修改,但是外面的bufsize
本身并不一定是const,也并不一定不能修改。
const int class_size=12;//编译时刻这个值是知道的
int finalGrade[class_size]; //正确
int x;
cin>>x;
const int size=x;//编译时刻这个值不知道大小,只有运行时刻才知道
double classAverage[size]; //错误
char * const q = "abc";//q is const,指针本身是const,但是所指向的那块内存单元不是const
*q='c';//正确
q++;//错误
const char *p="ABCD";//(*p) is a const char,指针p本身不是const,不能通过指针p修改所指的内存单元,并不意味着那个变量就是const了,不是说指针p指向哪里,哪里就变成了const。准确说法为p所指的对象不能通过它修改的指针
*q='b';//错误 (*p) is the const
p++;//正确
Person p1("Fred",200);
const Person* p=&p1;//对象是const
Person const* p=&p1;//对象是const
Person *const p=&p1;//指针是const
//区别的标记是const在*的前面还是后面
//const在*的前面,对象是const;const在*的后面,指针是const
const Person *const p=&p1;//对象和指针都是const
int * ip;
const int *cip;
int i;
ip=&i;
cip=&i;
const int ci=3;
ip=&ci;//错误,non-const指针不能指向const值
cip=&ci;
*ip=54;//正确
*cip=54;//错误,因为cip=&ci;cip指向const值
a.cpp
#include<iostream>
using namespace std;
int main(){
char *s="hello world";//默认为const,"hello world"被放在代码段里,而代码段是不可写的 此时有warning
cout<<s<<endl;
//s[0]='B';会报错
return 0;
}
--------------------------------------------------
#include<iostream>
using namespace std;
int main(){
const char *s="hello world";//warning会消失,这个s在代码里
cout<<s<<endl;
return 0;
}
-------------------------------------------------
#include<iostream>
using namespace std;
int main(){
char s[]="hello world";//s[]数组,整个数组在堆栈里,将代码段里的"hello world"拷贝到堆栈里,这个s在堆栈里
cout<<s<<endl;
s[0]='B';
return 0;
}
void f(const int* x);
int a=15;
f(&a); //正确
const int b=a;
f(&b); //正确
b=a+1; //错误
void f1(const int i){
i++;//错误,不能在f1里修改
}
int f3() { return 1; }
const int f4(){return 1;}
int main(){
const int j=f3();//正确
int k=f4();//正确,const值可以赋值给non-const值
}
const Currency the_raise(42,38)
整个对象是const,则整个对象里的值都不能修改。
int Date::set_day(int d){
day=d;//正确
}
int Date::get_day() const{//声明和定义都需要加上const
day++;//错误,不能改变
set_day(12);//错误
return day;//正确
}
int get_day() const;
int get_day() const{ return day;}//成员函数不能在定义里修改数据
//声明和定义都需要加上const
const 成员函数比const 对象安全 。