1. 程式人生 > >對於c++中流操作符過載的理解

對於c++中流操作符過載的理解

對於IO成員函式的過載不應該是一個成員函式的方式,並且應該宣告為友元

一、如果為成員函式,都會有一個某人的引數,也就是this指標,為左運算元,下面考慮將其宣告為成員函式的方式

對於cout<<t<<endl cout為左運算元,說明cout本身有一個過載的操作符方法,這顯然是不可以的。

對於t<<cout;也是有問題的,因為更具<<的過載方式

ostream& operator<<(ostream& cout,const Test& t);

其中cout匹配左運算元,t匹配右運算元,在這裡cout就會與t匹配,而t與cout匹配,矛盾

二、應該是一個全域性的函式

因為本身全域性函式沒有this指標的問題,所以可以向正常的方式呼叫

cout<<t<<endl;

最終的實現為

test.h

#ifndef TEST
#define TEST
#include <iostream>

using namespace std;

class Test{
public:
	Test(int,int);
	ostream& operator<<(ostream&,const Test&);
private:
	int a;
	int b;
};

#endif

test.cpp

#include "test.h"

Test::Test(int a,int b){
	this->a=a;
	this->b=b;
}

ostream& operator<<(ostream& out,const Test& t){
	cout<<t.a<<" "<<t.b<<endl;
}

int main(){
	Test t(1,2);
	cout<<t<<endl;
	return 0;
}


相關推薦

對於c++中流操作符過載理解

對於IO成員函式的過載不應該是一個成員函式的方式,並且應該宣告為友元 一、如果為成員函式,都會有一個某人的引數,也就是this指標,為左運算元,下面考慮將其宣告為成員函式的方式 對於cout<<t<<endl cout為左運算元,說明cout本身有

C++的操作符過載

一、操作符標記和操作符函式 1、雙目操作符:L#R 成員函式形式:L.operator# (R) —— 左調右參 全域性函式形式:::operator#(L,R) —— 左一右二 2、單目操作符:#O/O# 成員函式形式:O.operator#() 全域性函式形式:::o

