c++初学的几个疑问
本人c++入门小白,今天在学习自定义类以及运算符的重载的时候,碰见几个问题:
1.匿名(无名)对象
比如 我定义了一个类 Student
然后定义一个Student(1,2)的匿名对象.在dev c++的编译环境下是可以编译通过的。
但是 如果这样用: Student a = Student(1,2); 以及
Student & a = Student(1,2)编译通过不了.但是我看老师的例子就是这样的,请问是怎么回事?
2.类型转换
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(double c,double d)
{
a = c;
b = d;
}
friend Complex operator+(Complex & ,Complex & );
Complex(int c)
{
a = c;
b = 0;
}
void print()
{
cout<<a<<"+"<<b<<"i";
}
private:
double a;
double b;
};
Complex operator+(Complex & c1,Complex & c2)
{
return Complex( c1.a+c2.a,c1.b+c2.b);
}
int main()
{
Complex a(1.2,2.1);
int b = 1;
Complex c = Complex(b)+a;
c.print();
return 0;
}
在这段代码中,我已经用转换构造函数对整形转类的转换,但为什么在main函数中,为c进行初始化的时候不能隐形转换 ,即,Complex c = b +a; (即为什么这样写的时候编译器会报错?)
3.运算符的重载
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(double c,double d)
{
a = c;
b = d;
}
Complex(Complex & c)
{
a = c.a;
b = c.b;
}
friend Complex operator+(Complex & c1,Complex & c2);
void print()
{
cout<<a<<"+"<<b<<"i";
}
private:
double a;
double b;
};
Complex operator+(Complex & c1,Complex & c2)
{
return Complex(c1.a+c2.a,c1.b+c2.b);
}
int main()
{
Complex a(1.2,2.1),b(2.3,3.4);
Complex c = a + b;
c.print();
return 0;
}
在devc++环境下会报错。错误指向 operator+ 函数定义中
return Complex(c1.a+c2.a,c1.b+c2.b);这一行,错误提示为:
[Error] no matching function for call to 'Complex::Complex(Complex)'
[Note] Complex::Complex(Complex&)
然后 在 vc++中编辑就通过了,没有报错。请问这是编译器的问题,还是我写的代码在语法上有
问题?
求大神解决这三个问题。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不是你的教材有问题就是你的老师有问题,三段程序的错误是同一个————临时变量不能绑定在左值引用上,只能绑定在只读引用或者右值引用上。
复杂的原因现在解释给你听估计你也听不明白,你就记着几点:
1、拷贝构造函数的形式是
T(const T&)
,不是T(T&)
,你少写了个const
2、
operator+
之类返回新对象的操作符函数作为友元的形式是T operator+(const T&, const T&)
,不是T operator(T&, T&)
,你少写了两个const
3、不要用dev-c++或者旧版VC,要用Visual Studio 2013或者Visual Studio 2015 CTP 6,或者更新的版本
如果你们老师说的与上述几点不一致,建议你换个老师,或者换个学校。