一般大对象不作为参数传递,而只是传递他们的指针或者引用
别说是个类了,一个大点的结构体都是如此.
这不是少产生一个变量的问题了.
c/c++的参数传递有两种方式
一种是值传递,一种是地址传递,这个我就不需要解释了.
值传递的时候,参数是存放在寄存器中,
我不知道你的寄存器多大,该不会有几十几百K那么大吧?呵呵
所以为什么传递地址而不是值传递的道理你懂了吧,这不单是效率问题(当然也是问题)
别说是个类了,一个大点的结构体都是如此.
这不是少产生一个变量的问题了.
c/c++的参数传递有两种方式
一种是值传递,一种是地址传递,这个我就不需要解释了.
值传递的时候,参数是存放在寄存器中,
我不知道你的寄存器多大,该不会有几十几百K那么大吧?呵呵
所以为什么传递地址而不是值传递的道理你懂了吧,这不单是效率问题(当然也是问题)
解决方案 »
- 代码有错吗?暂停键可以暂停一下,但是继续时就很快将时间片用完了
- 写的接收数据和显示数据的程序出现边框显示不了
- 截图问题,高手进来,100分相送!说到做到!
- 启动画面!
- 请问如何将内存中存储的一个内存地址[如36fb4000,即0x0040fb36]读成一个真正的内存地址,赋给一个LPBYTE
- 线程同步的一个问题
- 为何我的SQL服务器常无端自动关闭服务?
- 关于DLL问题!
- 如何用sscanf格式化输出 "75,227,45,24,,,,,4,0,135,0" ,
- MFC控件刷新和C#winform控件刷新机制
- 谁有CuteFtp 4.2.3 build 2.14.1的注册码?
- mouse_event的MOUSEEVENTF_ABSOLUTE指定的坐标是那里的坐标?
使用引用或指针可以避免拷贝构造函数执行,因此如果将func1的声明改为func1(Base &),那么调用func2的最终结果将是Sub的vfunc被执行——这也正是使用虚函数所期望的。
“c/c++的参数传递有两种方式一种是值传递,一种是地址传递,这个我就不需要解释了.”
有些看法.我认为C及C++中参数没有地址传递。
比如
int *p,m;
已经声明的函数为 void fnMy1(int *v)大家想想,当你如下操作时:
fnMy1(p)时,传递的不也是p的值吗?
fnMy1(&m)时,传递的不也是&m的值吗?
也就是说在C中,函数参数是什么类型传的也是什么。
比如对于:
int m;
fnMy1(&m);传的是&m的值,对于 m来说是它的地址,也就是说你可以在
fnMy1内改变int *v的值,然后&m却不会变化。
之所以函数中会引起m的变化,是因为此时v的值与&m值相等[但不是相同一地址]
所以能过*v的操作自然会令m变化。而C中没有像BASIC、PASCAL中“传址”的含意:
REM BASIC
DELCARE SUB MYSUB(BYREF A AS INTEGER) ' 值
DELCARE SUB MYSUB(BYDEF A AS INTEGER) ' 址
{PASCAL}
PROCEDURE MYPRO(VAR I:INTEGER); {址}
PROCEDURE MYPRO(I:INTEGER); {值}
可能是我的想法也欠妥,但我始终认为,C和BASIC,以及PASCAL对于参数传递是性质是有差别的
不知florist2000(善良的石头)老兄有什么看法?
对于贴主:
"为什么很多时候,函数func的形参要声明为引用?仅仅是为了在函数栈中少生成一个变量,而提高效率吗?如果仅仅是作效率考虑,那为什么下面代码不合法?
void func1(Base a)
{ a.vfun();
}
void func2()
{ Sub b;
func1(b);
} "函数func的形参要声明为引用或指针 可以防止大内存的拷贝提高效率,但最重要的是支持多态。
我的实验:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>class base
{
public:
virtual void disp(){cout<<"base"<<endl;}};
class sub :public base
{
public:
virtual void disp(){cout<<"sub"<<endl;}
};void show(base f)
{
f.disp();
}void main(void)
{
sub s;
show(s);
getch();
}程序绝没错!编译通过,但输出为"base",没有达到你的要求[如果你是想实现多态的话]。
此时如果你将show的参数变为base &f,或base *f[此时相应的f->disp();show(&s);]
就达到你的“欲望”了,输出:"sub".why?
MSDN中已经讲得很明白了!
“虚函数是指一个类中你希望重载的成员函数,当你用一个基类的指针或引用[明白了?]指向一个继对象的时候,你调用一个虚函数时,实际引发的是继承类的版本 。”
DELCARE SUB MYSUB(BYREF A AS INTEGER) ' 址
DELCARE SUB MYSUB(BYDEF A AS INTEGER) ' 值