-
構(gòu)造函數(shù)
特殊的成員函數(shù),給對(duì)象的初始化,不需要用戶調(diào)用,建立對(duì)象時(shí),自動(dòng)執(zhí)行
它的函數(shù)名字與類相同,可以重載,沒有返回值和函數(shù)類型。
如果不寫構(gòu)造函數(shù),類會(huì)給出一個(gè)無(wú)參數(shù)的構(gòu)造函數(shù)。復(fù)制構(gòu)造函數(shù)
a.程序新建立一個(gè)對(duì)象時(shí),用另一個(gè)對(duì)象對(duì)它初始化。
b. 函數(shù)的參數(shù)為對(duì)象。
c. 函數(shù)的返回值為對(duì)象。
-
特殊的數(shù)據(jù)成員
常數(shù)據(jù)成員,const聲明,其值不能改變。 const string sex;
靜態(tài)數(shù)據(jù)成員,static聲明,屬于類,只能在類外初始化。 static double height;
引用數(shù)據(jù)成員,&聲明,是本人的別名。 char &c;
-
特殊的函數(shù)
常成員函數(shù),只能引用本類的數(shù)據(jù)成員,不能修改它們。 void prconst()const
靜態(tài)成員函數(shù),屬于類,在類外調(diào)用可以用類名加域運(yùn)算符號(hào),也可以對(duì)象名調(diào)用函數(shù)。 Person::prHeight();
-
內(nèi)存的動(dòng)態(tài)分配和撤銷。
c語(yǔ)言用malloc,free函數(shù),c++用new,delete。 //懷念java了。
Person *p3 = new Person("王五",88); 開辟了存放對(duì)象的空間,并初始化值。
delete p3; //回收開辟的內(nèi)存。
相關(guān)的代碼
#include <iostream>
#include<string>
using namespace std;
class Person {
protected:
string name;
int age;
const string sex; //const形數(shù)據(jù)成員,引用形數(shù)據(jù)成員,只能通過初始化列表初始化。
static double height;
public:
Person() {
}
Person(string na) :name(na) //初始化列表,要和成員函數(shù)對(duì)應(yīng)
{
}
Person(string na,int ag,string se) :name(na),age(ag),sex(se) //初始化列表,要和成員函數(shù)對(duì)應(yīng),不然會(huì)出錯(cuò)
{
}
/*
this指針指向本對(duì)象
*/
Person(string name, int age) { //采用this指針
this->name = name; //java里面是 this.name=name; 搞混了。
this->age = age;
}
void prconst()const {
cout << "const成員函數(shù)"<<endl;
}
//靜態(tài)成員函數(shù),只能調(diào)用靜態(tài)成員,它屬于類,可以用類名調(diào)用,加域作用符號(hào),但是非靜態(tài)成員函數(shù)也可以調(diào)用它
static void prHeight() {
cout << height << endl;
}
void toString();
/*
析構(gòu)函數(shù),對(duì)象生命周期結(jié)束,會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)
先構(gòu)造的后析構(gòu),后構(gòu)造的先析構(gòu)。
*/
~Person() {
cout << "析構(gòu)函數(shù)" << endl;
print2();
}
/*
復(fù)制構(gòu)造函數(shù)與類同名,采用引用,即別名。
*/
Person(const Person&p)
{ //復(fù)制構(gòu)造函數(shù)
cout << "復(fù)制構(gòu)造函數(shù) ";
name = p.name;
age = p.age;
}
/*
內(nèi)置函數(shù),減小時(shí)間開銷
c++類置函數(shù)要關(guān)鍵字inline聲明,但是類中定義的成員函數(shù)可以省略inline,
因?yàn)檫@些成員函數(shù)已經(jīng)被隱含的指定為內(nèi)置函數(shù)。如果類外定義,需要加上inline關(guān)鍵字。
內(nèi)置成員函數(shù),是不包括循環(huán)等控制結(jié)構(gòu)的函數(shù)。
*/
inline void print1() {
cout << "name=" << name << endl;
}
void print2(){
cout << "name=" << name << " " << "age=" << age << " " << "sex=" << sex <<endl;
}
};
/*
類外定義函數(shù)時(shí),必須在函數(shù)名前面加上類名。因?yàn)樵陬愅舛x不知道函數(shù)屬于哪個(gè)類。
class_name :: function()
*/
void Person::toString() {
cout << "[" << "name=" << name << " " << "age=" << age << "]" << endl;
}
double Person::height = 1.72; //靜態(tài)成員初始化
int main()
{
cout<<"類的大小:" << sizeof(Person) << endl;
Person p("王小二");
p.print1();
Person::prHeight(); //類調(diào)用
Person peo("張三", 66); //java是 Person peo=new Person("張三", 66);
peo.toString();
Person pe = peo; //等價(jià)于Person pe(peo);
pe.toString();
Person p1("李四", 22, "男");
p1.print2();
/*用復(fù)制構(gòu)造函數(shù),給const對(duì)象賦值。
const對(duì)象不能修改,只能調(diào)用const函數(shù)。
*/
const Person p2;
p2.prconst();
Person *p3 = new Person("王五",88); //new動(dòng)態(tài)申請(qǐng)一塊內(nèi)存
p3->toString();
delete p3; //動(dòng)態(tài)釋放內(nèi)存,防止內(nèi)存泄漏 ,有些懷念java,GC機(jī)制。
system("pause");
return 0;
}
結(jié)果
決定開始寫博客了,設(shè)計(jì)到j(luò)ava,c++等。