單操作符用返回引用,不能是友元函數,否則編譯不通過
雙操作符,必須定義為友元,否則編譯不通過
測試編譯器:g++ 4.6.3
[cpp]
#include <iostream>
#include <ostream>
#include <string>
using namespace std;
class T{
public:
T(){};
T(int t)
{
a = t;
};
T(const T &t)//當沒有定義復制函數,編譯器會自己合成一個,並不會調用下面的賦值”=“操作符。
{
cout << "復制" << endl;
a = t.a;
};
T& operator = (const T& t)//當沒有定義賦值函數,編譯器會自己合成一個,並不會調用下面的復制”()“操作符。
{
cout << "賦值" << endl;
a = t.a;
return *this;
}
T& operator += (int b)
{
a += b;
return *this;
}
private://友元函數可以為私有類,因為友元不是類成員,所以私有限制對他不起作用
friend ostream& operator << (ostream& out,const T& t)//必須設為友元函數,否則編譯不通過
{
out << "the num is:" << t.a;
return out;
}
friend T operator + (const T& t1, const T& t2)//必須設為友元函數,否則編譯不通過
{
T t;
t.a = t1.a + t2.a;
return t;
}
int a;
};
void fun(T t)
{
return ;
}
int main()
{
T t(2);
fun(t);//形參傳遞為復制函數
T t1;
t1 = t;//賦值操作符號
t1 += 5;
cout << t1 << endl;
T t2;// 如果是t2 = t + t1;初始化為復制函數,等價與t2(t + t1)
t2 = t + t1;//先加,在調用=
cout << t2 << endl;
return 0;
}
#include <iostream>
#include <ostream>
#include <string>
using namespace std;
class T{
public:
T(){};
T(int t)
{
a = t;
};
T(const T &t)//當沒有定義復制函數,編譯器會自己合成一個,並不會調用下面的賦值”=“操作符。
{
cout << "復制" << endl;
a = t.a;
};
T& operator = (const T& t)//當沒有定義賦值函數,編譯器會自己合成一個,並不會調用下面的復制”()“操作符。
{
cout << "賦值" << endl;
a = t.a;
return *this;
}
T& operator += (int b)
{
a += b;
return *this;
}
private://友元函數可以為私有類,因為友元不是類成員,所以私有限制對他不起作用
friend ostream& operator << (ostream& out,const T& t)//必須設為友元函數,否則編譯不通過
{
out << "the num is:" << t.a;
return out;
}
friend T operator + (const T& t1, const T& t2)//必須設為友元函數,否則編譯不通過
{
T t;
t.a = t1.a + t2.a;
return t;
}
int a;
};
void fun(T t)
{
return ;
}
int main()
{
T t(2);
fun(t);//形參傳遞為復制函數
T t1;
t1 = t;//賦值操作符號
t1 += 5;
cout << t1 << endl;
T t2;// 如果是t2 = t + t1;初始化為復制函數,等價與t2(t + t1)
t2 = t + t1;//先加,在調用=
cout << t2 << endl;
return 0;
}
輸出結果為:
復制
賦值
the num is:7
賦值
the num is:9