版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
類與對(duì)象實(shí)驗(yàn)報(bào)告(C++)實(shí)驗(yàn)內(nèi)容1.需要求3個(gè)長(zhǎng)方柱的體積,請(qǐng)編寫一個(gè)基于對(duì)象的程序。數(shù)據(jù)成員包括length(長(zhǎng))、width(寬)、height(高)。要求用成員函數(shù)實(shí)現(xiàn)以下功能:(1)由鍵盤分別輸入3個(gè)長(zhǎng)方柱的長(zhǎng)、寬、高。(2)計(jì)算長(zhǎng)方柱的體積;(3)輸出3個(gè)長(zhǎng)方柱的體積。請(qǐng)編寫程序,上機(jī)調(diào)試并運(yùn)行。2.建立一個(gè)對(duì)象數(shù)組,內(nèi)放5個(gè)學(xué)生的數(shù)據(jù)(學(xué)號(hào)、成績(jī)),用指針指向數(shù)組首元素,輸出第1,3,5學(xué)生的數(shù)據(jù)。3.建立一個(gè)對(duì)象數(shù)組,內(nèi)放5個(gè)學(xué)生的數(shù)據(jù)(學(xué)號(hào)、成績(jī)),設(shè)立一個(gè)函數(shù)max,用指向?qū)ο蟮闹羔樧骱瘮?shù)參數(shù),在max函數(shù)中找出5個(gè)學(xué)生中成績(jī)最高者,并輸出其學(xué)號(hào)。4.修改第6題程序,增加一個(gè)fun函數(shù),改寫main函數(shù)。改為在fun函數(shù)中調(diào)用change和display函數(shù)。在fun函數(shù)中使用對(duì)象的引用(Student&)作形參。5.商店銷售某一商品,每天公布統(tǒng)一的折扣(discount)。同時(shí)允許銷售人員在銷售時(shí)靈活掌握售價(jià)(price),在此基礎(chǔ)上,一次購(gòu)10件以上者,還可以享受9.8折優(yōu)惠?,F(xiàn)已知當(dāng)天3個(gè)銷貨員銷售情況為銷貨員號(hào)(num)銷貨件數(shù)(quantity)銷貨單價(jià)(price)101523.51021224.5610310021.5請(qǐng)編寫程序,計(jì)算出當(dāng)日此商品的總銷售款sum以及每件商品的平均售價(jià)。要求用靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。(提示:將折扣discount,總銷售款sum和商品銷售總件數(shù)n聲明為靜態(tài)數(shù)據(jù)成員,再定義靜態(tài)成員函數(shù)average(求平均售價(jià))和display(輸出結(jié)果)。實(shí)驗(yàn)答案1.#include<iostream>usingnamespacestd;classa{public:intlength,width,height;voidv(){intv=length*width*height;cout<<"長(zhǎng)方體體積為"<<v<<endl;}};intmain(){av1;av2;av3;cout<<"輸入第一個(gè)長(zhǎng)方體的長(zhǎng)寬高"<<endl;cin>>v1.length>>v1.width>>v1.height;cout<<"輸入第二個(gè)長(zhǎng)方體的長(zhǎng)寬高"<<endl;cin>>v2.length>>v2.width>>v2.height;cout<<"輸入第三個(gè)長(zhǎng)方體的長(zhǎng)寬高"<<endl;cin>>v3.length>>v3.width>>v3.height;v1.v();v2.v();v3.v();return0;}2.#include<iostream>usingnamespacestd;classstudent{public:student(intn,floats):num(n),score(s){}voiddisplay(){cout<<num<<""<<score<<endl;}private:intnum,score;};intmain(){studentstud[5]={student(101,99),student(102,85),student(103,76),student(104,90),student(105,66)};student*p=stud;for(inti=0;i<=2;p=p+2,i++)p->display();return0;}3.#include<iostream>#include<string>usingnamespacestd;classStudent{public:Student(intn,intm){num=n;score=m;}voiddisplay();floatscore;intnum;};voidStudent::display(){std::cout<<num<<""<<score<<std::endl;}floatmax(Student*a);intmain(){Studentstud[5]={Student(1,78.5),Student(2,85.5),Student(3,98.5),Student(4,100),Student(5,95.5)};Student*p;p=stud;for(p=stud;p<stud+5;p++){p->display();}Student*p1;p1=stud;max(p1);}floatmax(Student*a){inti,k;floatmax;max=a[0].score;for(i=0;i<5;i++)if(a[i].score>max){max=a[i].score;k=i+1;}std::cout<<"最高分為:"<<max<<""<<"其學(xué)號(hào)為:"<<k<<std::endl;}4.#include<iostream>#include<string>usingnamespacestd;classStudent{public:Student(intn,floats):num(n),score(s){}voidchange(intn,floats){num=n;score=s;}voiddisplay(){cout<<num<<""<<score<<endl;}private:intnum;floatscore;};voidfun(Student&ss){ss.display();ss.change(101,80.5);ss.display();}intmain(){Studentstud(101,78.5);fun(stud);return0;}5.#include<iostream>usingnamespacestd;classSale{public:Sale(intn,intq,doublepri):num(n),qua(q),price(pri){}staticdoubleaverage(Sale*,intn);staticvoiddisplay(Sale*,intn);private:intnum;intqua;doubleprice;staticdoublediscount;staticdoublesum;staticintcount;};doubleSale::discount=0.98;doubleSale::sum=0;intSale::count=0;doubleSale::average(Sale*cc,intn){Sale*p;for(p=cc;p<cc+n;p++){if(p->qua>10)p->price=p->price*discount;sum=sum+((p->price)*(p->qua));count=count+p->qua;}returnsum/count;}voidSale::display(Sale*cc,intn){cout<<"Average="<<Sale::average(cc,n)<<endl;cout<<"Sum="<<Sale::sum<<endl;}intmain(){Sales[3]={Sale(101,5,23.5),Sale(102,12,24.56),Sale(103,100,21.5)};Sale::display(s,3);return0;}
C++——類與對(duì)象簡(jiǎn)述C++是一種支持面向?qū)ο缶幊痰木幊陶Z(yǔ)言。在C++中,類和對(duì)象是面向?qū)ο缶幊痰暮诵母拍睢1疚膶⒃敿?xì)介紹C++類和對(duì)象的所有內(nèi)容,包括定義類、創(chuàng)建對(duì)象、成員函數(shù)、訪問(wèn)控制、構(gòu)造函數(shù)、析構(gòu)函數(shù)等,同時(shí)提供代碼示例和注意事項(xiàng)。類與對(duì)象定義類在C++中,類是一種用戶自定義的數(shù)據(jù)類型。類定義了一個(gè)對(duì)象的屬性和行為,是實(shí)現(xiàn)面向?qū)ο缶幊痰幕締卧?。類定義的一般形式如下:class
類名
{
private:
//
私有成員變量和函數(shù)
public:
//
公有成員變量和函數(shù)
protected:
//
保護(hù)成員變量和函數(shù)
};在C++中,類的訪問(wèn)控制符有三種,分別是:public、protected和private。這些訪問(wèn)控制符定義了在類的外部如何訪問(wèn)類的成員變量和成員函數(shù)。public:public關(guān)鍵字用于指定公共成員。公共成員可以在類的內(nèi)部和外部進(jìn)行訪問(wèn)。這意味著,任何一個(gè)函數(shù)都可以訪問(wèn)公共成員,而不需要進(jìn)行任何特殊的訪問(wèn)限制。protected:protected關(guān)鍵字用于指定保護(hù)成員。保護(hù)成員可以在類的內(nèi)部和派生類中進(jìn)行訪問(wèn),但不能在類的外部進(jìn)行訪問(wèn)。這意味著,只有在派生類中,才能訪問(wèn)保護(hù)成員,但在其他任何地方都無(wú)法訪問(wèn)。private:private關(guān)鍵字用于指定私有成員。私有成員只能在類的內(nèi)部進(jìn)行訪問(wèn)。這意味著,除了類本身以外,沒(méi)有任何其他函數(shù)或類可以訪問(wèn)私有成員。注意事項(xiàng)訪問(wèn)控制符只對(duì)類的外部進(jìn)行限制,而對(duì)類的內(nèi)部則沒(méi)有任何限制。這意味著,類的成員函數(shù)可以訪問(wèn)類的任何成員變量和成員函數(shù),而不需要進(jìn)行任何特殊的訪問(wèn)限制。公共成員的例子:class
Person
{
public:
std::string
name;
//
公共成員變量
void
setName(std::string
name)
{
this->name
=
name;
}
//
公共成員函數(shù)
};
int
main()
{
Person
p;
p.setName("Tom");
//
可以直接訪問(wèn)公共成員
std::cout
<<
<<
std::endl;
//
可以直接訪問(wèn)公共成員
return
0;
}在這個(gè)例子中,Person類的name成員變量和setName成員函數(shù)都是公共成員。因此,在main函數(shù)中,我們可以直接訪問(wèn)p對(duì)象的name成員變量和setName成員函數(shù),而不需要進(jìn)行任何特殊的訪問(wèn)限制。保護(hù)成員的例子:class
Person
{
protected:
int
age;
//
保護(hù)成員變量
void
setAge(int
age)
{
this->age
=
age;
}
//
保護(hù)成員函數(shù)
};
class
Student
:
public
Person
{
public:
void
setStudentAge(int
age)
{
setAge(age);
//
可以訪問(wèn)基類的保護(hù)成員函數(shù)
}
};
int
main()
{
Student
s;
s.setStudentAge(20);
//
可以訪問(wèn)基類的保護(hù)成員函數(shù)
return
0;
}在這個(gè)例子中,Person類的age成員變量和setAge成員函數(shù)都是保護(hù)成員,它們只能在類內(nèi)部和派生類中進(jìn)行訪問(wèn)。在Student類中,我們通過(guò)公共成員函數(shù)setStudentAge間接地訪問(wèn)了基類Person的保護(hù)成員函數(shù)setAge,從而實(shí)現(xiàn)了對(duì)age成員變量的設(shè)置。私有成員的例子:class
Person
{
private:
std::string
name;
//
私有成員變量
public:
void
setName(std::string
name)
{
this->name
=
name;
}
//
公共成員函數(shù)
std::string
getName()
{
return
name;
}
//
公共成員函數(shù)
};
int
main()
{
Person
p;
p.setName("Tom");
//
可以通過(guò)公共成員函數(shù)訪問(wèn)私有成員
std::cout
<<
p.getName()
<<
std::endl;
//
可以通過(guò)公共成員函數(shù)訪問(wèn)私有成員
std::cout
<<
<<
std::endl;
//
無(wú)法直接訪問(wèn)私有成員
return
0;
}在這個(gè)例子中,Person類的name成員變量是私有成員,它只能在類的內(nèi)部進(jìn)行訪問(wèn)。在main函數(shù)中,我們通過(guò)公共成員函數(shù)setName和getName來(lái)間接地訪問(wèn)name成員變量,而無(wú)法直接訪問(wèn)它。創(chuàng)建對(duì)象在C++中,對(duì)象是類的實(shí)例。通過(guò)創(chuàng)建對(duì)象,可以訪問(wèn)類的成員變量和成員函數(shù)。創(chuàng)建對(duì)象的一般形式如下://類名
對(duì)象名;例如,使用上述Person類創(chuàng)建一個(gè)對(duì)象的代碼如下:
Person
p;在創(chuàng)建對(duì)象之后,可以通過(guò)對(duì)象名訪問(wèn)類的成員變量和成員函數(shù)。例如,使用setName和setAge函數(shù)設(shè)置私有成員變量的值,使用print函數(shù)打印私有成員變量的值的代碼如下:
Person
p;
p.setName("Tom");
//
輸出內(nèi)容Tom成員函數(shù)在C++中,類的成員函數(shù)是定義在類內(nèi)部的函數(shù),用于實(shí)現(xiàn)類的行為。成員函數(shù)可以訪問(wèn)類的成員變量和成員函數(shù),以及傳遞參數(shù)和返回值。class
Person
{
private:
std::string
name;
//
私有成員變量
public:
void
setName(std::string
name)
//
成員函數(shù)
{
this->name
=
name;
}
//
公共成員函數(shù)
std::string
getName()
{
return
name;
}
//
公共成員函數(shù)
};從上面可知:子類要訪問(wèn)父類中的保護(hù)變量、私有變量需要通過(guò)公共的成員函數(shù)訪問(wèn),如果公共的成員函數(shù)中沒(méi)有保護(hù)·私有變量的內(nèi)容則不能訪問(wèn)。析構(gòu)函數(shù)在C++中,析構(gòu)函數(shù)是一種特殊的成員函數(shù),用于銷毀對(duì)象時(shí)清理資源。析構(gòu)函數(shù)的名稱與類名相同,但前面加上一個(gè)波浪號(hào)~,沒(méi)有參數(shù),也不需要顯式調(diào)用。~類名()
{
//
析構(gòu)函數(shù)體
}下面的Person類添加一個(gè)析構(gòu)函數(shù),用于清理對(duì)象的代碼如下:class
Person
{
private:
string
name;
int
age;
public:
Person(string
n,
int
a)
{
name
=
n;
age
=
a;
}
~Person()
{
cout
<<
"Destroying
object
"
<<
name
<<
endl;
}
void
setName(string
n)
{
name
=
n;
}
void
setAge(int
a)
{
age
=
a;
}
void
print()
{
cout
<<
"Name:
"
<<
name
<<
endl;
cout
<<
"Age:
"
<<
age
<<
endl;
}
};該析構(gòu)函數(shù)在銷毀對(duì)象時(shí)輸出一條消息。例如,銷毀上述Person對(duì)象的代碼如下:Person
p("Tom",
20);
p.print();
//
銷毀對(duì)象輸出結(jié)果為:Name:
Tom
Age:
20
Destroying
object
Tom構(gòu)造函數(shù)在C++中,構(gòu)造函數(shù)是一種特殊的成員函數(shù),用于初始化對(duì)象的成員變量。構(gòu)造函數(shù)的名稱與類名相同,沒(méi)有返回值類型,也不需要顯式調(diào)用。構(gòu)造函數(shù)的一般形式如下:類名(參數(shù)列表)
{
//
構(gòu)造函數(shù)體
}例如,為上述Person類添加一個(gè)構(gòu)造函數(shù),用于初始化name和age成員變量的代碼如下:class
Person
{
private:
string
name;
int
age;
public:
Person(string
n,
int
a)
{
name
=
n;
age
=
a;
}
void
setName(string
n)
{
name
=
n;
}
void
setAge(int
a)
{
age
=
a;
}
void
print()
{
cout
<<
"Name:
"
<<
name
<<
endl;
cout
<<
"Age:
"
<<
age
<<
endl;
}
};該構(gòu)造函數(shù)接受兩個(gè)參數(shù)n和a,用于初始化name和age成員變量。例如,使用該構(gòu)造函數(shù)創(chuàng)建一個(gè)Person對(duì)象的代碼如下:Person
p("Tom",
20);
p.print();輸出結(jié)果為:Name:
Tom
Age:
20靜態(tài)成員在C++中,靜態(tài)成員是類的成員,但不屬于任何對(duì)象。靜態(tài)成員可以被類的所有對(duì)象共享,也可以通過(guò)類名直接訪問(wèn)。靜態(tài)成員可以是靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。靜態(tài)數(shù)據(jù)成員是指屬于類的變量,靜態(tài)成員函數(shù)是指屬于類的函數(shù)。靜態(tài)數(shù)據(jù)成員的聲明和定義必須在類的外部進(jìn)行,并且要在前面加上關(guān)鍵字static。例如,為上述Person類添加一個(gè)靜態(tài)數(shù)據(jù)成員count,用于記錄創(chuàng)建的Person對(duì)象數(shù)量的代碼如下:class
Person
{
private:
string
name;
int
age;
static
int
count;
//
靜態(tài)數(shù)據(jù)成員
public:
Person(string
n,
int
a)
{
name
=
n;
age
=
a;
count++;
//
每次創(chuàng)建對(duì)象時(shí)增加對(duì)象數(shù)量
}
~Person()
{
count--;
//
每次銷毀對(duì)象時(shí)減少對(duì)象數(shù)量
}
void
setName(string
n)
{
name
=
n;
}
void
setAge(int
a)
{
age
=
a;
}
void
print()
{
cout
<<
"Name:
"
<<
name
<<
endl;
cout
<<
"Age:
"
<<
age
<<
endl;
}
static
int
getCount()
//
靜態(tài)成員函數(shù)
{
return
count;
}
};
int
Person::count
=
0;
//
靜態(tài)數(shù)據(jù)成員的定義例如,使用該類創(chuàng)建三個(gè)對(duì)象并輸出對(duì)象數(shù)量的代碼如下:Person
p1("Tom",20);
Person
p2("Jerry",
18);
Person
p3("Mary",
22);
cout
<<
"Object
count:
"
<<
Person::getCount()
<<
endl;
輸出結(jié)果Object
count:
3注意事項(xiàng)類的定義必須在使用之前。類的成員變量和成員函數(shù)的訪問(wèn)權(quán)限必須正確定義,遵循信息隱藏原則。類的成員函數(shù)可以直接訪問(wèn)類的成員變量和靜態(tài)成員,但不能直接訪問(wèn)非靜態(tài)成員函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)是必須的,用于初始化和清理對(duì)象。在創(chuàng)建對(duì)象時(shí),如果沒(méi)有顯式地調(diào)用構(gòu)造函數(shù),將調(diào)用默認(rèn)構(gòu)造函數(shù)。如果不需要復(fù)制對(duì)象,可以將復(fù)制構(gòu)造函數(shù)和賦值運(yùn)算符函數(shù)聲明為私有,并不實(shí)現(xiàn)它們。在使用靜態(tài)成員時(shí),可以通過(guò)類名直接訪問(wèn),也可以通過(guò)對(duì)象訪問(wèn)。但訪問(wèn)權(quán)限必須正確設(shè)置。class與struct的區(qū)別與class非常相似的就是C語(yǔ)言中的struct了。structstruct是一種自定義數(shù)據(jù)類型,可以包含數(shù)據(jù)成員和函數(shù)成員。它的默認(rèn)訪問(wèn)權(quán)限是public,默認(rèn)的繼承方式是public,默認(rèn)成員類型是public。struct
Point
{
int
x;
int
y;
void
print()
{
cout
<<
"("
<<
x
<<
",
"
<<
y
<<
")"
<<
endl;
}
};上面的代碼定義了一個(gè)Point結(jié)構(gòu)體,它包含了兩個(gè)int類型的數(shù)據(jù)成員x和y,以及一個(gè)打印函數(shù)print。由于默認(rèn)的訪問(wèn)權(quán)限是public,因此這些成員都可以在結(jié)構(gòu)體外部訪問(wèn)??梢允褂萌缦路绞匠跏蓟疨oint結(jié)構(gòu)體:Point
p1
=
{1,
2};
//
使用花括號(hào)初始化
Point
p2
{3,
4};
//
不使用等號(hào)初始化classclass也是一種自定義數(shù)據(jù)類型,可以包含數(shù)據(jù)成員和函數(shù)成員。它的默認(rèn)訪問(wèn)權(quán)限是private,默認(rèn)的繼承方式是private,默認(rèn)成員類型是private。下面是一個(gè)class的例子:class
Rectangle
{
private:
int
width;
int
height;
public:
Rectangle(int
w,
int
h)
:
width(w),
height(h)
{}
int
area()
{
return
width
*
height;
}
};上面的代碼定義了一個(gè)Rectangle類,它包含了兩個(gè)int類型的私有數(shù)據(jù)成員width和height,以及一個(gè)公有構(gòu)造函數(shù)Rectangle和一個(gè)公有成員函數(shù)area。由于默認(rèn)的訪問(wèn)權(quán)限是private,因此這些成員只能在類內(nèi)部或者通過(guò)類的公有成員函數(shù)訪問(wèn)??梢允褂萌缦路绞匠跏蓟疪ectangle類:Rectangle
r1(2,
3);
//
使用括號(hào)初始化
Rectangle
r2
=
Rectangle(4,
5);
//
使用等號(hào)初始化區(qū)別struct的默認(rèn)訪問(wèn)權(quán)限是public,而class的默認(rèn)訪問(wèn)權(quán)限是private。struct的默認(rèn)繼承方式是public,而class的默認(rèn)繼承方式是private。struct的默認(rèn)成員類型是public,而class的默認(rèn)成員類型是private。在使用struct時(shí)可以省略關(guān)鍵字struct,而在使用class時(shí)不能省略關(guān)鍵字class。在C++中,struct和class可以互相繼承,區(qū)別僅在于默認(rèn)訪問(wèn)權(quán)限和默認(rèn)繼承方式的不同。對(duì)象的內(nèi)存存儲(chǔ)模型相較于C語(yǔ)言,C++語(yǔ)言并沒(méi)有額外增加內(nèi)存消耗(確切說(shuō),在沒(méi)有虛函數(shù)情況下)。對(duì)于一個(gè)C++類對(duì)象,每個(gè)對(duì)象有獨(dú)立的數(shù)據(jù)成員(非static),但是內(nèi)存中成員函數(shù)只有一份,該類的所有對(duì)象共享成員函數(shù)。static數(shù)據(jù)成員屬于類,該類的所有對(duì)象共享static數(shù)據(jù)成員,static數(shù)據(jù)成員存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)。對(duì)象數(shù)據(jù)成員依據(jù)創(chuàng)建對(duì)象的方式不同,可能存在于棧上或者堆上。成員函數(shù)存儲(chǔ)在代碼段。無(wú)繼承狀態(tài)Class
Base
{
public:
int
a;
int
b;
virtual
void
function();
};首先是虛函數(shù)表指針,該指針是由編譯器定義和初始化(編譯階段,編譯器在構(gòu)造函數(shù)內(nèi)增加代碼實(shí)現(xiàn))成員函數(shù)代碼存儲(chǔ)在代碼段,堆上構(gòu)造虛函數(shù)表,將虛成員函數(shù)的地址存儲(chǔ)在虛函數(shù)內(nèi)。數(shù)據(jù)成員按照聲明的順序布局;單繼承無(wú)虛函數(shù)class
A
{
public:
int
a;
int
b;
void
fun1();
void
fun2();
};
class
B
:
public
A
{
public:
int
c;
void
fun2();
}B繼承A類其中a,b的數(shù)據(jù)是共享的,數(shù)據(jù)存儲(chǔ)與棧區(qū)fun()1,A::fun2(),B::fun2()都存在與代碼區(qū)中虛函數(shù)多繼承class
A
{
public:
int
a;
int
b;
virtual
void
vfun1();
virtual
void
vfun2();
void
fun1();
void
fun2();
};
class
B
:
public
class
A
{
public:
int
c;
virtual
void
vfun1();
virtual
void
vfun2();
void
fun2();
};
class
C
:
public
Class
B
{
public:
int
d;
virtual
void
vfun1();
void
fun2();
}B繼承A類其中a,b的數(shù)據(jù)是共享的,數(shù)據(jù)存儲(chǔ)與棧區(qū)fun()1,A::fun2(),B::fun2()都存在與代碼區(qū)中虛函數(shù)多繼承classA{public:inta;intb;virtualvoidvfun1();virtualvoidvfun2();voidfun1();voidfun2();};classB:publicclassA{public:intc;virtualvoidvfun1();virtualvoidvfun2();voidfun2();};classC:publicClassB{public:intd;virtualvoidvfun1();voidfun2();}A類中存在著整型變量a,b,普通成員函數(shù)fun1(),fun2()。虛函數(shù)vfun1(),vfun2().由于虛函數(shù)的存在那么存在著虛表指針vpter*指向A的虛函數(shù)表,A的虛函數(shù)表中存儲(chǔ)著A::vfun1()與A::vfun2()虛函數(shù)在代碼區(qū)中的地址。B繼承了A的公共區(qū)內(nèi)容,且B類中定義了一個(gè)整型變量c,同時(shí)對(duì)A類中的虛函數(shù)vfun1()虛函數(shù)進(jìn)行重寫,而虛函數(shù)vfun2()沒(méi)有進(jìn)行重寫。所以,B類在內(nèi)存的數(shù)據(jù)結(jié)構(gòu)是a,b,與類A進(jìn)行共享,C則屬于B類自己的內(nèi)容。A類無(wú)法訪問(wèn)。由于B重寫了從A類中繼承過(guò)來(lái)的虛函數(shù)vfun1(),而vfun2沒(méi)有。所以B::vfun1()在代碼區(qū)中是獨(dú)立的地址空間,而vfun2()是共享A類的。C繼承了B類的內(nèi)容,所以C類中的數(shù)據(jù)a,b與A,B類共享,C的數(shù)據(jù)與B共享,d的數(shù)據(jù)屬于C類自己。同理C類也沒(méi)有重寫A類中的vfun2()虛函數(shù),所以在地址上vfun2()與A、B數(shù)據(jù)進(jìn)行共享。vfun1()重寫了所以屬于自己的地址內(nèi)存空間。而對(duì)于非虛函數(shù)的成員B,C類是繼承A類的fun1(),fun2()的,所以他們倆是共享A::fun1(),與A::fun2()的地址空間,而B(niǎo)類里面的非虛函數(shù)fun2()只是與A類的fun2()名字相同,實(shí)際上是獨(dú)屬于B::的fun2(),所以B類里面的fun2()在代碼區(qū)中有自己的地址空間B::fun2()同理對(duì)C類也是這樣.C類里面fun2()是名字于A類相同而已,實(shí)際上存儲(chǔ)的內(nèi)存空間為C::fun2();創(chuàng)建對(duì)象classStudent{public://成員變量char*name;intage;floatscore;//成員函數(shù)voidsay(){cout<<name<<"的年齡是"<<age<<",成績(jī)是"<<score<<endl;}};有了Student類后,就可以通過(guò)它來(lái)創(chuàng)建對(duì)象了,例如:StudentliLei;//創(chuàng)建對(duì)象在創(chuàng)建對(duì)象時(shí),class關(guān)鍵字可要可不要,但是出于習(xí)慣我們通常會(huì)省略掉class關(guān)鍵字,例如:classStudentLiLei;//正確StudentLiLei;//同樣正確除了創(chuàng)建單個(gè)對(duì)象,還可以創(chuàng)建對(duì)象數(shù)組StudentallStu[100];C語(yǔ)言中經(jīng)典的指針在C++中仍然廣泛使用,尤其是指向?qū)ο蟮闹羔?上面代碼中創(chuàng)建的對(duì)象stu在棧上分配內(nèi)存,需要使用&獲取它的地址,例如:Studentstu;Student*pStu=&stu;當(dāng)然,你也可以在堆上創(chuàng)建對(duì)象,這個(gè)時(shí)候就需要使用前面講到的new關(guān)鍵字Student*pStu=newStudent;在棧上創(chuàng)建出來(lái)的對(duì)象都有一個(gè)名字,比如stu,使用指針指向它不是必須的。但是通過(guò)new創(chuàng)建出來(lái)的對(duì)象就不一樣了,它在堆上分配內(nèi)存,沒(méi)有名字,只能得到一個(gè)指向它的指針,所以必須使用一個(gè)指針變量來(lái)接收這個(gè)指針,否則以后再也無(wú)法找到這個(gè)對(duì)象了,更沒(méi)有辦法使用它。也就是說(shuō),使用new在堆上創(chuàng)建出來(lái)的對(duì)象是匿名的,沒(méi)法直接使用,必須要用一個(gè)指針指向它,再借助指針來(lái)訪問(wèn)它的成員變量或成員函數(shù)。棧內(nèi)存是程序自動(dòng)管理的,不能使用delete刪除在棧上創(chuàng)建的對(duì)象;堆內(nèi)存由程序員管理,對(duì)象使用完畢后可以通過(guò)delete刪除。在實(shí)際開(kāi)發(fā)中,new和delete往往成對(duì)出現(xiàn),以保證及時(shí)刪除不再使用的對(duì)象,防止無(wú)用內(nèi)存堆積。對(duì)象內(nèi)的值初始化在C++中,對(duì)象內(nèi)的數(shù)據(jù)可以通過(guò)以下三種方式進(jìn)行初始化:1,默認(rèn)初始化如果一個(gè)類中的成員變量沒(méi)有被顯式地初始化,并且沒(méi)有定義默認(rèn)的構(gòu)造函數(shù),那么這個(gè)成員變量就會(huì)被默認(rèn)初始化。默認(rèn)初始化的規(guī)則是,基本數(shù)據(jù)類型會(huì)被初始化為0,而對(duì)象類型會(huì)被默認(rèn)構(gòu)造函數(shù)初始化。classMyClass{public:intnum;//num默認(rèn)初始化為0std::stringstr;//str默認(rèn)初始化為空字符串};intmain(){MyClassobj;std::cout<<obj.num<<std::endl;//輸出0std::cout<<obj.str<<std::endl;//輸出空字符串return0;}2,成員初始化列表使用成員初始化列表可以在對(duì)象創(chuàng)建時(shí)直接對(duì)成員變量進(jìn)行初始化,而不是等到對(duì)象創(chuàng)建后再進(jìn)行初始化。成員初始化列表在構(gòu)造函數(shù)中使用冒號(hào)“:”進(jìn)行聲明,多個(gè)成員之間用逗號(hào)“,”隔開(kāi)。classMyClass{public:intnum;std::stringstr;MyClass(intn,conststd::string&s):num(n),str(s){}//使用成員初始化列表};intmain(){MyClassobj(100,"hello");std::cout<<obj.num<<std::endl;//輸出100std::cout<<obj.str<<std::endl;//輸出helloreturn0;}3,賦值初始化對(duì)象的成員變量也可以通過(guò)賦值進(jìn)行初始化,賦值初始化發(fā)生在對(duì)象創(chuàng)建后。。classMyClass{public:intnum;std::stringstr;};intmain(){MyClassobj;obj.num=100;obj.str="hello";std::cout<<obj.num<<std::endl;//輸出100std::cout<<obj.str<<std::endl;//輸出helloreturn0;}總結(jié)在C++中,對(duì)象內(nèi)的數(shù)據(jù)可以通過(guò)默認(rèn)初始化、成員初始化列表和賦值初始化進(jìn)行初始化。默認(rèn)初始化會(huì)根據(jù)數(shù)據(jù)類型進(jìn)行默認(rèn)值的初始化,成員初始化列表在對(duì)象創(chuàng)建時(shí)直接對(duì)成員變量進(jìn)行初始化,賦值初始化發(fā)生在對(duì)象創(chuàng)建后。使用成員初始化列表可以提高代碼的可讀性和效率。對(duì)象數(shù)組在C++中,我們可以定義對(duì)象數(shù)組,也就是將同一種類型的對(duì)象存儲(chǔ)在一個(gè)數(shù)組中。定義對(duì)象數(shù)組的語(yǔ)法如下:ClassNamearrayName[arraySize];其中,ClassName是對(duì)象類型,arrayName是數(shù)組的名稱,arraySize是數(shù)組的大小。例如,下面定義了一個(gè)包含三個(gè)MyClass對(duì)象的對(duì)象數(shù)組classMyClass{public:intnum;MyClass(intn):num(n){}};intmain(){MyClassmyArray[3]={MyClass(1),MyClass(2),MyClass(3)};return0;}上述代碼中,我們定義了一個(gè)包含三個(gè)MyClass對(duì)象的對(duì)象數(shù)組myArray。這個(gè)數(shù)組被初始化為三個(gè)MyClass對(duì)象,每個(gè)對(duì)象的num值分別為1、2、3。當(dāng)我們定義對(duì)象數(shù)組時(shí),每個(gè)對(duì)象都會(huì)被自動(dòng)調(diào)用它們的構(gòu)造函數(shù)進(jìn)行初始化。因此,我們必須確保該類型有可用的構(gòu)造函數(shù)。訪問(wèn)對(duì)象數(shù)組的元素與訪問(wèn)一般的數(shù)組元素一樣,可以使用下標(biāo)運(yùn)算符“[]”來(lái)訪問(wèn)。MyClassmyArray[3]={MyClass(1),MyClass(2),MyClass(3)};std::cout<<myArray[0].num<<std::endl;//輸出1std::cout<<myArray[1].num<<std::endl;//輸出2std::cout<<myArray[2].num<<std::endl;//輸出3總結(jié)在C++中,我們可以定義對(duì)象數(shù)組來(lái)存儲(chǔ)同一類型的對(duì)象。定義對(duì)象數(shù)組的語(yǔ)法為ClassNamearrayName[arraySize]。每個(gè)對(duì)象都會(huì)被自動(dòng)調(diào)用它們的構(gòu)造函數(shù)進(jìn)行初始化。我們可以使用下標(biāo)運(yùn)算符“[]”來(lái)訪問(wèn)對(duì)象數(shù)組的元素。C++成員對(duì)象和封閉類在C++中,成員對(duì)象是一個(gè)類的成員變量,這個(gè)成員變量是另一個(gè)類的對(duì)象。這種情況下,我們通常把包含成員對(duì)象的類稱為封閉類,被包含的成員對(duì)象稱為嵌套類或成員子對(duì)象。例如,下面定義了一個(gè)封閉類Person,包含一個(gè)成員對(duì)象Birthday:classBirthday{public:intyear;intmonth;intday;Birthday(inty,intm,intd):year(y),month(m),day(d){}};classPerson{public:std::stringname;Birthdaybirthday;//Birthday作為成員對(duì)象Person(conststd::string&n,constBirthday&b):name(n),birthday(b){}};intmain(){Birthdayb(1990,10,1);Personp("Tom",b);std::cout<<<<"'sbirthdayis"<<p.birthday.year<<"-"<<p.birthday.month<<"-"<<p.birthday.day<<std::endl;return0;}上述代碼中,我們定義了一個(gè)Birthday類和一個(gè)Person類,其中Person類包含一個(gè)Birthday對(duì)象作為成員對(duì)象。在main函數(shù)中,我們創(chuàng)建了一個(gè)Birthday對(duì)象b和一個(gè)Person對(duì)象p,將b作為參數(shù)傳遞給p的構(gòu)造函數(shù)。在輸出語(yǔ)句中,我們?cè)L問(wèn)了p對(duì)象的name成員變量和birthday成員對(duì)象的year、month和day成員變量。需要注意的是,成員對(duì)象的初始化順序是在封閉類構(gòu)造函數(shù)的初始化列表中按照聲明順序初始化的。例如,如果我們?cè)赑erson類中將birthday成員對(duì)象定義在name成員變量之前,那么在Person的構(gòu)造函數(shù)中,初始化列表中也應(yīng)該將birthday放在name前面。classPerson{public:Birthdaybirthday;std::stringname;Person(constBirthday&b,conststd::string&n):birthday(b),name(n){}};總結(jié)在C++中,成員對(duì)象是一個(gè)類的成員變量,這個(gè)成員變量是另一個(gè)類的對(duì)象。封閉類包含成員對(duì)象,被包含的成員對(duì)象稱為嵌套類或成員子對(duì)象。成員對(duì)象的初始化順序是在封閉類構(gòu)造函數(shù)的初始化列表中按照聲明順序初始化的。this指針在C++中,每個(gè)對(duì)象都有一個(gè)指向自己的指針,這個(gè)指針?lè)Q為this指針。this指針可以讓我們?cè)陬惖某蓡T函數(shù)中訪問(wèn)調(diào)用該函數(shù)的對(duì)象的成員變量和成員函數(shù)。this指針是一個(gè)隱式參數(shù),它被自動(dòng)傳遞給成員函數(shù)。在類的成員函數(shù)中,可以使用this指針來(lái)訪問(wèn)對(duì)象的成員變量和成員函數(shù)。例如:classPerson{public:std::stringname;intage;voidsetName(conststd::string&n){this->name=n;//使用this指針訪問(wèn)name成員變量}voidsetAge(inta){age=a;//直接訪問(wèn)age成員變量}voidprintInfo(){std::cout<<"Name:"<<this->name<<",Age:"<<this->age<<std::endl;//使用this指針訪問(wèn)成員變量}};intmain(){Personp;p.setName("Tom");p.setAge(20);p.printInfo();return0;}上述代碼中,我們定義了一個(gè)Person類,其中包含兩個(gè)成員變量name和age,以及三個(gè)成員函數(shù)setName、setAge和printInfo。在setName和printInfo函數(shù)中,我們使用了this指針來(lái)訪問(wèn)對(duì)象的成員變量name和age。在setAge函數(shù)中,我們直接訪問(wèn)了age成員變量。在main函數(shù)中,我們創(chuàng)建了一個(gè)Person對(duì)象p,并分別調(diào)用了它的setName、setAge和printInfo函數(shù)來(lái)設(shè)置和輸出對(duì)象的成員變量值。需要注意的是,this指針在成員函數(shù)中是一個(gè)局部變量,它指向調(diào)用該函數(shù)的對(duì)象,因此每個(gè)對(duì)象都有自己的this指針。在成員函數(shù)中,我們可以使用this指針來(lái)訪問(wèn)調(diào)用該函數(shù)的對(duì)象的成員變量和成員函數(shù)。如果一個(gè)成員函數(shù)沒(méi)有使用this指針訪問(wèn)任何成員變量或成員函數(shù),那么this指針將不會(huì)被使用,編譯器不會(huì)為該函數(shù)生成this指針。this只能用在類的內(nèi)部,通過(guò)this可以訪問(wèn)類的所有成員,包括private、protected、public屬性的??偨Y(jié)在C++中,每個(gè)對(duì)象都有一個(gè)指向自己的指針,這個(gè)指針?lè)Q為this指針。this指針可以讓我們?cè)陬惖某蓡T函數(shù)中訪問(wèn)調(diào)用該函數(shù)的對(duì)象的成員變量和成員函數(shù)。在成員函數(shù)中,我們可以使用this指針來(lái)訪問(wèn)調(diào)用該函數(shù)的對(duì)象的成員變量和成員函數(shù)。如果一個(gè)成員函數(shù)沒(méi)有使用this指針訪問(wèn)任何成員變量或成員函數(shù),那么this指針將不會(huì)被使用,編譯器不會(huì)為該函數(shù)生成this指針。C++靜態(tài)成員變量對(duì)象的內(nèi)存中包含了成員變量,不同的對(duì)象占用不同的內(nèi)存使得不同對(duì)象的成員變量相互獨(dú)立,它們的值不受其他對(duì)象的影響。例如有兩個(gè)相同類型的對(duì)象a、b,它們都有一個(gè)成員變量m_name,那么修改a.m_name的值不會(huì)影響b.m_name的值。有時(shí)候我們希望在多個(gè)對(duì)象之間共享數(shù)據(jù),對(duì)象a改變了某份數(shù)據(jù)后對(duì)象b可以檢測(cè)到。共享數(shù)據(jù)的典型使用場(chǎng)景是計(jì)數(shù),以前面的Student類為例,如果我們想知道班級(jí)中共有多少名學(xué)生,就可以設(shè)置一份共享的變量,每次創(chuàng)建對(duì)象時(shí)讓該變量加1。classStudent{public:Student(char*name,intage,floatscore);voidshow();public:staticintm_total;//靜態(tài)成員變量private:char*m_name;intm_age;floatm_score;}static成員變量屬于類,不屬于某個(gè)具體的對(duì)象,即使創(chuàng)建多個(gè)對(duì)象,也只為m_total分配一份內(nèi)存,所有對(duì)象使用的都是這份內(nèi)存中的數(shù)據(jù)。當(dāng)某個(gè)對(duì)象修改了m_total,也會(huì)影響到其他對(duì)象。static成員變量的內(nèi)存既不是在聲明類時(shí)分配,也不是在創(chuàng)建對(duì)象時(shí)分配,而是在(類外)初始化時(shí)分配。反過(guò)來(lái)說(shuō),沒(méi)有在類外初始化的static成員變量不能使用。//通過(guò)類類訪問(wèn)static成員變量Student::m_total=10;//通過(guò)對(duì)象來(lái)訪問(wèn)static成員變量Studentstu("小明",15,92.5f);stu.m_total=20;//通過(guò)對(duì)象指針來(lái)訪問(wèn)static成員變量Student*pstu=newStudent("李華",16,96);pstu->m_total=20;C++靜態(tài)成員函數(shù)在類中,static除了可以聲明靜態(tài)成員變量,還可以聲明靜態(tài)成員函數(shù)。普通成員函數(shù)可以訪問(wèn)所有成員(包括成員變量和成員函數(shù)),靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)成員。靜態(tài)成員函數(shù)與普通成員函數(shù)的根本區(qū)別在于:普通成員函數(shù)有this指針,可以訪問(wèn)類中的任意成員;而靜態(tài)成員函數(shù)沒(méi)有this指針,只能訪問(wèn)靜態(tài)成員(包括靜態(tài)成員變量和靜態(tài)成員函數(shù))。#include<iostream>usingnamespacestd;classStudent{public:Student(char*name,intage,floatscore);voidshow();public://聲明靜態(tài)成員函數(shù)staticintgetTotal();staticfloatgetPoints();private:staticintm_total;//總?cè)藬?shù)staticfloatm_points;//總成績(jī)private:char*m_name;intm_age;floatm_score;};intStudent::m_total=0;floatStudent::m_points=0.0;Student::Student(char*name,intage,floatscore):m_name(name),m_age(age),m_score(score){m_total++;m_points+=score;}voidStudent::show(){cout<<m_name<<"的年齡是"<<m_age<<",成績(jī)是"<<m_score<<endl;}//定義靜態(tài)成員函數(shù)intStudent::getTotal(){returnm_total;}floatStudent::getPoints(){returnm_points;}intmain(){(newStudent("小明",15,90.6))->show();(newStudent("李磊",16,80.5))->show();(newStudent("張華",16,99.0))->show();(newStudent("王康",14,60.8))->show();inttotal=Student::getTotal();floatpoints=Student::getPoints();cout<<"當(dāng)前共有"<<total<<"名學(xué)生,總成績(jī)是"<<points<<",平均分是"<<points/total<<endl;return0;}小明的年齡是15,成績(jī)是90.6李磊的年齡是16,成績(jī)是80.5張華的年齡是16,成績(jī)是99王康的年齡是14,成績(jī)是60.8當(dāng)前共有4名學(xué)生,總成績(jī)是330.9,平均分是82.725C++const成員變量和成員函數(shù)const成員變量的用法和普通const變量的用法相似,只需要在聲明時(shí)加上const關(guān)鍵字。初始化const成員變量只有一種方法,就是通過(guò)構(gòu)造函數(shù)的初始化列表classStudent{public:Student(char*name,intage,floatscore);voidshow();//聲明常成員函數(shù)char*getname()const;intgetage()const;floatgetscore()const;private:char*m_name;intm_age;floatm_score;};Student::Student(char*name,intage,floatscore):m_name(name),m_age(age),m_score(score){}voidStudent::show(){cout<<m_name<<"的年齡是"<<m_age<<",成績(jī)是"<<m_score<<endl;}//定義常成員函數(shù)char*Student::getname()const{returnm_name;}intStudent::getage()const{returnm_age;}floatStudent::getscore()const{returnm_score;}const成員函數(shù)可以使用類中的所有成員變量,但是不能修改它們的值,這種措施主要還是為了保護(hù)數(shù)據(jù)而設(shè)置的。const成員函數(shù)也稱為常成員函數(shù)。注意事項(xiàng)需要強(qiáng)調(diào)的是,必須在成員函數(shù)的聲明和定義處同時(shí)加上const關(guān)鍵字。char*getname()const和char*getname()是兩個(gè)不同的函數(shù)原型,如果只在一個(gè)地方加const會(huì)導(dǎo)致聲明和定義處的函數(shù)原型沖突。函數(shù)開(kāi)頭的const用來(lái)修飾函數(shù)的返回值,表示返回值是const類型,也就是不能被修改,例如constchar*getname()函數(shù)頭部的結(jié)尾加上const表示常成員函數(shù),這種函數(shù)只能讀取成員變量的值,而不能修改成員變量的值,例如char*getname()constC++const對(duì)象在C++中,const也可以用來(lái)修飾對(duì)象,稱為常對(duì)象。一旦將對(duì)象定義為常對(duì)象之后,就只能調(diào)用類的const成員(包括const成員變量和const成員函數(shù))了#include<iostream>usingnamespacestd;classStudent{public:Student(char*name,intage,floatscore);public:voidshow();char*getname()const;intgetage()const;floatgetscore()const;private:char*m_name;intm_age;floatm_score;};Student::Student(char*name,intage,floatscore):m_name(name),m_age(age),m_score(score){}voidStudent::show(){cout<<m_name<<"的年齡是"<<m_age<<",成績(jī)是"<<m_score<<endl;}char*Student::getname()const{returnm_name;}intStudent::getage()const{returnm_age;}floatStudent::getscore()const{returnm_score;}intmain(){constStudentstu("小明",15,90.6);//stu.show();//errorcout<<stu.getname()<<"的年齡是"<<stu.getage()<<",成績(jī)是"<<stu.getscore()<<endl;constStudent*pstu=newStudent("李磊",16,80.5);//pstu->show();//errorcout<<pstu->getname()<<"的年齡是"<<pstu->getage()<<",成績(jī)是"<<pstu->getscore()<<endl;return0;}C++友元函數(shù)和友元類在C++中,一個(gè)類中可以有public、protected、private三種屬性的成員,通過(guò)對(duì)象可以訪問(wèn)public成員,只有本類中的函數(shù)可以訪問(wèn)本類的private成員?,F(xiàn)在,我們來(lái)介紹一種例外情況——友元(friend)。借助友元(friend),可以使得其他類中的成員函數(shù)以及全局范圍內(nèi)的函數(shù)訪問(wèn)當(dāng)前類的private成員。1,友元函數(shù)在單繼承中,友元函數(shù)的使用方式與普通類中的使用方式相同??梢栽陬愔新暶饕粋€(gè)函數(shù)為友元函數(shù),使得該函數(shù)可以訪問(wèn)該類的私有成員變量和成員函數(shù)。classA{private:intx;public:friendvoidfoo(A&a);};voidfoo(A&a){a.x=10;//可以訪問(wèn)A類的私有成員變量x}intmain(){Aa;foo(a);return0;}在上面的代碼中,我們聲明了一個(gè)類A,并在其中聲明了一個(gè)函數(shù)foo為友元函數(shù)。在foo中,我們可以直接訪問(wèn)A類的私有成員變量x,并將其賦值為10。在主函數(shù)中,我們創(chuàng)建了一個(gè)A類的實(shí)例a,并將其作為參數(shù)傳遞給foo函數(shù),從而實(shí)現(xiàn)了對(duì)A類的私有成員變量x的修改。2,友元類友元類的使用方式與普通類中的使用方式相同??梢栽陬愔新暶髁硗庖粋€(gè)類為友元類,使得該類可以訪問(wèn)該類的私有成員變量和成員函數(shù)。下面是一個(gè)示例:classA{private:intx;public:friendclassB;};classB{public:voidfoo(A&a){a.x=10;//可以訪問(wèn)A類的私有成員變量x}};intmain(){Aa;Bb;b.foo(a);//調(diào)用B類的成員函數(shù)foo,修改A類的私有成員變量xreturn0;}在上面的代碼中,我們聲明了一個(gè)類A,并在其中聲明了一個(gè)類B為友元類。在類B中,我們聲明了一個(gè)成員函數(shù)foo,并在其中訪問(wèn)了A類的私有成員變量x,并將其賦值為10。在主函數(shù)中,我們創(chuàng)建了一個(gè)A類的實(shí)例a和一個(gè)B類的實(shí)例b,并將a作為參數(shù)傳遞給b的成員函數(shù)foo,從而實(shí)現(xiàn)了對(duì)A類的私有成員變量x的修改。注意事項(xiàng)需要注意的是,如果一個(gè)類A是另外一個(gè)類B的友元類,那么在B中可以訪問(wèn)A的私有成員變量和成員函數(shù),但是在A中不能訪問(wèn)B的私有成員變量和成員函數(shù)。這是由于友元關(guān)系是單向的。如果需要在A中訪問(wèn)B的私有成員變量和成員函數(shù),需要在B中再次聲明A為友元類。作用域C++的作用域是指變量、函數(shù)、類等標(biāo)識(shí)符在程序中可以被訪問(wèn)的范圍。在C++中,作用域分為以下四種:全局作用域:全局作用域是指在程序的任何地方都可以訪問(wèn)的標(biāo)識(shí)符。在C++中,全局作用域包括全局變量、全局函數(shù)和命名空間中的標(biāo)識(shí)符。類作用域:類作用域是指在類的成員函數(shù)中可以訪問(wèn)的標(biāo)識(shí)符。在C++中,類作用域包括類的成員變量、成員函數(shù)和友元函數(shù)。塊作用域:塊作用域是指在一個(gè)代碼塊(花括號(hào){}之間的代碼)中定義的標(biāo)識(shí)符。在C++中,塊作用域包括局部變量、函數(shù)參數(shù)和代碼塊中的標(biāo)識(shí)符。命名空間作用域:命名空間作用域是指在命名空間中定義的標(biāo)識(shí)符。在C++中,命名空間作用域包括命名空間中的變量、函數(shù)和類。下面通過(guò)代碼是全局作用域#include<iostream>usingnamespacestd;intglobal_var=10;//全局變量namespaceA{intnamespace_var=20;//命名空間變量classTest{public:voidfunc(){intclass_var=30;//類的成員變量cout<<"class_var:"<<class_var<<endl;cout<<"namespace_var:"<<namespace_var<<endl;cout<<"global_var:"<<global_var<<endl;}};}intmain(){intlocal_var=40;//局部變量A::Testt;t.func();cout<<"local_var:"<<local_var<<endl;cout<<"namespace_var:"<<A::namespace_var<<endl;cout<<"global_var:"<<global_var<<endl;return0;}在上面的代碼中,我們定義了一個(gè)全局變量global_var,一個(gè)命名空間A,一個(gè)命名空間變量namespace_var和一個(gè)類Test,在類中定義了一個(gè)成員變量class_var和一個(gè)成員函數(shù)func,在main函數(shù)中定義了一個(gè)局部變量local_var。在Test類的成員函數(shù)func中,可以訪問(wèn)類的成員變量class_var、命名空間變量namespace_var和全局變量global_var。在main函數(shù)中,可以訪問(wèn)局部變量local_var、命名空間變量namespace_var和全局變量global_var。類作用域中的類成員作用域classPerson{public:voidsetName(std::stringname){this->name=name;}std::stringgetName(){returnname;}private:std::stringname;};intmain(){Personperson;person.setName("Alice");std::cout<<person.getName()<<std::endl;return0;}類作用域classPerson{public:classAddress{public:Address(std::stringcountry,std::stringcity):country(country),city(city){}std::stringgetCountry(){returncountry;}std::stringgetCity(){returncity;}private:std::stringcountry;std::stringcity;};voidsetAddress(Addressaddress){this->address=address;}AddressgetAddress(){returnaddress;}private:Addressaddress;};intmain(){Person::Addressaddress("China","Beijing");Personperson;person.setAddress(address);std::cout<<person.getAddress().getCountry()<<","<<person.getAddress().getCity()<<std::endl;return0;}在上面的例子中,類Person定義了一個(gè)類類型Address,可以在類外部使用“Person::Address”來(lái)訪問(wèn)這個(gè)類類型。塊作用域C++的塊作用域是指在一對(duì)花括號(hào)內(nèi)定義的變量或?qū)ο笾辉谶@個(gè)花括號(hào)內(nèi)有效,出了這個(gè)花括號(hào)就失效了。這種特性可以用來(lái)控制變量的可見(jiàn)性和生命周期。#include<iostream>intmain(){intx=1;{inty=2;std::cout<<"x+y="<<x+y<<std::endl;//輸出x+y=3}std::cout<<"x+y="<<x+y<<std::endl;//編譯錯(cuò)誤,y不在作用域內(nèi)return0;}在上面的代碼中,變量x是在main函數(shù)的作用域中定義的,它的作用域是整個(gè)main函數(shù)。而變量y是在{}內(nèi)部定義的,它的作用域只在這個(gè)花括號(hào)內(nèi)部。所以在第一個(gè)cout語(yǔ)句中,x和y都是有效的,可以正常計(jì)算。但在第二個(gè)cout語(yǔ)句中,y已經(jīng)超出了作用域,所以編譯器會(huì)報(bào)錯(cuò)。需要注意的是,如果在內(nèi)部作用域中定義了與外部作用域中同名的變量,那么內(nèi)部作用域中的變量會(huì)覆蓋外部作用域中的變量,直到內(nèi)部作用域結(jié)束為止。例如:#include<iostream>intmain(){intx=1;{intx=2;std::cout<<"x="<<x<<std::endl;//輸出x=2}std::cout<<"x="<<x<<std::endl;//輸出x=1return0;}在上面的代碼中,內(nèi)部作用域中定義了一個(gè)名為x的變量,它會(huì)覆蓋外部作用域中的x變量。所以第一個(gè)cout語(yǔ)句輸出的是內(nèi)部作用域中的x變量,而第二個(gè)cout語(yǔ)句輸出的是外部作用域中的x變量。命名空間作用域命名空間的作用域是指命名空間中定義的標(biāo)識(shí)符(如函數(shù)、變量、類等)在程序中的可見(jiàn)范圍。命名空間的作用域可以分為兩種1,未限定作用域未限定作用域是指在命名空間外部直接使用命名空間中定義的標(biāo)識(shí)符namespacemy_namespace{intmy_var=1;}intmain(){std::cout<<my_namespace::my_var<<std::endl;//輸出1return0;}在未限定作用域中,必須使用命名空間限定符(如my_namespace::)來(lái)訪問(wèn)命名空間中的標(biāo)識(shí)符。2.限定作用域限定作用域是指在命名空間內(nèi)部或使用了命名空間限定符的作用域中使用命名空間中定義的標(biāo)識(shí)符。例如:namespacemy_namespace{intmy_var=1;voidmy_func(){intmy_var=2;std::cout<<my_var<<std::endl;//輸出2std::cout<<my_namespace::my_var<<std::endl;//輸出1}}intmain(){my_namespace::my_func();return0;}在限定作用域中,可以直接使用命名空間中定義的標(biāo)識(shí)符,也可以使用命名空間限定符來(lái)訪問(wèn)其他命名空間中的標(biāo)識(shí)符。需要注意的是,命名空間的作用域也受到同名標(biāo)識(shí)符的影響。如果在命名空間中定義了與全局作用域或其他命名空間中的標(biāo)識(shí)符同名的標(biāo)識(shí)符,因此需要做出限制。如下namespacemy_namespace{intmy_var=1;}intmy_var=2;intmain(){std::cout<<my_var<<std::endl;//輸出2std::cout<<my_namespace::my_var<<std::endl;//輸出1return0;}命名空間可以嵌套namespaceA{inta=1000;namespaceB{inta=2000;}}voidtest03(){cout<<"A中的a="<<A::a<<endl;//1000cout<<"B中的a="<<A::B::a<<endl;//2000}命名空間是開(kāi)放的,即可以隨時(shí)把新的成員加入已有的命名空間中(常用)namespaceA{inta=100;intb=200;}//將c添加到已有的命名空間A中namespaceA{intc=300;}voidtest04(){cout<<"A中a="<<A::a<<endl;//100cout<<"A中c="<<A::c<<endl;//200}命名空間中的函數(shù)可以在“命名空間”外定義namespaceA{inta=100;//變量voidfunc();}voidA::func()//成員函數(shù)在外部定義的時(shí)候記得加作用域{//訪問(wèn)命名空間的數(shù)據(jù)不用加作用域cout<<"func遍歷a="<<a<<endl;}voidfunb()//普通函數(shù){cout<<"funb遍歷a="<<A::a<<endl;}voidtest06(){A::func();funb();}無(wú)名命名空間,意味著命名空間中的標(biāo)識(shí)符只能在本文件內(nèi)訪問(wèn),相當(dāng)于給這個(gè)標(biāo)識(shí)符加上了static,使得其可以作為內(nèi)部連接namespace{inta=10;voidfunc(){cout<<"hellonamespace"<<endl;}}voidtest(){//只能在當(dāng)前源文件直接訪問(wèn)a或funccout<<"a="<<a<<endl;func();}命名空間可取別名namespaceveryLongName{inta=10;voidfunc(){cout<<"hellonamespace"<<endl;}}voidtest(){namespaceshortName=veryLongName;cout<<"ve
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年消防設(shè)備制造與安裝一體化服務(wù)合同協(xié)議書(shū)2篇
- 二零二五年度面包烘焙產(chǎn)品出口合同4篇
- 二零二五年度美食攤位租賃與品牌孵化合同4篇
- 2025年度個(gè)人對(duì)旅游公司借款協(xié)議4篇
- 二零二五獼猴桃種植基地土地租賃與智能灌溉系統(tǒng)合同4篇
- 錄用條件協(xié)議書(shū)(2篇)
- 二零二五年度模板木方質(zhì)量保證合同范本4篇
- 市場(chǎng)研究專題報(bào)告十 -急性缺血性腦卒中藥物市場(chǎng)研究專題報(bào)告 202410
- 2025年銷售合同簽訂全流程規(guī)范與操作指南2篇
- 博士答辯導(dǎo)師講座模板
- 金蓉顆粒-臨床用藥解讀
- 社區(qū)健康服務(wù)與管理教案
- 2023-2024年家政服務(wù)員職業(yè)技能培訓(xùn)考試題庫(kù)(含答案)
- 2023年(中級(jí))電工職業(yè)技能鑒定考試題庫(kù)(必刷500題)
- 藏歷新年文化活動(dòng)的工作方案
- 果酒釀造完整
- 第4章-理想氣體的熱力過(guò)程
- 生涯發(fā)展展示
- 法治副校長(zhǎng)專題培訓(xùn)課件
- 手術(shù)室應(yīng)對(duì)突發(fā)事件、批量傷員應(yīng)急預(yù)案及處理流程
- 動(dòng)機(jī)-行為背后的原因課件
評(píng)論
0/150
提交評(píng)論