首页 > c++初学的几个疑问

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++中编辑就通过了,没有报错。请问这是编译器的问题,还是我写的代码在语法上有
问题?

求大神解决这三个问题。。。


不是你的教材有问题就是你的老师有问题,三段程序的错误是同一个————临时变量不能绑定在左值引用上,只能绑定在只读引用或者右值引用上。

复杂的原因现在解释给你听估计你也听不明白,你就记着几点:
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,或者更新的版本

如果你们老师说的与上述几点不一致,建议你换个老师,或者换个学校。

【热门文章】
【热门文章】