Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 按值定义范围和传递类?_C++_Scoping - Fatal编程技术网

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;
}