常量对象和函数的麻烦

8 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;
}
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,代码执行正常.但它仍然是一个恒定的对象吗?感谢您的帮助,我希望我提供了足够的信息.如果它很重要我正在使用代码块.

Lwi*_* Ko 6

const对象"constantObject"需要初始化程序或要求"类ExampleClass"具有用户声明的默认构造函数.

  • 编译器不生成默认构造函数吗? (2认同)

Mak*_*zin 5

ExampleClass是一个POD(普通旧数据)结构.当它被声明为这样的局部变量时,ExampleClass exampleObj不会调用默认构造函数,它仍然是未初始化的.

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

更新:

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

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

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

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

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