---
title: "Const：C++常对象，常变量，常成员函数"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/cpp-const-objects-variables-member-functions/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/02-编程语言与运行时/C++/Const：C++常对象，常变量，常成员函数.md"
content_hash: 561a74fd836948dc54a55b1c474cf11dbd8b8edea84601144149d8b35a342e58
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# Const：C++常对象，常变量，常成员函数

﻿# Const：C++常对象，常变量，常成员函数

> 创建时间：2020/1/16 16:45

### 用const修饰的声明数据成员称为常数据成员

  1. 任何函数都不能对常数据成员赋值。
  2. **构造函数对常数据成员进行初始化时也只能通过初始化列表进行。（只有此一种方法）**
  3. 常数据成员在初始化时必须赋值或称其必须初始化.
  4. 如果类有多个默认构造函数必须都初始化常数据成员。

Notes：

  * 不能对常数据成员在类中初始化，要通过类的构造函数，只有静态常量才能这样初始化。

```cpp
string str1 = &quot;test&quot;;
string str2 = &quot;test&quot;;

```

### 用const修饰的声明声明成员函数称为常成员函数

声明：<类型标志符>函数名（参数表）const；

说明：

1\. const是函数类型的一部分，在实现部分也要带该关键字。
2\. const关键字可以用于对重载函数的区分。
3\. 常成员函数不能更新任何数据成员，也不能调用该类中没有用const修饰的成员函数，只能调用常成员函数和常数据成员。

Notes：

  * const是函数类型的一部分，在实现部分也要带该关键字。
  * 常对象只能调用常成员函数。
  * 普通对象可以调用全部成员函数
  * 当对一个对象调用成员函数时，编译程序先将对象的地址赋给this指针，然后调用成员函数，每次成员函数存取数据成员时，由隐含使用this指针
  * 在C++中，this指针被隐含地声明为: X * const this,这意味着不能给this 指针赋值
  * 在X类的const成员函数中，this指针的类型为：const X* const, 这说明this指针所指向的这种对象是不可修改的（即不能对这种对象的数据成员进行赋值操作）
  * 由于this并不是一个常规变量，所以，不能取得this的地址

```cpp
string str1 = &quot;test&quot;;
string str2 = &quot;test&quot;;

```

对于c++的成员函数（当然不是静态成员函数),都会含有一个隐藏的参数
int GetValue()函数，在编译后会变成：

> int GetValue(A * const this); //不能修改this变量，但可以修改this指向的内容，即：this是常量指针。

int GetValue()const ，编译后是：

> int GetValue(const A* const this);

this指针的出现就解释了，所有类A的对象都是公用一套代码模版，为什么各个对象在调用成员函数的时候不会乱套。
C++为成员函数提供了一个名字为this的指针，这个指针称为自引用指针。每当创建一个对象时，系统就把this指针初始化为指向该对象。每当调用一个成员函数时，系统就自动把this指针作为一个隐含的参数传给该函数。不同的对象调用同一个成员函数时，C++编译器将根据成员函数this指针所指向的对象来确定应该引用哪一个对象的数据成员。通常情况下，this指针是隐含存在的，也可以将其显示的表示出来（即如上例中的 this->mValue。不过this指针只能在类中使用）

### 用const修饰的定义对象称为常对象

常对象是指对象的数据成员的值在对象被调用时不能被改变。常对象必须进行初始化，且不能被更新。不能通过常对象调用普通成员函数，但是可以通过普通对象调用常成员函数。常对象只能调用常成员函数。

以下两种声明完全一样没有任何区别：
const <类名> <对象名>
<类名> const <对象名>

总结：

既要使数据能在一定范围内共享，又要保证它不被任意修改，这时可以使用const。
对于const int * pa，指的是不能通过改变 * pa 的值来改变pa指向的变量的值，但可以通过改变pa指向的变量的值来改变 * pa的值。设置为常引用，还是可以改变实际的值。
**指向常变量的指针变量：const 类型名 * 指针变量名；**

  1. 如果一个变量已被声明为常变量，只能用指向常变量的指针变量指向它，而不能用一般的（指向非const型变量的）指针变量指向它。
  2. 指向常变量的指针变量除了可以指向常变量外，还可以指向未被声明为const的变量。此时不能通过此指针变量改变该变量的值
  3. 如果函数的形参是指向非const型变量的指针，实参只能用指向非const变量的指针，而不能用指向const变量的指针

**在C++面向对象程序设计中，经常用常指针和常引用作函数参数。这样既能保证数据安全，使数据不能被随意修改，在调用函数时又不必建立实参的拷贝。用常指针和常引用作函数参数，可以提高程序运行效率。**
