目錄
前言
成員函數返回this指向的對象本身時,為什是返回引用類型?
成員函數返回this對象本身時,內部通常會通過拷貝構造函數來創建一個臨時對象?
總結
前言
c++通過提供特殊的對象指針,this指針 指向被調用的成員函數所屬的對象
- this指針是隱含每一個非靜態成員函數內的一種指針
- this指針不需要定義,直接使用即可
- 當形參和成員變量同名時,可用this指針來區分
- 在類的非靜態成員函數中返回對象本身,可使用return *this
成員函數返回this指向的對象本身時,為什是返回引用類型?
? ? ? ? 類似于 &b=a,修改b同時就是修改a,完全可以把b當做a,b就是a本身,但是如果返回的不是引用,就是 b=a,那就是創造一個新的變量。不能把b當做a用,所以類型去掉引用返回的不是b本身,而是b的副本
? ? ? ? 當你直接返回一個 Person 對象時,每次調用 PersonAddPerson 函數都會創建一個新的 Person 對象。這是因為函數返回的是一個臨時對象(即在函數內部創建的),而不是原對象本身。
? ? ? ? 在 C++ 中,函數的返回值通常會通過拷貝構造函數(copy constructor)或移動構造函數(move constructor)生成一個臨時對象。這樣做是為了保證函數返回的對象是有效的且能夠被使用。
? ? ? ? 因此,如果 PersonAddPerson 函數直接返回一個新創建的 Person 對象,每次調用函數時都會生成一個臨時對象。這樣的設計可能會引入額外的資源開銷,包括內存分配和對象構造等。
? ? ? ? 如果你希望在原對象上進行修改而不是返回新對象,你可以使用引用類型作為函數的返回類型。通過返回引用類型,函數可以直接操作并修改原對象。這樣可以避免創建新對象和資源開銷。
#include <iostream>
using namespace std;class Person
{
public:Person(int age){// 1、當形參和成員變量同名時,可用this指針來區分this->age = age; // this->成員,類似結構體指針訪問成員}Person& PersonAddPerson(Person p){this->age += p.age;return *this; // 返回對象本身}int age;
};void test01()
{Person p1(10);cout << "p1.age = " << p1.age << endl; // 10Person p2(10);/* 鏈式調用,第一次得到20,返回p2本身,再繼續調用,最終加兩次得到40(如果返回的是Person類型,這里得到的是20)*/p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);cout << "p2.age = " << p2.age << endl; // 40
}int main() {test01();return 0;
}
成員函數返回this對象本身時,內部通常會通過拷貝構造函數來創建一個臨時對象?
????????當一個函數返回一個對象時,編譯器會使用拷貝構造函數來生成該返回對象的副本。拷貝構造函數是一個特殊的類成員函數,用于將一個對象的數據成員的值復制到另一個對象中。
假設我們有一個簡單的類 Person,具有一個 name 字符串成員變量:
class Person {public:std::string name;Person(const std::string& n) : name(n) {}// 拷貝構造函數Person(const Person& other) : name(other.name) {}};// 現在,我們有一個函數 getPerson(),它返回一個 Person 對象:Person getPerson() {Person p("Alice");return p;}
? ? ? ? 在這個例子中,當 getPerson() 函數被調用時,它會創建一個 Person 對象 p,并將其初始化為 "Alice"。然后,函數將返回 p。
? ? ? ? 在返回的過程中,編譯器會使用拷貝構造函數來生成返回對象 p 的副本。這意味著在調用 getPerson() 后,將會創建一個新的 Person 對象,其中的 name 字符串值被復制為 "Alice"。這是因為我們不能直接返回函數內部的局部對象 p,因為它是在函數結束后將被銷毀的。
? ? ? ? 因此,拷貝構造函數在這里的作用是在函數返回對象時,根據已有對象的值創建一個新的對象,確保返回的對象是有效且具有正確的值。
總結
this指針是一個特殊的指針,用于訪問當前對象的成員。它提供了一種便捷的方式來引用當前對象的成員變量和成員函數,并解決名稱沖突的問題。