从常量对象引用到指针
From constant object reference to pointer
在我的c++程序中,我有一个基类B和一些派生类D1, D2等。然后我有一个函数以派生类D1为参数,通过const引用传递以提高性能,而不是通过复制传递:
void appendDerived(const D1& derived)
{
listOfDerived.append(D1);
}
listOfDerived是一个派生类的列表,所以append方法如下:
void append(Base* base)
{
if (!base) return;
m_myList.append(base->clone()); //clone function is defined for each derived and does: return new D1(*this);
}
由于appendDerived接受const引用作为实参,编译器在append方法中给出错误,因为没有与append相匹配的函数。我找到的解决方案如下:
将appendDerived函数更改为:
void appendDerived(D1 derived) { listOfDerived.append(&derived); }
所以按值传递参数,但有性能损失。
将appendDerived函数更改为:
void appendDerived(D1* derived) { listOfDerived.append(derived); }
所以通过指针传递参数,这意味着我必须改变所有的函数调用appendDerived在整个代码中,有一些缺点,我不想在这里列出…
在追加前创建一个中间变量:
void appendDerived(const D1& derived) { D1 derived_temp = derived; listOfDerived.append(&derived_temp); }
- 是坏的,因为你正在传递一个局部变量的地址。
- 似乎没问题,但您将函数更改为接受指针而不是引用。这对调用方有影响。
- 以同样的方式被破坏。是多少。
void appendDerived(D1& derived)
{
listOfDerived.append(&D1);
}
要考虑的几件事:
-
append()
接受一个指针。appendDerived()
取一个参考值有意义吗? -
append
或appendDerived
中哪一个需要参数为指向const
的指针/引用?这可能是您在两个地方都需要const
,而不是上面建议的非const。换句话说,将append
更改为
.
void append(const Base* base)
{
if (!base) return;
m_myList.append(base->clone()); //clone needs to be const, as it should be.
}
这需要clone()
为const
:
virtual Base* clone() const;
^^^^^
只是为了确保你所做的列表应该是恒定的还是不恒定的?如果你有一个非常量列表,那么尝试使用const引用来追加它是非法的,因为你会破坏const。您只需要接受一个引用和一个const引用。
相关文章:
- C++对象共享属性 - 使用指针或引用
- 当原始指针和唯一指针都引用同一对象时,如何避免双重释放
- 为什么在对象引用恒定时允许更改为另一个类的指针的成员变量
- C++关于传递对象(指针与引用)的约定
- 指针和引用作为常量对象的成员变量
- 如何在 std::set 中存储指向对象的指针(或引用)
- 是否使用对象的指针和引用作为函数参数更轻
- C++将取消引用指针对象分配给变量并使用该对象
- 不同的智能指针可以引用同一个对象吗?
- 如何混合C++共享指针和对象引用
- 返回一个对象:值、指针和引用
- 让子对象引用其父对象而不是指针,这是不是一种糟糕的做法
- 是为添加常量而重新创建的对象/引用/指针
- 当子对象引用被分配给父对象指针时,为什么不能访问子类
- 在指针取消引用时返回对本地临时对象的引用
- 表达式必须具有指向对象引用(C++)的指针
- 对象引用和对象指针
- 从常量对象引用到指针
- 为什么在c++中将指向对象的指针或引用返回到内存堆是一场灾难
- 定义一个对象有什么区别;s成员的值、指针或引用