C++朋友函数两个数字的加法



我是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;
}

这是传递值:

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)

并且它应该工作得更好

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

您应该声明函数set,以通过引用而不是通过值获取输入参数obj1

更改此项:

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的副本,因为您通过值传递它

但还有很多其他提示:

朋友功能大多是糟糕的设计。

为什么不给类提供set/get例程,并在void set(a obj1)void show(a obj)函数中使用这些例程呢?

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);
}

最新更新