我正在尝试学习如何使用常量函数和对象,但是,我有一些错误使我保持了一个多小时,我似乎无法弄明白.我跟着一个简单的例子,我想我在路上的某个地方迷路了.这是我的代码.
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;
}
Run Code Online (Sandbox Code Playgroud)
ExampleClass.h
#ifndef EXAMPLECLASS_H
#define EXAMPLECLASS_H
class ExampleClass
{
public:
void printText();
void printConstText() const;
};
#endif // EXAMPLECLASS_H
Run Code Online (Sandbox Code Playgroud)
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";
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
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 ===|
Run Code Online (Sandbox Code Playgroud)
如果我在ExampleClass之前取出const,代码执行正常.但它仍然是一个恒定的对象吗?感谢您的帮助,我希望我提供了足够的信息.如果它很重要我正在使用代码块.
你ExampleClass是一个POD(普通旧数据)结构.当它被声明为这样的局部变量时,ExampleClass exampleObj不会调用默认构造函数,它仍然是未初始化的.
您需要创建自己的默认构造函数或使用以下语法 - ExampleClass exampleObj = ExampleClass();.这将创建一个临时ExampleClass对象和值初始化您的exampoleObj.
更新:
以下是C++ 03标准8.5.9的摘录.
如果没有为对象指定初始化程序,并且该对象是(可能是cv限定的)非POD类类型(或其数组),则该对象应默认初始化;
如果对象是const限定类型,则底层类类型应具有用户声明的默认构造函数.[这个适用于const对象]
否则,如果没有为非静态对象指定初始化程序,则该对象及其子对象(如果有)具有不确定的初始值); 如果对象或其任何子对象是const限定类型,则程序格式错误.[这个适用于const和POD类型]
这意味着constantObject应该有用户定义的默认构造函数,否则程序格式不正确,应该进行诊断.如果我们删除const,对象将保持未初始化(将具有不确定的初始值)