C++学习之路-const成员

本文详细讲解了C++中const成员变量的初始化方法、const成员函数的书写规则,以及const成员和非const成员的重载区别。重点强调了函数体内不可修改非静态成员的限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

被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){}
};

如果不初始化,就会报错

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值