1. 程式人生 > 其它 >char型別的實參與const char型別的形參不相容_C++ const 的使用

char型別的實參與const char型別的形參不相容_C++ const 的使用

技術標籤:char型別的實參與const char型別的形參不相容

作者:鯨90830

連結:https://www.cnblogs.com/whale90830/p/10542361.html

1) const 物件的一般形式

  • 型別名const物件名[(構造實參表列)];

  • const型別名 物件名[(構造實參表列)];

注意:常物件必須要有初值(因為以後不能改值了)。

2) 限定作用:

定義為const的物件的所有資料成員的值都不能被修改。

凡出現呼叫非const的成員函式,將出現編譯錯誤。但建構函式除外。

Timeconstt1(12,34,46);//t1是常物件
t1.set_Time();//編譯錯誤PE,非const成員函式
t2.show_Time();//錯誤,非const成員函式

3) mutable成員

對資料成員宣告為mutable(易變的)時,即使是const物件,仍然可以修改該資料成員值。

常物件成員

1)常資料成員

使用const說明的資料成員稱為常資料成員,其值是不能改變的。

如果在一個類中說明了常資料成員,那麼建構函式就只能通過初始化列表對該資料成員進行初始化,而任何其他函式都不能對該成員賦值。

classTime
{
constinthour;//宣告hour為常資料成員
Time(inth):hour(h){}//通過引數初始化表對常資料成員hour初始化
};
classTime
{
constinthour;//宣告hour為常資料成員
Time(inth)
{
hour=h;//錯誤
}
};
例3.30 常資料成員舉例。
#include
classDate{
public:
Date(inty,intm,intd);
voidshowDate();
constint&r;
private:
constintyear;
constintmonth;
constintday;
};
Date::Date(inty,intm,intd):year(y),month(m),day(d),r(year){}
inlinevoidDate::showDate()
{
cout<<"r="<endl;cout<"."<"."<endl;
}voidmain(){Datedate1(1998,4,28);
date1.showDate();
}

2)常成員函式

在類中使用關鍵字const說明的函式為常成員函式。

常成員函式的說明格式如下:

型別說明符 函式名(引數表) const;

voidshow_Time()const;//注意const的位置在函式名和括號之後
voidTime::show_Timeconst
{
cout<endl;
}

注意:const是函式型別的一個組成部分,在宣告函式和定義函式時都要有const關鍵字,在呼叫時不必加const。

例3.28 常引用作函式形參
#include
intadd(constint&i,constint&j);
voidmain(){
inta=20;
intb=30;
cout<"+"<"="<endl;
}intadd(constint&i,const&j){returni+j;
}

如果將一個物件說明常物件,則通過該物件只能呼叫它的常成員函式,而不能呼叫普通成員函式。而且常成員函式也不能更新物件的資料成員。

例3.31 常成員函式的使用。
#include
classDate{
public:
Date(inty,intm,intd);
voidshowDate();
voidshowDate()const;
private:
intyear;
intmonth;
intday;
};
Date::Date(inty,intm,intd):year(y),month(m),day(d){}
voidDate::showDate()
{
cout<<"ShowDate1:"<<endl;
cout<"."<"."<endl;
}voidDate::showDate()const
{cout<<"ShowDate2:"<<endl;cout<"."<"."<endl;
}voidmain(){Datedate1(1998,4,28);
date1.showDate();constDatedate2(2002,11,14);
date2.showDate();
}

常成員函式只能引用本類中的資料成員,而不能修改它們,即成員資料不能作為語句的左值。(注意:可以改mutable成員)

例 const物件及mutable成員
classTime{
public:
Time()
{
hour=0;
minute=0;
}
voidset_Hour(inth)const{hour=h;}
voidset_Minute(intm){minute=m;}
voidshow_Time()const{cout<":"<endl;}private:mutableinthour;intminute;
};intmain(){
Timet1;
t1.set_Hour(8);
t1.set_Minute(8);
t1.show_Time();
Timeconstt2;
t2.set_Hour(8);
t2.set_Minute(8);
t2.show_Time();return0;
}

3)常成員的使用

  • a) 如果在一個類中,有些資料成員的值允許改變,另一些資料成員的值不允許改變,則可以將一部分資料成員宣告為const,以保證其值不被改變,可以用非const的成員函式引用這些資料成員的值,並修改非const資料成員的值。

  • b) 如果要求所有的資料成員的值都不允許改變,則可以將所有的資料成員宣告為const,或將物件宣告為const(常物件),然後用const成員函式引用資料成員,這樣起到“雙保險”的作用,切實保證了資料成員不被修改。

  • c) 如果已定義了一個常物件,則只能呼叫其中的const成員函式,而不能呼叫非const成員函式(不論這些函式是否會修改物件中的資料)。如果需要訪問物件中的資料成員,可將常物件中所有成員函式都宣告為const成員函式,但應確保在函式中不修改物件中的資料成員。

