构造函数初始化列表和 const 变量

Posted

技术标签:

【中文标题】构造函数初始化列表和 const 变量【英文标题】:The constructor initializer list and const variable 【发布时间】:2013-04-23 11:02:07 【问题描述】:

可能这可能是一个非常基本的问题,但仍然想了解一些基本概念......

为什么我们将变量定义为 const ? - 在整个程序中保持该特定变量的值不变。

但是,当我遇到构造函数的初始化列表时,它允许在对象构造期间为 const 变量赋值(例如,我尝试了下面的程序),我对 const 关键字本身的基本概念感到困惑。有人可以澄清一下吗?

如果在对象构造过程中允许更改,下面程序中 const 变量的目的是什么?我们有这些行为的实时场景吗?如果是的话,你能给出一些场景吗?

#include<iostream>
using namespace std;

class Test 
    const int t;
public:
    Test(int t):t(t)   //Initializer list must be used
    int getT()  return t; 
;

int main() 
    Test t1(10);
    cout<<t1.getT();
    return 0;

【问题讨论】:

这只是为了保证你可以初始化你对象的所有变量,但初始化后你不会改变它们。如果无法初始化 const 变量,它将毫无用处。此外,您不会为 const 变量赋值:您使用该值初始化变量。 初始化列表不会改变 const 数据成员。他们初始化它们。这就是为什么您需要一个初始化列表并且您不能在实际的 ctor 主体中进行分配。 const 变量当然也需要初始化。否则你会得到一个未定义的初始值。 【参考方案1】:

基本上,当数据成员被声明为常量时,它们必须在构造对象之前具有一些值因此我们使用成员初始化器,以便在构造对象之前数据成员具有一些值。

在这个程序中直到最后数据成员将具有相同的值

真实场景:

例如,您必须创建一个工资单程序,其中每个员工都有名字和姓氏,这样您就不会希望函数意外修改他们的名字,因此为了防止这种情况,您可以保持它们不变。

【讨论】:

【参考方案2】:

为什么我们将变量定义为 const ?

一个变量被声明const 表示它不会被改变。

但是,当我遇到构造函数的初始化列表时,它允许在对象构造期间为 const 变量赋值(例如,我尝试了以下程序),我对 const 关键字本身的基本概念感到困惑。有人可以澄清一下吗?

如果不是简单类型而是MyClass,不是赋值而是构造,会使用MyClass的构造函数,而不是operator=

【讨论】:

【参考方案3】:

在对象构造期间它不会改变,因为它没有(定义的)值。 当您在类中提供const-成员时,这是对象身份的一部分,并且此特定值将在对象的整个生命周期中保持不变。 在声明成员const 时,您向编译器保证您不会尝试更改该成员的值。

来自MSDN

const 关键字指定变量的值是常量,并告诉编译器阻止程序员对其进行修改。

// constant_values1.cpp
int main() 
   const int i = 5;
   i = 10;   // C3892
   i++;   // C2105

【讨论】:

以上是关于构造函数初始化列表和 const 变量的主要内容,如果未能解决你的问题,请参考以下文章

C++类和对象下

c++ 初始化列表VS构造函数内赋值初始化成员变量

c++ 初始化列表VS构造函数内赋值初始化成员变量

c++ 初始化列表VS构造函数内赋值初始化成员变量

const成员变量

c++初始化函数列表