永发信息网

简单的MFC问题

答案:2  悬赏:40  手机版
解决时间 2021-02-15 10:44
void CStudentInfoView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_studentInfoSet;
CRecordView::OnInitialUpdate(); // 视图更新并初始化
GetParentFrame()->RecalcLayout();
ResizeParentToFit(); // 根据视图的尺寸重新调整父窗口的大小
while (!m_pSet->IsEOF())
{
m_pSet->MoveNext();
m_pSet->GetRecordCount();
}
m_pSet->MoveFirst();
}
请问m_pSet = &GetDocument()->m_studentInfoSet;是什么意思呢?
已知
CStudentInfoDoc* CStudentInfoView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStudentInfoDoc)));
return (CStudentInfoDoc*)m_pDocument;
}
还有个问题
CStudentInfoDoc* CStudentInfoView::GetDocument()
中的CStudentInfoDoc* CStudentInfoView是什么意思啊?
初学者 谢谢
最佳答案
m_pSet = &GetDocument()->m_studentInfoSet;

这个是引用

CStudentInfoDoc* CStudentInfoView 这个是指针

你问了两个问题都是C++的难点。

关于引用与指针,简单说下:
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。
而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。
在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的:
指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。
为了进一步加深大家对指针和引用的区别,下面我从编译的角度来阐述它们之间的区别:
程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。符号表生成后就不会再改,因此指针可以改变其指向的对象(指针变量中的值可以改),而引用对象则不能修改。
最后,总结一下指针和引用的相同点和不同点:
★相同点:
●都是地址的概念;
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。
★不同点:
●指针是一个实体,而引用仅是个别名;
●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
●引用没有const,指针有const,const的指针不可变;
●引用不能为空,指针可以为空;
●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
●指针和引用的自增(++)运算意义不一样;
●引用是类型安全的,而指针不是 (引用比指针多了类型检查

引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、
指针传递和引用传递。

1)以下是“值传递”的示例程序。

由于Func1 函数体内的x 是外部变量n 的一份拷贝,
改变x 的值不会影响n, 所以n 的值仍然是0。
void Func1(int x)
{
x = x + 10;
}
int n = 0;
Func1(n);
cout << “n = ” << n << endl;// n = 0

2)以下是“指针传递”的示例程序。

由于Func2 函数体内的x 是指向外部变量n 的指针,改变该指针的内容将导致n 的值改变,所以n 的值成为10。
void Func2(int *x)
{
(* x) = (* x) + 10;
}
int n = 0;
Func2(&n);
cout << “n = ” << n << endl; // n = 10

3)以下是“引用传递”的示例程序。

由于Func3 函数体内的x 是外部变量n 的引用,x 和n 是同一个东西,改变x 等于改变n,所以n 的值成为10。
void Func3(int &x)
{
x = x + 10;
}

int n = 0;
Func3(n);
cout << “n = ” << n << endl; // n = 10
对比上述三个示例程序,会发现“引用传递”的性质象“指针传递”,而书写方式象
“值传递”。实际上“引用”可以做的任何事情“指针”也都能够做,为什么还要“引用”
这东西?
答案是“用适当的工具做恰如其分的工作”。
指针能够毫无约束地操作内存中的如何东西,尽管指针功能强大,但是非常危险。
就象一把刀,它可以用来砍树、裁纸、修指甲、理发等等,谁敢这样用?
如果的确只需要借用一下某个对象的“别名”,那么就用“引用”,而不要用“指针”,
以免发生意外。比如说,某人需要一份证明,本来在文件上盖上公章的印子就行了,如
果把取公章的钥匙交给他,那么他就获得了不该有的权利。
全部回答
mfc就能制作真正的软件了,qq等软件就是mfc制作后加的皮肤库。 用mfc你完全能做出和附件中计算器一模一样的程序。 你可以自己练习写些小程序理解一下mfc的控件使用技巧。 之后如果想做出更漂亮的界面,建议放弃mfc,我刚做完mfc界面美化,用mfc美化代码量太大了,同事的qt换个图片就搞定的事,我每个控件加一遍代码,没有深入学习的价值。 如果让基础更扎实,可以学习windows api
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
一个男生为什么对别人说话会有说有笑,唯独你
重庆鸡公煲临邑总店在哪里啊,我有事要去这个
美食大战老鼠中毛血旺配方怎么得到
韩尚剪地址在哪,我要去那里办事
玉轩印务怎么去啊,有知道地址的么
最近新华书店购进一批书价都相同的书,其中文
沃尔沃S60L原厂后窗玻璃多少钱
宝鸡到西安汽车末班最晚是几点?就这几天
家风是一个家庭(或家族)在子女教育和为人处
福州好印象办公文仪在哪里啊,我有事要去这个
为什么CF进去时出现fmodex.dll
魔兽世界 银头鲑鱼在那钓?
公司要新增一部主机电话,怎么弄
雪艳发艺地址在哪,我要去那里办事
如果夏天储水式电热水器不用怎么样处理
推荐资讯
天桥地址在哪,我要去那里办事
王者荣耀三线线小兵杀一队能得多少经验金币?
双美美容地址在什么地方,想过去办事
请问广陵散适合哪种古琴弹奏?仲尼式还是伏羲
她说误交损友意思说我什么
广胜大酒店停车场地址在什么地方,我要处理点
010 8348 8998这个号码是干什么的
全自动洗衣机洗好了衣服甩不了怎么回事?
燃气灶的风门为什么会烫手
卡尼尔真采净白柔珠洁面晶露和洁面乳有什么区
大韦羊肉顶效总店地址在哪,我要去那里办事
食人族 过河目前没找到答案。。。。
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?