指向常物件的指標變數

1)指向常物件的指標變數的一般形式

const 型別 *指標變數名

constchar*pc;//pc指向的char是const型的
*pa='a';// 錯誤:pa 指向的目標不能改變
pa++;//正確,pa本身的值可以改變
Timet1;
constTime*pt;
*pt=t1;// 錯誤:pt指向的目標不能改變

2)關於指向常物件的指標變數的說明

  • a) 指向常物件(變數)的指標變數,不能通過它來改變所指向目標物件的值,但指標變數的值是可以改變的。

  • b) 如果被宣告為常物件(變數),只能用指向常物件(變數)的指標變數指向它,而不能非const型指標變數去指向它。

constinta=10,b=20;
constint*pa=&a;//正確
int*pb=&a;// 錯誤:非 const 型指標
  • c) 指向常物件(變數)的指標變數除了可以指向常物件(變數)外,還可以指向未被宣告為const的物件(變數)。此時不能通過此指標變數改變該變數的值。

pa=&b;// 正確:也可指向非 const 型的變數
*pa=30;// 錯誤:指向 const 型的指標不能改目標值
  • d) 指向常物件(變數)的指標變數可以指向const和非const型的物件(變數),而指向非const型變數的指標變數只能指向非const的物件(變數)。

constint*pa=&b;//正確
int*pb=&a;//錯誤
  • e) 如果函式的形參是指向非const型變數的指標,實參只能用指向非const變數的指標,而不能用指向const變數的指標,這樣,在執行函式的過程中可以改變形參指標變數所指向的變數(也就是實參指標所指向的變數)的值。

voidf(Time*pt);
Time*p1;
constTime*p2;
f(p1);//正確
f(p2);//錯誤
  • f) 如果函式形參是指向const型變數的指標,允許實參是指向const變數的指標,或指向非const變數的指標。

voidg(constTime*pt)
Time*p1;
ConstTime*p2;
f(p1);//正確
f(p2);//正確
  • g) 基本規則:希望在呼叫函式時物件的值不被修改,就應當把形參定義為指向常物件的指標變數,同時用物件的地址作實參(物件可以是const或非const型)。如果要求該物件不僅在呼叫函式過程中不被改變,而且要求它在程式執行過程中都不改變,則應把它定義為 const型

物件的常引用

在C++中,經常用常指標和常引用作函式引數。這樣既能保證資料安全,使資料不能被隨意修改,在呼叫函式時又不必建立實參的拷貝,可以提高程式執行效率。

例 物件的常引用。
classTime{
public:
Time(int,int,int);
inthour;
intminute;
intsec;
};
Time::Time(inth,intm,ints)
{
hour=h;
minute=m;
sec=s;
}
voidfun1(Time&t)//t是物件引用{t.hour=18;}
voidfun2(constTime&t)//t為常引用{t.hour=18;//錯誤}
intmain(){
voidfun1(&);
voidfun2(constTime&);
Timet1(10,13,56);
fun(t1);
cout<endl;return0;
}
例3.29 非常物件和常物件的比較。
#include
classSample{
public:
intm;
Sample(inti,intj){m=i;n=j;}
voidsetvalue(inti){n=i;}
voiddisply(){
cout<<"m="<endl;cout<<"n="<endl;
}private:intn;
};voidmain(){Samplea(10,20);//若為:constSamplea(10,20);
a.setvalue(40);//不能修改常物件的資料成員
a.m=30;//不能修改常物件的資料成員
a.disply();//常物件不能呼叫普通成員函式
}

const型資料的小結Timeconstt=Time(1,2,3);

constTimet=Time(1,2,3);
constinta=10;
intconsta=10;
  • t是常物件,其成員值在任何情況下都不能被改變。

  • a 是常變數,其值不能被改變

voidTime::fun()const;

fun 是Time類的常成員函式,可以呼叫該函式,但不能修改本類中的資料成員(非mutable)

Time*constpt;
int*constpa;
  • pt 是指向Time物件的常指標,

  • pa 是指向整數的常指標。指標值不能改變。

constTime*pt;
constint*pa;
  • pt是指向Time類常物件的指標,

  • pa是指向常整數的指標,不能通過指標來改變指向的物件(值)


●編號485,輸入編號直達本文

●輸入m獲取文章目錄

C語言與C++程式設計

c7369b1eb01a6db7d521e157cae110d8.png

分享C/C++技術文章