C++ 按值定义范围和传递类?
可能重复:C++ 按值定义范围和传递类?,c++,scoping,C++,Scoping,可能重复: 以下代码最多只能输出垃圾或崩溃: #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);
以下代码最多只能输出垃圾或崩溃:
#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: %s\n",o.s); // works ok
func(o);
printf("hello: %s\n",o.s); // outputs garbage
};
#包括
#包括
#包括
C类{
公众:
char*s;
C(字符*s_u3;){
s=(char*)calloc(strlen(s_)+1,1);
strcpy(s,s_);
};
~C(){
免费的;
};
};
void func(C){};
void main(){
C o=“你好”;
printf(“您好:%s\n”,o.s);//工作正常
func(o);
printf(“你好:%s\n”,o.s);//输出垃圾
};
<>我真的很好奇为什么-这个对象不应该被触摸,因为我通过值传递……/p>< p>你的代码中的所有东西在C++的眼中都是不好的,对不起。 试试这个
#包括
C类{
std::字符串s;
C(常数std::string&s)
:s(s){}
};
STD::OcStand和Trace:P>您的代码中的所有代码在C++的眼中都是不好的,对不起。
试试这个
#包括
C类{
std::字符串s;
C(常数std::string&s)
:s(s){}
};
std::ostream&operator另外,请不要用类编码“C”。。。求你了@詹姆斯:因为在这个(C++)世界里,一切都是不好的。@Xeo为什么要把你的意见强加于人?有些人喜欢用C++类提供的结构优势来编写C,这没有什么错。完美的STL和boost并非无处不在,也不一定适合所有应用。@JamesMcLaughlin:你说得对。但“并非无处不在”和“不适合每个应用程序”需要一种透视感,即“并非无处不在”意味着“仅在非常小的嵌入式平台上不可用”和“不适合每个应用程序”意味着“可能不适合0.00001%的应用程序”-即,虽然两者在技术上都是正确的,但实际上,这样的问题太过本地化,假设它们是可用的,而且是适合的,这是完全合理的。@ JamesMcLaughlin这种代码是完全废话,这就是C++的名字,把它当成一种可怕的混乱语言。它还弥补了StAcExcel(或者至少一般来说是坏的风格)的C++问题的一半,否则不会发生。产生C++的原因是为了从有用的抽象中摆脱那种代码,也请避免用“类”编码C。求你了@詹姆斯:因为在这个(C++)世界里,一切都是不好的。@Xeo为什么要把你的意见强加于人?有些人喜欢用C++类提供的结构优势来编写C,这没有什么错。完美的STL和boost并非无处不在,也不一定适合所有应用。@JamesMcLaughlin:你说得对。但“并非无处不在”和“不适合每个应用程序”需要一种透视感,即“并非无处不在”意味着“仅在非常小的嵌入式平台上不可用”和“不适合每个应用程序”意味着“可能不适合0.00001%的应用程序”-即,虽然两者在技术上都是正确的,但实际上,这样的问题太过本地化,假设它们是可用的,而且是适合的,这是完全合理的。@ JamesMcLaughlin这种代码是完全废话,这就是C++的名字,把它当成一种可怕的混乱语言。它还弥补了StAcExcel(或者至少一般来说是坏的风格)的C++问题的一半,否则不会发生。之所以创建C++是为了从有用的抽象中摆脱那种代码。我同意这是正确的方法,但我仍然不明白为什么原始代码崩溃。可能是双重免费的我知道这很旧。。。但考虑到崩溃,可能是在调用“func(o)”的复制操作之后创建的新“C”类的实例将调用尚未初始化的“s”上的“free(…)”。自动生存期将在“func”退出时调用析构函数,该析构函数在未初始化的“s”上调用free。也许吧。我同意这是正确的方法,但我仍然想知道为什么原始代码会崩溃。可能是双重免费的我知道这很旧。。。但考虑到崩溃,可能是在调用“func(o)”的复制操作之后创建的新“C”类的实例将调用尚未初始化的“s”上的“free(…)”。自动生存期将在“func”退出时调用析构函数,该析构函数在未初始化的“s”上调用free。大概
#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;
}