標籤:

C++重載運算符的調用者是誰?

C++重載運算符的調用者是誰,假如調用者是重載對象的話,A a = b;這個語句,C++構造函數沒有返回值,那A a就沒有返回東西,這個賦值運算符的調用者是誰啊,

再比如說cout &<&< a,a的頭文件里重載了&<&<作為全局函數,那使用時它的調用者是誰,cout還是a?


調用者從來都是語句所處的當前函數啊,什麼時候成對象了

成員函數的調用者也是當前函數啊

main的調用者是操作系統啊,操作系統也是跑了一個「廣義的」函數來調用你的main的啊

怕你繞不過來

int main()
{
printf("hello world");
}

printf的調用者是main

int main()
{
std::vector& a;
a.push_back(1);
}

vector::push_back的調用者是main

void foo()
{
std::cout &<&< "hello world"; } int main() { foo(); }

重載operator&<&<的調用者是foo,foo的調用者是main


A a = b; 調用的不是operator=(),所以你的問題不成立

全局的operator&<&<有兩個參數,沒有this指針,不存在調用者——其實C++根本就沒有調用者這個概念,我假設你要問的是this指針是誰。


C++的對象方法調用,沒有太多特別之處。

class Fucker
{
void fuck(int target, float time);
}

基本上就是:

struct Fucker;
void fucker_fuck(Fucker* this, int target, float time);

當然,實際上還是有一些區別的,比如this call什麼的,不過現階段對你不重要。

而重載運算符,只不過是名字有些鬼畜的函數而已,和普通的全局函數/成員函數沒有什麼實質的區別。比如這兩個函數:

Fucker operator + (const Fucker a, const Fucker b);
Fucker deep_dark_fantasy(const Fucker a, const Fucker b);

並沒有什麼實質的區別,無非是C++硬點前一個函數可以以a+b的形式被調用,語法糖而已。

於是,整件事情的「調用者」,基本上沒什麼值得深究的問題。


A a = b;

調用構造函數A::A(const A b)

cout &<&< a;

調用朋元函數std::ostream operator&<&<(std::ostream os, const A a)


謝邀

------

A a=b是調用了C++默認生成的一個重載的"=",就是簡單的吧b中的值複製到a中

假想代碼大概是這樣(不知道對不對,歡迎指正)

A operator=(const A x)
{
//複製
return A;
}

即=運算符調用a和b做了複製值並返回了一個類a的引用

---

經大佬 @vczh 提醒,確實不對,補張圖吧

是調用了默認的拷貝構造函數

A(const A a )

&<&<的重載是這樣的

ostream operator&<&<(ostream cout,const Point a) { cout&<&

即&<&<調用輸出流(類對象cout)和p,合併成一個輸出流之後返回這個輸出流

舉個例子:

cout&<&<"Hello "&<&<""world"&<&

"world"&<&

"Hello "&<&

cout&<&

這樣應該就比較清楚了

同時也會想到如果數據較多的話,速度會比較慢


大兄弟,建議你把輪子哥@vech 開過光的C++ Primer 5th 從第七章類開始看。這個問題你就完全明白了.


A a = b; 調用的不是運算符重載,而是 A 的複製構造函數。

cout&<&「調用者」意思不明,請釐清調用者的意思。


在win32下面,就是傳參時寄存器ecx的值 this


推薦閱讀:

C++中int A::*a里的指針a是什麼?
為什麼使用virtual關鍵字在C++與C#會出現不同的效果?求解答。
【C語言】關於C裡面數組批量初始化?
知乎上看到一些人評價c++的exception很難用,想問一下大家寫c++時怎麼處理錯誤?

TAG:CC |