我对Java和C#相当熟悉,并希望用C++来拓展我的视野。
但是,在访问成员或objcect方法时,我很难理解何时使用->或.操作符。
我肯定我不是第一个问这个问题的人。有很多问题可以解决同样的问题,但我无法将提供的答案与我的特殊情况联系起来。
我有一个非常简单的类,叫做Stock
class Stock
{
public:
int32_t value;
string name;
Stock(void);
~Stock(void);
void doStuff();
};我知道,如果对象是在堆上分配的,那么当对象驻留在堆栈空间时,我必须使用->和.。
但是,如果我想打印Stock对象的名称字符串的长度,我需要这样做:
Stock* bmw = new Stock;
bmw->name = "BMw";
cout << bmw->name.length() << endl;通过"->“运算符访问股票的名称,通过”“访问名称的长度。操作符。在我看来,这两个对象(股票和字符串)都驻留在堆空间中,所以我只需要->操作符,对吗?
我在这里错过了什么?用弦乐怎么样?我以为字符串总是指针..。你能解释一下这里起作用的概念吗?
谢谢您的答复。
马库斯
发布于 2014-11-10 17:25:23
当您有指针时使用->,当您有实例时使用.。
在您的示例中,bmw是指向Stock实例的指针,因此可以使用->运算符引用它的成员。name字段是一个字符串实例,因此使用.运算符。
你也可以把它写成
(*bmw).name = "BMw";因为*bmw返回地址存储在变量bmw中的实例
事情就这么简单--不要把堆栈和堆弄混了。这些只是内存分配实现细节。
发布于 2014-11-10 17:45:00
只要知道当你指向一个对象时,你就会使用箭头操作符(->)。在您的示例中,name成员不是指向std::string的指针,因此不能使用箭头操作符,而是使用点(.)。
你可以这样做:
std::string* name;
Stock* sptr = new Stock;
sptr->name = new std::string("blah blah blah");
std::cout << sptr->name->length << std::endl;发布于 2014-11-10 17:25:32
bmw->name.length()bmw是指向堆上创建的Stock对象的指针。因此,必须使用->来访问它的成员(就像在您的例子中那样)。在"bmw->name“之后,将给出字符串对象。并且该字符串对象没有使用新的分配方式,这意味着它不在堆上。所以,一定要访问它的成员(在本例中是length() ),您必须使用'.‘。
https://stackoverflow.com/questions/26849342
复制相似问题