码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++——赋值理解(匿名临时对象)

时间:2019-01-26 15:18:01      阅读:438      评论:0      收藏:0      [点我收藏+]

标签:不同类   重载   c++   就是   width   log   程序   png   类型   

对三,王炸:

赋值的本质,是将变量传递给一个匿名临时变量,之后再传递给另一个变量。


  •  匿名临时对象:
#include <iostream>
using namespace std;

class A {
public:
    A() {
        cout << "构造函数:" << this << endl;
    }
    A(const A &a) {
        cout << "拷贝构造函数:" << this << endl;
    }
    ~A() {
        cout << "析构函数:" << this << endl;
    }
};

A f() {
    A a;
    return a;
}
int main() {
    A a = f();
    return 0;
}

首先要知道赋值的时候回调用拷贝构造函数,初始化的时候调用构造函数:

执行 return a; 产生了匿名临时对象 F903,在给a的赋值之前,销毁局部对象F803,F903赋值给了外面的a,程序执行结束时销毁。

 技术分享图片

 A()用来创建匿名对象,理论上这也是应该调用拷贝构造函数的,但事实上,编译器会对此进行优化,变成A a;

技术分享图片

 


  •   强制类型转化:

C++属于强类型语言,只要类型不一样,就不能赋值。

但是这里是可以赋值当场打脸,也是因为出现了一个匿名临时对象作为隐式转换的过渡桥梁。

技术分享图片    技术分享图片

注意第二张图:

这里并不是&b开辟了新的空间,引用的就是转换的临时变量

(int &b = a;是报错的)可见临时变量的常量性,const才能引用。

 

下面这样的隐式转换看似好像是错的。

技术分享图片

#include <iostream>
using namespace std;

class A {
    
public:
    int x;
    A(int num) {
        cout << "构造函数:" << this << endl;
        x = num;
    }
    A(const A &a) {
        cout << "拷贝构造函数:" << this << endl;
    }
    ~A() {
        cout << "析构函数:" << this << endl;
    }
};

int main() {
    A a = 10;
    cout << a.x << endl;
    return 0;
}

 两个不同类型能否进行赋值操作,在于能否找到一个中间桥梁,这里的赋值寻找到了构造函数A(int num){};(重载 ‘=’ 运算符也是可以实现的) 所以可以成功,并且a成功实例化。

 在构造函数前加上explicit关键字,则禁止 类似这样 不应该允许的经过转换构造函数进行的隐式转换的发生。

 

加上一个operator int(),反过来也是可以实现的:

技术分享图片


 

C/C++——赋值理解(匿名临时对象)

标签:不同类   重载   c++   就是   width   log   程序   png   类型   

原文地址:https://www.cnblogs.com/czc1999/p/10323369.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!