重庆网站建设哪家公司哪家好详情页怎么设计
const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数。
一. const修饰 普通类型的变量
 const int  a = 7;
 int  b = a;   // 正确
 a = 8;        // 错误,不能改变
a 被编译器认为是一个常量,其值不允许修改。
 二. const 修饰 指针变量
 A: const 修饰指针指向的内容,则内容为不可变量。
 B: const 修饰指针,则指针为不可变量。
 C: const 修饰指针和指针指向的内容,则指针和指针指向的内容都为不可变量。
A: 指针指向的内容 8 不可改变。简称左定值,因为 const 位于 * 号的左边。
 const int *p = 8;
B: const 指针 p 其指向的内存地址不能够被改变,但其内容可以改变。
 int a = 8;
 int* const p = &a;
 *p = 9; // 正确
 int  b = 7;
 p = &b; // 错误
C: 则是 A 和 B 的合并
 三. const 参数传递
对于 const 修饰函数参数可以分为三种情况
 A:值传递的 const 修饰传递,一般这种情况不需要 const 修饰,因为函数会自动产生临时变量复制实参值。
 #include<iostream>
 using namespace std;
void Cpf(const int a)
 {
     cout<<a;
     // ++a;  是错误的,a 不能被改变
 }
int main(void)
  
 {
     Cpf(8);
     system("pause");
     return 0;
 }
B:当 const 参数为指针时,可以防止指针被意外篡改。
 #include<iostream>
 using namespace std;
void Cpf(int *const a)
 {
     cout<<*a<<" ";
     *a = 9;
 }
  
 int main(void)
 {
     int a = 8;
     Cpf(&a);
     cout<<a; // a 为 9
     system("pause");
     return 0;
 }
 此时输出结果是8 9,如果void Cpf(int *const a)改为void Cpf(const int * a)则会报错,因为此时a指向的内容应该是不变的
C:自定义类型的参数传递,需要临时对象复制参数,对于临时对象的构造,需要调用构造函数,比较浪费时间,因此我们采取const外加引用传递的方法。
 并且对于一般的int ,double等内置类型,我们不采用引用的传递方式。
 (注:这个没懂)
 四、const成员函数:不可以修改对象的数据,不管对象是否具有const性质。编译时以是否修改成员数据为依据进行检查。
 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员。若要修改类对象,应调用公有成员函数来完成。
     为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数)。例如,
const Screen blankScreen;
 blankScreen.display(); // 对象的读操作
 blankScreen.set(‘*’); // 错误:const类对象不允许修改
在C++中,只有被声明为const的成员函数才能被一个const类对象调用。
要声明一个const类型的类成员函数,只需要在成员函数参数列表后加上关键字const,例如,
class Screen {
  public:
  char get() const;
 };
在类体之外定义const成员函数时,还必须加上const关键字,例如
char Screen::get() const {
  return _screen[_cursor];
 }
若将成员成员函数声明为const,则该函数不允许修改类的数据成员。例如,
class Screen {
  public:
  int ok() const {return _cursor; }
  int error(intival) const { _cursor = ival; }
 };
在上面成员函数的定义中,ok()的定义是合法的,error()的定义则非法。
五. const修饰函数返回值
可以阻止用户修改返回值。返回值也要相应的付给一个常量或常指针。
若函数的返回值是指针,且用const修饰,则函数返回值指向的内容是常数,不可被修改,
 此返回值仅能赋值给const修饰的相同类型的指针。如:
const int * f1()
 {
     int * p;
     p = new int;
     *p = 1;
     return p;
 }
 int main()
 {
     const int * p1;
     p1 = f1();
     return 0;
 }
若主函数改为:
 int main()
 {
     const int * p1;
     p1 = f1();
     *p1 = 2;
     return 0;
 }
则编译时报错:"[10] error: assignment of read-only location ‘* p1’" (编译器code::block);因为修改了p1指向对象的值。
 如果函数返回值是数值(by value),因C++中,返回值会被复制到外部临时的存储单元中,故const 修饰,中没有任何价值的。例:不要把函数int fun1() 写成const int func1()。
 如果返回值是对象,将函数A fun2() 改写为const A & fun2()的确能提高效率。但此要注意,要确定函数究竟是想返回一个对象的“copy”,还是仅返回对象的“别名”即可,否则程序会出错。
