Cpp下匿名对象探究

先来看看一段代码:

#include "iostream"
using namespace std;

class ABCD
{
public:
    ABCD(int a, int b, int c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
        printf("ABCD() construct, a:%d,b:%d,c:%d  \n", this->a, this->b, this->c);
    }
    ~ABCD()
    {
        printf("~ABCD() construct,a:%d,b:%d,c:%d  \n", this->a, this->b, this->c);
    }
    int getA()
    {
        return this->a;
    }
protected:
private:
    int a;
    int b;
    int c;
};

int run3()
{
    printf("run3 start..\n");
    ABCD(400, 500, 600);
    printf("run3 end\n");
    return 0;
}

int main()
{

    run3();
    system("pause");
    return 0;
}

我们下断点来一步一步调试:

我们F11,进入下一步:

打印出如下:

我们继续往下走:

调用ABCD类的构造函数,完成对象的初始化工作

继续往下走,我们会发现:

跟进:

析构完成后:

输出结果:

继续往下走,程序执行完毕。

从上面我们可以分析出,匿名对象如果没有完成赋值,也就是没有与一个对象进行绑定,那么匿名对象的构造执行完毕后,会马上执行析构函数,回收对象分配的内存空间。

有了上面的基础,我们来看看匿名对象的一个经典案例:

#include "iostream"
using namespace std;

//构造中调用构造是危险的行为
class MyTest
{
public:
    MyTest(int a, int b, int c)
    {
        this->a = a;
        this->b = b;
        this->c = c;
    }
    MyTest(int a, int b)
    {
        this->a = a;
        this->b = b;

        MyTest(a, b, 100); //产生新的匿名对象
    }
    ~MyTest()
    {
        printf("MyTest~:%d, %d, %d\n", a, b, c);
    }
protected:
private:
    int a;
    int b;
    int c;

public:
    int getC() const { return c; }
    void setC(int val) { c = val; }
};

int main()
{
    MyTest t1(1, 2);
    printf("c:%d", t1.getC()); //请问c的值是?  输出一个垃圾值
    system("pause");
    return 0;
}

上面函数执行结果如下:

可以看出,c的输出结果为一个垃圾值,那么为什么会出现这种情况呢?下面我们来分析一下上面的代码:

我们跟进:

完成对象的初始化,接着我们继续执行MyTest(1,2,100);,注意,这里会产生一个匿名对象,我们上面说过,当匿名对象没有进行绑定操作,会自动进行析构。所以当我们执行完上面代码后,会马上调用析构函数,回收匿名对象的内存空间。

完成对匿名函数的析构,也就是说此时匿名对象内存空间已经被回收,那么c对应值此时是系统随机分配的,所以最终的输出结果是一个垃圾值。

时间: 2024-10-12 18:35:52

Cpp下匿名对象探究的相关文章

第九天(下) 匿名对象和内部类

匿名对象 匿名对象是指在创建对象的时,只有创建对象的语句,却没有把对象地址赋值给某个变量. public class Person{     public void eat(){         System.out.println("");     } } 创建一个普通对象 Person p = new Person(); 匿名对象 new Person(); 特点 创建匿名对象直接使用,没有变量名. new Person(),eat(); 在只使用一次的情况下使用,因为每次new都

匿名对象的使用

很早就知道有匿名对象这个东西,但是没用过,今天又了解了下匿名对象,下面简单的记录下吧: 匿名对象的特点:     1.匿名对象是没有别其它对象所引用 2.使用一次就变成垃圾了,被垃圾回收器收回了 匿名对象使用情况: 1.需要的对象没有别的对象再次引用 2.可以剪短这个对象的周期,用完就没了. 符合这两种情况的时候,可以用下匿名对象

dynamic结合匿名类型 匿名对象传参

首先说明下,我一般很少用dynamic关键字(类)的,因为毕竟是由反射实现的,所以对于性能方面还是吃亏不少(注:由于心里没底,查了一些资料得知,dynamic实质上好像不是由反射实现的,其性能也比直接反射要高不少,至于为什么,我也不明白,希望你们知道的能留言告诉我一下!谢谢啦 ^_^)我也不知道为什么DLR能够实现与反射一样的实现,但代码,性能要比后者简介,高效!! 我这里就纯粹在这里坐下记录 匿名对象(类型)传参的几种方式 代码如下: class Program { static void M

java匿名对象

java学习面向对象之匿名内部类 之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 class NoObject {     void method()     {         System.out.println("Hello NoNam

Arduino下LCD1602综合探究(中)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法

一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduino的端口占用降到最少?LiquidCrystal库到底应该如何学习?在Arduino下LCD1602综合探究(下)中,笔者拟介绍一个1602的综合性实验,以期对前文的内容加以综合应用和总结.闲话少说,下面开始进入正文. 二.减少1602对Arduino的端口占用 <1>不使用I2C 在上文中,笔者

windows下匿名管道的使用

windows中有时候需要使用多进程进行编程,有的时候是因为一个复杂的过程需要开启一个新的进程进行处理,又或者仅仅是需要调用一个已经存在的exe等等,创建多个进程时,进程之间的通信是一个重要的问题,下面讨论一下如何使用匿名管道,在父子进程中进行通信. 使用情况:父进程使用createProcess与子进程进行通信. 管道(pipe)和现实中的管道的作用非常相似,从一端放入东西(数据),这些东西(数据)就可以通过管道,从另一端被取出来.在这里,管道的两端就是计算机上需要通信的两个进程,一个进程向管

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

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

当类型为dynamic的视图模型遭遇匿名对象

当年在ASP.NET MVC 1.0时代我提到,在开发时最好将视图的Model定制为强类型的,这样可以充分利用静态检查功能进行排错.不过有人指出,这么做虽然易于静态检查,但是定义强类型的Model类型实在是太麻烦了,因此也出现了基于SmartBag等折衷方案.强类型是一种极端方案,而在C# 4.0中我们又可以使用另一个极端,那就是让Model成为dynamic类型,这样在视图中便可以完全自由地获取数据了.不过,在使用匿名对象的情况下视图会抛出奇怪的"无法找到成员"异常,我们必须解决这个

c# 匿名对象增加动态属性

在开发过程中碰到了一个需求,需要动态创建对象及其动态属性.在尝试几种方法后,最后完成了需求,记录下过程,给园友参考下 1.动态创建对象一:匿名对象 object obj1 = new {Name = "金朝钱",Age="31",Birthday =DateTime.Now}; 创建的匿名对象: 问题1:无法动态映射对象属性 解决:使用反射的方式获取对象值 object obj1 = new {Name = "金朝钱",Age="31&