const無處不在!

在C++的函數定義中,處處都是const關鍵字的使用ios

  • const修飾普通變量
  • const修飾指針
  • const修飾函數參數
  • const修飾函數返回值
  • const在類中的使用

好比下面這段代碼將const的各類應用場景都揉到一塊兒了:函數

#include<iostream>
#include<stdio.h>

using namespace std;

/*
 * const修飾函數參數
 * 
 * const int i1:參數是常量,不容許在函數中修改這個參數
 * const int* i2:參數指針所指的內容爲常量不可變
 * int* const i3:參數指針自己是常量,不可變
 * const int& i4:參數爲引用,增長效率(不用拷貝參數)同時防止修改
 * 
 * 其實和const修飾變量是同樣的效果
 */
void func_param( const int i1, 
                const int* i2, 
                int* const i3,
                const int& i4 ){

  cout << "func_param_i1: " << i1 << endl;
  //compile error: assignment of read-only parameter 'i1'
  //i1 = 10;

  cout << "func_param_i2: " << *i2 << endl;
  //compile error: assignment of read-only location '* i2'
  //*i2 = 10;
  i2 = NULL;

  cout << "func_param_i3: " << *i3 << endl;
  *i3 = 10;
  //compile error: assignment of read-only parameter 'i3'
  //i3 = NULL;

  cout << "func_param_i4: " << i4 << endl;
  //compile error: assignment of read-only reference 'i4'
  //i4 = 10;
}


/*
 * const修飾函數返回值
 * const int func_ret_1(),沒啥意義,由於返回值自己就是賦值
 * const int* func_ret_2(),把func_ret_2()當作一個變量,指針內容不可變
 * int const* func_ret_3(),把func_ret_3()看做成一個變量,即指針自己不可變
 */
const int func_ret_1(){
  return 1;
}
const int* func_ret_2(){
  int *i = (int*)malloc(sizeof(int));
  *i = 100;
  return i;
}
int* const func_ret_3(){
  int *i = (int*)malloc(sizeof(int));
  *i = 100;
  return i;
}


/*
 * const在類中的應用
 */
class TestConst{
/*
 * const修飾類成員「變量」
 */
private:
  /*
   * 成員變量不能修改
   * 只能在初始化列表中賦值
   */
  const int iConst;
public:
  /*
   * 在初始化列表中對const成員賦值
   */
  TestConst(int x): iConst(x) { cout << "TestConst Create" << endl; }
  ~TestConst() { cout << "TestConst Destroy" << endl; }


/*
 * const修飾類成員函數
 */
private:
  //普通變量
  int iVar;
  //非const成員函數
  int testFunc() { return 1; }
public:
  /*
   * 常成員函數,它不能改變對象的成員變量
   * 也不能調用類中任何非const成員函數
   */
  void testConstFunc() const {
    //compile error: assignment of member 'TestConst::iVar' in read-only object
    //iVar = 10;
    //compile error: passing 'const TestConst' as 'this' argument discards qualifiers [-fpermissive]
    //testFunc();
  }
};


int main()
{
  cout << "main begin" << endl;
  

  /*
   * const定義一個常量,其值不可變
   */
  cout << "define a const variable" << endl;
  const int constInt = 10;   //等價於這樣的定義:int const constInt = 10;
  //compile error: assignment of read-only variable 'constInt'
  //constInt = 100;

  
  /*
   * const修飾一個指針會怎麼樣呢
   * 若const位於*左側,則const用於修飾指針所指向的內容,即指針指向一個常量
   * 若const位於*右側,則const用於修飾指針自己,即指針自己是一個常量
   */
  cout << "define a variable" << endl;
  int varInt = 10;

  /*
   * const位於*右側,指針自己是常量
   */
  int* const p1 = &varInt;
  *p1 = 100;
  //compile error: assignment of read-only variable 'p1'
  //p1 = NULL;

  /*
   * const位於*左側,指針指向一個常量
   */
  const int* p2 = &varInt;
  //compile error: assignment of read-only location '* p2'
  //*p2 = 100;
  p2 = NULL;

  /*
   * const位於*左側和右側,指針自己、指向的內都是常量
   */
  const int* const p3 = &varInt;
  //compile error: assignment of read-only location '*(const int*)p3'
  //*p3 = 100;
  //compile error: assignment of read-only variable 'p3'
  //p3 = NULL;
  

  /*
   * 測試const修飾函數參數
   */
  int param = 100;
  func_param(param, &param, &param, param);


  /*
   * 測試const修飾函數返回值
   */
  int ret1 = func_ret_1();

  //compile error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
  //int *ret2 = func_ret_2();
  //*ret2 = 100;
  //ret2 = NULL;

  int *ret3 = func_ret_3();
  *ret3 = 100;
  ret3 = NULL;


  /*
   * 測試類中的const
   */
  TestConst *t = new TestConst(10);
  delete t;


  cout << "main end" << endl;
  return 0;
}

編譯運行效果以下測試

圖片描述

上面經過註釋、運行結果已經將const關鍵字的各類應用場景進行了描述。徹底能夠認爲是講解C++中const用法的一份簡單參考手冊!this

另外結合這篇《C++函數傳值返回和引用返回》一塊兒閱讀效果會更好spa

相關文章
相關標籤/搜索