一妥衣、友元(friend)
所謂友元幽钢,就是給別人開權(quán)限用的赎婚,允許自己的朋友來訪問自己類中所有權(quán)限下的成員康辑,包括私有成員
友元包括友元函數(shù)和友元類
1.1 友元函數(shù)
1> 普通的類的非成員函數(shù),是無權(quán)訪問類中的受保護(hù)成員以及私有成員的郑趁,但是刊驴,將一個函數(shù)設(shè)置成友元函數(shù),那么該函數(shù)可以訪問該類中的所有權(quán)限下的成員寡润,
2> 友元函數(shù)分為全局函數(shù)作為友元函數(shù)和其他類的成員函數(shù)作為友元函數(shù)
3> 全局函數(shù)作為友元函數(shù)格式:在類內(nèi)進(jìn)行全局函數(shù)的聲明:friend? 函數(shù)頭捆憎;
#include <iostream>
using namespace std;
class Stu;? ? ? ? ? ? //對類的前置聲明
void fun(Stu &s);? ? ? ? ? ? //將函數(shù)進(jìn)行前置聲明
class Stu
{
private:
? ? string name;
? ? int age;
? ? double score;
public:
? ? Stu() {}
? ? Stu(string n, int a, double s):name(n),age(a),score(s) {}
? ? //類中的成員函數(shù),可以直接使用所有權(quán)限下的成員
? ? void show()
? ? {
? ? ? ? cout<<"name = "<<name<<"? age = "<<age<<"? score = "<<score<<endl;
? ? }
? ? //將全局函數(shù)聲明成友元函數(shù),那么該全局函數(shù)可以訪問該類中的所有權(quán)限下的成員
? ? friend void fun(Stu &s);
};
//定義一個全局函數(shù)
void fun(Stu &s)
{
? ? cout<<"name = "<<s.name<<"? age = "<<s.age<<"? score = "<<s.score<<endl;
}
int main()
{
? ? Stu s("zhangpp", 18, 90);
? ? fun(s);
? ? return 0;
}
練習(xí):定義一個貓類(Cat)和一個狗類(Dog)梭纹,分別有私有成員:個數(shù)(count)躲惰、重量(wight)
成員函數(shù):有參構(gòu)造
分別實例化一個貓的對象和狗的對象,調(diào)用一個全局函數(shù)变抽,在全局函數(shù)中础拨,輸出貓和狗的總個數(shù)和總重量
#include <iostream>
using namespace std;
class Dog;? ? ? ? ? ? //將類進(jìn)行前置聲明
class Cat
{
private:
? ? int count;
? ? double weight;
public:
? ? Cat(int a,double b):count(a),weight(b)
? ? {
? ? ? ? cout<<"有參構(gòu)造"<<endl;
? ? }
? ? friend void fun(Cat &c,Dog &d);? ? ? ? ? ? //將全局函數(shù)設(shè)置成友元函數(shù)
};
class Dog
{
private:
? ? int count;
? ? double weight;
public:
? ? Dog(int a,double b):count(a),weight(b)
? ? {
? ? ? ? cout<<"有參構(gòu)造"<<endl;
? ? }
? ? friend void fun(Cat &c,Dog &d);
};
//定義全局函數(shù),由于是友元函數(shù)绍载,可以調(diào)用類中的私有屬性
void fun(Cat &c,Dog &d)
{
? ? cout<<"總個數(shù)wei:"<<c.count+d.count<<endl;
? ? cout<<"總重量為:"<<c.weight+d.weight<<endl;
}
int main()
{
? ? Cat c(2,5.2);
? ? Dog d(2,9.3);
? ? fun(c,d);
? ? return 0;
}
4> 其他類的成員函數(shù)作為友元函數(shù)诡宗,聲明格式:friend 其他類::函數(shù)名(形參列表);
1.2 友元類
將一個類聲明成友元類,那么就運行這個類中的所有成員函數(shù)來訪問自己類中的私有成員了
#include <iostream>
using namespace std;
class Stu;? ? ? ? ? ? //對類的前置聲明
void fun(Stu &s);? ? ? ? ? ? //將函數(shù)進(jìn)行前置聲明
class Teacher
{
private:
? ? string name;
? ? string subject;? ? ? ? ? //科目
public:
? ? Teacher() {}
? ? Teacher(string n, string s):name(n), subject(s) {}
? ? void display(Stu &s);? ? ? ? ? ? //類內(nèi)聲明击儡,類外定義
};
class Stu
{
private:
? ? string name;
? ? int age;
? ? double score;
public:
? ? Stu() {}
? ? Stu(string n, int a, double s):name(n),age(a),score(s) {}
? ? //類中的成員函數(shù)塔沃,可以直接使用所有權(quán)限下的成員
? ? void show()
? ? {
? ? ? ? cout<<"name = "<<name<<"? age = "<<age<<"? score = "<<score<<endl;
? ? }
? ? //將全局函數(shù)聲明成友元函數(shù),那么該全局函數(shù)可以訪問該類中的所有權(quán)限下的成員
? ? friend void fun(Stu &s);
? ? //將老師類中的成員函數(shù)設(shè)置成友元函數(shù)
? ? //friend void Teacher::display(Stu &s);
? ? //將整個老師類都聲明成友元類
? ? friend class Teacher;
};
//定義一個全局函數(shù)
void fun(Stu &s)
{
? ? cout<<"name = "<<s.name<<"? age = "<<s.age<<"? score = "<<s.score<<endl;
}
//將老師類中的成員函數(shù)類外定義
void Teacher::display(Stu &s)
{
? ? cout<<"my_name = "<<name<<endl;
? ? cout<<"my_subject = "<<subject<<endl;
? ? cout<<"stu_name = "<<s.name<<endl;
}
int main()
{
? ? Stu s("zhangpp", 18, 90);
? ? fun(s);
? ? Teacher t("zhansan", "C++");
? ? t.display(s);
? ? return 0;
}
1.3 友元的總結(jié)
1> 友元是單向的,A將B設(shè)置成友元阳谍,則A允許B訪問自己的成員蛀柴,而B不一定允許A訪問其成員
2> 友元不具有傳遞性:A是B的朋友,B是C的朋友边坤,那么A不一定是C的朋友
3> 友元不具有繼承性:父類的朋友不一定是子類的朋友
4> 友元破壞了類的封裝性名扛,使得訪問權(quán)限形同虛設(shè),所以不在萬不得已的情況下茧痒,盡可能不使用友元
5> 必須使用友元的情況:插入和提取運算符重載時肮韧,需要使用全局函數(shù)作為友元函數(shù)(后面講)
二、常成員(const)
程序員有時在是定義類中的函數(shù)或者定義類對象時旺订,需要對成員變量進(jìn)行相關(guān)保護(hù)弄企,讓其在該調(diào)用中不被修改,那么就引入的常成員函數(shù)和常對象
2.1 常成員函數(shù)
1> 在定義成員函數(shù)后区拳,加關(guān)鍵字const拘领,那么該函數(shù)就是常成員函數(shù)
2> 在常成員函數(shù)中,不能修改成員變量的值樱调,保護(hù)成員變量不被修改约素,但是可以使用成員變量
3> 常成員函數(shù)和同名的非常成員函數(shù)届良,即使參數(shù)種類和個數(shù)等同,也構(gòu)成重載關(guān)系圣猎,原因是this指針的類型不同
非常成員函數(shù)中this:? 類名? * const this;
常成員函數(shù)中this:const 類名? * const this;
4> 非常對象士葫,調(diào)用成員函數(shù)時,優(yōu)先調(diào)用非常成員函數(shù)送悔,如果沒有非常成員函數(shù)慢显,那么就調(diào)用同名的常成員函數(shù)
2.2 常對象
1> 定義對象時,加關(guān)鍵字const: const 類名 對象名欠啤;
2> 常對象只能調(diào)用常成員函數(shù)荚藻,不能調(diào)用非常成員函數(shù)
2.3 mutable關(guān)鍵字
該關(guān)鍵字可以修飾類中的成員變量,表示該變量可以在成員函數(shù)中被修改
#include <iostream>
using namespace std;
class Stu
{
private:
? ? string name;
? ? mutable int age;? ? ? ? ? ? //由mutable修飾的成員變量洁段,可以在常成員函數(shù)中被修改
? ? double score;
public:
? ? Stu() {}
? ? Stu(string n, int a, double s):name(n),age(a),score(s) {}
? ? //類中的成員函數(shù)应狱,可以直接使用所有權(quán)限下的成員
? ? void show()const? ? ? ? ? ? //this原型:const 類名? * const this;
? ? {
? ? ? ? //this->score = 100;? ? ? ? ? ? ? //更改成員變量的值
? ? ? ? this->age = 16;? ? ? ? ? ? //由于該成員變量由mutable修飾,取消了其常屬性
? ? ? ? cout<<"name = "<<name<<"? age = "<<age<<"? score = "<<this->score<<endl;
? ? }
? ? //定義同名的非常成員函數(shù)
? ? void show()? ? ? ? ? ? ? ? ? //this原型:類名? * const this;
? ? {
? ? ? ? this->score = 100;? ? ? ? ? ? ? //更改成員變量的值
? ? ? ? cout<<"name = "<<name<<"? age = "<<age<<"? score = "<<score<<endl;
? ? }
};
int main()
{
? ? Stu s1("zhangs", 18, 90);
? ? //s1.show();? ? ? ? ? ? ? ? ? ? ? //100
? ? const Stu s2("lisi", 20, 50);? ? ? ? //該對象為常對象
? ? //s2.show();
? ? //定義常引用眉撵,目標(biāo)為非常對象
? ? const Stu &ref = s1;
? ? ref.show();? ? ? ? ? ? // 常引用也有常屬性侦香,調(diào)用成員函數(shù)時,只能調(diào)用常成員函數(shù)纽疟,不能調(diào)用非常成員函數(shù)
? ? s1.show();? ? ? ? ? ? //調(diào)用非常成員函數(shù)
? ? return 0;
}
三、運算符重載(operator)
自定義的類中憾赁,系統(tǒng)默認(rèn)只提供兩個運算符供用戶使用污朽,分別是賦值運算符和取地址運算符,其余運算符只使用用基本數(shù)據(jù)類型龙考,對于構(gòu)造數(shù)據(jù)類型而言蟆肆,不可直接使用,除非將該運算符進(jìn)行重載操作
3.1 定義
所謂運算符重載晦款,本質(zhì)上也是靜態(tài)多態(tài)的一種炎功,能夠?qū)崿F(xiàn)“一符多用”,使用運算符重載缓溅,能夠完成運算符作用于類對象之間蛇损,使得代碼更加簡潔、可讀性更強(qiáng)坛怪。
3.2 重載的方法
所有運算符重載淤齐,都擁有一個統(tǒng)一的名稱:operator#? ? ? (#表示運算符號)
參數(shù):根據(jù)運算符本身特點決定,如果是單目運算符袜匿,最多擁有一個參數(shù)更啄,如果是雙目運算符,最多擁有兩個參數(shù)
返回值:由用戶自己決定
3.3 調(diào)用原則及調(diào)用時機(jī)
1> 調(diào)用時機(jī):使用該運算符時居灯,系統(tǒng)自動調(diào)用祭务,無需手動調(diào)用
2> 調(diào)用原則:左調(diào)右參? (運算符的左側(cè)是函數(shù)調(diào)用者内狗,右側(cè)是該函數(shù)的參數(shù))? 例如:a = b;? ? ? ? //a.operator=(b)
3.4 重載版本
每個運算符重載,都可以實現(xiàn)兩個版本的重載函數(shù)义锥,分別是成員函數(shù)版和全局函數(shù)版
成員函數(shù)版比全局函數(shù)版本少一個參數(shù)柳沙,因為類對象本身就是一個參數(shù)
全局函數(shù)版和成員函數(shù)版只能實現(xiàn)一個,否則會造成調(diào)用時的混亂情況
全局函數(shù)版缨该,需要使用友元函數(shù)來完成
3.5 算術(shù)類運算符重載
1> 種類:+偎行、-、*贰拿、/蛤袒、%
2> 表達(dá)式格式:L # R? ? ? ? ? ? ? ? //L表示左操作數(shù)? #表示運算符? R表示右操作數(shù)
3> 左操作數(shù):既可以是左值也可以是右值,運算過程中不會被修改
4> 右操作數(shù):既可以是左值也可以是右值膨更,運算過程中不會被修改
5> 結(jié)果:結(jié)果是一個同類的右值妙真,不能被改變
6> 定義格式:
全局函數(shù)版:const 類名 operator# (const 類名 &L, const 類名 &R)
成員函數(shù)版:const? 類名 operator# ( const 類名 &R)const
3.6 關(guān)系類運算符重載
1> 種類:>、<荚守、>=珍德、<=、==矗漾、!=
2> 表達(dá)式格式:L # R? ? ? ? ? ? ? ? //L表示左操作數(shù)? #表示運算符? R表示右操作數(shù)
3> 左操作數(shù):既可以是左值也可以是右值锈候,運算過程中不會被修改
4> 右操作數(shù):既可以是左值也可以是右值,運算過程中不會被修改
5> 結(jié)果:bool類型敞贡,表示真假
6> 定義格式:
全局函數(shù)版:bool operator# (const 類名 &L, const 類名 &R)
成員函數(shù)版:bool operator# ( const 類名 &R)const
3.7 賦值類運算符重載
1> 種類:=泵琳、+=、-=誊役、*=获列、/=、%=
2> 表達(dá)式格式:L # R? ? ? ? ? ? ? ? //L表示左操作數(shù)? #表示運算符? R表示右操作數(shù)
3> 左操作數(shù):只能是左值
4> 右操作數(shù):既可以是左值也可以是右值蛔垢,運算過程中不會被修改
5> 結(jié)果:自身的引用
6> 定義格式:
全局函數(shù)版:類名 &operator# (類名 &L, const 類名 &R)
成員函數(shù)版:類名 & operator# ( const 類名 &R)
3.8 單目運算符重載
1> 種類:击孩!、~鹏漆、*巩梢、&、-
2> 表達(dá)式格式: # O? ? ? ? ? ? ? ? //? #表示運算符? O表示操作數(shù)
3> 操作數(shù):既可以是左值也可以是右值甫男,運算過程中不能更改
4> 結(jié)果:同類的右值
5> 定義格式:
全局函數(shù)版:類名 operator# (const 類名 &O)
成員函數(shù)版:類名 operator# ( )const
3.9 自增自減運算符
1> 前置自增運算
1且改、表達(dá)式格式:++O
2、操作數(shù):只能是左值
3板驳、結(jié)果:更改后自身的引用又跛,是一個左值
4、定義格式
全局函數(shù)版:類名& operator++(類名 & other)
成員函數(shù)版:類名 & operator++()
2> 后置自增
1若治、表達(dá)式格式:O++
2慨蓝、操作數(shù):只能是左值
3感混、結(jié)果:臨時值,是一個右值礼烈,更改之前的值
4弧满、定義格式:為了區(qū)分跟前置自增的區(qū)別,后置自增多一個啞元進(jìn)行占位
全局函數(shù)版:類名 operator++(類名 & other此熬, int)
成員函數(shù)版:類名? operator++(int)
3.10 插入提取運算符的重載(<<? >>)
1> 這兩個運算符的使用:cout<<對象? ? cin>>對象名? ? ? ? ? //cout.operator<<(對象)
2> cin和cout所在的類分別為istream和ostream類庭呜,如果想要實現(xiàn)成員函數(shù)版的運算符重載,需要對這兩個類重新更改內(nèi)容
3> 對于這兩個運算符重載犀忱,只能使用全局函數(shù)版募谎,借助友元的威力來實現(xiàn)
4> 由于不需要訪問istream或ostream類中的私有成員或受保護(hù)成員,所以無需將該全局函數(shù)在istream和ostream類中設(shè)置成友元函數(shù)
5> 由于該函數(shù)要訪問自定義類的私有成員阴汇,所以只需在自定義類中將該全局函數(shù)設(shè)置成友元函數(shù)即可
6> 表達(dá)式:L#R? ? ? ? //L表示cin或cout? ? #表示<<或>>運算符? R表示自定義的類對象
7> 左操作數(shù):istream或ostream類對象
8> 右操作數(shù):自定義的類對象
9> 結(jié)果:左操作數(shù)自身的引用
10> 定義格式
ostream &operator<<(ostream &L,? const 類名 &R);
istream &operator>>(istream &L, 類名 &R);
#include <iostream>
using namespace std;
//定義一個復(fù)數(shù)類 5 + 3i
class Complex
{
private:
? ? int real;? ? ? ? //實部
? ? int vir;? ? ? ? ? //虛部
public:
? ? Complex() {}
? ? Complex(int r, int v):real(r), vir(v) {}? ? ? ? //有參構(gòu)造
? ? //定義展示函數(shù)
? ? void show()
? ? {
? ? ? ? if(vir>=0)
? ? ? ? {
? ? ? ? ? ? cout<<real<<" + "<<vir<<"i"<<endl;
? ? ? ? }else
? ? ? ? {
? ? ? ? ? ? cout<<real<<vir<<"i"<<endl;
? ? ? ? }
? ? }
? ? //全局函數(shù)版實現(xiàn)加運算符重載
? ? friend const Complex operator+ (const Complex &L, const Complex &R);
? ? //成員函數(shù)版實現(xiàn)運算符重載
? ? const? Complex? operator- ( const Complex? &R)const
? ? {
? ? ? ? Complex c;
? ? ? ? c.real = this->real - R.real;
? ? ? ? c.vir = this->vir - R.vir;
? ? ? ? return c;
? ? }
? ? //成員函數(shù)版實現(xiàn)關(guān)系運算符的重載:實部>實部? && 虛部>虛部
? ? bool operator>(const Complex &R)const
? ? {
? ? ? ? return this->real>R.real&&this->vir>R.vir;
? ? }
? ? //重載中括號運算符
? ? int & operator[](int index)
? ? {
? ? ? ? if(index == 0)
? ? ? ? {
? ? ? ? ? ? return real;? ? ? ? ? //返回實部
? ? ? ? }else if(index == 1)
? ? ? ? {
? ? ? ? ? ? return vir;? ? ? ? ? //返回虛部
? ? ? ? }
? ? }
? ? //重載+=運算符:實部+=實部? 虛部+=虛部
? ? Complex & operator+=(const Complex &R)
? ? {
? ? ? ? this->real += R.real;
? ? ? ? this->vir += R.vir;
? ? ? ? return *this;? ? ? ? ? ? ? ? //返回自身的引用
? ? }
? ? //重載負(fù)號運算符: 實部= -實部数冬, 虛部 = -虛部
? ? Complex operator-()
? ? {
? ? ? ? Complex c;
? ? ? ? c.real = -this->real;
? ? ? ? c.vir = -this->vir;
? ? ? ? return c;
? ? }
? ? //重載前置自增運算符重載函數(shù):實部 = 實部+1? 虛部=虛部+1
? ? Complex &operator++()
? ? {
? ? ? ? ++this->real;
? ? ? ? ++this->vir;
? ? ? ? return *this;
? ? }
? ? //重載后置自增運算符重載函數(shù):實部 = 實部+1? 虛部=虛部+1
? ? Complex operator++(int)
? ? {
? ? ? ? Complex c;
? ? ? ? c.real = this->real++;
? ? ? ? c.vir = this->vir++;
? ? ? ? return c;
? ? }
? ? //將全局函數(shù)版實現(xiàn)的輸出運算符重載函數(shù)設(shè)置成友元
? ? friend ostream &operator<<(ostream &L, Complex &c);
? ? //重載小括號運算符,做一個仿函數(shù)
? ? void operator()(string s)
? ? {
? ? ? ? cout<<s<<endl;
? ? }
? ? //重載小括號運算符搀庶,做一個仿函數(shù)
? ? void operator()()
? ? {
? ? ? ? cout<<520<<" "<<1314<<endl;
? ? }
? ? //重寫類型轉(zhuǎn)換運算符
? ? operator int()
? ? {
? ? ? ? return real;? ? ? ? //將該數(shù)據(jù)類型向int類型轉(zhuǎn)換后拐纱,使用的是real的值
? ? }
};
//全局函數(shù)版實現(xiàn)加號運算符重載:實部+實部? 虛部+虛部
const Complex operator+ (const Complex &L, const Complex &R)
{
? ? //定義一個臨時空間
? ? Complex c;
? ? c.real = L.real + R.real;
? ? c.vir = L.vir + R.vir;
? ? return c;
}
//重載輸出運算符函數(shù)
ostream &operator<<(ostream &L, Complex &c)
{
? ? if(c.vir>=0)
? ? {
? ? ? ? L<<c.real<<" + "<<c.vir<<"i"<<endl;
? ? }else
? ? {
? ? ? ? L<<c.real<<c.vir<<"i"<<endl;
? ? }
? ? //返回左操作數(shù)自身的引用
? ? return L;
}
int main()
{
? ? Complex c1(5,3);
? ? c1.show();? ? ? ? ? ? ? ? ? ? //5+3i
? ? Complex c2(2,-1);
? ? c2.show();? ? ? ? ? ? ? ? ? ? ? //2-1i
? ? Complex c3 = c1-c2;? ? ? ? ? ? //調(diào)用加法運算符重載函數(shù)? c1.operator-(c2)
? ? c3.show();? ? ? ? ? ? ? ? ? ? ? //3+4i
? ? if(c3 > c2)? ? ? ? ? ? ? //調(diào)用關(guān)系運算符重載函數(shù)
? ? {
? ? ? ? cout<<"yes"<<endl;
? ? }else
? ? {
? ? ? ? cout<<"no"<<endl;
? ? }
? ? c3[0] = 5;? ? ? ? ? ? ? //將實部進(jìn)行修改成5,調(diào)用中括號運算符重載
? ? c3.show();? ? ? ? ? ? ? ? ? //5+4i
? ? c3 += c2;? ? ? ? ? ? //調(diào)用+=運算符重載函數(shù)
? ? c3.show();? ? ? ? ? ? //7+3i
? ? Complex c4 = -c3;? ? ? //調(diào)用-號運算符重載
? ? c4.show();? ? ? ? ? ? ? //-7 - 3i
? ? c3.show();? ? ? ? ? ? //7+3i
? ? Complex c5 = ++c3;? ? ? ? ? //調(diào)用前置自增運算符重載函數(shù)
? ? c5.show();? ? ? ? ? ? ? ? ? //8+4i
? ? c3.show();? ? ? ? ? ? ? ? ? //8+4i
? ? Complex c6 = c3++;? ? ? ? ? //調(diào)用后置自增運算符重載函數(shù)
? ? c6.show();? ? ? ? ? ? ? ? ? //8+4i
? ? c3.show();? ? ? ? ? ? ? ? ? //9+5i
? ? cout<<c3;? ? ? ? ? ? ? ? //cout.operator<<(c3)
? ? c3("hello world");? ? ? //c3.operator()("hello world");
? ? c3();
? ? int num = (int)c3;? ? ? ? ? ? //調(diào)用類型轉(zhuǎn)換運算符重載函數(shù)
? ? cout<<"num = "<<num<<endl;
? ? return 0;
}
3.11 不能重載的運算符
1> 成員運算符 .
2> 成員指針運算符 .*
3> 作用域限定符 ::
4> 求字節(jié)運算符 sizeof
5> 三目運算符 ?:
3.12 運算符重載注意事項
1> 運算符重載,不能改變運算符的優(yōu)先級
2> 運算符重載哥倔,不能改變運算符操作數(shù)個數(shù)
3> 運算符重載秸架,不能更改運算符的本質(zhì)邏輯,例如不允許在加法運算符重載函數(shù)中咆蒿,實現(xiàn)加法
4> 運算符重載咕宿,不能自己造運算符,是在已有的運算符的基礎(chǔ)上進(jìn)行重載操作
5> 運算符重載蜡秽,不能改變運算符的結(jié)合律
6> 運算符重載,一般不設(shè)置默認(rèn)參數(shù)
作業(yè)
仿照string類缆镣,完成myString 類
class myString
{
? ? private:
? ? ? ? char *str;? ? ? ? ? //記錄c風(fēng)格的字符串
? ? ? ? int size;? ? ? ? ? ? //記錄字符串的實際長度
? ? public:
? ? ? ? //無參構(gòu)造
? ? ? ? myString():size(10)
? ? ? ? {
? ? ? ? ? ? str = new char[size];? ? ? ? //構(gòu)造出一個長度為10的字符串?
? ? ? ? ? ? strcpy(str,"");? ? ? ? //賦值為空串? ? ? ? ?
? ? ? ? }
? ? ? ? //有參構(gòu)造
? ? ? ? myString(const char *s)? ? ? ? ? //string? s("hello world")
? ? ? ? {
? ? ? ? ? ? size = strlen(s);
? ? ? ? ? ? str = new char[size+1];
? ? ? ? ? ? strcpy(str, s);
? ? ? ? }
? ? ? ? //拷貝構(gòu)造
? ? ? ? //析構(gòu)函數(shù)
? ? ? ? //拷貝賦值函數(shù)
? ? ? ? //判空函數(shù)
? ? ? ? //size函數(shù)
? ? ? ? //c_str函數(shù)
? ? ? ? //at函數(shù)
? ? ? ? char &at(int pos)? ? ? ? ? ? ?
? ? ? ? //加號運算符重載
? ? ? ? //加等于運算符重載
? ? ? ? //關(guān)系運算符重載(>)?
? ? ? ? //中括號運算符重載
};
附:現(xiàn)在只是囫圇吞棗似的學(xué)芽突,沒有感覺。至于后繼感悟董瞻,節(jié)后重修一遍再