目录
const修饰成员变量
1.使用:
2.初始化:
3) 注意:
const修饰成员方法和对象
1)使用:
1. 修饰对象:
2.修饰成员函数:被const修饰的成员函数,在其内部无法修改成员属性(包括非const限定的)。
3.两者的关系:
4. 原因:
5.建议:
const其实C语言中也经常使用,就是将变量设置为只读。--- 只能读数据,不能该数据
定义一个人的类,我们的身份证号不能随便修改,这时候就可以定义成const类型。
class Human {
public:
Human();
private:
int age;
string name;
const int idCard = 0; // 设置初始值
};
Human::Human(){
age = 18;
name = "学习";
// idCard = 10;// 报错
}
代码中,idCard被设置为只读,是无法修改的,如果修改就会报错。
1)方法一: 直接初始化
就是上面代码使用的方法,在定义时直接初始化。
2)方法二: 使用初始化列表 -- 建议使用
方法一的缺点:
方法一在c++11之后才支持,而且const的量初始化之后就不能改了,比定义的时候怎么知道其值为多少?(就比如,当出生,没有身份证的时候,你是不知道身份证号的)。
这时候就要使用方法二:
class Human {
public:
Human(int age, string name, int idCard);
private:
int age;
string name;
const int idCard; // 设置初始值
};
Human::Human(int age, string name, int idCard):age(age),name(name),idCard(idCard){
}
我们使用有参构造创建对象的时候,初始化列表会根据相应的参数给相应的成员变量初始化。
语法:在参数后面加一个: 然后成员(参数),多个之间用,隔开。
const修饰的量只能在初始化列表中初始化,不能在函数内部进行初始化。
假设,我们有两个人类的对象,我们希望一个对象中数据初始化之后就不修改(可以将它定义为const类型),而另外一个则可以修改非const修饰的量。
注意: 对上面这段话,表示对于可修改的属性,有些对象可以改变,有些对象不可以改变。
class Human {
public:
Human(string name, int idCard);
string getName() const;
int getIdCard() const;
void setName(const char* name);
private:
string name;
const int idCard; // 设置初始值
};
Human::Human(string name, int idCard):name(name),idCard(idCard){
}
string Human::getName() const{
// name = "学习"; // const修饰的函数中不能修改数据
return name;
}
int Human::getIdCard() const {
// idCard = 10; // 不能修改
return idCard;
}
void Human::setName(const char* name) {
name = "值"; // 非const限定的函数可以修改内部的值
this->name = name;
}
int main(void) {
const Human man("学习",123456);
Human man1("努力", 654321);
system("pause");
return 0;
}
代码中,我们定义了两个对象,一个使用const限定。被const限定的对象,其内部的值是不可以改变的。
上面代码中, 定义了两个const类型,getName和getIdCard。
语法: 在函数声明和定义的时候,在函数的后面就一个const。
上面说到,其实在const限定的对象内部,它的成员变量都是可修改的。如果不被const限定,是可以正常修改的。
但是,我们知道,对于普通函数,在其内部可以随意修改非const修饰的成员变量(代码中已经体现)。但是,const限定的函数,是不可以修改的。
所以,这就导致,const限定的对象,只能调用const修饰的函数。
对于非const限定的成员变量,在函数中我们可以随意修改它们的值。对于这样的变量,我们有的对象希望它改变,而有的对象希望它不变。(所以你也不能将它直接设置为const,因为那样谁也改不了了)。
既然普通函数可以修改这个变量,那不希望变量改变的对象(const修饰的对象),就不能去调用这样的函数了。因为它会改变值的。
而const限定的函数,其内部是无法修改任何值的,所以对于const对象可以放心调用,因为它改不了你的值。 (当然这样的函数非const限定的对象也能调用。你都允许改了,那不改的当然也能)
当我们函数内部不去修改成员数据的值的时候,就将它设置为const类型。(比如读取数据的函数等)