C ++访问成员和函数

时间:2014-11-10 17:21:57

标签: c++

我对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字符串总是指针... 你能解释一下这里有哪些概念吗?

提前感谢您的回复。

马库斯

5 个答案:

答案 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 ++中,只有当左边的表达式计算为->classstruct的指针时才需要使用union,否则使用{{1 }}。函数也可以返回指向对象的指针,在那里你需要使用.运算符:

->

Stock* GetStockByIndex(int); GetStockByIndex(0)->value; 的用法未绑定到-> / heap,并且new的使用未绑定到堆栈已分配的对象。它只是上下文(左边的表达式)。

在不久的将来,您还会看到:

.

你可能想知道这怎么可能?这是因为C ++允许Stock s; s->calculate(); 重载!

欢迎您!