求C++大神 没有与这些操作数多表条件匹配数据求和的“<<”运算符是什么意思

下次自動登錄
現在的位置:
& 綜合 & 正文
C++之運算符重載(1)
在前一節中曾提到過,C++中運行時的多態性主要是通過虛函數來實現的,而編譯時的多態性是由函數重載和運算符重載來實現的。這一系列我將主要講解C++中有關運算符重載方面的內容。在每一個系列講解之前,都會有它的一些基礎知識需要我們去理解。而運算符重載的基礎就是運算符重載函數。所以今天主要講的是運算符重載函數。
  1.運算符重載是對已有的運算符賦予多重含義,使同一個運算符作用域不同類型的數據導致不同行為的發生。比如
2 int i1=10,i2=10;3 i=i1+i2;4 std::cout&&"i1+i2="&&i&&std::5 6 double7 double d1=20,d2=20;8 d=d1+d2;9 std::cout&&"d1+d2="&&d&&std::
在這個程序里"+"既完成兩個整形數的加法運算,又完成了雙精度型的加法運算。為什麼同一個運算符\"+"可以用於完成不同類型的數據的加法運算?這是因為C++針對預定義基本數據類型已經對"+"運算符做了適當的重載。在編譯程序編譯不同類型數據的加法表達式時,會自動調用相應類型的加法運算符重載函數。但是C++中所提供的預定義的基本數據類型畢竟是有限的,在解決一些實際的問題時,往往需要用戶自定義數據類型。比如高中數學裡所提到的複數:
Complex //複數類
2 { 3 public: 4 double//實數 5 double//虛數 6
Complex(double real=0,double imag=0) 7
{ 8 this-&real= 9 this-&imag=10
假如我們建立兩個複數,並用"+"運算符讓它們直接相加:
1 Complex com1(10,10),com2(20,20),2 sum=com1+com2;
那麼會提示沒有與這些操作數匹配的 "+" 運算符的錯誤。這是因為Complex類類型不是預定義類型,系統沒用對該類型的數據進行加法運算符函數的重載。C++就為運算符重載提供了一種方法,即運算符重載函數。其函數名字規定為operator後緊跟重載運算符。比如:operator+(),operator*()等。現在我們給上述程序聲明一個加法運算符的重載函數用於完成複數的加法運算:
1 #include "stdafx.h" 2 #include &iostream& 3
4 class Complex //複數類 5 { 6 public: 7 double//實數 8 double//虛數 9
Complex(double real=0,double imag=0)10
{11 this-&real=12 this-&imag=13
}14 };15 16 Complex operator+(Complex com1,Complex com2)//運算符重載函數17 {18 return Complex(com1.real+com2.real,com1.imag+com2.imag);19 }20 21 int main()22 {23
Complex com1(10,10),com2(20,20),24
sum=com1+com2;//或sum=operator+(com1,com2)25 26
std::cout&&"sum的實數部分為"&&sum.real&&std::27
std::cout&&"sum的虛數部分為"&&sum.imag&&"i"&&std::28 29 return0;30 }
在上述示例代碼中,調用運算符重載函數時,也可以以operator+(com1,com2)的形式來調用,實際上com1+com2在程序解釋時也是轉化成前者一樣的形式。但是直接用com1+com2的形式更加符合人的書寫習慣。
  2.上述示例中的運算符重載函數是不屬於任何的類,是全局的函數。因為在Complex類(複數類)中的數據成員是公有的性質,所以運算符重載函數可以訪問。但如果定義為私有的呢,那該怎麼辦。其實,在實際的運算符重載函數聲明當中,要不定義其為要操作類的成員函數或類的友元函數。
  (1)運算符重載函數作為類的友元函數的形式:
  class 類名
    friend 返回類型 operator運算符(形參表);
  類外定義格式:
  返回類型 operator運算符(參數表)
    函數體
