C++通过匿名对象调用成员函数
C++ 通过匿名对象调用成员函数
刚开始写第一个 leetcode 程序就看到了之前没见到过的东西。首先,框架定义了一个Solution类,我们把方法写在成员函数twoSum(int,int)内,main()函数直接通过构造一个匿名的对象调用该成员函数。
vector<int> ret = Solution().twoSum(nums, target);
进一步总结,如果想要调用成员函数,其实是有三种方法的:
1、设置成静态成员函数,可以直接通过类名调用 Class::fun();
2、创建一个对象 object,使用object.fun()方法调用;
3、创建一个匿名的对象,使用匿名对象调用 Class().fun();
参考:http://www.cnblogs.com/gossiplee/p/4612929.html 《C++临时匿名对象》
#include "iostream"
using namespace std;
class A
{
public:
A (int _a=0, int _b=0)
{
this->a1 = _a;
this->b1 = _b;
cout << "construct function called!" << endl;
}
A (A &obj)
{
cout << "copy_constructor function called!" << endl;
}
~A()
{
cout << "objext destory function called!" << endl;
}
void printf()
{
cout << this->a1 << " " << this->b1 << endl;
}
protected:
private:
int a1;
int b1;
};
int main()
{
A(10, 10).printf(); //直接通过类名构造一个匿名对象,用后即焚
cout << "在此处打印之前,匿名对象就已经被析构!" << endl;
return 0;
}
顺便说一下C++ 11中引入的匿名函数
参考:C++11中的匿名函数(lambda函数,lambda表达式)
C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下:
[capture](parameters)->return-type{body}
如果没有参数,空的圆括号()可以省略.返回值也可以省略,如果函数体只由一条return语句组成或返回类型为void的话.形如:
[capture](parameters){body}
下面举了几个Lambda函数的例子:
[](int x, int y) { return x + y; } // 隐式返回类型
[](int& x) { ++x; } // 没有return语句 -> lambda 函数的返回类型是'void'
[]() { ++global_x; } // 没有参数,仅访问某个全局变量
[]{ ++global_x; } // 与上一个相同,省略了()
[](int x, int y) -> int { int z = x + y; return z; } //有一个int返回值
lambda函数可以引用在它之外声明的变量。这些变量的集合叫做一个闭包,闭包被定义在lambda表达式声明的方括号[]内,这个机制允许这些变量按值或按引用被捕获:
[] //未定义变量.试图在Lambda内使用任何外部变量都是错误的.
[x, &y] //x 按值捕获, y 按引用捕获.
[&] //用到的任何外部变量都隐式按引用捕获
[=] //用到的任何外部变量都隐式按值捕获
[&, x] //x显式地按值捕获. 其它变量按引用捕获
[=, &z] //z按引用捕获. 其它变量按值捕获
举一个例子
std::vector<int> some_list;
int total = 0;
for (int i=0;i<5;++i) some_list.push_back(i);
std::for_each(begin(some_list), end(some_list), [&total](int x)
{
total += x;
});
//此例计算list中所有元素的总和. 变量total被存为lambda函数闭包的一部分. 因为它是栈变量(局部变量)total的引用,所以可以改变它的值