C++临时性对象的生命周期详细解析_C 语言

有关临时对象的生命周期有三种情况:

1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。

实例代码如下:

复制代码 代码如下:

#include <iostream>
using namespace std;
class A
{
public:
    A(int i): m_i(i)
    {
        cout << "A(): " << m_i << endl;
    }
    ~A()
    {
        cout << "~A(): " << m_i << endl;
    }
    A operator+(const A& rhs)
    {
        cout << "A operator+(const A& rhs)" << endl;
        return A(m_i + rhs.m_i);
    }
    int m_i;
};
int main()
{
    A a1(1), a2(2);
    a1 + a2;
    cout << "------------------------------------" << endl; //运行到这里,a1 + a2产生的临时变量已经被释放
    return 0;
}

运行结果为:

2)凡含有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止。
示例代码如下:

复制代码 代码如下:

#include <iostream>
using namespace std;

class A
{
public:
    A(int i = 0): m_i(i)
    {
        cout << "A(): " << m_i << endl;
    }

    ~A()
    {
        cout << "~A(): " << m_i << endl;
    }

    A operator+(const A& rhs)
    {
        cout << "A operator+(const A& rhs)" << endl;
        return A(m_i + rhs.m_i);
    }

    A& operator=(const A& rhs)
    {
        cout << "A& operator=(const A& rhs)" << endl;
        m_i += rhs.m_i;
        return *this;
    }

    int m_i;
};

int main()
{
    A a1(1), a2(2);
    A a3;
    a3 = a1 + a2; //a1 + a2产生的临时变量在a3的赋值操作完成后,才释放
    return 0;
}

运行结果为:

3)如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。

示例代码如下:

复制代码 代码如下:

#include <iostream>
using namespace std;
class A
{
friend ostream& operator<<(ostream& os, const A&);
public:
    A()
    {
    }
    A(const A&)
    {
        cout << "A(const A&)" << endl;
    }
    ~A()
    {
        cout << "~A()" << endl;
    }
};
ostream& operator<<(ostream& os, const A&)
{
    os << "ostream& operator<<(ostream& os, const A&)" << endl;
    return os;
}
const A& f(const A& a)
{
    return a;
}
int main(int argc, char* argv[])
{
    {
        const A& a = A();
        cout << "-------------------" << endl;
    }//直到被初始化之reference的生命结束
    cout  << f(A()) << endl; //直到临时对象的生命范畴(scope)结束:
                             //临时对象的const引用在f的参数上(而不是返回值)。
                             //这个引用在f()返回的时候就结束了,但是临时对象未必销毁。
    cout << "-------------------" << endl;

    return 0;
}

运行结果:

时间: 2024-10-10 12:12:14

C++临时性对象的生命周期详细解析_C 语言的相关文章

C++中的friend函数详细解析_C 语言

为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具体来说:为了使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 使用友元函数的优缺点 优点:能够提高效率,表达简单.清晰. 缺点:友元函数破环

C++中的对象数组详细解析_C 语言

类是对象的抽象,我们可以使用一个类来定义很多的对象,然后每个对象都有自己的属性. 当我们使用类来定义很多相同结构的对象的时候,我们可以采取对象数组的方法. 例如,一个班有50个学生,我们定义了一个学生类,该类的学生具有相同的数据成员和成员函数,我们就可以定义一个这样的数组. 复制代码 代码如下: Student stdu[50];//假设已经声明了Student类,定义stud数组,有50个元素 ======================对象数组的初始化====================

C++中对象的赋值与复制操作详细解析_C 语言

对象的赋值 如果对一个类定义了两个或多个对象,则这些同类的对象之间可以互相赋值,或者说,一个对象的值可以赋给另一个同类的对象.这里所指的对象的值是指对象中所有数据成员的值. 对象之间的赋值也是通过赋值运算符"="进行的.本来赋值运算符"="只能用来对单个的变量赋值,现在被扩展为两个同类对象之间的赋值,这是通过对赋值运算符的重载实现的. 实际上这个过程是通过成员复制来实现的,即将一个对象的成员值一一复制给另外一个对象的成员.对象赋值的一般形式: 对象名1=对象名2;

C语言中auto,register,static,const,volatile的区别详细解析_C 语言

1)auto这个关键字用于声明变量的生存期为自动,即将不在任何类.结构.枚举.联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量.这个关键字不怎么多写,因为所有的变量默认就是auto的. (2)register这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率. (3)static常见的两种用途:1>统计函数被调用的次数; 2>减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型.在一

STL list链表的用法详细解析_C 语言

本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂.不失为STL的入门文章,新手不容错过! 0 前言1 定义一个list2 使用list的成员函数push_back和push_front插入一个元素到list中3 list的成员函数empty()4 用for循环来处理list中的元素5 用STL的通用算法for_each来处理list中的元素6 用STL的通用算法count_if()来统计list中的元素个数7 使用count_if()的一个更

全局变量与局部变量在内存中的区别详细解析_C 语言

一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)-,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量

C++指向类成员函数的指针详细解析_C 语言

首先 函数指针是指向一组同类型的函数的指针:而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更准确的讲应该是指非静态的成员函数.前者是直接指向函数地址的,而后者我们从字面上也可以知道 它肯定是跟类和对象有着关系的. 函数指针实例: 复制代码 代码如下: typedef int (*p)(int,int);//定义一个接受两个int型且返回int型变量的函数指针类型int func(int x,int y){ printf("func:x=%d,y=%

C++嵌套类与局部类详细解析_C 语言

1. 嵌套类外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现.从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用.如果在外围类之外的作用域使用该类名时,需要加名字限定. 嵌套类中的成员函数可以在它的类体外定义. 嵌套类的成员函数对外围类的私有成员没有访问权,反之亦然. 嵌套类仅仅只是语法上的嵌入. 2. 局部类类也可以定义在函数体内,这样的类被称为局部类(loacl class).局部类只在定义它的局部域内可见. 局部类的成员

c_str()的用法详细解析_C 语言

const char *c_str();c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. c_str()就是把string类对象转换成和c兼容的char *类型.这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式.注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针比如:最好不要这样:char* c;string s="1234";c