STL——临时对象的产生与运用

所谓临时对象,就是一种无名对象。它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往造成效率上的负担。但有时候刻意制造一些临时对象,却又是使程序干净清爽的技巧。刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值,例如Shape(3,5)或int(8),其意义相当于调用相应的constructor且不指定对象名称。STL最常将此技巧应用于仿函数(functor)与算法的搭配上,例如:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

template <typename T>
class print
{
public:
    void operator()(const T& elem)
    {
        cout<<elem<<" ";
    }
};

int main()
{
    int ia[6]={0,1,2,3,4,5};
    vector<int> iv(ia,ia+6);

    //print<int>()是一个临时对象,不是一个函数调用操作
    for_each(iv.begin(),iv.end(),print<int>());
}

  运行结果:

最后一行便是产生“class template具体化”print<int>的一个临时对象,这个对象将被传入for_each()之中起作用。当for_each()结束时,这个临时对象也就结束了它的生命。

时间: 2024-10-27 09:56:20

STL——临时对象的产生与运用的相关文章

STL源码分析--仿函数 &amp; 模板的模板参数 &amp; 临时对象

STL源码分析-使用的一些特殊语法 关于泛型编程中用到的一些特殊语法,这些语法也适用于平常的模板编程 1.  类模板中使用静态成员变量 Static成员变量在类模板中并不是很特殊,同时这个变量不属于对象,属于实例化以后的这个类类型.每一个实例化对应一个static变量 2.  类模板中可以再有模板成员 3.  模板参数可以根据前一个模板参数而设定默认值 4.  类模板可以拥有非类型的模板参数 所谓非类型的模板参数就是内建型的模板参数 Template <class T,class Alloc =

C++中临时对象的产生与运用

 所谓临时对象就是一种无名对象.它的出现如果不在程序员的预期之下(例如任何pass by value操作都会引发copy操作,于是形成一个临时对象),往往照成效率上的负担.但有时候可以制造一些临时对象,却又使程序干净清爽的技巧.刻意制造临时对象的方法是,在型别名称之后直接加一对小括号,并可指定初值,例如int(8),其意义相当于调用相应的constructor,且不指定对象名称.STL最常将此技巧应用于仿函数与算法的搭配上.例如: #include <vector> #include &l

C++中临时对象的学习笔记

http://www.cppblog.com/besterChen/category/9573.html 所属分类: C/C++/STL/boost 在函数调用的时候,无论是参数为对象还是返回一个对象,都将产生一个临时对象.这个笔记就是为了学习这个临时对象的产生过程而写. 本代码的详细例子见实例代码Ex.01 Ok,先让我们定义一个类: class CExample { public: int m_nFirstNum; int m_nSecNum; int GetSum(); bool SetN

C++标准的规定:非常量的引用不能指向临时对象(转载)

C++标准的规定:非常量的引用不能指向临时对象: 为了防止给常量或临时变量(只有瞬间的生命周期)赋值(易产生bug),只许使用const引用之. 下面的内容转自: http://blog.csdn.net/liuxialong/article/details/6539717 概括一下: 不能把临时对象作为实参传给非const引用. 例如: void conv(string &str) { } int main() { conv("dasd"); // 这里错了,编译器自动生成一

一个函数返回临时对象引起的编译器优化问题

我们都知道,如果在一个函数调用另一个函数,假设是 main 函数调用 fun 函数,这个 fun 函数返回一个临时类类型变量,那么这个时候编译器就会在 main 函数申请一个空间并生成一个临时对象,通过拷贝构造函数将 fun 返回的临时变量的值拷贝到这个临时对象.我们看如下的代码: #include <iostream> #include <cstring> using namespace std; class Matrix { public: explicit Matrix(do

C++临时对象减少的方法

C++临时对象产生的场景: 1. 值传递   2. 函数返回   3. 后置++ 等 减少临时对象产生的方法: 1. 使用引用或指针传递 2. 避免隐式类型转换 3. 使用 += 代替 + string x = a + b; // 这里会产生保存a+b值的临时对象 string x(a); x += b; // 这样就不会产生临时对象 4. 使用前置++代替后置++ 前置++的定义: type operator++(); 后置++的定义: const type operator++(int);

对象追踪、临时对象追踪、绝对坐标与相对坐标

1.对象追踪 快捷键SE 若所画的图形不是在水平或垂直方向上的则按极坐标的方法输入 如下图 临时对象追踪 快捷键  键盘上的ctrl+鼠标右键 与对象追踪差不多只是使用时需要点击起点接下来的步骤与使用对象追踪时的一样 2.绝对坐标 就是以坐标系为原点建立的直角坐标系 输入时按直角坐标系的方法输入(x,y) 如下图 这样输入得到的是一条线段的长度 如果不输入0,0,只输入5,10则就是如下图 相对坐标就是以上一个点为原点建立直角坐标系 输入时在输入的坐标前面加上@然后在输入坐标 当在输入时软件发现

C++临时对象销毁时间

下面这段代码会输出什么? [cpp] view plaincopy const char* p = string("hello temprary string").c_str(); cout << p; 下面这段代码运行之后会怎样? [cpp] view plaincopy #include <vector> class Foo { public: Foo() { _p = new char[32]; } ~Foo() { delete _p; } privat

转:C++中临时对象及返回值优化

http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行时确实生成了这样的对象. 通常出现在以下两种情况: (1)为了使函数调用成功而进行隐式类型转换的时候. 传递某对象给一个函数,而其类型与函数的形参类型不同时,如果可以通过隐式转化的话可以使函数调用成功,那么此时会通过构造函数生成一个临时对象,当函数返回时临时对象即自动销毁.如下例: //计算字符ch