【问题标题】:pointer not initialized in c++ class指针未在 C++ 类中初始化
【发布时间】:2017-03-08 01:20:30
【问题描述】:

我是 C++ 和指针的新手,我对这个 C++ 代码有疑问。通常,此代码必须显示“true”,但事实并非如此。提前致谢。

class Trie{  
   public:
      Trie* root;
      int color;
      Trie(){
         color=0;
       }
       ~Trie(){
       }
  };

 int main(){
   Trie test;
   if(test.root==nullptr)cout<<"true"<<endl;
  }

【问题讨论】:

  • 因为您从未将其设置为nullptr。在color = 0;之后的构造函数中,写root = nullptr;
  • 你从来没有初始化过test.root,当你写test.root==nullptr时你期望会发生什么?
  • 由于你的构造函数没有初始化root,它可以是任何东西。
  • 注意空格是你的朋友。您的if 声明没有空格很难阅读。
  • 如果您期望 int 是 32 位整数,那您就错了(在某些平台上,int 是 16 位!)。如果您需要一个 32 位整数来存储 0-255 个 RGB 值的元组,那么您应该使用显式的 uint32_t 或更好:定义一个包含 3x uint8_t 值的元组结构。您还将获得更好的性能,因为成员将是处理器字对齐的。

标签: c++


【解决方案1】:

C 和 C++ 与 Java 和 C# 不同,出于性能原因,不会自动将内存或对象成员初始化为零,因为如果您只是要设置自己的值,那么两次覆盖内存是没有意义的;缺点是您必须非常小心,以确保不要先使用未初始化的数据。

要解决您的问题,您可以在构造函数或初始化列表中设置成员:

Trie() {
    this->color = 0;
    this->root  = nullptr;
}

或者:

Trie() :
    color ( 0 ),
    root  ( nullptr )
{    
}

至于您的 color 值,请考虑改用元组,因为无法保证 int 将是 32 位整数(假设您需要存储 0-255 RGB 值):

struct RgbColor {
    uint8_t r;
    uint8_t g;
    uint8_t b;

    RgbColor() :
        RgbColor( 0, 0, 0 ) {
    }

    RgbColor(uint8_t r, uint8_t g, uint8_t b) :
        r(r),
        g(g),
        b(b) {
    }

    RgbColor(uint32_t rgb) :
        r( ( rgb >> 24 ) & 0xFF ),
        g( ( rgb >> 16 ) & 0xFF ),
        b( ( rgb >>  8 ) & 0xFF ) {
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2011-04-10
    • 1970-01-01
    • 2011-06-24
    • 2012-05-24
    相关资源
    最近更新 更多