隐式构造函数

C++之隐式构造函数

先来看一段很简单的程序。


这是一个简单的类,拥有两个私有成员,有两个构造函数用来初始化私有成员,还有一个输出信息的方法。

注意下面的类对象a、b的实例化过程。

#include <iostream>

using namespace std;

class Person
{
    private:
        string My_name;
        int My_age;
    public:
        Person(string name)
            :My_name(name), My_age(-1){}
        Person(int age)
            :My_name("unknow"), My_age(age){}
        void saySth()
        {
            cout << "my name is " << My_name << ", age is " << My_age << endl;
        }
};

int main()
{
    Person a("ganlan");
    Person b(22);

    a.saySth();
    b.saySth();
    return 0;
}

下面展示一种奇怪的实例化方法。

#include <iostream>

using namespace std;

class Person
{
    private:
        string My_name;
        int My_age;
    public:
        Person(string name)
            :My_name(name), My_age(-1){}
        Person(int age)
            :My_name("unknow"), My_age(age){}
        void saySth()
        {
            cout << "my name is " << My_name << ", age is " << My_age << endl;
        }
};

int main()
{
    Person a = string("ganlan");
    Person b = 22;

    a.saySth();
    b.saySth();
    return 0;
}

先忽略第23行,注意第24行,b的类型是Person类型,怎么可以被int类型赋值呢?

其实这是“隐式构造函数”搞的鬼,可以理解为同第一个程序那样调用构造函数初始化成员变量。

第23行比较特殊一些,需要转化为string类型才能使用该字符串。


隐式构造函数,建议大家会用即可,认识就行。

C++ 中,隐式调用构造函数是指在某些情况下,编译器会自动调用构造函数来创建一个对象,而不需要程序员显式地调用构造函数。 例如,当我们定义一个类的对象时,编译器会自动调用该类的默认构造函数来创建对象。又例如,当我们用一个已有的对象初始化另一个对象时,编译器也会自动调用该类的拷贝构造函数来完成初始化。 下面是一个示例代码,演示了隐式调用构造函数的情况: ```c++ #include <iostream> using namespace std; class MyClass { public: int value; MyClass() { // 默认构造函数 cout << "default constructor called" << endl; value = 0; } MyClass(int n) { // 带参数的构造函数 cout << "constructor with int called" << endl; value = n; } MyClass(const MyClass& other) { // 拷贝构造函数 cout << "copy constructor called" << endl; value = other.value; } }; int main() { MyClass a; // 隐式调用默认构造函数 MyClass b = 10; // 隐式调用带参数的构造函数 MyClass c(a); // 隐式调用拷贝构造函数 MyClass d = b; // 隐式调用拷贝构造函数 return 0; } ``` 在上面的代码中,当我们定义对象 `a` 时,编译器会自动调用 `MyClass` 类的默认构造函数;当我们定义对象 `b` 时,由于使用了整数 `10` 进行初始化,编译器会自动调用 `MyClass` 类的带参数的构造函数;当我们定义对象 `c` 和 `d` 时,由于使用了已有的对象进行初始化,编译器会自动调用 `MyClass` 类的拷贝构造函数。 需要注意的是,当我们使用 `explicit` 关键字修饰一个构造函数时,就不能进行隐式调用构造函数了,只能使用显式调用构造函数
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值