我对Java和C#非常熟悉,并希望通过C ++拓宽视野。
但是在访问成员或对象的方法时,我无法理解何时使用->
或.
运算符。
我确信我不是第一个提出这个问题的人。有很多问题可以解决同样的问题,但我无法将提供的答案与我的特殊情况联系起来。
我有一个非常简单的类叫做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;
通过“ - &gt;”访问该股票的名称运算符,通过“。”的名称长度。运营商。 在我看来,这两个对象(股票和字符串)都驻留在堆空间中,所以我只需要 - &gt;接线员,对吗?
我在这里缺少什么?字符串怎么样?我thougt字符串总是指针... 你能解释一下这里有哪些概念吗?
提前感谢您的回复。
马库斯
答案 0 :(得分:3)
->
,当您拥有实例时使用.
。
在您的示例中,bmw
是指向Stock
实例的指针,因此您可以使用->
运算符引用它的成员。 name
字段是字符串实例,因此您使用.
运算符。
你也可以把它写成
(*bmw).name = "BMw";
由于*bmw
返回实例,其地址存储在变量bmw
就这么简单 - 不要通过引入堆栈和堆来混淆自己。这些只是内存分配实现细节。
答案 1 :(得分:1)
当你指向一个对象时,只要知道你使用箭头操作符( - &gt;)。 在你的情况下,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;
答案 2 :(得分:0)
bmw->name.length()
bmw是指向堆上创建的Stock对象的指针。因此,请访问其必须使用的成员(如您的案例名称) - &gt;。 &#34; bmw-&gt; name&#34;会给你字符串对象。并且没有使用新的方法分配该字符串对象它不在堆上。因此,访问它的成员(在这种情况下就像长度())你必须使用&#39;。&#39; 。
答案 3 :(得分:0)
“use” - &gt;“对于在堆中分配的对象”不准确。 只需要通过指针访问对象的成员时,就必须使用“ - &gt;”。 对于其他情况,请使用“。”。
答案 4 :(得分:0)
欢迎来到受C ++统治的本土世界!
在C ++中,只有当左边的表达式计算为->
,class
或struct
的指针时才需要使用union
,否则使用{{1 }}。函数也可以返回指向对象的指针,在那里你需要使用.
运算符:
->
Stock* GetStockByIndex(int);
GetStockByIndex(0)->value;
的用法未绑定到->
/ heap,并且new
的使用未绑定到堆栈已分配的对象。它只是上下文(左边的表达式)。
在不久的将来,您还会看到:
.
你可能想知道这怎么可能?这是因为C ++允许Stock s;
s->calculate();
重载!
欢迎您!的