C++访问成员和函数

C++ access members and functions

本文关键字:函数 成员 访问 C++      更新时间:2023-10-16

我对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;

股票的名称可通过"->"运算符访问,名称的长度可通过"."运算符访问。在我看来,这两个对象(股票和字符串)都位于堆空间中,所以我只需要->运算符,对吧?

我在这里错过了什么?用绳子怎么样?我认为字符串总是指针。。。你能解释一下这里的概念吗?

提前感谢您的回复。

Markus

->在您有指针时使用,.在您有实例。

在您的示例中,bmw是指向Stock实例的指针,因此您可以使用->运算符引用它的成员。name字段是字符串实例,因此使用.运算符。

你也可以把它写成

(*bmw).name = "BMw";

由于*bmw返回地址存储在变量bmw 中的实例

就这么简单——不要把堆栈和堆放在一起混淆自己。这些只是内存分配实现的细节。

只要知道当u指向对象时使用箭头运算符(->)。在您的情况下,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;
bmw->name.length()

bmw是指向在堆上创建的Stock对象的指针。因此,一定要访问它的成员(就像您的案例名称一样),您必须使用->。在"bmw->name"之后会给出字符串对象。那个字符串对象并没有使用new进行分配,这意味着它不在堆上。因此,访问它的成员(在本例中类似于length())时,必须使用"."。

"使用"->"用于堆中分配的对象"是不准确的。只要您想通过指针访问对象的成员,就必须使用"->"。对于其他情况,请使用".".

欢迎来到由C++统治的原生世界!

在C++中,只有当左边的表达式计算为classstructunion的指针时,才需要使用->,否则使用.。一个函数也可能返回一个指向对象的指针,在那里你需要使用->操作符:

Stock* GetStockByIndex(int);
GetStockByIndex(0)->value;

->的使用不绑定到new/heap,.的使用不与堆栈分配的对象绑定。它只是上下文(左侧的表达式)。

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

Stock s;
s->calculate();

你可能会想,这怎么可能。这是因为C++允许->过载!

欢迎