1:基本概念
2:匿名对象的用法
3:注意事项和延伸
基本概念和性质:
匿名对象又称为,临时对象。所谓匿名对象就是省去对象名称,就是指主要形式上的特点是。在实例化时,类名(),如类名为complay。匿名对象complay();。一般情况下,匿名对象的生存周期只有一行。接下来一行后。就会自动调用析构函数。释放这一部分内存。
匿名对象的用法:
#include <iostream>
using namespace std;
class student
{
public:
int p_a1;
int p_a2;
int p_a3;
int fun1(void) /*这里使用了一个默认参数列表*/
{
p_a1=1;p_a2=2;p_a3=3;
return p_a1+ p_a2+ p_a3;
}
/*声明一个构造函数,用来在用例初始化时,给成员变量初始化*/
student(int G_a1,int G_a2,int G_a3);
};
student::student(int G_a1,int G_a2,int G_a3):p_a1(G_a1),p_a2(G_a2),p_a3(G_a3)
{
}
int main()
{ /*创建匿名对象*/
int sum1,sum2;
/*使用匿名对象,调用函数,和对类中的成员变量赋值*/
sum1=student(0,0,0).fun1();
sum2=student(0,0,0).fun1();
int Value1=(student(4,5,6).p_a1);
int Value2=(student(7,8,9).p_a2);
int Value3=(student(10,11,12).p_a3);
cout << "输出sum1的值:"<<sum1<< endl;
cout << "输出sum2的值:"<<sum2<< endl;
cout << "输出value1的值:"<<Value1<< endl;
cout << "输出value2的值:"<<Value2<< endl;
cout << "输出value3的值:"<<Value3<< endl;
return 0;
}
匿名使用场景如下:我们使用student(),创建一个匿名对象,然后使用这个匿名对象,调用fun1()。这样做的好处有两个:
1)如果仅是暂时需要一个对象来,调用函数,或对变量进行赋值时。我们就可以创建匿名对象
2)匿名对象,生存周期只有行代码,下一行就会自己释放内存,从而节省内存空间。
匿名对象还有如下定义方式
- (new student(30, 15, 90)) -> fun1();
- (new student(30 16, 80)) -> fun1();
- (new student(30, 16, 99)) -> fun1();
- (new student(30, 14, 60)) -> fun1();
先使用new开辟一段堆内存,然后指定 开辟类student的实例对象,此时对象已经创建成功,用括号传递实参给构造函数。整体此时还要加上一个括号,此时new放回一个指针(该指针指向开辟内存的首字节的地址)。到这一步之后,我们得到了一个指针变量。于是我们将这个指针,指向类中定义的函数。
根据上面代码,我们可以知道匿名函数定义时,也是能够使用构造函数,为对象中的成员赋值。
我们知道。同一个对象student,实例化 两个实例对象a1和a2。
class student a1,a2;//注意a1和a2之间用","隔开。
a1=a2;//此语句是合法操作
//由此我们想到,匿名对象是否可以赋值给有名对象(前提是他们是基于同一class创建出来的)
class student stu_3=student(1,2,3) /*这里有一个隐藏的知识点,有名的对象可以在最前面+class,虽然也可以不加(c++语法同时兼容加class或不加),但是匿名对象在创建时,必须不能加class,从这里就可以看出来c++语法上的复杂,这也让我们这些初学者产生了学习上的困难*/
class student stu_4= 2023; //这种叫做隐式转换,可以暂时理解为class student stu_4=student(2023,0,0);我滴妈呀。真搞不懂c++为什么搞出那么多复杂的概念,和看起来很无厘头的语法。真是让人奔溃。
匿名对象有常属性,所以引用匿名对象只能 const 引用。这里又涉及到引用的相关知识,后面再说吧!