根据价值确定范围并传递课程?
可能重复:
什么是三项规则?
以下代码最好输出垃圾或崩溃:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
class C {
public:
char* s;
C(char* s_) {
s=(char *)calloc(strlen(s_)+1,1);
strcpy(s,s_);
};
~C() {
free(s);
};
};
void func(C c) {};
void main() {
C o="hello";
printf("hello: %sn",o.s); // works ok
func(o);
printf("hello: %sn",o.s); // outputs garbage
};
我真的很想知道为什么 - 对象不应该被触碰,因为我通过价值传递它...
在C ++的眼中,对你的代码的颠覆是不好的,对不起。 尝试这个
#include <iostream>
class C {
std::string s;
C(const std::string& s_)
: s(s_){}
};
std::ostream& operator<<(std::ostream& os, const C& c){
return os << c.s;
}
void func(C& c){
// do what you need here
}
int main(){
C c("hello");
std::cout << c << 'n';
func(c);
std::cout << c << std::endl;
return 0;
}
在这个例子中,你不必担心内存分配和销毁,printf格式字符串或strcpy。 它更健壮。
C与类(这是你正在写的)是完全错误的,并且盲目地忽略了创建的特性,使语言更安全,更容易,而没有开销。
链接地址: http://www.djcxy.com/p/73189.html