類中的屬性和方法被const修飾
阿新 • • 發佈:2019-02-19
在C語言和C++中有一個很特殊的關鍵詞——const,這個關鍵詞表示常量的意思,一旦被該關鍵詞修飾後,則該變數變成了一個常量,const可以修飾變數,也可以修飾指標,也可以修飾引用,同樣地,const也可以用來修飾類或結構體中的屬性或方法。const的好處之一就是防止後續程式中修改不允許變動的值,以避免產生bug。如下面的程式,就是一個典型的方法可以改變物件中的屬性:
#include <iostream>
using namespace std;
struct A{
int m, n;
void f(){ //呼叫這個方法將改變這個類的屬性
m++;
n++;
}
};
int main(){
A a1 = {1, 2};
A a2 = {5, 6};
a1.f(); //改變物件a1的屬性
a2.f(); //改變物件a2的屬性
在這種情況下,物件的屬性很容易被改變,如果這時我不想某一物件中的屬性時,這時可用const修飾該物件,如:
#include <iostream>
using namespace std;
struct A{
int m, n;
void f(){ //同樣地,該方法修改了類中的屬性
m++;
n++;
}
};
int main(){
const A a1 = {5, 6}; //用const修飾物件a1,說明a1是個常量物件,屬性不允許被修改
A a2 = {5, 6}; //非常量物件
a1.f(); //產生編譯錯誤,a1為常量物件,其屬性不允許被修改
a2.f(); //合法
}
值得注意的是,被const修飾的物件不能呼叫類中沒有被const修飾的方法,例如上面的物件a1不能呼叫方法f,但可以呼叫被const修飾的方法。但是沒有被const修飾的物件是可以呼叫被const修飾的方法的,例如下面的程式:
#include <iostream>
using namespace std;
struct A{
int m, n;
void f() const { //該函式被const修飾
cout << m << "\t" << n << endl;
}
};
int main(){
const A a1 = {3, 4}; //被const修飾的物件a1
A a2 = {5, 6}; //未被const修飾的物件a2
a1.f(); //合法,因為方法f也被const修飾
a2.f(); //合法,雖然a2未被const修飾,但也可以呼叫被const修飾的方法
}
輸出結果:
一旦類中的方法被const修飾了,則意味著該方法為常量,方法中不得有修改類中屬性的語句存在,例如:
struct A{
int m, n;
void f() const {
m++; //產生編譯錯誤,此處修改了類中的屬性
int d = 0;
d++; //合法,d不是類中的屬性,可以被修改
}
};
同樣地,被const修飾的方法也不允許呼叫其他能夠修改類中屬性的其他方法,例如:
struct A{
int m, n;
void h(){
m++;
n++;
}
void f() const {
h(); //產生編譯錯誤,方法h修改了類中的屬性,方法f被const修飾,不得呼叫方法h
}
一般地,在一些類的方法中,如果需要將屬性作為返回值的,或者需要以文字形式輸出的方法都會用const修飾,如下面的程式:
#include <iostream>
using namespace std;
class Complex{
int re;
int im;
public:
void setCom(int r, int i){
re = r;
im = i;
}
int getReal() const { //該函式用const修飾,因為僅僅是以實部作為返回值
return re;
}
int getImag() const { //同樣地用const修飾
return im;
}
void text() const { //以文字形式輸出,也用const修飾
cout << "this complex number is : << re << " + " << im << "j" <<endl;
}
};
int main(){
Complex com1;
com1.setCom(5, 6);
cout << com1.getReal() << endl;
cout << com1.getImag() << endl;
com1.text();
}
輸出結果:
如有錯誤,歡迎大家批評與指正!