8

我正在尝试学习如何使用常量函数和对象,但是,我有一些错误让我坚持了一个多小时,我似乎无法弄清楚。我正在遵循一个简单的例子,我想我在途中迷路了。这是我的代码。

主文件

#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

示例类.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,则代码可以正常执行。但它仍然是一个常量对象吗?感谢您的帮助,我希望我提供了足够的信息。如果这很重要,我正在使用代码块。

4

3 回答 3

6

const 对象 "constantObject" 需要一个初始化器或需要 "class ExampleClass" 具有用户声明的默认构造函数。

于 2012-08-15T06:57:45.900 回答
5

ExampleClass是一个POD(普通旧数据)结构。当它被声明为像这样的局部变量时,ExampleClass exampleObj不会调用默认构造函数并且它保持未初始化状态。

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

更新:

这是 C++03 标准 8.5.9 的摘录。

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

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

否则,如果没有为非静态对象指定初始化器,则该对象及其子对象(如果有)具有不确定的初始值);如果对象或其任何子对象是 const 限定类型,则该程序是非良构的。[这个适用于 const 和 POD 类型]

这意味着constantObject应该有用户定义的默认构造函数,否则程序是错误的,应该被诊断出来。如果我们删除 const,对象将保持未初始化状态(将具有不确定的初始值

于 2012-08-15T07:01:28.647 回答
1

至少在较新版本的 GCC 中,并且可能在 C++11 标准中,这种行为已被考虑和问题并且似乎已得到修复。有关问题报告,请参见此处

于 2012-08-15T07:35:43.663 回答