程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++類結構函數詳解

c++類結構函數詳解

編輯:關於C++

c++類結構函數詳解。本站提示廣大學習愛好者:(c++類結構函數詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是c++類結構函數詳解正文



//1、 結構函數是干甚麼的

/*   類對象被創立時,編譯體系對象分派內存空間,並主動挪用該結構函數->由結構函數完成成員的初始化任務
     eg: Counter c1;

     編譯體系為對象c1的每一個數據成員(m_value)分派內存空間,並挪用結構函數Counter( )主動地初始化對象,初始化以後c1的m_value值設置為0

     故:結構函數的感化:初始化對象的數據成員。*/

      class Counter
       {
      public:       // 類Counter的結構函數,以類名作為函數名,無前往類型
      Counter(){
      m_value = 0;
      }

      private:
      int m_value;  // 類公有的數據成員
      }

 

//2、 結構函數的品種

#include <iostream>
using namespace std;

class Complex
{
private :
    double m_real;
    double m_imag;

public:

//*無參數結構函數

// 假如創立一個類你沒有寫任何結構函數,則體系會主動生成默許的無參結構函數,函數為空,甚麼都不做
// 只需你寫了一個上面的某一種結構函數,體系就不會再主動生成如許一個默許的結構函數,假如願望有一個如許的無參結構函數,則須要本身顯示地寫出來

    Complex(void)
    {   m_real = 0.0;
        m_imag = 0.0;
    }

//*普通結構函數(也稱重載結構函數)

//普通結構函數可以有各類參數情勢,一個類可以有多個普通結構函數,條件是參數的個數或許類型分歧(基於c++的重載函數道理)

//例如:你還可以寫一個 Complex(int num)的結構函數出來,創立對象時依據傳入的參數分歧挪用分歧的結構函數

    Complex(double real, double imag)
    {   m_real = real;
        m_imag = imag;
    }

//*復制結構函數(也稱為拷貝結構函數)

//復制結構函數參數為類對象自己的援用,用於依據一個已存在的對象復制出一個新的該類的對象,普通在函數中會將已存在對象的數據成員的值復制一份到新創立的對象中

//若沒有顯示的寫復制結構函數,則體系會默許創立一個復制結構函數,但當類中有指針成員時,由體系默許創立該復制結構函數會存在風險,詳細緣由在有關 “淺拷貝”、“深拷貝”的文章中闡述

    Complex(const Complex & c)
    {   // 將對象c中的數據成員值復制過去
        m_real = c.m_real;
        m_imag = c.m_imag;
    }

//*類型轉換結構函數,依據一個指定的類型的對象創立一個本類的對象,須要留意的一點是,這個其實就是普通的結構函數,然則關於湧現這類單參數的結構函數,C++會默許將參數對應的類型轉換為該類類型,

//有時刻這類隱私的轉換是我們所不想要的,所以須要應用explicit來限制這類轉換。

//例如:上面將依據一個double類型的對象創立了一個Complex對象

    Complex(double r)
    {   m_real = r;
        m_imag = 0.0;
    }

// 等號運算符重載(也叫賦值結構函數)

// 留意,這個相似復制結構函數,將=左邊的本類對象的值復制給等號右邊的對象,它不屬於結構函數,等號閣下雙方的對象必需曾經被創立。

// 若沒有顯示的寫 =運算符重載,則體系也會創立一個默許的=運算符重載,只做一些根本的拷貝任務

    Complex &operator=(const Complex &rhs )

    {   // 起首檢測等號左邊的能否就是右邊的對象自己,若是本對象自己,則直接前往
        if ( this == &rhs )
        {   return *this;
        }

        // 復制等號左邊的成員到右邊的對象中
        this->m_real = rhs.m_real;
        this->m_imag = rhs.m_imag;

        // 把等號右邊的對象再次傳出,目標是為了支撐連等 eg:a=b=c 體系起首運轉 b=c 然後運轉 a=(b=c的前往值,這裡應當是復制c值後的b對象)
        return *this;
    }
};

//3、應用下面界說的類對象來講明各個結構函數的用法:

int main()
{  
    // 挪用了無參結構函數,數據成員初值被賦值為0.0
    Complex c1,c2;

    // 挪用普通結構函數,數據成員初值分離被賦為指定值
    Complex c3(1.0,2.5);

    // 固然,也能夠應用上面的情勢
    // Complex c3 = Complex(1.0,2.5);

    //  把c3的數據成員的值賦值給事前被創立的對象c1
    //  因為c1曾經事前被創立,故此處不會挪用任何結構函數
    //  只會挪用 = 號運算符重載函數
    c1 = c3; 

    //  挪用類型轉換結構函數
    //  體系起首挪用類型轉換結構函數,將5.2創立為一個本類的暫時對象,然後挪用等號運算符重載,將該暫時對象賦值給c2
    c2 = 5.2; 

    // 挪用拷貝結構函數( 有上面兩種挪用方法)

    Complex c5(c3);
    Complex c4 = c3;

    // 留意和 =運算符重載的辨別,這裡等號右邊的對象不是事前曾經創立,故須要挪用拷貝結構函數,參數為c2
    // 這一點特殊主要,這兒是初始化,不是賦值。
    // 其實這兒就觸及了C++中的兩種初始化的方法:復制初始化和賦值初始化。
    // 個中c5采取的是復制初始化,而c4采取的是賦值初始化,這兩種方法都是要挪用拷貝結構函數的。

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved