Perl确实功能很方便阿



QUOTE:
原帖由 shaver 于 2007-9-29 18:30 发表
c/c++的参数传递的,本来就是一个拷贝后的副本,对副本的修改,肯定不会影响到正本,这个是自然。
但是这样也增加了传递的开销。所以有一个说法,对于多于四个字节的结构体,或自定义类型,都应该采用传指针或 ...

这样的确会增加传递开销.
所以在使用非内建数据时, 人们大多采用指针或者引用传递.
总之, C++把决定权于交给写code的人.
各位讨论得这么精彩,我就不打扰各位了.
呵呵,多来谈谈自己的看法嘛。Perl用一句就可以实现cat, sort程序,确实方便啊!


QUOTE:
原帖由 Godbach 于 2007-9-30 08:22 发表
呵呵,多来谈谈自己的看法嘛。Perl用一句就可以实现cat, sort程序,确实方便啊!

C++同样有,STL里面,不过写法没perl那么随性,符合各自的语言风格
当然,perl的sort条件写起来比C++要简省,不过一个{}里面就写出合适的达到你要求的代码,感觉水平就见高低了
写代码测试了一下
#include <string>
#include <iostream>
using namespace std;

inline int print_str_addr(string env,const string& str)
{
  cout<<env<<(void*)(str.c_str())<<endl;
}

int fun(string str)
{
  print_str_addr("In the function, &str=",str);
  str[4]='b';
  print_str_addr("function, &str([4]='b')=",str);
  cout<<"str="<<str<<endl;
}

int main()
{
  string str="123456";
  print_str_addr("&str=",str);
  string str2=str;
  print_str_addr("&(str2=str)=",str2);
  str2[3]='a';
  print_str_addr("&(str2[3]='a')=",str2);
  cout<<"str="<<str<<"; str2="<<str2<<endl;
  fun(str);
  print_str_addr("after function call,&str=",str);
  cout<<"str="<<str<<endl;
  return 0;
}

下面是运行结果:
&str=0x8328014
&(str2=str)=0x8328014
&(str2[3]='a')=0x832802c
str=123456; str2=123a56
In the function, &str=0x8328014
function, &str([4]='b')=0x832808c
str=1234b6
after function call,&str=0x8328014
str=123456

可以看出:
1、确实是写时拷贝。赋值操作只是增加了一下引用而已,修改的时候才完整复制。
2、使用fun(string str)这种方式是正确的,并没有增大开销,而且是安全的,即使在函数内改变了,改变的也只是一个临时拷贝,对原来的字符串没有影响。
楼上能解释下str.c_str()的用法吗?我不大明白
对于同一个str,使用str.c_str()和&str得到的地址不一样,那他们分别得到的是什么地址?
&str得到的是str这个String类的地址
str.c_str得到的则是str这个String类中存放的实际字符串的地址

哈哈,有点像C++版了
大家都是讨论技术嘛,没有喧宾夺主就好

我在45楼的帖子里面的程序段,cout<<env<<(void*)(str.c_str())<<endl;下面加了句cout<<&str<<endl;
的出的结果大不同了:

[Copy to clipboard] [ - ]
CODE:
&str=0x9eed014
&str=0xbffd1070
&(str2=str)=0x9eed014
&(str2=str)=0xbffd1050
&(str2[3]='a')=0x9eed02c
&(str2[3]='a')=0xbffd1050
str=123456; str2=123a56
In the function, &str=0x9eed014
In the function, &str=0xbffd1040
function, &str([4]='b')=0x9eed08c
function, &str([4]='b')=0xbffd1040
str=1234b6
after function call,&str=0x9eed014
after function call,&str=0xbffd1070
str=123456

很明显,对象在被调用的时候,地址就发生了变化,而被改写时,地址仍然不变
str是string类的对象,在生成str的时候,就分配空间和地址了
我去STL上查了下,对于str2=str,我认为是对=的重载,而重载的是
basic_string& operator=(const basic_string&这样的形式
构造函数的介绍是:“Generalization of the copy constructor.”
对于对象str2,应该是完成了复制字符串的,而不是const的引用,这是我的理解

不知道谁能分析下以上2种写法的结果差异
不知道你说的以上两种写法是指哪两种……


[Copy to clipboard] [ - ]
CODE:
inline int print_str_addr(string env,const string& str)
{
        cout<<env<<(void*)(str.c_str())<<endl;
        cout<<env<<&str<<endl;
}

你看我上面的结果都是成对存在的,对应于这2种cout