int & Value(Int *const this)
//int & Value(Int * const this);
int & Value(const Int * const this)
//int &Value() const {return Value;}
以上这两个函数是 算重载函数的,因为this的不同。但是用const修饰返回值时不可以作为重载的依据。
class Int
{
private:
int value;
public:
int & Value()//int & Value(Int * const this);
{
return vlaue;
}
int & Value() const//int &Value() const
{return Value;}
}
int main()
{
Int a{10};
const Int b{20};
cout<<b.Value()<<endl;
cout<<a.Value()<<endl;
}
这个程序是无法编译通过的,因为b无法调用Value函数,虽然已经在最后加了const表示常方法 ,但是以引用的返回没有常性,这相互矛盾。
系统会说无法将const int转化为左值引用,因为你返回的value是个右值。
可以将这个函数改成
const int & Value() const//int &Value() const
{return Value;}
}
这样 就可以了。
但是我们只可以对其取值,不可以改变它的值,因为是常对象。
vector(顺序链表)
Int& Add(const Int &it) const
{
int x=this->value+it.value;
return Int(x);
}
//c=a.Add(b);
//c=Add(&a,b);
这个函数这样写是错误的,因为返回的是一个不具名的右值对象,但是返回值是以左值引用设置的。
Int && Add(const Int &it) const
{
int x=this->value+it.value;
return Int(x);
}
这样也是不对的,用右值引用作为返回值的话返回的是他的地址,但是函数结束整个函数所有内容已经被消亡掉,无法根据地址找到具体的。
类型的缺省函数有:
1、缺省的构造函数
2、缺省的 析构函数
3、缺省的拷贝构造函数
4、缺省的赋值语句
没有缺省的移动函数
5/6、两个取地址符
int类型强转
operator int() const
{
return value;
}
int main()
{
x=(int)a;
}
不需要返回值类型,因为本身就是int类型的强转。
构造函数补充
打印出来的结果是:
实部是一个随机值,而虚部2
因为初始化顺序不是按照参数列表初始化的,而是按照你定义的顺序
所以会先初始化m_real的值,这时m_image还未初始化,所以会变成随机值