匿名对象引入 : 在上一篇博客 【C++】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 ) 中 , 讲到了 如果 类对象 作为函数的返回值 , 返回的是在 函数中 创建的 类实例对象 的 副本 , 其本质是一个匿名对象 ;
对象值作为函数返回值 : 函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ;
// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
Student s1(18, 170);
return s1;
}
在 C++ 语言中 ,
" 匿名对象 " 指的是 没有 显式指定名称 的 类 的 实例对象 ;
匿名对象 通常用于 临时计算 或 作为函数的 参数 / 返回值 传递 ;
匿名对象创建语法 :
类名(构造函数参数)
下面的代码 , 就是创建 Student 类的 匿名对象 ;
Student(12, 170)
匿名对象 的 作用域 仅限于 创建匿名对象 的 那一句代码 , 这句代码执行完毕后 , 匿名对象会自动销毁 , 下一行代码无法访问 上一行代码 创建的 匿名对象 ;
下面的代码中 , 创建了 Student 类型的 匿名对象 , 并调用了该对象的 printfInfo 成员方法 ;
// 创建匿名对象, 并执行匿名对象函数
Student(12, 170).printfInfo();
" 匿名对象 " 通常只在创建它的语句中使用 , 并且在语句结束时会被销毁 ;
" 匿名对象 " 不适用于需要 在多个语句之间保持持久性的情况 ;
创建匿名对象核心代码 : 创建了 Student 类型的匿名对象后 , 调用该匿名对象的函数 ; 这句代码执行完毕后 , 匿名对象就无法访问了 , 因为匿名对象的作用域仅限于其所在的表达式中 ;
// 创建匿名对象, 并执行匿名对象函数
Student(12, 170).printfInfo();
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
// 带参构造函数
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "调用带参数构造函数" << endl;
}
// 打印学生信息
void printfInfo()
{
cout << "学生信息 : 年龄 = " << m_age << " , 身高 = " << m_height << endl;
}
Student(const Student& s)
{
m_age = s.m_age;
m_height = s.m_height;
cout << "调用拷贝构造函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
int main()
{
// 创建匿名对象, 并执行匿名对象函数
Student(12, 170).printfInfo();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
调用带参数构造函数
学生信息 : 年龄 = 12 , 身高 = 170
Press any key to continue . . .