C++访问成员和函数
C++ access members and functions
我对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++中,只有当左边的表达式计算为class
、struct
或union
的指针时,才需要使用->
,否则使用.
。一个函数也可能返回一个指向对象的指针,在那里你需要使用->
操作符:
Stock* GetStockByIndex(int);
GetStockByIndex(0)->value;
->
的使用不绑定到new
/heap,.
的使用不与堆栈分配的对象绑定。它只是上下文(左侧的表达式)。
在不久的将来,你还会看到:
Stock s;
s->calculate();
你可能会想,这怎么可能。这是因为C++允许->
过载!
欢迎
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针