首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++访问成员和函数

C++访问成员和函数
EN

Stack Overflow用户
提问于 2014-11-10 17:21:56
回答 5查看 125关注 0票数 0

我对Java和C#相当熟悉,并希望用C++来拓展我的视野。

但是,在访问成员或objcect方法时,我很难理解何时使用->.操作符。

我肯定我不是第一个问这个问题的人。有很多问题可以解决同样的问题,但我无法将提供的答案与我的特殊情况联系起来。

我有一个非常简单的类,叫做Stock

代码语言:javascript
复制
class Stock
{
public:
    int32_t value;
    string name;

    Stock(void);
    ~Stock(void);

    void doStuff();
};

我知道,如果对象是在堆上分配的,那么当对象驻留在堆栈空间时,我必须使用->.

但是,如果我想打印Stock对象的名称字符串的长度,我需要这样做:

代码语言:javascript
复制
Stock* bmw = new Stock;
bmw->name = "BMw";
cout << bmw->name.length() << endl;

通过"->“运算符访问股票的名称,通过”“访问名称的长度。操作符。在我看来,这两个对象(股票和字符串)都驻留在堆空间中,所以我只需要->操作符,对吗?

我在这里错过了什么?用弦乐怎么样?我以为字符串总是指针..。你能解释一下这里起作用的概念吗?

谢谢您的答复。

马库斯

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-11-10 17:25:23

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

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

你也可以把它写成

代码语言:javascript
复制
(*bmw).name = "BMw";

因为*bmw返回地址存储在变量bmw中的实例

事情就这么简单--不要把堆栈和堆弄混了。这些只是内存分配实现细节。

票数 3
EN

Stack Overflow用户

发布于 2014-11-10 17:45:00

只要知道当你指向一个对象时,你就会使用箭头操作符(->)。在您的示例中,name成员不是指向std::string的指针,因此不能使用箭头操作符,而是使用点(.)。

你可以这样做:

代码语言:javascript
复制
std::string* name;
Stock* sptr = new Stock;
sptr->name = new std::string("blah blah blah");
std::cout << sptr->name->length << std::endl;
票数 1
EN

Stack Overflow用户

发布于 2014-11-10 17:25:32

代码语言:javascript
复制
bmw->name.length()

bmw是指向堆上创建的Stock对象的指针。因此,必须使用->来访问它的成员(就像在您的例子中那样)。在"bmw->name“之后,将给出字符串对象。并且该字符串对象没有使用新的分配方式,这意味着它不在堆上。所以,一定要访问它的成员(在本例中是length() ),您必须使用'.‘。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26849342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档