{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions/",
  "atlas": "https://www.pystone.net/?node=cpp-const-objects-variables-member-functions#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions.md",
  "context": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:cpp-const-objects-variables-member-functions",
  "slug": "cpp-const-objects-variables-member-functions",
  "title": "Const：C++常对象，常变量，常成员函数",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Const：C++常对象，常变量，常成员函数",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "561a74fd836948dc54a55b1c474cf11dbd8b8edea84601144149d8b35a342e58",
  "assets": [],
  "headings": [
    {
      "depth": 1,
      "text": "Const：C++常对象，常变量，常成员函数",
      "anchor": "constc常对象常变量常成员函数",
      "citation": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions/#constc%E5%B8%B8%E5%AF%B9%E8%B1%A1%E5%B8%B8%E5%8F%98%E9%87%8F%E5%B8%B8%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0"
    },
    {
      "depth": 3,
      "text": "用const修饰的声明数据成员称为常数据成员",
      "anchor": "用const修饰的声明数据成员称为常数据成员",
      "citation": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions/#%E7%94%A8const%E4%BF%AE%E9%A5%B0%E7%9A%84%E5%A3%B0%E6%98%8E%E6%95%B0%E6%8D%AE%E6%88%90%E5%91%98%E7%A7%B0%E4%B8%BA%E5%B8%B8%E6%95%B0%E6%8D%AE%E6%88%90%E5%91%98"
    },
    {
      "depth": 3,
      "text": "用const修饰的声明声明成员函数称为常成员函数",
      "anchor": "用const修饰的声明声明成员函数称为常成员函数",
      "citation": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions/#%E7%94%A8const%E4%BF%AE%E9%A5%B0%E7%9A%84%E5%A3%B0%E6%98%8E%E5%A3%B0%E6%98%8E%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0%E7%A7%B0%E4%B8%BA%E5%B8%B8%E6%88%90%E5%91%98%E5%87%BD%E6%95%B0"
    },
    {
      "depth": 3,
      "text": "用const修饰的定义对象称为常对象",
      "anchor": "用const修饰的定义对象称为常对象",
      "citation": "https://www.pystone.net/notes/cpp-const-objects-variables-member-functions/#%E7%94%A8const%E4%BF%AE%E9%A5%B0%E7%9A%84%E5%AE%9A%E4%B9%89%E5%AF%B9%E8%B1%A1%E7%A7%B0%E4%B8%BA%E5%B8%B8%E5%AF%B9%E8%B1%A1"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:programming-languages-and-runtimes",
      "title": "编程语言与运行时",
      "url": "https://www.pystone.net/notes/programming-languages-and-runtimes/",
      "atlas": "https://www.pystone.net/?node=programming-languages-and-runtimes#knowledge-atlas",
      "label": "编程语言与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "C++中的“Const：C++常对象，常变量，常成员函数”导航项",
      "citation": "https://www.pystone.net/notes/programming-languages-and-runtimes/#c"
    }
  ],
  "contentMarkdown": "# Const：C++常对象，常变量，常成员函数\n\n﻿# Const：C++常对象，常变量，常成员函数\n\n> 创建时间：2020/1/16 16:45\n\n### 用const修饰的声明数据成员称为常数据成员\n\n  1. 任何函数都不能对常数据成员赋值。\n  2. **构造函数对常数据成员进行初始化时也只能通过初始化列表进行。（只有此一种方法）**\n  3. 常数据成员在初始化时必须赋值或称其必须初始化.\n  4. 如果类有多个默认构造函数必须都初始化常数据成员。\n\nNotes：\n\n  * 不能对常数据成员在类中初始化，要通过类的构造函数，只有静态常量才能这样初始化。\n\n```cpp\nstring str1 = &quot;test&quot;;\nstring str2 = &quot;test&quot;;\n\n```\n\n### 用const修饰的声明声明成员函数称为常成员函数\n\n声明：<类型标志符>函数名（参数表）const；\n\n说明：\n\n1\\. const是函数类型的一部分，在实现部分也要带该关键字。\n2\\. const关键字可以用于对重载函数的区分。\n3\\. 常成员函数不能更新任何数据成员，也不能调用该类中没有用const修饰的成员函数，只能调用常成员函数和常数据成员。\n\nNotes：\n\n  * const是函数类型的一部分，在实现部分也要带该关键字。\n  * 常对象只能调用常成员函数。\n  * 普通对象可以调用全部成员函数\n  * 当对一个对象调用成员函数时，编译程序先将对象的地址赋给this指针，然后调用成员函数，每次成员函数存取数据成员时，由隐含使用this指针\n  * 在C++中，this指针被隐含地声明为: X * const this,这意味着不能给this 指针赋值\n  * 在X类的const成员函数中，this指针的类型为：const X* const, 这说明this指针所指向的这种对象是不可修改的（即不能对这种对象的数据成员进行赋值操作）\n  * 由于this并不是一个常规变量，所以，不能取得this的地址\n\n```cpp\nstring str1 = &quot;test&quot;;\nstring str2 = &quot;test&quot;;\n\n```\n\n对于c++的成员函数（当然不是静态成员函数),都会含有一个隐藏的参数\nint GetValue()函数，在编译后会变成：\n\n> int GetValue(A * const this); //不能修改this变量，但可以修改this指向的内容，即：this是常量指针。\n\nint GetValue()const ，编译后是：\n\n> int GetValue(const A* const this);\n\nthis指针的出现就解释了，所有类A的对象都是公用一套代码模版，为什么各个对象在调用成员函数的时候不会乱套。\nC++为成员函数提供了一个名字为this的指针，这个指针称为自引用指针。每当创建一个对象时，系统就把this指针初始化为指向该对象。每当调用一个成员函数时，系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时，C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下，this指针是隐含存在的，也可以将其显示的表示出来（即如上例中的 this->mValue。不过this指针只能在类中使用）\n\n### 用const修饰的定义对象称为常对象\n\n常对象是指对象的数据成员的值在对象被调用时不能被改变。常对象必须进行初始化，且不能被更新。不能通过常对象调用普通成员函数，但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。\n\n以下两种声明完全一样没有任何区别：\nconst <类名> <对象名>\n<类名> const <对象名>\n\n总结：\n\n既要使数据能在一定范围内共享，又要保证它不被任意修改，这时可以使用const。\n对于const int * pa，指的是不能通过改变 * pa 的值来改变pa指向的变量的值，但可以通过改变pa指向的变量的值来改变 * pa的值。设置为常引用，还是可以改变实际的值。\n**指向常变量的指针变量：const 类型名 * 指针变量名；**\n\n  1. 如果一个变量已被声明为常变量，只能用指向常变量的指针变量指向它，而不能用一般的（指向非const型变量的）指针变量指向它。\n  2. 指向常变量的指针变量除了可以指向常变量外，还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值\n  3. 如果函数的形参是指向非const型变量的指针，实参只能用指向非const变量的指针，而不能用指向const变量的指针\n\n**在C++面向对象程序设计中，经常用常指针和常引用作函数参数。这样既能保证数据安全，使数据不能被随意修改，在调用函数时又不必建立实参的拷贝。用常指针和常引用作函数参数，可以提高程序运行效率。**\n"
}
