首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 友元函數與拷貝構造函數深度解析

     編輯:C++ 入門

一、友元函數

定義與特點

  • 定義在類外部的普通函數,在類內用 friend 聲明
  • 不是成員函數,無 this 指針,不能用對象調用(直接調用)
  • 可訪問類的 private/protected/public 所有成員,但必須通過對象/引用/指針

聲明語法

class Point {
    double x, y;
public:
    friend double distance(Point, Point); // 僅聲明,加 friend
};

實現示例

double distance(Point my1, Point my2) {
    return sqrt((my1.x-my2.x)*(my1.x-my2.x) + (my1.y-my2.y)*(my1.y-my2.y));
    // 直接訪問私有成員 x,y
}

限制

  • 定義時不加 friend
  • main 不能聲明為友元(只能被調用,不能調用他人)

二、拷貝構造函數

定義與調用時機

  • 同名無返回值,單參數為 const 類名&(引用,避免無限遞歸)
  • 調用場景:T obj2 = obj1;(初始化)、按值傳參、按值返回對象
  • 賦值 obj2 = obj1; 調用拷貝賦值運算符,非拷貝構造

聲明形式

class Point {
    int x, y;
public:
    Point(Point &pf) { x = pf.x; y = pf.y; } // 類內可省略 類名::
    // 或推薦 const 版本
    Point(const Point &pf) { *this = pf; }
};

const 正確性

  • 無 const 時,pf.x = 8 合法但危險(修改源對象)
  • 加 const 後,嘗試修改編譯報錯,保證源對象不變
  • 引用參數生命週期隨函數結束自動釋放,無需手動管理

系統默認行為

若未顯式定義,編譯器自動生成公有的逐成員拷貝構造(淺拷貝)。含指針/資源管理類必須自定義深拷貝。

總結對比

特性友元函數拷貝構造函數
屬於類成員否是
訪問私有成員是(需對象)是(隱含 this)
調用方式直接調用隱式/顯式初始化
典型用途運算符重載、跨類協作對象複製、資源管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved