栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++学习之路-const成员

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++学习之路-const成员

const成员
  • 定义
  • const成员变量
    • 初始化方法
  • const成员函数
    • 书写方法
    • 函数体内部不可以存在非static成员变量、非static成员函数
    • const成员函数和非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成员函数的调用,可以有两种调用方式:

  • 普通对象调用
Person person;
person.run();
  • 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
引用成员变量

这就属于语法部分,记住书写方式以及规则就好。

首先时书写方式:

在类中定义一个引用变量,那就是引用成员变量。必须初始化,且存在两种初始化方式:

  • 直接在声明时初始化,即引用其他类内的成员变量
class Person
{
	int m_age;
	int &m_salay = m_age; //引用类型成员

public:
	Person(){}
};
  • 通过构造函数初始化列表初始化,需要外部传参初始化
class Person
{

	int &m_work;
public:
	Person(int &work): m_work(work){}
};

如果不初始化,就会报错

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960870.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号