根据价值确定范围并传递课程?

可能重复:
什么是三项规则?

以下代码最好输出垃圾或崩溃:

#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

上一篇: Scoping and passing classes by value?

下一篇: Default copy constructor & its problems