c++中++运算符的实现
Implementation of ++ operator in c++
c++中如何定义标准++操作符?(c++ 11)
例如。
int k, i=3;
k = i++;
首先将I赋值为3,然后使I递增。
有人能解释一下这是如何实现的吗?
还有,是否复制了该变量?
标准只定义了的作用,而没有定义如何实现
至于引号,你可以在c++标准§5.2.6[自增和自减]节中找到:
后缀的值表达式是其操作数的值。[注:得到的值是原始值的副本-end注]操作数必须为a修改的左值。操作数的类型应为算术类型或指向完整对象类型的指针。操作数的值对象通过向其添加1来修改,除非该对象的类型为Bool,在这种情况下,它被设置为true。[注:这种用法是已弃用,见附件D。的值的计算在修改操作数对象之前对c++表达式进行排序。对于不确定顺序的函数调用,后缀的操作++是一个单独的求值。[注:因此,函数调用不能介入左值到右值的转换和边值之间。与任何单个后缀++操作符关联的效果。-结束音符]The结果是一个右值。结果的类型为cv-不合格操作数类型的版本。
当你为你的类做一个重载时,你可以这样写:
T& T::operator++() // pre-increment, return *this by reference
{
// increment something, somehow
// maybe there is local int i and you will type 'i = i + 1;' or '++i;'
// so whatever 'increment by one' means in your case.
// for type 'int', this function would result in (an instruction | a series of instructions)
// that increment the variable by one.
return *this;
}
T T::operator++(int) // post-increment
{
T copy(*this);
++(*this);// pre-increment here seems logical
return copy;
}
可以看到,在实际数据递增之后创建并返回一个临时对象。因此,返回值是旧值,同时增加实际值。
对于内置类型,它使用相同的逻辑。如何做到这一点取决于实施操作的人,并且可以有所不同。但工作原理是一样的
post fix ++,在i++
中,是这样的(在int的情况下):
int operator++(int i)
{
int temp = i;
i = i + 1;
return temp;
}
前缀++,如在++i
中是这样的(对于int):
int operator++()
{
return i + 1;
}
你明白为什么前缀++和——被认为更有效了吧?
在C/c++语言中有前后递增。
摘自维基百科:
int x;
int y;
// Increment operators
x = 1;
y = ++x; // x is now 2, y is also 2
y = x++; // x is now 3, y is 2
// Decrement operators
x = 3;
y = x--; // x is now 2, y is 3
y = --x; // x is now 1, y is also 1
关于自增和自减运算符的更多信息
GCC内部解释:
计算单个操作数的值,并对操作数进行递增或递减操作。对于preprerement_expr和PREINCREMENT_EXPR,表达式的值是自增或自减后的值;在POSTDECREMENT_EXPR和POSTINCREMENT_EXPR的情况下,是递增或递减发生之前的值。操作数的类型与结果的类型一样,可以是整型、布尔型或浮点型。
一元和二进制表达式- GNU编译器集合(GCC)内部构件
- 使用'+='运算符统一实现 C++ '+'运算符
- 如何在层次结构中实现运算符使用?
- 使用初始值设定项列表作为函数参数的类对象实现运算符 [] 的示例
- 为什么我不能使用在 Visual C++ 32 位中实现运算符无符号 int() 作为数组索引的类?
- 我想知道我将如何实现 + 运算符重载.我已经从我上一个问题中计算出 += 运算符重载
- 如何在抽象基类中实现运算符+
- 如何拆分标头和重载实现运算符
- 如何在不修改C 中的LHS参数的情况下实现` `运算符
- 实现运算符<=> 表示可选<T>
- 如何实现运算符重载
- C++对象 [实现] 运算符 == 错误
- 在类标头之外实现运算符重载 C++
- 函子 - 它们相对于未实现运算符的其他类具有什么能力 ( )
- 实现运算符的正确方法!=用于类外的模板作为一个免费函数
- 在抽象基类上实现运算符<
- 不清楚如何在从抽象基类派生的类中实现运算符重载
- 我应该如何在派生类对象的基类部分的基类中实现运算符重载
- 尝试实现运算符时出错<<?
- 实现运算符<< 带有类::工厂();
- 派生 istringstream 和实现运算符>>(string&)