函数调用
使用括号调用的函数调用运算符是二元运算符。
语法
primary-expression ( expression-list )
备注
在此上下文中,primary-expression 为第一个操作数,并且 expression-list(可能为参数的空列表)为第二个操作数。函数调用运算符用于需要大量参数的操作。这之所以有效,是因为 expression-list 是列表而非单一操作数。函数调用运算符必须是非静态成员函数。
函数调用运算符在重载时不会修改函数的调用方式;相反,它会在运算符应用于给定类的类型的对象时修改解释该运算符的方式。例如,以下代码通常没有意义:
Point pt; pt( 3, 2 );
但是,如果存在一个适当的重载函数调用运算符,则此语法可用于将 x 坐标偏移 3 个单位并将 y 坐标偏移 2 个单位。下面的代码显示了这样的定义:
// function_call.cpp class Point { public: Point() { _x = _y = 0; } Point &operator()( int dx, int dy ) { _x += dx; _y += dy; return *this; } private: int _x, _y; }; int main() { Point pt; pt( 3, 2 ); }
请注意,函数调用运算符适用于对象的名称,而不是函数的名称。
也可以使用指向函数的指针(而非该函数本身)重载函数调用运算符。
typedef void(*ptf)(); void func() { } struct S { operator ptf() { return func; } }; int main() { S s; s();//operates as s.operator ptf()() }
下标
下标运算符 ([ ])(如函数调用运算符)被视为二元运算符。下标运算符必须是采用单个参数的非静态成员函数。此参数可以是任何类型,并指定所需的数组下标。
以下示例演示如何创建用于实现边界检查的 int 类型的矢量:
// subscripting.cpp // compile with: /EHsc #include <iostream> using namespace std; class IntVector { public: IntVector( int cElements ); ~IntVector() { delete [] _iElements; } int& operator[]( int nSubscript ); private: int *_iElements; int _iUpperBound; }; // Construct an IntVector. IntVector::IntVector( int cElements ) { _iElements = new int[cElements]; _iUpperBound = cElements; } // Subscript operator for IntVector. int& IntVector::operator[]( int nSubscript ) { static int iErr = -1; if( nSubscript >= 0 && nSubscript < _iUpperBound ) return _iElements[nSubscript]; else { clog << "Array bounds violation." << endl; return iErr; } } // Test the IntVector class. int main() { IntVector v( 10 ); int i; for( i = 0; i <= 10; ++i ) v[i] = i; v[3] = v[9]; for ( i = 0; i <= 10; ++i ) cout << "Element: [" << i << "] = " << v[i] << endl; } Array bounds violation. Element: [0] = 0 Element: [1] = 1 Element: [2] = 2 Element: [3] = 9 Element: [4] = 4 Element: [5] = 5 Element: [6] = 6 Element: [7] = 7 Element: [8] = 8 Element: [9] = 9 Array bounds violation. Element: [10] = 10
注释
当 i 在前一个程序中达到 10 时,operator[] 将检测是否在使用超出边界的下标并发出错误消息。
请注意,函数 operator[] 将返回引用类型。这会使它成为左值,从而使您可以在赋值运算符的任何一侧使用下标表达式。
成员访问
类成员访问可通过重载成员访问运算符 (–>) 来控制。此运算符被视为此用法中的一元运算符,而重载运算符函数必须是类成员函数。因此,此类函数的声明是:
语法
class-type *operator–>()
备注
其中,class-type 是此运算符所属的类的名称。成员访问运算符函数必须是非静态成员函数。
此运算符(通常与指针取消引用运算符一起使用)用于实现在取消引用用法或对用法计数前验证指针的“智能指针”。
无法重载 . 成员访问运算符。
C++ 重载运算符和重载函数 类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针"行为。运算符 -> 必须是一个成员函数。如果使用了 -> 运算符,返回类型必须是指针或者是类的对象。 运算符 -> 通常与指针引用运算符 * 结合使用,用于实现"智能指针"的功能。这些指针是行为与正常指针相似的对象,唯一不同的是,当您通过指针访问对象时,它们会执行其他的任务。比如,当
本文向大家介绍C++中的四个默认成员函数与运算符重载详解,包括了C++中的四个默认成员函数与运算符重载详解的使用技巧和注意事项,需要的朋友参考一下 本文主要给大家介绍了关于C++默认成员函数与运算符重载的相关内容,分享出来公的敬爱啊参考学习,话不多说,来一起看看详细的介绍: 一:类和对象的基础知识:类的定义,访问限定符,面向对象封装性,对象的大小计算等等。(编译环境为VS2015) 面向对象程序设
C++ 重载运算符和重载函数 函数调用运算符 () 可以被重载用于类的对象。当重载 () 时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。 下面的实例演示了如何重载函数调用运算符 ()。 #include <iostream> using namespace std; class Distance { private: int
最近在review代码的时候发现,使用了空指针调用成员函数,并且成员函数内部有使用到成员变量,居然没有出错。很是奇怪,就用一篇博客把关于空指针调用成员函数相关的内容总结起来。 空指针调用成员函数 调用普通成员函数 如果空指针调用普通成员函数,看该函数体中是否使用到了this指针(是否访问非静态成员变量)。如果使用到了this指针,程序会崩溃;如果没有使用到this指针,程序不会崩溃。当然,如果访问
我有一个这样的类: 返回从town参数到路径的。 我试图做的是为优先级队列重载布尔运算符,但它给了我错误 我知道为什么它会给我这个错误,但是我不知道如何在< code>Comparator结构中使用一个非静态函数。 > 必须是非静态的 我尝试在类中移动但没有成功 我需要用一个结构重载运算符,因为我需要在上使用两个不同的bool重载,用于两种不同的情况,但参数相同(两个城镇)。换句话说,我需要结构,
以下SSCCE说明了这种情况: 项目之前编译得很好,我用几个编译器(、、、和)再次检查了这个SSCCE,所有这些编译器都在没有任何警告的情况下编译了它(使用)。所有编译器都设置为C++11/C++0x标准。将ctor添加到中后,即使在和上也能很好地编译 使两个的非成员都显示了所有编译器中的二义性(正如预期的那样) 在查看了标准草案(和)之后,我没有找到任何使成员函数/运算符比非成员函数/运算符更匹