const成员
定义
被const修饰的成员变量和非静态(static)成员函数,都叫作const成员。
class Person
{
public:
const int mc_height = 180;
void run() const{
}
};
const成员变量
必须初始化(必须类内部初始化):可以在声明的时候,直接初始化赋值
class Person
{
public:
const int mc_height = 180;
};
如果不初始化,构造函数会报错:未提供初始值设定项
初始化方法
- 直接赋值初始化
const int mc_height = 180;
- 构造函数初始化列表
Person(): mc_height(180){}
上面两种初始化方式,只能适用于非静态的const成员变量,如果遇到静态的const成员变量,就不能放在初始化列表里初始化了
static const int msc_weight = 75;
我们知道,static成员变量必须在类外初始化。但是一旦是static+const成员变量,那类内类外都可以初始化了。
- 类外 (需要类名:: )
const int Person::msc_weight = 75;
- 类内
static const int msc_weight = 75;
const成员函数
书写方法
const关键字写在参数列表的后面(也能写在前面,但是通常写在后面),如果函数的声明和实现分离,书写都必须带const
class Person
{
public:
void run() const;
};
void Person::run() const
{
cout << "run() const" << endl;
}
函数体内部不可以修改非static成员变量、非static成员函数
内部不能修改非static成员变量、非static成员函数(这个很重要,要记住),但是可以访问。
class Person
{
int m_age;
public:
Person(): mc_height(180){}
static int ms_family;
const int mc_height;
static const int msc_weight; // 不可以放在初始化列表里
void run() const;
static void static_test()
{
}
void test()
{
}
};
const int Person::msc_weight = 75;
int Person::ms_family = 4;
void Person::run() const
{
cout << "run() const" << endl;
m_age = 10; // 不可以访问、修改非静态的成员变量
test(); // 不可以访问非静态的成员函数,因为非静态成员函数内部可以访问非静态成员,这就与const函数的初衷相悖
ms_family = 5; // 可以访问、修改静态的成员变量
static_test(); //可以调用static成员函数,因为static成员函数内部也不可以访问非static成员变量,调用起来没毛病
}
const成员函数和非const成员函数构成重载
class Person
{
int m_age;
public:
void run() const
{
cout << "run() const" << endl;
}
void run()
{
cout << "run()" << endl;
}
};
我们在类外调用的时候,需要区分开。
int main()
{
Person person;
person.run();
const Person person1;
person1.run(); //函数重载
getchar();
return 0;
}
但const成员函数的调用,可以有两种调用方式:
- 普通对象调用(非const成员也可以调用const函数)
Person person;
person.run();
- const对象调用(const对象只能调用const函数)
const Person person1;
person1.run();
只不过,普通对象调用时,会默认优先调用非const成员函数。即类中有重载函数时,会先调用非const的。如果没有非const,只有const成员函数,那就会直接调用const成员函数:
class Person
{
int m_age;
public:
void run() const
{
cout << "run() const" << endl;
}
};
Person person;
person.run(); //run() const
总结:const对象只能调用const函数。非const对象可以调用const函数,也可以调用非const函数。
引用成员变量
这就属于语法部分,记住书写方式以及规则就好。
首先时书写方式:
在类中定义一个引用变量,那就是引用成员变量。必须初始化,且存在两种初始化方式:
- 直接在声明时初始化,即引用其他类内的成员变量
class Person
{
int m_age;
int &m_salay = m_age; //引用类型成员
public:
Person(){}
};
- 通过构造函数初始化列表初始化,需要外部传参初始化
class Person
{
int &m_work;
public:
Person(int &work): m_work(work){}
};
如果不初始化,就会报错