版主,请教了:()

justaseeker 2003-04-14 12:42:04
#include<iostream>
using namespace std;

class A
{
public:
A(){cout<<"con of A"<<endl;}
~A(){
cout<<"de of A"<<endl;
}
void F(){cout<<"F()"<<endl;}
private:
int num;
};

void main()
{
A *b;
cout<<"address of b is "<<b<<endl;
b->F();
cout<<"after f()"<<endl;

}

//1.当一个类的实例建立时,在内存中存放规律:先放从基类继承来的(如果有的
//话)data membet 和一个vptr(指向 自己的virtue function table的指针),
//然后在存放自己的data member,但是那些static 和 nonstaticd的函数怎么存
//放,而且用实例调用的时候是如何调用的呢?
//2.这个程序中,指针b并未初始化,是如何调用f()的?当f()中涉及的实例
//的数据,如num则会出现异常到底nonstatic 函数如何被调用?
...全文
37 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
langzi8818 2003-04-18
  • 打赏
  • 举报
回复
呵呵,耐心看,我也是在半路上停了一段时间,但是我还是把他耐心的看完了。呵呵,我的QQ14316494希望做个朋友:)
哥们,揭贴了~~
justaseeker 2003-04-17
  • 打赏
  • 举报
回复
哦,是这样的:
大约一年半以前,我开始看c++,最先是华中科技的一本书,《面向对象程序设计》,不过大约有一半,是讲c的,后来又看了一本译本《c++大学教程》,又《c++ primer》,这个Lippman有点那个,在primer里,关于上边的问题多多少少提了一点,说得但是又不够深入,更让我心痒难骚,好好看了2遍,粗看了一遍,大大小小的程序写了也不算少,倒是,越写疑问越多,便又看《c++对象模型》,看了1,3,4章,还是迷茫,(其余的还没有看,翻了翻,太吃力了,不怕大家笑话)便来问了,一讨论领悟不少,谢谢诸位了!!
:)
langzi8818 2003-04-17
  • 打赏
  • 举报
回复
靠地址呀,~
你看看c++对象模型就知道了
langzi8818 2003-04-17
  • 打赏
  • 举报
回复
其实说明了,类里的非虚拟函数,他们和普通的函数没有什么区别,就是类函数中有一个(非静态)隐藏的指针。他指向函数的调用者。
webber84 2003-04-16
  • 打赏
  • 举报
回复
static member function与non-static member function类似,只不过不传this指针。
justaseeker 2003-04-16
  • 打赏
  • 举报
回复
static member function呢?
能不能具体说一下?
webber84 2003-04-16
  • 打赏
  • 举报
回复
一个non-static的member function会被编译器提取到类定义外面变成一个全局函数,比如这里的F()在编译以后就变成一个名字类似A_Fv的全局函数,当你用b->F()调用它时,这段代码被编译
器改成 A_Fv(b),b就是你在F()中可以访问到的this指针。理论上来说,因为你的b没有初始化,所以this的指向是随机的。但是VC为了在debug编译状态下可以捕捉到这种使用未初始化变量的错误,它会自动把内存置为0xC
justaseeker 2003-04-16
  • 打赏
  • 举报
回复
TO langzi8818(非典型性浪子) :

编译器是根据指针所指向的类型吗?靠什么?
访问非静态数据,虚拟函数等等显得特别自然顺利成章,是靠指针偏移量和vptr,但是非静态函数呢?
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

class A
{
public:
A():num(4){cout<<"con of A"<<endl;}
~A(){
cout<<"de of A"<<endl;
}
void F(){cout<<"F()"<<num<<endl;}
private:
int num;
};

void main()
{
A *b;
cout<<"address of b is "<<b<<endl;
b->F();
cout<<"after f()"<<endl;

}我不程序该了一下,你看看输出的结果,不是4,因为b根本就没有指向任何实例,他输出的数是什么东西,我也不太明白?是个随机数?
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
我自己的理解,错了请指正
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
1.当一个类的实例创建的时候,这个实例只分配到基类和他自己的非static 的变量的总合,其函数是放在外边的,和其他实例共享。(就是类在编译的时候,函数和静态成员变量是分配好地址的,而变量成员只计算出偏移量);懂? 在每个非静态函数里他都有个隐藏的指针(this),指向调用他的实例;
2对指针来说,他在编译期的检查很松。当调用F()的时候,p就传给F()的参数this,但是他没有起作用(我认为),因为你没有用到实例的变量。呵呵,所以就输出F(
LoveCreatesBeauty 2003-04-15
  • 打赏
  • 举报
回复
学习
up
earthharp 2003-04-15
  • 打赏
  • 举报
回复
//1.当一个类的实例建立时,在内存中存放规律:先放从基类继承来的(如果有的
//话)data membet 和一个vptr(指向 自己的virtue function table的指针),
//然后在存放自己的data member,但是那些static 和 nonstaticd的函数怎么存
//放,而且用实例调用的时候是如何调用的呢?


和void Fun(struct A* p);这样的调用一样。
只不过这个指针是隐式传递的,对你不可见。在内部传递的指针就是this指针。
对于static成员,他们的存储空间在类外,看看它们的定义方式就知道。

//2.这个程序中,指针b并未初始化,是如何调用f()的?当f()中涉及的实例
//的数据,如num则会出现异常到底nonstatic 函数如何被调用?
这里它并不会检查指针b是否指向合法的A对象。调用f()只是传递这个指针给函数f,它只是以为指向的内容就是A对象,而一个类的数据结构在和struct是一样的。如果你可以理解任何指针都能够成功的取出一个struct,这里的道理也是一样的。
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
小笨补充的很对~:)
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
但是static和nonstatic函数呢?
他们是放到类的外面的,被类的实例S共享的,编译器会帮你找到的
  • 打赏
  • 举报
回复
static函数根本就没有this指针,这也是它和普通成员函数的最大区别,所以它是无法访问非static成员变量的。
象楼主写的b->F();即使可以访问函数F()也不能读写类中的数据的。
devzhao 2003-04-15
  • 打赏
  • 举报
回复
编译器会提示warning:local variable 'b' used without having been initialized!
运行时会出错!
wyqiang 2003-04-15
  • 打赏
  • 举报
回复
up
justaseeker 2003-04-15
  • 打赏
  • 举报
回复
TO earthharp(骄傲的石头):
TO langzi8818(想回头的浪子):

也就是说,b->F();在编译阶段转换成F(this);这里this指向那儿?是随机的吗在这儿?

还有,一个实例调用virtual函数,利用的是vtpr,但是static和nonstatic函数呢?如何找到?
langzi8818 2003-04-15
  • 打赏
  • 举报
回复
我看了看,我声明了多个指针,他们的地址都是0xCCCCCCCCC.
其实我对这些也有些不懂,迷茫中…………
加载更多回复(1)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