C++中的那些“匿名“

2024-06-24 11:20:58 浏览数 (1)

匿名对象

定义

在C 中,匿名对象(Anonymous Object)是指在没有被命名的情况下创建的临时对象。它们通常用于在单个语句中执行一系列操作或者调用某个函数,并不需要将其结果存储在变量中。

匿名对象的创建非常简单,只需要在类名后面使用一对空括号。

详解

语法结构

语法格式:类名()

具体概念理解
代码语言:javascript复制
#include<iostream>
using namespace std;
class A
{
public:
	A(int a) :_a(a)
	{
		cout << "构造函数的使用" << endl;

	}
	~A()
	{
		cout << "析构函数的使用" << endl;

	}
private:
	int _a;
};

我们在这里创建了一个类A,然后再main函数中实例化了两个对象,分别为【有名的对象】,【匿名的对象】,此时可以知道:匿名对象很显然是没有名字的。

代码语言:javascript复制
int main()
{
	A b(10);
	A(10);

	return 0;
}

对于【有名的对象】而言:其生命周期在当前函数局部域中;

对于【匿名对象】而言:其生命周期通常为定义匿名对象这一行,然后马上销毁,但也不一定:

匿名对象的对象类型

匿名对象不仅仅是用于类对象,也可以是内置类型,比如int,double,float等等:

其匿名对象默认都是0;

匿名对象的生命周期
实例1
代码语言:javascript复制
class A
{
public:
    A(int s)
    {
        i = s;
    }

    void myshow()
    {
          cout<<i<<endl;
    }
private:
     int i;
};

void playstage()
{
     cout<<A(10).myshow()<<endl;//调用匿名对象

   A a = 11;//此处发生隐身转换。。。。相当于  A a = A(11);   此处的A(11)就是一个匿名对象

     A b = A(12);//当匿名对象有等待初始化的对象接的时候,只调用一次构造和析构函数
     
     A c;//调用一次构造函数
     c = A(13);//此处为赋值。。。。。此处的匿名对象会调用一次构造函数
}

void main()
{
    playstage();

    system("pause");

}
示例2
代码语言:javascript复制
class wer
{
public:
    wer()
    {
        cout << "wer类 无参构造函数" << endl;
    }

    wer(wer& obj)
    {
        cout << "wer类 拷贝构造函数" << endl;
    }

    ~wer()
    {
        cout << "wer类 析构函数 " << endl;
    }

};

void playStage() //一个舞台,展示对象的生命周期
{
    wer();             /*在执行此代码时,利用无参构造函数生成了一个匿名Cat类对象;执行完此行代码,
                            因为外部没有接此匿名对象的变量,此匿名又被析构了*/
    wer cc = wer();    /*在执行此代码时,利用无参构造函数生成了一个匿名Cat类对象;然后将此匿名变 成了cc这个实例对象*/

}

int main()
{
    playStage();
    system("pause");
    return 0;
}

 说明 1、在执行playStage()函数中的Cat()时,生成了一个匿名对象,执行完Cat()代码后,此匿名对象就此消失。这就是匿名对象的生命周期。 2、在执行playStage()函数中Catcc=Cat0;时,首先生成了一个匿名对象,因为外部有cc对象在等待被实例化,然后将此匿名对象变为了cc对象,其生命周期就变成了cc对象的生命周期。 总结: 如果生成的匿名对象在外部有对象等待被其实例化此匿名对象的生命周期就变成了外部对象的生命周期;如果生成的匿名对象在外面没有对象等待被其实例化,此匿名对象将会生成之后,立马被析构。

匿名对象的使用场景
代码语言:javascript复制
#include<iostream>
using namespace std;
class A
{
public:
	int A_solutin(int a)
	{
		cout << "A_solutin" << endl;
		return a;
	}
private:
	int _a;
};

有如上这样一个类,我们如果想去调用这个类里的成员函数,该如何去调用呢?

相信大家都会选择使用这一种方式:

代码语言:javascript复制
int main()
{
	A b;
	b.A_solutin(1);

	return 0;
}

这一种方式就是创建一个有名的对象,然后利用这个有名的对象去调用。

但是,还有另外一种方式

代码语言:javascript复制
int main()
{
	A().A_solutin(1);

	return 0;
}

这个过程采用匿名对象,代码简洁,干练。

但是,由于没有真实对象的产生,所以这个在之后的代码中也无法使用这个对象。

0 人点赞