友元函數重載雙目運算符(有兩個操作數,通常在運算符的左右兩則),參數表中的個數為兩個。若是重載單目運算符(只有一個操作數),則參數表中只有一參數。
i.友元函數重載雙目運算符(+):
1 #include "stdafx.h" 2 #include &iostream& 3
4 class Complex //複數類 5 { 6 private://私有 7 double//實數 8 double//虛數 9 public:10
Complex(double real=0,double imag=0)11
{12 this-&real=13 this-&imag=14
friend Complex operator+(Complex com1,Complex com2);//友元函數重載雙目運算符+16 void showSum();17 };18 19 20 Complex operator+(Complex com1,Complex com2)//友元運算符重載函數21 {22 return Complex(com1.real+com2.real,com1.imag+com2.imag);23 }24 25 void Complex::showSum()26 {27
std::cout&&28 if(imag&0)29
std::cout&&"+";30 if(imag!=0)31
std::cout&&imag&&"i"&&std::32 }33 34 int main()35 {36
Complex com1(10,10),com2(20,-20),37
sum=com1+com2;//或sum=operator+(com1,com2)38
sum.showSum();//輸出複數相加結果39 40 return0;41 }
ii.友元函數重載單目運算符(++):
1 #include "stdafx.h" 2 #include &iostream& 3
4 class Point//坐標類 5 { 6 private: 7 int 8 int 9 public:10
Point(int x,int y)11
{12 this-&x=x;13 this-&y=y;14
friend voidoperator++(Point& point);//友元函數重載單目運算符++16 void showPoint();17 };18 19 voidoperator++(Point& point)//友元運算符重載函數20 {21 ++point.x;22 ++point.y;23 }24 25 void Point::showPoint()26 {27
std::cout&&"("&&x&&","&&y&&")"&&std::28 }29 30 int main()31 {32
Point point(10,10);33 ++//或operator++(point)34
point.showPoint();//輸出坐標值35
36 return0;37 }
運算符重載函數可以返回任何類型,甚至是void,但通常返回類型都與它所操作的類類型一樣,這樣可以使運算符使用在複雜的表達式中。比如把上述雙目運算符重載函數示例代碼中main()主函數里的com1+com2改為com1+com2+com2,那麼結果又會不一樣了。像賦值運算符=、下標運算符[]、函數調用運算符()等是不能被定義為友元運算符重載函數。同一個運算符可以定義多個運算符重載函數來進行不同的操作。
  (2)運算符重載函數作為類的成員函數的形式:
  class 類名
    返回類型 operator 運算符(形參表);
   類外定義格式:
  返回類型 類名:: operator 運算符(形參表)
    函數體;
對於成員函數重載運算符而言,雙目運算符的參數表中僅有一個參數,而單目則無參數。同樣的是重載,為什麼和友元函數在參數的個數上會有所區別的。原因在於友元函數,沒有this指針。
i.成員函數重載雙目運算符(+):
1 #include "stdafx.h" 2 #include &iostream& 3
4 class Complex //複數類 5 { 6 private://私有 7 double//實數 8 double//虛數 9 public:10
Complex(double real=0,double imag=0)11
{12 this-&real=13 this-&imag=14
Complex operator+(Complex com1);//成員函數重載雙目運算符+16 void showSum();17 };18 19 20 Complex Complex::operator+(Complex com1)21 {22 return Complex(real+com1.real,imag+com1.imag);23 }24 25 void Complex::showSum()26 {27
std::cout&&28 if(imag&0)29
std::cout&&"+";30 if(imag!=0)31
std::cout&&imag&&"i"&&std::32 }33 34 35 int main()36 {37
Complex com1(10,10),com2(20,-20),38
sum=com1+com2;//或sum=com1.operator+(com2)39
sum.showSum();//輸出複數相加結果40 return0;41 }
對於雙目運算符而言,運算符重載函數的形參中僅為一個參數,它作為運算符的右操作數(如com2對象),而當前對象作為左操作數(如:上述中的com1對象),它是通過this指針隱含傳遞給成員運算符重載函數的。
ii.成員函數重載單目運算符(++):
1 #include "stdafx.h" 2 #include &iostream& 3
5 class Point//坐標類 6 { 7 private: 8 int 9 int10 public:11
Point(int x,int y)12
{13 this-&x=x;14 this-&y=y;15
}16 voidoperator++();//成員函數重載雙目運算符++17 void showPoint();18 };19 20 21 void Point::operator++()22 {23 ++x;24 ++y;25 }26 27 28 void Point::showPoint()29 {30
std::cout&&"("&&x&&","&&y&&")"&&std::31 }32 33 int main()34 {35
Point point(10,10);36 ++//或point.operator++()37
point.showPoint();//輸出坐標值38
39 return0;40 }
對於單目運算符而言,當前對象作為運算符的操作數。
  在運算符重載運用時應該注意以下幾個問題:(1)C++中只能對已有的C++運算符進行重載,不允許用戶自己定義新的運算符;(2)C++中絕大部分的運算符可重載,除了成員訪問運算符.,成員指針訪問運算符.*,作用域運算符::,長度運算符sizeof以及條件運算符?:;(3)重載後不能改變運算符的操作對象(操作數)的個數。如:"+"是實現兩個操作數的運算符,重載後仍然為雙目運算符;(4)重載不能改變運算符原有的優先順序;(5)重載不能改變運算符原有結合的特性。比如:z=x/y*a,執行時是先做左結合的運算x/y,重載後也是如此,不會變成先做右結合y*a;(6)運算符重載不能全部是C++中預定義的基本數據,這樣做的目的是為了防止用戶修改用於基本類型數據的運算符性質;(7)從上述的示例中可以看到雙目運算符可以被重載為友元函數也可以重載為成員函數,但有一種情況,只能使用友元函數,是什麼情況呢?我舉個例子: 
1 class Complex //複數類 2 { 3 private://私有 4 double//實數 5 double//虛數 6 public: 7
Complex(double real=0,double imag=0) 8
{ 9 this-&real=10 this-&imag=11
Complex operator+(int x);13 };14 15 Complex Complex::operator+(int x)16 {17 return Complex(real+x,imag);18 }19 20 int main()21 {22
Complex com1(5,10),23
total=com1+5;24 25 return0;26 }
如果我們把上述main()主函數實現部分里的total=com1+5改為total=5+com1;那麼程序就會報錯(沒有與這些操作數匹配的
"+" 運算符),因為左操作數5不是該複數類的對象,不能調用相應的成員函數Complex operator+(int x),所以編譯錯誤。但如果我們定義一下兩個友元函數就能解決上述的問題:
  friend Complex operator+(Complex com1,int
  friend Complex operator+(int x,Complex
  3.最後還是一樣,我將用一個示例來總結一下今天所講的內容(開發工具:vs2010): 
1 #include "stdafx.h"
2 #include &iostream&
4 class Complex //複數類
6 private://私有
7 double//實數
8 double//虛數
9 public: 10
Complex(double real=0,double imag=0) 11
{ 12 this-&real= 13 this-&imag= 14
Complex operator+(Complex com1);//成員函數重載雙目運算符+ 16 //或friend Complex operator+(Complex com1,Complex com2);//友元函數重載雙目運算符+ 17
friend Complex operator+(Complex com1,int x);//友元函數重載雙目運算符+ 18 //或Complex operator+(int x); 19
friend Complex operator+(int x,Complex com1);//友元函數重載雙目運算符+ 20 void showSum(); 21 }; 22
24 Complex Complex::operator+(Complex com1) 25 { 26 return Complex(real+com1.real,imag+com1.imag); 27 } 28
29 Complex operator+(Complex com1,int x)//左操作數類型為複數,右操作數的類型為整數 30 { 31 return Complex(com1.real+x,com1.imag); 32 } 33
34 Complex operator+(int x,Complex com1)//左操作數類型為整數,右操作數的類型為複數 35 { 36 return Complex(x+com1.real,com1.imag); 37 } 38
39 void Complex::showSum() 40 { 41
std::cout&& 42 if(imag&0) 43
std::cout&&"+"; 44 if(imag!=0) 45
std::cout&&imag&&"i"&&std:: 46 } 47
48 class Point//坐標類 49 { 50 private: 51 int 52 int 53 public: 54
Point(int x,int y) 55
{ 56 this-&x=x; 57 this-&y=y; 58
friend voidoperator++(Point& point);//友元函數重載單目運算符++ 60
Point operator++();//成員函數重載雙目運算符++ 61 void showPoint(); 62 }; 63
64 voidoperator++(Point& point)//友元運算符重載函數 65 { 66 ++point.x; 67 ++point.y; 68 } 69
70 Point Point::operator++() 71 { 72 ++x; 73 ++y; 74 return*this;//返回當前對象 75 } 76
78 void Point::showPoint() 79 { 80
std::cout&&"("&&x&&","&&y&&")"&&std:: 81 } 82
83 int main() 84 { 85 //兩個複數相加 86
std::cout&&"兩個複數相加:"&&std:: 87
Complex com1(10,10),com2(20,-20), 89
sum=com1+com2;//或sum=com1.operator+(com2) 90
std::cout&&"(10+10i)+(20-20i)="; 91
sum.showSum();//輸出複數相加結果 92
93 //三個複數相加 94
std::cout&&"三個複數相加:"&&std:: 95
sum=com1+com2+com2; 97
std::cout&&"(10+10i)+(20-20i)+(20-20i)="; 98
sum.showSum(); 99 100 //整數和複數相加101
std::cout&&"整數和複數相加:"&&std::102
Complex com3(5,10),104
total=com3+5;//或total=operator+(com1,5);105
std::cout&&"(5+10i)+5=";106
total.showSum();107 108
total=5+com3;//或total=operator+(5,com1);109 //只能用友元函數來重載運算符110
std::cout&&"5+(5+10i)=";111
total.showSum();112 113 //單目運算符++重載114
std::cout&&"單目運算符++重載:"&&std::115 116 //注意:下述實現部分不能只用一個++point會造成二義性117
Point point(10,10);118 //調用友元函數119 operator++(point);//或++point120
std::cout&&"調用友元函數:++(10,10)=";121
point.showPoint();//輸出坐標值122 123 //調用成員函數124
point=point.operator++();//或++125
std::cout&&"調用成員函數:++(10,10)=";126
point.showPoint();127 128 return0;129 }
原文地址:
【上篇】【下篇】当前位置: &
c++语法问题。不知道怎么改。我是新手
template&class_Fty_C_CLASS_ARG0&struct_RESULT_TYPE&false,_Fty_C_ARG0_ARG1&{//definereturntypeforUDTwithoutnestedtypenamedresult_type#if_NARGS==0typedefvoid_T#else/*_NARGS*/typedeftypename_Fty::templateresult&_Fty(_ARG0_ARG1)&::type_T#endif/*_NARGS*/};错误提示:错误8errorC2825:'_Fty':当后面跟“::”时必须为类或命名空间错误9errorC2903:“result”:符号既不是类模板也不是函数模板错误10errorC2039:“result”:不是“`globalnamespace'”的成员错误11errorC2143:语法错误:缺少“;”(在“&”的前面)错误12errorC2039:“type”:不是“`globalnamespace'”的成员错误13errorC2238:意外的标记位于“;”之前template&class_Fty_C_CLASS_FARG0&struct_RESULT_OF{//UDTstaticconstbool_Value=_HAS_RESULT_TYPE(_Fty);typedeftypename_RESULT_TYPE&_RESULT_OF&_Fty_C_FARG0_FARG1&::_Value,_Fty_C_FARG0_FARG1&::_Type_T};错误14errorC2039:“_Type”:不是“std::tr1::_Result_type2&__formal,_Fty,_Arg0,_Arg1&”的成员错误15errorC2146:语法错误:缺少“;”(在标识符“_Type”的前面)错误16errorC4430:缺少类型说明符-假定为int。注意:C++不支持默认int错误17errorC2602:“std::tr1::_Result_of2&_Fty,_Farg0,_Farg1&::_Type”不是“std::tr1::_Result_of2&_Fty,_Farg0,_Farg1&”基类的成员错误18errorC2868:“std::tr1::_Result_of2&_Fty,_Farg0,_Farg1&::_Type”:非法的using声明语法;应输入限定名if(bind(m_listen_sockfd,(structsockaddr*)&m_local_addr,sizeof(m_local_addr))==SOCKET_ERROR)returnMY_SOCKET_BIND_ERROR;错误19errorC2678:二进制“==”:没有找到接受“std::tr1::_Bind_fty&_Fty,_Ret,_BindN&”类型的左操作数的运算符(或没有可接受的转换)43IntelliSense:没有与这些操作数匹配的"=="运算符
通常是代码不全,或者编译参数不对造成的。这代码是全的。但是这些错误。不知道怎么转换。说详细点。大哥。我用的是VC2010&c++平台ocket的bind与function的bind冲突了...,只需要把调用socket的bind(xxxx)改成:::bind(xxx)即可!!
本站所有文章全部来源于互联网,版权归属于原作者。本站所有转载文章言论不代表本站观点,如是侵犯了原作者的权利请发邮件联系站长(),我们收到后立即调整或删除。
NativeRECTsRECT=newNativeRECT();//get屏幕RECTGetWindowRect(hWnd,outsRECT);问题1:该方法有时获去到的值是负数?求解答?ScreenToClient(hWnd,refxx);问题2:该方法获取到的值一直是0//结构体布局本机位置[StructLayout(LayoutKind.Sequential)]publicstructNat...
现在做到一个视频驱动二次开发的项目,视频服务平台的SDK是C#的,但是要集成到我们的平台是MFC架构的,一个是托管,一个是非托管,就牵涉到了一个非托管MFC调用托管C#的问题网上的方法多数是将C#封装成为COM,但是我在封装的时候遇到一个问题就是,我封装的这个COM要引用到视频SDK中的很多dll,但是这些dll是没有强命名的后来我在网上找到了给没有代码的dll强命名的方法——用指令先生成一个sn...
C++的原函数是unsignedchar__stdcallRC500USB_select(unsignedlongsnr,unsignedchar&size);VB调用DLL文件不会出现问题DeclareFunctionRC500USB_selectLib"RC500USB.dll"(ByValsnrAsLong,ByRefsizeAsByte)AsByte用C#我是这么调用的public...
我想用C++做界面,但是我不喜欢MFC,觉得那种添加代码的方式太不爽了,后来学习SDK,无奈效率太低。问一下前辈用c++写Windowsforms的程序,会不会存在什么问题?望指点。PS:大都是用C#写的。。。很不心安啊。
inti=0,j,k;j=(++i)+(++i)+(++i)+(++i);i=0;k=(i++)+(i++)+(i++)+(i++);i=0;i=(i++)+(i++)+(i++)+(i++);Console.WriteLine("j={0}",j);Console.WriteLine("k={0}",k);Console.WriteLine("i={0}",i);Console.ReadKey(...
1、SDK.H中有声明以下函数//回调typedefbool(CALLBACK*DataCallBack)(intindex,inttype,BYTE*pData,intlen,intparam1,intparam2);//设置回调DLL_EXPORTintWAPA_IPC_SetDataCallBack(DataCallBackfData);//连接摄像机DLL_EXPORTintWAPA_IP...
我用C++调用eigen做矩阵运算时候结果出现2.7E+308的错误voidCGet_DCB::Cal_Part_Nbb(MatrixXd&nbb1_,MatrixXd&nbb2_,MatrixXd&nbb3_,MatrixXd&w1_,MatrixXd&w2_){intstart_=num_obs[period-1],end_=num_obs[period...
extern"C"intPASCALEXPORTBack(intPort,charlpOutBuffer[],DWORDdwBytesWrite)像这样的C++的函数,我怎么在C#里引用声明。char应该是C#里的什么类型,DWORD应该是什么类型?谢谢。
现在我想调用C++写的win32DLL函数,输出字符串。DLL中的CPP函数:XXX_APIvoid__stdcallWriteString(wchar_t*content){std::cout&&}C#cs:[DllImport(@"...XXX",EntryPoint="WriteString")]externunsafestaticvoidWriteString(...
Dimobjasobjectobj=GetObject(Nothing,"CATIA.Application")用的时候我会在C++里定义个CATIA.Application*app=NULL;然后通过类似VB的GetObject的函数给app赋值C++里有GetObject或则CreateObject获得正在运行程序的函数吗?C++ 没有操作匹配的 运算符_百度知道
C++ 没有操作匹配的 运算符
我有更好的答案
你不会以为input是整数类型吧?if(!input.is_open()){&&&&//...}
采纳率:84%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。c++ 有多个运算符+与这些操作数匹配
c++ 有多个运算符+与这些操作数匹配
class vector1{
vector1(int size);
~vector1();
friend vector1 operator +(const vector1&c1,const vector1&c2);
friend vector1 operator -(const vector1&c1,const vector1&c2);
friend vector1 operator -(const vector1&c);
friend ostream& operator &&(ostream &out,const vector1&c);
friend istream &operator &&(istream &in,vector1&c);
vector1::vector1(int len){
if(len&=0) exit(0);
v=new T[len];
for(int i=0;i
vector1::~vector1(){
delete []v;
T &vector1::operator const{
return v[i];
vector1 operator +(const vector1&c1,const vector1&c2){
int len=c1.
vector1c3(len);
for(int i=0;i
c3[i]=c1[i]+c2[i];
return c3;
vector1 operator -(const vector1&c1,const vector1&c2){
int len=c1.
vector1c3(len);
for(int i=0;i
c3[i]=c1[i]-c2[i];
return c3;
vector1 operator -(const vector1&c){
int len1=c.
for(int i=0;i
c[i]=-c[i];
istream &operator &&(istream &in,vector1&c){
int len1=c.
for(int i=0;i
ostream& operator &&(ostream &out,const vector1&c){
int len1=c.
for(int i=0;i&len1;i++){
out&&c[i];
if(i&len1-1) out&&",";
out&&")"&&
int main()
vector1c1(10),c2(10),c4(10);
cin&&c1&&c2;
cout&&c1&&
应该是运算符重载的时候出错了。
解决方案二:
你重载了+,还在程序中进行加法运算C++这个提示错误看不懂(´・_・`)求解释。_百度知道
C++这个提示错误看不懂(´・_・`)求解释。
C++这个提示错误看不懂(´・_・`)求解释。错误 1 error C2679: 二进制“&&”: 没有找到接受“std::basic_string&char,std::char_traits&char&,std::allocator&char&&”类型的右操作数的运算符(或没有可接受的转换)
2 IntelliSense:
我有更好的答案
就是说 cout && string这种操作符不支持,没有定义过。没有定义过就不能这么输出运算符应该是定义的啊,看起来不正常,你这什么编译器啊?
采纳率:58%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 绝地求生匹配 的文章

 

随机推荐