C++临时匿名对象

匿名对象:临时的对象,一般都是在构造完就被释放掉了(有特殊情况,返回值优化)

1. 返回值优化:若是函数返回的匿名对象返回时候有同类型的新对象接上,则该匿名对象被转化为新对象。

#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;
    }
protected:
private:
    int a1;
    int b1;
};

// 函数返回值产生匿名对象
A g()
{
    A a2(10,19);
    return a2;
}
// 测试一: 匿名对象用来初始化一个新对象。
void Test1()
{
    A a1 = g();
}
// 测试二: 用等号初始化一个新对象
void Test2()
{
    A a3;
    a3 = g();
}

int main()
{
    Test1();
    Test2();
    return 0;
}

Test1结果:调用了两次构造函数,两次析构函数
construct function called!构造a2
copy_constructor function called!构造匿名a2的匿名对象
objext destory function called!析构局部变量a2
objext destory function called!析构a1(其实就是a2的匿名对象)
**********************************************************/

Test2结果:调用了三次构造函数三次析构函数
construct function called!构造a3
construct function called!构造a2
copy_constructor function called!构造匿名a2的匿名对象
objext destory function called!析构局部变量a2
objext destory function called!析构a2的匿名对象
**********************************************************/

2.没有对象名:普通情况,构造完成之后就直接被析构

#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;
}

需要注意的点:

1. 所有形参都提供了默认的实参的构造函数也定义了默认构造函数,而这样的构造函数形参列表是有形参的(有参构造函数的形参有初始值的话,就相当于写了默认构造函数)

2. 匿名对象是否被析构看返回值是否有对象来接上

3. 拷贝构造函数的三种应用场景:
   <1> a1 = a2 (区分两种不同的情况: A aa; A bb = aa;会 //bb = aa; 不会   ):一个对象初始化另一个对象时
   <2> func(A a1):当对象作为函数参数时
   <3> A a2 = func():当函数返回值为对象时(涉及到匿名对象的问题)

4. 特别注意:等号操作和对象的初始化是两个不同的概念

时间: 2024-10-14 14:13:43

C++临时匿名对象的相关文章

Java基础学习笔记十 Java基础语法之final、static、匿名对象、内部类

final关键字 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变.final是个修饰符,它可以用来修饰类,类的成员,以及局部变量. final的特点 final修饰类不可以被继承,但是可以继承其他类. class Yy {} final clas

C++中引用和匿名对象的理解和本质剖析

引用是什么? 引用其实就是给变量起的一个别名,使用这个别名跟使用变量名没有区别. 那什么又是变量名呢? 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号),编译器通过变量来申请并命名内存空间,程序员可以通过变量的名字可以使用存储空间. 也可以这样理解,变量名是逻辑概念,变量是物理层面,变量含数据类型和数据值,数据类型决定内存的分配,编译器将变量名和变量对应的内存联系起来,使程序员可以通过变量名来操作内存. 引用怎么用?    语法:Type& name = var; 规则:1.普通引用在

构造 &amp; 析构 &amp; 匿名对象&zwj;

?以前仅知道创建对象,但对匿名对象的了解基本为0. 通过阅读google chromium源代码 中关于 log 的使用,查阅相关资料,了解了一下匿名对象,予以记录. 什么是匿名对象? 匿名对象可以理解为是一个临时对象,一般系统自动生成的,如你的函数返回一个对象,这个对象在返回时会生成一个临时对象. #include <iostream> class myclass {public:  myclass()  {    std::cout << "构造函数" &l

Java学习(匿名对象、内部类、包、import、代码块)

一.匿名对象 概念:匿名对象是指在创建对象时,只有创建的语句,却没有把对象地址值赋给某个变量. 特点: (1)匿名对象直接使用,没有变量名.当做形参使用. new Person().name="张三"; (2)匿名对象只能调用一次方法,再次调用相当于又创建了一个新的匿名对象 new Person().setName("小明"); System.out.println(new Person().getName()); //输出为空,因为又创建了一个新的匿名对象,跟上一

匿名对象,内部类和访问修饰符应用

一.匿名对象 1.概念: 匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 如:已经存在的类: public class Person{ public void eat(){ System.out.println(); } } 普通类创建: Person p = new Person(); 创建一个匿名对象: new Person(); 2.匿名对象的特点: ①创建匿名对象直接使用,没有变量名. new Person().eat() //eat方法被一个没有名字的P

5、static、final、匿名对象、内部类、包、修饰符、代码块

final关键字 final关键字概念 * A: 概述 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承, 或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后, 就可以对其中的方法进行重写,那怎么解决呢? 要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变. final是个修饰符,它可以用来修饰类,类的成员,以及局部变量. final修饰类义 * A: final 修饰类 final修饰类不

匿名对象+内部类+包

匿名对象 匿名对象的概念 匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 匿名对象的特点 1.创建匿名对象直接使用,没有变量名. 2. 匿名对象在没有指定其引用变量时,只能使用一次. 3.匿名对象可以作为方法接收的参数.方法返回值使用 内部类 内部类概念  什么是内部类: 将类写在其他类的内部,可以写在其他类的成员位置(类里面)和局部位置(方法里面),这时写在其他类内部的类就称为内部类.其他类也称为外部类. 什么时候使用内部类: 在描述事物时,若一个事物内部还包含

this/super/static/final/匿名对象/继承/抽象类/访问权限修饰符

1.this关键字的作用     1)调用本类中的属性;     2)调用本类中的构造方法;且只能放首行,且必须留一个构造方法作为出口,即不能递归调用     3)表示当前对象; 2.匿名对象     直接new出来的对象,不创建变量名,且只能使用一次,通常作为方法的参数及返回值使用 3.继承     继承是面向对象的三大特征之一,通过关键字:extends实现,被继承的类称为父类(也称作基类/超类),实现继承的类称为子类(也称作派生类).     特点:     (1)通过继承,子类可以直接访

47 匿名对象

什么是匿名对象 没有名字的对象 匿名对象应用场景 调用方法  仅仅只调用一次的时候 那么匿名对象调用有什么好处呢? 节省代码 注意:调用多次的时候,不适合,匿名对象调用完毕就是垃圾 1 class Demo2_Phone{ 2 3 4 public static void main(String[] args) { 5 6 new Phone().sendMessage(); //匿名对象 7 } 8 } 9 10 class Phone{ 11 String brand; 12 int pri