函数传递参数的类型主要包括:传值,传指针,传引用。这是每本C++书上都会详细讲述的,并且不厌其烦的告诉我们传值是不会改变实参值的。
在csdn的C++版上看到一个有趣的问题,一个Stack的类,写了一个打印函数printS(),基本过程是pop一个元素就打印一个元素,为了防止Stack被修改,函数采用的是传值的方式,printS(Stack a ),但是print函数只能调用一次正确运行,第二次就出现了问题。不是传递的值吗?pop的的Stack a的拷贝阿?
问题就在这儿。不要以为传递的是Stack的拷贝,Stack的属性可能也有指针,方法也可能是通过指针或者引用来实现的。
记得曾经上过一门很重要的计算机专业课(呵呵,名字忘了,操作系统吧),讲到地址的时候,有绝对的地址和偏移地址的区别,那类中的指针存放的地址是绝对的还是相对的呢?写了个程序验证了一下.
class test
{
public:
void change(void);
void print(void);
int* p;
int i;
test();
virtual ~test();
};
test::test()
{
i=2;
p=&i;
}
test::~test()
{
}
void test::print()
{
cout<<i<<endl;
}
void test::change()
{
*p=*p+2;
}
void printa(test a)
{
a.change();
cout<<"this is called by printa"<<endl;
a.print();
cout<<"prinda is end"<<endl;
}
int main(int argc, char* argv[])
{
test a;
cout<<"this is called by main first"<<endl;
a.print(); //得到结果2,实参原来的i值
printa(a); //得到结果2,change之后形参的i值没有改变
cout<<"this is called by main second"<<endl;
a.print(); //得到结果4,实参的i值被改变了
return 0;
}
程序的结果证明了指针的地址保留的绝对地址。
为什么指针不用相对的地址呢?相对于程序入口的地址?相对于对象的地址?
对指针的适当限制,即不失灵活性,又安全了很多。真是不解,是编译器受技术原因限制,还是........
或许是我太浅薄,还理解不了C++的博大精深!