美文网首页c++小黄鸭课堂
C++小黄鸭课堂(4)再谈构造函数

C++小黄鸭课堂(4)再谈构造函数

作者: 春天的尐熊 | 来源:发表于2021-11-01 09:03 被阅读0次

让我们先看一段代码,有没有发现什么神奇的地方:

class A {
    public:
    A(int i) : i(i) {}
    private:
    int i;
};
A a = 5;

小黄鸭小c:一个a类的对象居然可以用一个整数进行赋值。
小黄鸭小a:有可能是没有进行赋值,只是看起来是一个赋值语句,实际上可能只是通过有参构造实例化了a。
那我们来看一下是不是进行了赋值,要怎么看呢?看代码吧

class A {
    public:
    A(int i) : i(i) {
        cout << "A(i)" << endl;
    }
    A(const A &a) {
        cout << "A(A&)" << endl;
    }
    A& operator=(const A &a) {
        cout << "a&=" << endl;
        return *this;
    }
    private:
    int i;
};

int main() {
    A a = 5;
    return 0;
}
/* 输出
A(i)
*/

现实摆在眼前,一些有经验的小鸭子都傻眼了,它们曾经以为,这里是先将整数5,通过有参构造生成一个临时对象,再将此临时对象通过拷贝构造/移动构造实例化出来a对象。

我们再来看一个东西

class A {
    public:
    explicit A(int i) : i(i) {}
    private:
    int i;
};

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

这时候发现我们报错了

error: no viable conversion from 'int' to 'A'

这是因为其实语句A a = 5实际上是编译器隐式帮我们调用了A(i)这个有参构造,但是加上了explicit关键字之后就需要显式调用有参构造才可以。

相关文章

  • C++小黄鸭课堂(4)再谈构造函数

    让我们先看一段代码,有没有发现什么神奇的地方: 小黄鸭小c:一个a类的对象居然可以用一个整数进行赋值。小黄鸭小a:...

  • C++小黄鸭课堂(2)默认构造函数

    先来看一下下面这段代码,思考一下会发生什么? 有经验的小黄鸭应该会知道,这里面调用了A类的默认构造函数。 下面讲解...

  • C++小黄鸭课堂(3)多样的构造函数

    哪到底有哪些构造函数呢? 1、无参构造 2、有参构造 3、拷贝构造 4、移动构造(c++11) 看一段代码: 移动...

  • C++之再谈构造函数

    小结: 在定义时候,如果一个类的数据成员是另外一个类的对象的时候,在调用构造函数创建对象的时候,对作为数据成员的对...

  • C++ 拷贝构造函数浅析

    什么是拷贝构造函数:拷贝构造函数,顾名思义,就是在拷贝的时候调用的构造函数。 几个原则:C++ primer p4...

  • windows逆向3

    VC 程序内存和编译的一些特征C++ 构造函数C++ 成员函数C++ 析构函数C++ 全局对象的构造C++ 全局对...

  • C++小黄鸭课堂(5)默认构造函数,教科书的惊天大骗局

    还记得这段代码吗? 这里我们说到编译器会帮我们自动生成一个默认的构造函数,但是我们把它编译成汇编: g++ -S ...

  • C++ 构造过程

    构造函数 C++中每个类必须有一个构造函数,如果用户没有自行编写构造函数,则C++会自动提供一个无参数的构造函数,...

  • C++:面向对象基础

    构造函数 C++中有三种构造函数:默认构造函数,有参构造函数,拷贝构造函数 类对象的初始化 括号法//默认构造函数...

  • [C++之旅] 10 构造函数

    [C++之旅] 10 构造函数 构造函数的特点 构造函数在对象实例化时被自动调用 构造函数与类同名 构造函数没有返...

网友评论

    本文标题:C++小黄鸭课堂(4)再谈构造函数

    本文链接:https://www.haomeiwen.com/subject/jwczaltx.html