【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

构造函数

原创 2016年08月31日 00:11:39

以下代码输出是什么?

#include<iostream>
using namespace std;
class MyClass
{
public:
    MyClass(int i = 0)
    {
        cout << i;
    }
    MyClass(const MyClass &x)
    {
        cout << 2;
    }
    MyClass &operator=(const MyClass &x)
    {
        cout << 3;
        return *this;
    }
    ~MyClass()
    {
        cout << 4;
    }
};
int main()
{
    MyClass obj1(1), obj2(2);
    MyClass obj3 = obj1;
    return 0;
}


答案:

122444


解题思路:

关键是区分 浅/深拷贝操作 和 赋值操作: 
没有重载=之前: 
A a ; 
A b; 
a = b; 
这里是赋值操作。 
A a; 
A b = a;  
这里是浅拷贝操作(简单的值拷贝调用拷贝构造函数)。 

重载 = 之后: 
A a ; 
A b; 
a = b; 
这里是深拷贝操作(通常重载赋值运算符函数中进行深拷贝操作(new分配新内存地址,进行拷贝))。 
A a; 
A b = a;  
这里还是浅拷贝操作(调用拷贝构造函数)。 

所以 MyClass obj3 = obj1; 调用的是拷贝构造函数,而没调用符号重载函数。 
如果写成 MyClass obj3; obj3 = obj1; 输出的结果就是 1203444(调用默认构造函数时为0)

引申:构造函数自己传值进去就为自己的值(不会赋值为0),赋值为0是用于默认构造函数。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

C++ 构造函数语义学与 const rvalue reference

此文源自《深度探索C++对象模型》第二章构造函数语义学和《Effective Modern C++》item17-Understand special member function generati...

[细说Java](3)创建字符串是使用" "还是构造函数?

在Java中,可以使用两种方式创建字符串: <div style="font-family: 微软雅黑,'Microsoft YaHei',Georgia,Helvetica,Arial,sans-serif,宋体,PMingLiU,serif; font-size: 14.2857px; l

js面向对象小结(工厂模式,构造函数,原型方法,继承)

最近过了一遍尼古拉斯泽卡斯的高级程序设计第三版(红皮书)第六章:面向对象程序设计,现在把总结出来的东西和大家分享一下。 主要内容如下: 1.工厂模式 2.构造函数模式 3.原型...

Javascript 面向对象编程:用构造函数模式创建对象

       在ECMAScript中的构造函数可用来创建特定类型的对象,想Object和Array这样的原生构造函数,在运行是会自动出现在执行环境中。因此,可以创建自定义的构造函数,从而定义对象类型的属性和方法。       1、如下例子,使用构造函数创建原型对象: function Person(name,age){     this.name=name;     t

Hibernate Validator 校验方法的参数,返回值,构造函数

Hibernate Validator 校验方法的参数,返回值,构造函数 之前我们使用hibernate-Validator的时候基本是对于某个JavaBean进行的校验,比如下面的这个例子 publ...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)