繁体   English   中英

C ++朋友函数将两个数相加

[英]C++ friend function addition of two numbers

我是C ++的初学者,尝试使用一个朋友函数编写一个程序以将两个数字相加。 请帮助我,因为我正在使用默认构造函数而不是我从用户请求的变量中初始化了变量的总和。

这是我的代码

#include "stdafx.h"
#include <iostream>
class a
{
     int m_var;
     int m_var2;
public:
    a()
    {
        m_var=1;
        m_var=2;
    };

    friend void set(a obj1);
    friend void show(a ob);

};



void set(a obj1)

{
    std::cout<<"please enter the first number"<< "\n";
    std::cin>>obj1.m_var;
    std::cout<<"please enter the second number"<<"\n";

    std::cin>>obj1.m_var2;


}
void show(a obj)
{
        std::cout<< (obj.m_var+obj.m_var2);

    }



int main()
{
    a s;

    set(s);
    show(s);
    return 0;

}

由于obj1是函数set的局部变量,因此当您使用类a的实例调用此函数时,将在该函数“内部”创建该实例的副本,而该函数“外部”的实例将不受影响。

您应该声明函数set以采用输入参数obj1 by-reference而不是by-value

更改此:

void set(a obj1)

对此:

void set(a& obj1)

这是按值传递的:

void set(a obj1)

它创建对象的副本。 在范围之外,将看不到对此对象的更改。

通过参考传递:

void set(a& obj1)
void set(a obj1)

创建对象的副本后,方法内部发生的任何情况都将限制在方法主体内,并且不会在方法外部反映出来。

通过参考传递

void set(a& obj1)

除非需要,否则请尽量不要创建副本。 更改其他方法的签名

void show(a obj)

void show(a& obj)

问题在于您的set函数具有通过值传递的参数:

void set(a obj1)

因此它修改了对象的临时副本,并且在退出函数时所做的修改就消失了。 更改为参考:

void set(a& obj1)

它应该更好地工作

有几个错误。 您会在代码中找到它们:

class a
{
     int m_var;
     int m_var2;
             ^
public:
    a()
    {
        m_var = 1;
        m_var2 = 2;
             ^
    }
     ^

    friend void set(a& obj1);
    friend void show(a ob);

};

如果要更改原始变量,请按引用接受参数,否则将更改此参数的副本,并且在返回函数后不更改原始对象:

void set( a& obj1) {
    std::cout << "please enter the first number" << "\n";
    std::cin >> obj1.m_var;
    std::cout << "please enter the second number" << "\n";
    std::cin >> obj1.m_var2;
}

void show(a obj) {
        std::cout << (obj.m_var+obj.m_var2);
}



int main() {
    a s;
    set( s);
    show( s);
    return 0;
}

首先是您的问题:set获得了obj的副本,因为您按值传递了它

但还有许多其他提示:

朋友功能大多是错误的设计。

为什么不给您的类设置/获取例程,并在您的void set(a obj1)void show(a obj) void set(a obj1)函数中使用这些例程?

class A  // most conventions say classes have to be uppercase, objects lowercase
{
public:
    A()
    : m_var1(1)  // Also initialization of member should be done in initializer lists.
    , m_var2(2)
    {

    };
    int get1()const {return m_var1;}
    int get2()const {return m_var2;}
    void set1(int i){m_var1 = i;}
    void set2(int i){m_var2 = i;}

private:  // put private at end of class declaration since it is not interesting for class users
     int m_var1;
     int m_var2;

};

void show(const A& obj) // use const references to avoid copying
{
   std::cout<< (obj.get1()+obj.get2()
};


void set(A& obj1) // use reference to avoid copying that was the reason for your not working code
{
    int i;
    std::cout<<"please enter the first number"<< "\n";
    std::cin>>i;
    obj1.set1(i);
    std::cout<<"please enter the second number"<<"\n";
    std::cin>>i;
    obj1.set2(i);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM