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的引用,所以可以改变它的值