千家信息网

C++临时对象实例分析

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇"C++临时对象实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++临时
千家信息网最后更新 2025年01月19日C++临时对象实例分析

这篇"C++临时对象实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++临时对象实例分析"文章吧。

    一、初探临时对象

    1.问题

    下面的程序输出什么?为什么?

    下面编写程序进行实验:

    #include class Test {    int mi;public:    Test(int i) {        mi = i;    }    Test() {        Test(0);    }    void print() {        printf("mi = %d\n", mi);    }};int main(){    Test t;    t.print();    return 0;}

    输出结果如下:

    程序意图:

    • 在 Test() 中以 0 作为参数调用 Test(int i)

    • 将成员变量 mi 的初始值设置为 0

    运行结果:

    • 成员变量 mi 的值为随机值

    2.思考

    构造函数是一个特殊的函数

    • 是否可以直接调用?

    • 是否可以在构造函数中调用构造函数?

    • 直接调用构造函数的行为是什么?

    3.答案

    • 直接调用构造函数将产生一个临时对象

    • 临时对象的生命周期只有一条语句的时间(过了这条 C++ 语句,临时对象将被析构而不复存在)

    • 临时对象的作用域只在一条语句中

    • 临时对象是 C++ 中值得警惕的灰色地带

    可以将上面代码写成这样,避免临时对象:

    #include class Test {    int mi;    void init(int i)    {        mi = i;    }public:    Test(int i) {       init(i);    }    Test() {       init(0);    }    void print() {        printf("mi = %d\n", mi);    }};int main(){    Test t;    t.print();    return 0;}

    输出结果如下:

    再来看一个程序,深刻体会一下临时对象:

    #include class Test {    int mi;    void init(int i)    {        mi = i;    }public:    Test(int i) {        printf("Test(int i)\n");        init(i);    }    Test() {        printf("Test()\n");        init(0);    }    void print() {        printf("mi = %d\n", mi);    }    ~Test()    {        printf("~Test()\n");    }};int main(){    printf("main begin\n");    Test();    Test(10);    printf("main end\n");    return 0;}

    输出结果如下:

    这个程序很好的说明了临时对象的生命周期只有一条语句的时间(过了这条 C++ 语句,临时对象将被析构而不复存在)

    二、编译器的行为

    现代 C++ 编译器在不影响最终执行结果的前提下,会尽力减少临时对象的产生!!!

    下面来看一个例子:

    #include class Test{    int mi;public:    Test(int i)    {        printf("Test(int i) : %d\n", i);        mi = i;    }    Test(const Test& t)    {        printf("Test(const Test& t) : %d\n", t.mi);        mi = t.mi;    }    Test()    {        printf("Test()\n");        mi = 0;    }    int print()    {        printf("mi = %d\n", mi);    }    ~Test()    {        printf("~Test()\n");    }};Test func(){    return Test(20);}int main(){    //Test t(10); 等价于 Test t = Test(10);    Test t = Test(10); // ==> Test t = 10;    Test tt = func();  // ==> Test tt = Test(20); ==> Test tt = 20;    t.print();    tt.print();    return 0;}

    输出结果如下:

    注意两点:

    • 通过输出结果可以看到【编译器并没有按照生成临时对象,再用临时对象初始化 t 对象(其中涉及调用拷贝构造函数)】的步骤,因为现代的编译器都会尽力避免临时对象的产生。

    • Test t = Test(10); 等价于 Test t = 10; 写成Test t = 10; 可以杜绝临时对象的产生。因为临时对象的产生会带来性能上的问题,Test t = Test(10); 相当于调用了两次构造函数, 而 Test t = 10; 少调用一次函数,性能得到提升。

    以上就是关于"C++临时对象实例分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

    对象 函数 C++ 结果 输出 内容 程序 语句 编译器 编译 实例 实例分析 分析 不复存在 变量 只有 周期 性能 成员 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全防护专题会议 东莞尚梦互联网科技有限公司 如何管理我的世界服务器 青岛分销软件开发哪家靠谱 信用社软件开发岗位面试 华三路由器网络安全设置教程 普陀区企业数据库研发厂家价格 流式数据库和时序数据库区别 影响网络安全的内因和外因 网络技术是由什么技术 卡池猫池软件开发 顺义区专业性软件开发概况 汉中网络技术服务价格 韶关东塔网络安全学院包住宿 SQL数据库许可限制值设定 oracle数据库线程数 mysql简历数据库格式 手机网络安全宣传高清图片 运用网络技术授课的方法 汽车电子总线网络技术包括 EA和软件开发 cmu数据库发展方向 黑马程序网络安全运维 数据库互换码 2022年网络安全新年献词 查询系统的sql数据库设计 服务器和轻量应用服务器区别 群星进服务器显示连接 个人网站需要什么性能的服务器 全球网络安全议题大全
    0