常量对象和函数的麻烦

时间:2012-08-15 06:56:21

标签: c++ const

我正在尝试学习如何使用常量函数和对象,但是,我有一些错误使我保持了一个多小时,我似乎无法弄明白。我跟着一个简单的例子,我想我在路上的某个地方迷路了。这是我的代码。

Main.cpp的

#include <iostream>
#include "ExampleClass.h"

int main(){
    ExampleClass exampleObj; // object used to call members of ExampleClass.
    exampleObj.printText(); // calls printVar from the ExampleClass.

    const ExampleClass constantObject; // object used to call constant members of ExampleClass.
    constantObject.printConstText(); // calls printConstVar from the ExampleClass.

    return 0;
}

ExampleClass.h

#ifndef EXAMPLECLASS_H
#define EXAMPLECLASS_H


class ExampleClass
{
    public:
        void printText();
        void printConstText() const;
};

#endif // EXAMPLECLASS_H

ExampleClass.cpp

#include <iostream>
#include "ExampleClass.h"

void ExampleClass::printText(){
    std::cout << "The code works!" << "\n";
}

void ExampleClass::printConstText() const{
    std::cout << "The code works!" << "\n";
}

我收到了错误:

C:\Documents and Settings\Me\My Documents\ConstObjects\main.cpp||In function 'int main()':|
C:\Documents and Settings\Me\My Documents\ConstObjects\main.cpp|8|error: uninitialized const 'constantObject'|
||=== Build finished: 1 errors, 0 warnings ===|

如果我在ExampleClass之前取出const,代码执行正常。但它仍然是一个恒定的对象吗?感谢您的帮助,我希望我提供了足够的信息。如果它很重要我正在使用代码块。

3 个答案:

答案 0 :(得分:6)

const对象“constantObject”需要初始化程序或要求“class ExampleClass”具有用户声明的默认构造函数。

答案 1 :(得分:5)

您的ExampleClassPOD (plain old data)结构。当它被声明为像ExampleClass exampleObj这样的局部变量时,没有调用默认构造函数,它仍然未初始化。

您需要创建自己的默认构造函数或使用以下语法 - ExampleClass exampleObj = ExampleClass();。这将创建一个临时ExampleClass对象,并初始化您的exampoleObj

<强>更新

以下是C ++ 03标准8.5.9的摘录。

  

如果没有为对象指定初始化程序,并且该对象是   (可能是cv限定的)非POD类类型(或其数组),.   对象应默认初始化;

     

如果对象是const限定类型,则基础类类型应具有   用户声明的默认构造函数。 [这个适用于const对象]

     

否则,如果没有初始值设定项   为非静态对象,对象及其子对象指定,如果   任何,具有不确定的初始值);如果对象或其中任何一个   子对象属于const限定类型,程序格式不正确。 [这个适用于const和POD类型]

这意味着constantObject应该有用户定义的默认构造函数,否则程序格式不正确,应该进行诊断。如果我们删除const,对象将保持未初始化(将不确定初始值

答案 2 :(得分:1)

这种行为被认为是问题并且似乎已得到解决,至少在较新版本的GCC中是这样,并且可能是在C ++ 11标准中。有关问题报告,请参阅here