通俗理解C++ operator(過載操作符

如何理解operator(過載操作符)? operator是C++的過載操作符關鍵字,其作用就是對操作符重新定義,使其能夠適應其他不同資料型別的運算。 簡單點說,就是“+”本來是算數運算子,一般用於基本資料型別,但是想要運算使用者定義的資料型別class(在cl

C#中如何利用操作符過載和轉換操作符 (轉載)

操作符過載 有的程式語言允許一個型別定義操作符應該如何操作型別的例項,比如string型別和int型別都過載了(==)和(+)等操作符,當編譯器發現兩個int型別的例項使用+操作符的時候,編譯器會生成把兩個整數加到一起的程式碼。當編譯器發現兩個string型別的例項使用+操作符的時候,編譯器會生成把兩個

1、【C++】類&物件/建構函式/拷貝建構函式/操作符過載/解構函式

一、C++類 & 物件     C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。     類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在

C++筆記 第三十課 操作符過載的概念---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第三十課 操作符過載的概念 1.需要解決的問題 下面的複數解決方案是否可行? 30-1 複數的加法操作 #include <stdio.h> class

C++ 中指標操作符(*)過載備忘

下面程式碼可以編譯通過,從程式碼中可以看出只要過載了指定物件的指標操作符過載時,編譯器會自動轉成父類指標型別 class OverLoadObjABase { public: int x; }; class OverLoadObjA: public OverLoadObjABase {

對於c語言程式與設計的理解

對於電腦科學與技術這個學科來說,c和c++還有java都是其重要的語言基礎,在大一剛開始兩個多月對於c的學習,其中神奇之處深深的吸引了我,獨特的編譯方式引起了我的好奇心,也激起我想要征服這個學科的信念。我寫下這篇部落格來記錄我認為c語言學習要點和易錯點。  首先最先需要接觸和

c++實現日期類(class Date) 建構函式 拷貝構造 操作符過載(輸入輸出 比較操作 算數運算 自增自減)

註釋比較詳細,可以直接跑起來,直接上程式碼(vs2012 win7) 一、標頭檔案 /************** Date.h ***************/ #pragma once #include <iostream> using name

白話文說c++ 操作符過載

前言 c++操作符過載的背景主要是原有的操作符+ - += 等只能運算基本資料型別 int double這些,但是實際中我們經常遇到很多自定義的型別,比如複數 結構體等,比如要計算1+2i 與2+3i這兩個複數的和或者比大小,計算機就沒有直接的方法進行計算,這時候,運算子過載起到了很大的作用

C++ 操作符過載(小結 持續更新ing )(歡迎收藏)

操作符過載一個原則是:被操作的資料型別中 至少有一個是自定義的型別(使用class定義類),如果被操作的變數都是基本型別,那麼就不能定義操作符過載。 如果過載了new,則必須過載delete,因為系統知道了你自定義了怎麼new一個空間, 但是呢,你使用delete的時候,系統並

C++操作符過載總結operator(小結 更新ing)

#include <iostream> #include<string.h> #include<stdlib.h> using namespace std; /*操作符過載一個原則是:被操作的資料型別,至少有一個是自定義的型別, * 如果被操作的變數都是基本型別,那麼

C++學習筆記(七)--操作符過載 友元函式 類的繼承 訪問控釋protected

C++ Primer Plus的閱讀大概到這邊也就先暫時告一段落了(因為開學了!!) 然後近期找來了C++ Primer稍微翻了翻覺得確實寫得比Plus要好一些,而且加入了C++11的新特性,但是無論哪本書對於這些最基本的功能應用大抵也是差不多的,所以也沒覺得看的是Plu

C#建構函式、操作符過載以及自定義型別轉換

構造器   構造器(建構函式)是將型別的例項初始化的特殊方法。構造器可分為例項構造器和型別構造器,本節將詳細介紹有關內容。 例項構造器   顧名思義,例項構造器的作用就是對型別的例項進行初始化。如果類沒有顯示定義任何構造器,C#編譯器會定義一個預設的無參構造器。相反,如果類

<C++學習二十>C++中函式過載理解(未完待續)

摘要: 本篇部落格僅作為筆記,如有侵權,請聯絡,立即刪除(網上找部落格學習,然後手記筆記,因紙質筆記不便儲存,所以儲存到網路筆記)。   我們平時寫程式碼中會用到幾個函式但是他們的實現功能相同,但是有些細節卻不同。例如:交換兩個數的其中包括(int,float,char,double)這些型別。這C語言中我

c++友元實現操作符過載

運算子過載的本質是一個函式 #include <iostream> using namespace std; class A { private: int m_a; int m_b; friend A operator+

C# bool true, false 操作符過載,用在 if, while等語句中

// Definitely true operator. Returns true if the operand is True, false // otherwise. public static bool operator true(DBBool

c++拷貝建構函式和賦值操作符過載

c++拷貝建構函式: class A { A(const A& a); .... } 由於拷貝建構函式中,一般不允許對原物件進行修改,因此一般在引數中使用const關鍵字進行限制。 拷貝建構函式一般用於需要new記憶體等操作。如果不允許使用拷貝建

C++基礎】----操作符過載(03)

今天我們來討論操作符過載中比較重要的一個內容:賦值操作符的過載 1. 常量不允許出現在=左邊 由於編譯期對賦值有著嚴格的要求和限制,因此強制 operator=() 為成員函式。 成員函式的優點在於在呼叫時,永遠有一個隱式的this指標被呼叫,而反觀友元函式,我們可以將任何

c++操作符過載多檔案形式練習

Array.h#pragma once//標頭檔案中宣告的函式,編譯器會自動去各.cpp檔案去匹配物件的具體定義//標頭檔案中不能包含.cpp檔案,編譯時候會報錯誤,但可以包含其他的.h標頭檔案//標頭檔案中不能定義函式的具體內容,只可以宣告函式,但可以定義型別,如果型別裡包