首页 > 编程知识 正文

c++指针初始化,static变量初始化

时间:2023-05-04 14:56:08 阅读:114503 作者:3064

上面的代码打印“a”。

在定义了c类指针且未初始化时,居然可以安全地调用类内部的成员函数。

我在网上查了一下:

初始化为NULL的类指针可以安全地调用与类成员变量无关的类成员函数,而不会出现错误。 但是,如果在类成员函数中调用类成员变量,则会出错。 既然赋值为NULL时也可以使用,那么不自然初始化的类指针也同样满足这种情况。

假设有以下简单的类定义:

类测试

{

公共:

void func () {cout 'hahaha' endl; }

int get () {return a b; }

test(:a(1),b )2) }

公共:

int a,b;

(;

编译器会自动将此类转换为:

类测试

{

int a,b;

(;

void_test_func(test*this;

int_test_get(test*this;

.

类中的函数由编译器静态编译,可以调用所有非虚函数(别急,稍后再讨论)。 因为是在函数地址编译过程中确定的。 类中的所有成员函数都通过this指针调用成员变量,编译器则调用this类,如myclass.function(int a,int b )-- function (my class,inta,int b )

要添加main函数,请执行以下操作:

int main () )

{

test * p=空值;

p-func (; //正确,未调用成员变量,未使用空this指针

p-get (; //错误,this指针为空,用this指针调用变量,因此错误

返回0;

}

执行结果如上所述,不调用成员变量的func ) )函数执行正确,调用成员变量的get ) )函数错误。 两者实际上都传递了空的this指针。 前者没有错只是因为没有调用this指针,后者被调用了。 (此时为p-func ) )和p-get ) )与func(NULL )、get )……)相同。 对象指针为null,但在调用成员函数时,函数地址是在编译过程中确定的,不通过对象指针(即当前p指针)调用成员函数,而对象指针作为参数传递给函数

那么,这里是问题。 虚函数的情况怎么样? 因为虚函数用this指针计算vptr,找到vtable并将其分散。 this指针为空,因此在查找vtable时为coredump。 总之,在这种情况下,调用this指针的所有函数都是错误的,但完全不调用this指针的成员函数也没有问题。

总结:总是在定义指针时初始化是一个好习惯。 这个问题最初是因为写程序时的疏忽,但因为有错误,所以没有注意到那个方法的错误。 现在追根溯源,我们对C的内部机制有了更深的了解,但不能侥幸。 它暗示,养成良好的编程习惯对自己和今后的伴侣都是一件好事。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。