为什么可以在未初始化的对象上使用类成员函数(至少我认为它是未初始化的)。以下运行没有错误:
// 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
}?这种可接受的编码风格是否有理由使用这种方法?
答案 0 :(得分:1)
为什么我们所宣称的是
bar()
的指针存在,并且被称为A
时,我们甚至可以使用myClass
?
因为,通常,编译器无法判断指针在运行时是否有效;所以不需要诊断此错误。但是,在这种情况下,一个体面的编译器应该能够发出警告,只要你没有建立警告被禁用。
这种可接受的编码风格是否有理由使用这种方法?
绝对不是。取消引用无效指针会产生未定义的行为。
答案 1 :(得分:0)
因为你不知道myClass所指向的内存块是否是一个初始化对象,它具有正确的语法,但是未定义的行为,但是如果想要防止,你应该使用-Wall或类似的编译器选项(取决于你的编译器)它会警告你未初始化的指针。