我有一个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,我的代码将如何更改以及这两种方法中的哪一种最佳?
答案 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,只是一个必须再次初始化的名称。