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