亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

嵌入式C++開發詳解(六)

2019-11-08 02:00:15
字體:
來源:轉載
供稿:網友

運算符重載

一、友元機制

1.友元介紹

·友元是一種允許非類成員函數訪問類的非公有成員的一種機制

·可以把一個函數指定為類的友元,也可以把整個類指定為另一個類的友元。

   友元函數

   友元類

2.友元函數

·友元函數在類作用域外定義,但它需要在類體中進行說明

·為了與該類的成員函數加以區別,定義的方式是在類中用關鍵字friend說明該函數,格式如下:

      friend 類型  友元函數名(參數表)

友元的作用在于提高程序的運行效率

友元函數的注意事項:

·友元函數不是類的成員函數,在函數體中訪問對象的成員,必須用對象名加運算符“.”加對象成員名。但友元函數可以訪問類中的所有成員(公有的、私有的、保護的),一般函數只能訪問類中的公有成員。

·友元函數不受類中的訪問權限關鍵字限制,可以把它放在類的公有、私有、保護部分,但結果一樣。

·某類的友元函數的作用域并非該類作用域。如果連友元函數不是另一類的成員函數,則其作用域為另一類的作用域,否則與一般函數相同。

·友元函數破壞了面向對象程序類的封裝性,所有友元函數如不是為了必須使用則盡可能少用?;蛘哂闷渌侄伪Wo封裝性。

3.友元類

友元類的注意事項:

·友元關系是單向的

·友元關系不能被傳遞

·友元關系不能被繼承

代碼示例:

String.h;#ifndef _STRING_H_#define _STRING_H_ class String{public:    friend class StringTool;friend void PRint(const String &s1);  //友元函數String();String(char *str);~String();void Display();private:char *str_; };#endifString.cpp:#include <iostream>#include "String.h" using namespace std; String::String(){cout << "default constructor String!" << endl;}String::String(char *str){cout << "constructor String" << endl;int len = strlen(str) + 1;str_ = new char(len);memset(str_, 0, len);strcpy(str_, str);} String :: ~String(){cout << "destory String" << endl;} void String::Display(){cout << str_ << endl;} void print(const String& s1)//友元函數{cout << s1.str_ << endl;} StringTool.h:#ifndef _STRINGTOOL_H_#define _STRINGTOOL_H_#include "String.h" class StringTool{public:void mystrcat(String& s1, String& s);}; #endifStringTool.cpp:#include <iostream>#include <string.h>#include "StringTool.h" void StringTool::mystrcat(String &s1, String &s){strcat(s1.str_, s.str_);} main.c:#include <iostream>#include "String.h"#include "StringTool.h"using namespace std; int main(){String s1("hello");print(s1);//String s2("world");//StringTool st;//st.mystrcat(s1, s2);//調用友元類 return 0;}

運行結果:

二、運算符重載

1.運算符重載介紹

·運算符重載允許把標準運算符(如+、—、*、/、<、>等)應用于自定義數據類型的對象

運算符重載的作用:

·直觀自然,可以提高程序的可讀性

·體現了C++的可擴充性

·運算符重載僅僅只是為了語法上的方便,它是另一種函數調用方式

·運算符重載,本質上是函數重載

運算符重載的注意事項:

·不要濫用重載,本質上是函數重載

2.運算符重載的實現

(1)成員函數重載

  · 成員函數原型格式:

     函數類型 Operator 運算符(參數表);

  ·成員函數定義的格式:

     函數類型 類名 :: operator 運算符(參數表)

     {

         函數體;

     }

(2)友元函數重載

  ·友元函數原型的格式:

friend 函數類型 operator運算符(參數表);

  ·友元函數定義的格式:

函數類型 函數類型 類名::operator 運算符(參數表)

{

    函數體;

}

3.運算符重載規則

·運算符重載不允許發明新的運算符

·不能改變運算符操作對象的個數

·運算符被重載后,其優先級和結合性不會改變

·不能被重載的運算符

   作用域解析運算符 ::

   條件運算符   ?:

   直接成員訪問運算符   .

   類成員指針引用的運算符 .*

   sizeof運算符     sizeof

·成員函數重載和友元函數重載的選擇

  一般情況下,單目運算符最好重載為類的成員函數;雙目運算符則最好重載為類的友元函

  數

  以下一些雙目運算符不能重載為類的友元函數:= ()、[]、->

  類型轉換運算符只能以成員函數方式重載

  流運算符只能以友元的方式重載

 

