使用类成员函数而无需初始化

时间:2013-07-31 16:58:48

标签: c++ initialization declaration

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

// 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()的指针存在,并且被称为{{1}时,我们甚至可以使用A }?这种可接受的编码风格是否有理由使用这种方法?

2 个答案:

答案 0 :(得分:1)

  

为什么我们所宣称的是bar()的指针存在,并且被称为A时,我们甚至可以使用myClass

因为,通常,编译器无法判断指针在运行时是否有效;所以不需要诊断此错误。但是,在这种情况下,一个体面的编译器应该能够发出警告,只要你没有建立警告被禁用。

  

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

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

答案 1 :(得分:0)

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