按值划分和传递类?

时间:2012-03-09 15:14:02

标签: c++ scoping

  

可能重复:
  What is The Rule of Three?

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

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

我真的很想知道为什么 - 这个对象甚至不应该被触及,因为我按价值传递它......

1 个答案:

答案 0 :(得分:3)

对于你的代码而言,在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(这是你正在编写的)绝对是错误的,并且盲目地忽略了为使语言更安全和更容易而没有开销而创建的功能。