4.++運算符的重載

(1)成員函數重載方式

(2)友元函數重載方式

代碼示例:

Integer.h:#ifndef _INTEGER_H_#define _INTEGER_H_ class Integer{public:    Integer();    Integer(int n);    ~Integer();    void Display() const;    Integer& operator++();    Integer operator++(int n);  //  friend Integer& operator++(Integer &i);   //友元函數重載方式  //  friend Integer operator++(Integer &i,int n);   //友元函數重載方式    operator int();private:    int n_;};#endif Integer.cpp:#include "Integer.h"#include <iostream> using namespace std; Integer :: Integer(){ } Integer :: Integer(int n) : n_(n){ } Integer :: ~Integer(){ } void Integer :: Display() const{    cout << n_ << endl;} Integer& Integer :: operator++(){    cout << "++i" << endl;     ++n_;     return *this;}Integer Integer :: operator++(int n){    cout << "i++" << endl;     Integer tmp(n_);     n_++;     return tmp;} #if 0 Integer& operator++(Integer& i){    cout << "friend ++i" << endl;    ++i.n_;     return i;} Integer operator++(Integer& i,int n){    cout << "friend i++" << endl;     Integer temp(i.n_);    i.n_++;    return temp;} #endif Integer :: operator int(){    return n_;} Main.c:#include "Integer.h"#include <iostream> using namespace std; Integer :: Integer(){ } Integer :: Integer(int n) : n_(n){ } Integer :: ~Integer(){ } void Integer :: Display() const{    cout << n_ << endl;} Integer& Integer :: operator++(){    cout << "++i" << endl;     ++n_;     return *this;}Integer Integer :: operator++(int n){    cout << "i++" << endl;     Integer tmp(n_);     n_++;     return tmp;} #if 0 Integer& operator++(Integer& i){    cout << "friend ++i" << endl;    ++i.n_;     return i;} Integer operator++(Integer& i,int n){    cout << "friend i++" << endl;     Integer temp(i.n_);    i.n_++;    return temp;} #endif Integer :: operator int(){    return n_;} 

運行結果請自行實踐~

 

5.!運算符重載

成員函數原型:

   bool operator!() const;

成員函數定義:

   bool String :: operator!()  const

   {

       return strlen(str_)  ! = 0;

   }

6.賦值運算符重載

成員函數原型:

String& operator = (const String& other);

成員函數定義:

String& String :: operator = (const String& other)

{

    if(this == &other)

    {

        return * this;

    }

 

    int len = strlen(other.str_) + 1;

 

    delete[] str_;

 

    str_  = new char[len];

    memset(str_,0,len);

    strcpy(str_,other.str_);

}

 

7.[]運算符重載

成員函數原型:

(1)char& operator[](unsigned int index);

(2)const char& operator[](unsigned int index) const;

成員函數定義:

(1)char& String :: operator[](unsigned int index)

{

    cout << "no const" << endl;

 

    //return str_[index];

    return const_cast<char&>(static_cast<const String&>(*this)[index]);

}

 

(2)const char& String :: operator[](unsigned int index) const

{

    cout << "const[]" << endl;

 

    return str_[index];

}

8.+運算符重載

成員函數原型:

friend String operator+(const String &s1,const String &s2);

成員函數定義:

String operator+(const String& s1,const String& s2)

{

#if 0

    int len = strlen(s1.str_) + strlen(s2.str_) + 1;

    char * newstr = new char[len];

    memset(newstr,0,len);

    strcpy(newstr,s1.str_);

    strcat(newstr,s2.str_);

    String temp(newstr);

 

    delete newstr;

#endif     //實現+=后可以直接使用下面幾行代碼

 

    String temp(s1);

    temp += s2;

 

    return temp;

 

}

9.+=運算符重載

成員函數原型:

String& operator+=(const String& other);

成員函數定義:

String& String :: operator+=(const String& other)

{

    int len = strlen(str_) + strlen(other.str_) + 1;

    char * newstr = new char[len];

    memset(newstr,0,len);

    strcpy(newstr,str_);

    strcat(newstr,other.str_);

    delete[] str_;

    str_ = newstr;

 

    return * this;

}

10.流運算符重載

