重载运算符 [] C++
Overloading Operator[] in C++
无论出于何种原因,在main():className[index]= 2
中编码。 触发 className 的构造函数,而不是编码重载方法,其中右手操作数作为参数传递(在本例中为 2)。需要您澄清的模糊行为。为什么忽略方法运算符 [] ?
下面是动态数组类的示例:
class dTableau
{
public:
dTableau(int taille);
int& operator [](int index) ;
dTableau &operator =(int val);
// other methods
private:
int *m_tab;
int m_taille;
};
dTableau::dTableau(int taille)
{
m_taille = taille;
m_tab = new int[taille];
for (int cnt = 0; cnt < m_taille;cnt++) {
m_tab[cnt] = cnt;
}
}
int& dTableau::operator[](const int index) {
return m_tab[index];
}
void main(){
int taille=2;
dTableau *t = new dTableau(taille);
// this line triggers the constructor with 1 as parameter
t[1]=1;
}
C++只会在其中一个操作数为类类型时尝试应用重载运算符。看看这段代码:
dTableau *t = new dTableau(taille);
t[1] = 1;
在这里,变量t
是指向dTableau
的指针,而不是诚实善良dTableau
对象。结果,该行
t[1] = 1;
被解释为"访问t
指针指向的索引 1 处的元素,然后为其分配值 1"。然后,这将导致转换构造函数用于将右侧的 1 转换为dTableau
,然后最终将其分配给 t
数组中 1
的(无效)数组索引处的(不存在的)对象。
由于t
是一个指针,如果要使用重载的选择运算符,则需要首先引用它:
(*t)[1] = 1;
或者,如果t
不需要是指针,请不要这样声明它:
dTableau t(taille);
t[1] = 1;
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<