std :: string name和std :: string& name之间的c ++差异

时间:2011-04-29 12:48:55

标签: c++

我有一个lib.h,lib.cpp和test.cpp。我想问什么更好? lib.h

class c
{
    std::string name;
}*cc;

lib.cpp

{
    std::cout << "the name is:" << name << std:: endl;
}

TEST.CPP

main()
{ 
    c tst;
    tst.name="diana";
}

我应该使用什么? std :: string name或std :: string * name?我如何使用&amp; name,我的代码将如何更改以及这两种方法中的哪一种最佳?

5 个答案:

答案 0 :(得分:3)

std::string & name;是一个参考。你需要在构造函数中初始化它,所以它实际上引用了某些东西。只要您的c实例存在,它所指的内容就必须存在。这不是正确的解决方案。

std::string name;是一个实际变量,使用它。

答案 1 :(得分:3)

首先,我很难相信您的代码会在main中尝试访问私有数据成员name时编译。

关于&。要定义从哪里开始真的很难。简而言之,std::string &name被称为reference类型为std::string的对象。引用某种方式是别名到其他对象。主要特征是,您始终必须在创建时初始化对象的refence,并且您无法重新初始化引用以指向另一个对象。有关此功能的更多信息,请参阅C++ FAQ

修改 通常,您可以使用任意顺序声明类的public,protected和private成员:

class MyClass {
//here goes private members when working with class
//and public when working with structs

public:
//here goes public members
protected:
//here goes protected
private: 
//here goes private
public: 
//here goes public again
};

成员声明的排序实际上是代码政策问题。例如,google style guide建议将所有public成员放在private之前。

关于隐藏功能成员(不必私有)。你实际上无法隐藏函数成员声明,​​但有几种方法可以“隐藏”实现,但我不确定它是隐藏你正在谈论的定义。但你可以查看PImpl成语。这需要理解指针,所以我建议你先从它们开始。

使用指向字符串的指针的小代码示例:

#include <iostream>
#include <string>

class MyClass {
public:
 std::string *pstr;
};

int main() {
 std::string str("test");
 MyClass myObj;

 myObj.pstr = &str;
 std::cout << myObj.pstr->c_str()  << std::endl;
}

答案 2 :(得分:2)

std::string &name是“仅”对字符串的引用(有点像指针)。因为名称肯定属于class c,所以我认为在那里有一个实例是有意义的。

在传递实例时(以避免复制),可以很好地使用引用。

答案 3 :(得分:1)

const std::string& 

是对std :: string的引用,理解关于变量生命周期的含义非常重要。一旦引用的变量消失,引用就不再有效,这是开始C ++程序员的一种非常常见的方式。

YMMV,首先选择一个好的教程,同时,除非你知道为什么以及你在做什么,否则不要使用引用

祝你好运

答案 4 :(得分:0)

我用的是:字符串名称;因为string * name只是一个需要给出一个值的指针,然后我必须想出一种方法来清理它以后我自己,以及string&amp; name,只是一个必须再次初始化的名称。