·為什么一定要使用友元函數進行重載?

如果是重載雙目操作符(即為類的成員函數),就只要設置一個參數作為右側運算量,而左側運算量就是對象本身

而 >> 或<<左側運算量是 cin或cout而不是對象本身,所以不滿足后面一點,就只能申明為友元函數了

成員函數原型:

(1)friend ostream& operator<<(ostream& out,const String& s);

(2)friend istream& operator>>(istream& in,String& s);

成員函數定義:

(1)ostream& operator<<(ostream& out,const String& s)

{

    out << s.str_;

 

    return out;

}

 

(2)istream& operator>>(istream& in,String& s)

{

    char buffer[1024];

    in >> buffer;

    int len  = strlen(buffer) + 1;

    delete[] s.str_;

    s.str_ = new char[len];

 

    strcpy(s.str_,buffer);

 

    return in;

}

11.類型轉換運算符重載

·必須是成員函數,不能是友元函數

·沒有參數(操作數是什么?)

·不能指定返回類型(其實已經指定了)

·函數原型:operator 類型名();

Integer :: operator int()

{

    return n_;

}

 

int main(void)

{

Integer n(100);

n = 200;

n.Display();

 

int sum = add(n,100);

cout << sum << endl;

 

int x = n;

int v = static cast<int>(n);

 

return 0;

}

12.->運算符重載

#include <iostream>

using namespace std;

 

class DBHelper

{

public:

  DBHelper()

  {

   cout<<"DB ..."<<endl;

  }

  ~DBHelper()

  {

   cout<<"~DB ..."<<endl;

  }

 

  void Open()

  {

   cout<<"Open ..."<<endl;

  }

 

  void Close()

  {

   cout<<"Close ..."<<endl;

  }

 

  void Query()

  {

   cout<<"Query ..."<<endl;

  }

};

 

class DB

{

public:

  DB()

  {

   db_ = new DBHelper;

  }

 

  ~DB()

  {

   delete db_;

  }

 

  DBHelper* operator->()

  {

   return db_;

  }

private:

  DBHelper* db_;

};

 

 

int main(void)

{

  DB db;

  db->Open();

  db->Query();

  db->Close();

  return 0;

}

13.new/delete

(1)operator new

(1) 只分配所要求的空間,不調用相關對象的構造函數。當無法滿足所要求分配的空間時,則 ->如果有new_handler,則調用new_handler,否則

  ->如果沒要求不拋出異常(以nothrow參數表達),則執行bad_alloc異常,否則

 ->返回0

(2) 可以被重載

(3) 重載時,返回類型必須聲明為void*

(4) 重載時,第一個參數類型必須為表達要求分配空間的大?。ㄗ止潱?,類型為size_t

(5) 重載時,可以帶其它參數

void * operator new(size_t size)

{

cout <<“void * operator new(size_t size size)” << endl;

void *p = malloc(size);

return p;

}

void operator delete(void *p)

{

cout <<“void operator delete(void *p)” << endl;

free(p);

}

(2)new operator

new operator 

(1)調用operator new分配足夠的空間,并調用相關對象的構造函數 

(2)不可以被重載

