1

为什么可以在未初始化的对象上使用类成员函数(至少我相信它是未初始化的)。以下运行没有错误:

// A.h
class A {
 public:
  explicit A(int n) : n_(n) {};
  ~A() {};
  int foo() {
    return n_;
  };
  int bar(int i) {
    return i;
  };
 private:
  int n_;
};

// main.cc
#include <iostream>
#include "A.h"

int main(int argc, char **argv) {
  A *myClass;
  std::cout << myClass->bar(5) << "\n";
}

现在,尝试肯定会失败,但是当我们声明的只是一个指向存在的指针并且被调用时myClass->foo();,为什么我们甚至可以使用呢?这是可接受的编码风格/是否有理由使用这种方法?bar()AmyClass

4

2 回答 2

1

bar()当我们声明的只是一个指向A存在的指针并且被调用时,为什么我们甚至可以使用myClass

因为,一般来说,编译器不可能判断指针在运行时是否有效。因此不需要诊断此错误。但是,在这种情况下,一个体面的编译器应该能够发出警告,只要您没有在禁用警告的情况下进行构建。

这是可接受的编码风格/是否有理由使用这种方法?

绝对不。取消引用无效指针会产生未定义的行为。

于 2013-07-31T17:07:15.813 回答
0

因为你不知道 myClass 指向的内存块是否是一个初始化的对象,所以它有正确的语法,但未定义的行为,但是如果想阻止,你应该使用 -Wall 或类似的编译器选项(取决于你的编译器),它会警告你未初始化的指针。

于 2013-07-31T17:09:56.740 回答