隐式变换和显式转换产生拷贝吗
隐式转换和显式转换产生拷贝吗本帖最后由 hasea9 于 2012-12-25 17:56:36 编辑隐式转换和显式转换产生拷贝
隐式转换和显式转换产生拷贝吗
本帖最后由 hasea9 于 2012-12-25 17:56:36 编辑 隐式转换和显式转换产生拷贝吗
比如:
void foo(string ss) {
ss +="123456";
std::cout<< ss <<std::endl;
}
int main {
char *aa="adfasd";
foo((string)aa);
}
这样写是不是在main中把char *aa拷贝到string的空间。然后把该string实参传给foo函数,拷贝一份string到函数的栈空间,最后在计算??当然据说string等容器是在堆中分配的。
那这份数据不是拷贝了2次。!!!!!!
[解决办法]
强制转换应该不会进行数据拷贝
[解决办法]
但是string有构造函数string ( const char * s );
不需要强制转换吧?
PS:对象传递,用引用比较好
[解决办法]
(string)aa用aa初始化一个string,调用一次string的构造函数
void foo(string ss) 值传递调用一次拷贝构造函数
[解决办法] 该回复于2012-12-26 08:47:57被管理员删除
[解决办法]拷贝一份的
[解决办法]其实在main()函数中的这条语句中
foo((string)aa);
(string)aa是否真的调用string类的构造函,与编译器不同而不同,有一些编译是会做很多优化,例如在VC6.0的编译器就会优化掉,此处不会调用string的构造函数,而是直接以字符串指针aa作为参数,在调用foo()时直接构造foo函数的局部变量ss时做为调用string构造函数的参数。即编译器在内部这样做ss.string(aa);
即使这样写foo(string(aa)); 在VC6.0中也只会调用一次string的构造函数,根上面的含义一样,并不会先生成string类型的量个临时变量,再以这个临时变量调用string的拷贝构造函数来创建foo函数的ss局部变量。
VC6.0不是严格的C++编译器,如果在UNIX上的GCC编译器来编译运行时,可能结果会如上面所说。调用一次string(const char*);再调用一次string(string&);
aa="adfasd";这分数据在VC6.0中只会拷贝一次.即以字符串的形式做为参数,拷贝到foo中用来构造局变量SS的实参.