gpt4 book ai didi

c++ - 在 C++ 中将指针转换为值是否需要成本?

转载 作者:行者123 更新时间:2023-11-30 02:27:49 24 4
gpt4 key购买 nike

我正在学习 C++。我在谷歌风格指南中了解到何时应该使用“通过指针传递”或“通过常量引用传递”。 它说

(1) 如果函数中的任何成员发生变化,则应通过指针传递值。

(2) 如果函数中有任何成员没有改变,则该值应该通过const 引用传递。

我想知道当我有一个实例的指针并且任何成员都不会在新函数中更改时,我是否需要使该函数通过 const 引用传递以保留 google 样式指南。如果是这样,我需要通过'*pointer'将指针转换为实际值。我关心从指针到实际值的转换成本,但老实说我不知道​​它是否有成本。请告诉我在这种情况下该怎么做。

当我使用访问者模式时会发生这种情况。我需要使用“this”指针,但成员不会在函数中更改。我不知道在这种情况下保留谷歌风格指南是否有任何好处或代价。

以防万一,我复制下面的示例代码。它是访客模式的一部分。它有两个函数,分别是指针传递和常量引用传递。

#include <iostream>

class ClassA;

class VisitorInterface {
public:
virtual ~VisitorInterface() = default;
virtual void operator() (ClassA* obj) const = 0;
virtual void operator() (const ClassA& obj) const = 0;
};

class VisitorsHostInterface { // = visitor's host
public:
virtual ~VisitorsHostInterface() = default;
virtual void accept(VisitorInterface* v) = 0;
virtual void accept(const VisitorInterface& v) = 0;
};

class VisitorsHost : public VisitorsHostInterface {
public:
virtual ~VisitorsHost();
void accept(VisitorInterface* v) override {};
void accept(const VisitorInterface& v) override {};
};

class ClassA : public VisitorsHostInterface {
public:
void print() const { std::cout << "ClassA value_ = " << value_ << std::endl; }
void accept(VisitorInterface* v) override {
(*v)(this);
};
void accept(const VisitorInterface& v) override {
v(*this);
};
private:
int value_=11;
};

class Visitor : public VisitorInterface {
public:
virtual ~Visitor() = default;
void operator() (ClassA* obj) const override {
if (obj) {
obj->print();
}
}
void operator() (const ClassA& obj) const override {
obj.print();
}

};

最佳答案

在你的情况下,没有

你有两个签名

void accept(VisitorInterface* v) override {};
void accept(const VisitorInterface& v) override {};

他们都需要一个引用(或者指针和引用,如果你想要准确的话),所以你实际上并没有将 this 转换为一个对象,在这两种情况下你都只是传递 this 的地址每个接受函数

但是如果你有

void accept(const VisitorInterface v) override {};

您可能已经调用了一个可能很昂贵的复制构造函数,具体取决于它的作用。

关于c++ - 在 C++ 中将指针转换为值是否需要成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318709/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com