【C/C++基础进阶系列】C/C++ 对象模型 -- 类基础知识总结(二)
发布日期:2021-05-07 20:53:15 浏览次数:25 分类:精选文章

本文共 1164 字,大约阅读时间需要 3 分钟。

【C/C++基础进阶系列】C/C++ 对象模型 -- 类基础知识总结(二)

【1】临时对象

在C++中,临时对象是指在函数返回时、作为函数返回值产生的对象,或是在某些表达式中被直接使用但不再被引用到的对象。这些临时对象的产生通常伴随着构造函数和析构函数的调用,可能会对程序性能产生影响。通过理解临时对象的产生机制,可以更好地优化程序性能。

例如,在以下代码中,CTempValue tm(10, 20); 会在函数返回时产生一个临时对象,并调用构造函数。随后,int Sum = tm.Add(tm); 会再次产生一个临时对象,因为tm会被拷贝。

CTempValue tm(10, 20);
int Sum = tm.Add(tm);

另一个例子是隐式类型转换产生的临时对象。例如:

CTempValue sum;
sum = 1000; // 隐式类型转换会生成一个临时对象

通过避免不必要的临时对象的生成,可以显著优化程序性能。

【2】对象移动

在C++11中,引入了对对象移动操作的支持,可以在不拷贝数据的情况下将对象的资源转移给新的对象。这种机制特别适用于资源受限的场景,如动态内存管理。

例如,类A的构造函数和拷贝构造函数都涉及到对B类对象的管理:

A(A&& tmpa) : m_pb(tmpa.m_pb) {
tmpa.m_pb = nullptr;
cout << "类A的移动构造函数执行了" << endl;
}

在这种机制下,对象的资源(如动态内存)会被转移,而原始对象的资源会被清除。这对于资源管理非常有用。

【3】类型转换构造函数、类成员指针

类型转换构造函数用于将外部数据类型的对象转换为本类对象。例如,以下代码中TestInt ti = 12; 会调用TestInt的类型转换构造函数,将整数转换为TestInt对象。

TestInt ti = 12;  // 隐式类型转换
TestInt ti1 = TestInt(12); // 显式类型转换

类成员函数指针可以通过指向类对象的成员函数地址来调用。例如:

void (CT:: * myfpointpt)(int);  // 定义一个函数指针变量
myfpointpt = &CT::ptfunc; // 绑定函数指针
CT ct;
ct.m_a = 189;
ct.*myfpointpt(100); // 调用类对象的成员函数

通过合理使用类型转换构造函数和类成员指针,可以更好地管理对象的构造和成员函数调用。

【参考致谢】

本文内容基于多个来源,包括《C++新经典》和《C++11/14高级编程Boost程序库探秘》等专业书籍,同时参考了众多技术博客,内容在此进行了适当的改写和整理。如有不当之处,请随时指出。

上一篇:【C/C++基础进阶系列】C/C++ 泛型 -- 函数模板
下一篇:【C/C++基础进阶系列】C/C++ 对象模型 -- 类基础知识总结(一)

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年05月03日 01时06分25秒