江南水岸渣fit人

博客园 首页 新随笔 联系 订阅 管理

语法似乎没有问题。但是无法运行,发生生成错误。

难道是因为构造函数吗?我自定义了一个传参构造函数,以及一个空构造函数。

在写重载函数的时候 需要声明一个Person对象,temp,如果将一下代码的 空构造函数注释掉,会报错。

但是不注释空构造函数的话,会出现绿色波浪线  ——>显示重载。

                

 

代码如下:

#include<iostream>
using namespace std;
class Person
{
public:
    int m_age;
    int m_weight;
    string m_name;
    string m_gender;
    Person();
    Person(int age, int weight, string name, string gender)
    {
        this->m_age = age;
        this->m_gender = gender;
        this->m_name = name;
        this->m_weight = weight;
    }
    ~Person()
    {
        cout << "调用析构函数" << endl;
    }
};
//通过全局函数重载 .格式如下:
//类名  operator+ (参数1,参数2,参数....,参数n)
Person operator+ (Person& p1, Person& p2)
{
    Person temp;
    temp.m_age    = p1.m_age    + p2.m_age;
    temp.m_gender = p1.m_gender + p2.m_gender;
    temp.m_name   = p1.m_name   + p2.m_name;
    temp.m_weight = p1.m_weight + p2.m_weight;
    return temp; //可不可以返回 &temp ?把返回类型改成 &person ?
}
//有了重载的函数后,在使用时就可以直接 p = p1 + p2 .
void show(Person& p)
{
    cout << "name:\t" << p.m_name << endl;
    cout << "his gender:\t" << p.m_gender << endl;
    cout << "his age:\t" << p.m_age << endl;
    cout << "his weight:\t" << p.m_weight << endl;
}
int main()
{
    Person a(10,20,"Kobe_","Super");
    Person b(15,30,"Bryant" , "star");
    Person ok = a + b; //编译可以通过。重载完成。
    show(ok);
    system("pause");
    return 0;
}

 应该是重载函数的问题,全局重载函数中的 temp  编译始终无法通过。

 

 

解决方法:将自定义的两个构造函数都注释掉,就可以编译通过,正常运行了。。。。无语

#include<iostream>
using namespace std;
class Person
{
public:
    int m_age;
    int m_weight;
    ~Person()
    {
        cout << "调用析构函数" << endl;
    }
};
Person operator+(Person& p1, Person& p2)
{
    Person temp;
    temp.m_age    = p1.m_age    + p2.m_age;
    temp.m_weight = p1.m_weight + p2.m_weight;
    return temp;  
}
void show(Person& p)
{
    cout << "his age:\t" << p.m_age << endl;
    cout << "his weight:\t" << p.m_weight << endl;
}
int main()
{
    Person a;
    Person b;
    a.m_age = 10;
    a.m_weight = 20;
    b.m_age = 11; 
    b.m_weight = 21;
    Person ok = operator+(a,b); //编译可以通过。
    Person James = ok + a;  //直接相加也可以通过
    show(ok);
    cout << "  " << endl;
    show(James);
    system("pause");
    return 0;
}

存在疑惑:

1.如果我需要定义一个Person对象,比如temp时,我想直接给temp一个初始值,怎么办?难道不可以使用传参构造吗?

2.自定义一个空的构造函数也不能运行,这是为什么?难道默认的空构造函数  与 我 自己写的空构造函数重载吗?

3.

posted on 2021-10-12 19:43  江南水岸渣fit人  阅读(60)  评论(0)    收藏  举报