(3)placement new(不分配內存+構造函數的調用)


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美乱大交xxxxx另类电影| 亚洲一区二区三区乱码aⅴ| 亚洲理论电影网| 久久亚洲一区二区三区四区五区高| 欧美精品久久久久久久久| 欧美风情在线观看| 午夜精品一区二区三区av| 一区二区三区国产在线观看| 中文字幕久久精品| 亚洲热线99精品视频| 欧美在线激情网| 亚洲一区二区久久久| 久久精品成人欧美大片古装| 国产亚洲欧美一区| 中文精品99久久国产香蕉| 都市激情亚洲色图| 色与欲影视天天看综合网| 中日韩午夜理伦电影免费| 精品人伦一区二区三区蜜桃免费| 中文字幕久热精品在线视频| 伦理中文字幕亚洲| 日韩av123| 亚洲欧美日韩在线一区| 国产剧情日韩欧美| 国产精品入口尤物| 国产免费观看久久黄| 久久免费高清视频| 亚洲天堂av在线播放| 亚洲伊人成综合成人网| 中文字幕在线成人| 高清一区二区三区日本久| 日韩中文字幕在线观看| 日韩中文字幕国产精品| 国产精品久久久精品| 97视频在线观看免费高清完整版在线观看| 青青a在线精品免费观看| 国产精品综合不卡av| 97在线免费观看视频| 亚洲国产精品va在线看黑人动漫| 在线观看日韩www视频免费| 欧美老妇交乱视频| 久久亚洲精品视频| 国产成人久久久| 91久久久亚洲精品| 国产精品久久久久久久久影视| 国内成人精品一区| 97香蕉久久夜色精品国产| 91精品国产成人www| 综合网日日天干夜夜久久| 精品日本高清在线播放| 欧美日韩一区二区三区| 久久综合久中文字幕青草| 57pao成人国产永久免费| 91在线国产电影| 2019中文字幕全在线观看| 国产在线拍揄自揄视频不卡99| 亚洲欧美一区二区三区情侣bbw| 国内精品400部情侣激情| 国产91精品久久久| 97色在线观看| 久久中文字幕视频| 日韩精品一区二区三区第95| 久久久精品一区| 岛国av一区二区在线在线观看| 国产激情999| 欧美一区二区三区艳史| 亚洲欧洲日韩国产| 中文字幕日韩电影| 精品久久久久久久久久久| 亚洲精品日韩久久久| 美日韩在线视频| 91精品久久久久久久久| 久久视频免费观看| xvideos亚洲| 日韩美女视频中文字幕| 亚洲国产精品资源| 国产一区二区三区直播精品电影| 亚洲男人第一av网站| 伦伦影院午夜日韩欧美限制| 久久精品国产2020观看福利| 97成人在线视频| 久久福利视频导航| 久久久亚洲成人| 亚洲福利影片在线| 久久久爽爽爽美女图片| 日韩高清电影好看的电视剧电影| 中文字幕日韩精品在线| 欧美乱妇高清无乱码| 欧美大秀在线观看| 91欧美激情另类亚洲| 精品国产拍在线观看| 欧美亚洲第一区| 一区二区三区四区在线观看视频| 97不卡在线视频| 自拍偷拍亚洲在线| 国产成人精品久久二区二区91| 91精品国产高清自在线| 亚洲第一区在线| 亚洲国产成人精品一区二区| 欧美日韩免费在线观看| 欧美在线亚洲在线| 中文字幕精品久久| 97视频在线观看成人| 日韩精品在线私人| 一区国产精品视频| 爱福利视频一区| 成人av在线亚洲| 91久久精品视频| 国产99视频精品免视看7| 宅男66日本亚洲欧美视频| 在线观看国产精品日韩av| 国产精品视频自拍| 欧美一性一乱一交一视频| 精品视频—区二区三区免费| 日本伊人精品一区二区三区介绍| 岛国av午夜精品| www.欧美精品一二三区| 成人网页在线免费观看| 国产精品视频在线观看| 欧美—级a级欧美特级ar全黄| 久久久免费高清电视剧观看| 伊人亚洲福利一区二区三区| 亚洲丁香婷深爱综合| 国产在线视频一区| 欧美肥老太性生活视频| 亚洲国产天堂久久国产91| 亚洲精品视频网上网址在线观看| 亚洲成人黄色在线| 97在线看免费观看视频在线观看| 国产精品久久久999| 欧美黑人视频一区| 亚洲欧美日韩网| 日韩av在线免费看| 欧美麻豆久久久久久中文| 国产精品国产三级国产aⅴ浪潮| 亚洲性视频网站| 欧美丰满老妇厨房牲生活| www.亚洲人.com| 日韩在线免费高清视频| 日韩欧美在线视频日韩欧美在线视频| 欧美日韩国产激情| 2020欧美日韩在线视频| www.国产精品一二区| 色偷偷88888欧美精品久久久| 久久久视频在线| 国产精品视频自在线| 久久久久久九九九| 日本欧美精品在线| 日韩亚洲欧美中文在线| 精品久久久久久久久久ntr影视| 亚洲午夜久久久久久久| 国产精品美腿一区在线看| 国产精品亚发布| 久久精品视频在线观看| 欧美夫妻性生活视频| 欧美精品www在线观看| 国产精品视频男人的天堂| 91系列在线播放| 国产精品流白浆视频| 日韩中文字幕精品| 国产成人97精品免费看片| 亚洲成年人影院在线| 成人精品视频久久久久| 亚洲欧美国产精品va在线观看|