我正在尝试学习如何使用常量函数和对象,但是,我有一些错误使我保持了一个多小时,我似乎无法弄明白。我跟着一个简单的例子,我想我在路上的某个地方迷路了。这是我的代码。
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,代码执行正常。但它仍然是一个恒定的对象吗?感谢您的帮助,我希望我提供了足够的信息。如果它很重要我正在使用代码块。
答案 0 :(得分:6)
const对象“constantObject”需要初始化程序或要求“class ExampleClass”具有用户声明的默认构造函数。
答案 1 :(得分:5)
您的ExampleClass
是POD (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。