IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++学习第十一课--inline、const、mutable、this和static笔记 -> 正文阅读

[C++知识库]C++学习第十一课--inline、const、mutable、this和static笔记

一、在类定义中实现成员函数inline

在.h头文件中声明类,如下:

#ifndef   __MAIN_H__
#define   __MAIN_H__

class student
{
public:
	int age;
	int hight;
	int num;
	void stuInitFunc(int stuAge, int stuHight, int stuNum);
};

#endif // !__MAIN_H__

在.cpp文件中定义类,如下:

void student::stuInitFunc(int stuAge, int stuHight, int stuNum)
{
	this->age = stuAge;
	this->hight = stuHight;
	this->num = stuNum;
}

在main函数或者其它函数调用student成员的stuInitFunc函数如下:

int main()
{
	student stu;
	stu.stuInitFunc(20,180,1001);
    cout << stu.age<< " " << stu.hight << " " << stu.num << endl;
	return 0;
}

以上的写法是我们平时的写法,如果我们把函数的整个定义都写在.h头文件中,整个程序如下所示,.h头文件的声明如下:

#ifndef   __MAIN_H__
#define   __MAIN_H__

class student
{
public:
	int age;
	int hight;
	int num;
    void stuInitFunc(int stuAge, int stuHight, int stuNum)
	{
		this->age = stuAge;
		this->hight = stuHight;
		this->num = stuNum;
	}

};

#endif // !__MAIN_H__

在.cpp文件中调用类的成员函数如下所示:

#include <iostream>
#include <vector>
#include<time.h>
#include"main.h"

using namespace std;

int main()
{
	student stu;
	stu.stuInitFunc(20,180,1001);
	cout << stu.age << " " << stu.hight << " " << stu.num << endl;
	return 0;
}

在类的声明中,这种直接把成员函数定义写在类声明里面,会被当成inline内联函数来处理。

、成员函数末尾的const

这里再介绍一种const的常用用法,就是在成员函数的末尾增加一个const。对于成员函数的声明和定义代码分开的情况下,不仅要在成员函数的声明中增加const,也要在成员函数的定义中增加const。这样做的作用是告诉系统,在这个成员函数中不能修改该对象里面的任何成员变量值。

我们在成员函数声明后面加上const,如下:

void?stuInitFunc(int?stuAge, int?stuHight, int?stuNum) ?const;

成员函数定义时,在参数圆括号后面加上const,如下:

void student::stuInitFunc(int stuAge, int stuHight, int stuNum) const
{
	this->age = stuAge;
	this->hight = stuHight;
	this->num = stuNum;
}

编译后,语法出现错误,报错信息如下所示:

?三、mutable

mutable,翻译成中文,表示不稳定的、容易改变的意思。与 const 正好是反义词。而且

mutable的引入也正是为了突破const 目的限制。

在成员函数末尾加const,是不允许修改成员变量值的。那在设计类成员变量的时候,如果确实遇到了需要在const结尾的成员函数中希望修改成员变量的需求,怎么办?有人提出,把成员函数的末尾的const去掉,变成一个不以const结尾的成员函数。那这个时候可能面临一个问题:如果这个成员函数从const变成非const了,那么就不能被const对象调用了。所以,引入mutable修饰符(关键字)来修饰一个成员变量。一个成员变量一旦被mutable所修饰,就表示这个成员变量永远处于可修改状态,即使是在以const结尾的成员函数中。

我们在上面的例子类声明过程中,在声明成员变量前面加上mutable关键字,在成员函数就可以修改成员变量的值,修改如下:

class student
{
public:
	mutable int age;
	mutable int hight;
	mutable int num;
	void stuInitFunc(int stuAge, int stuHight, int stuNum)  const;
};

再次编译程序,不会报错。

四、返回自身对象的引用--this

this用在成员函数中是一个隐藏起来的函数参数,表示的是指向本对象的指针,那么*tthis表示改指针指向的对象也就是本对象。换句话说,*this表示调用这个成员函数的那个对象。

如下在类student的成员函数中,三种写法都是正确的:

方式一:没有this,推荐使用这种方式

void student::stuInitFunc(int stuAge, int stuHight, int stuNum) const
{
	age = stuAge;
	hight = stuHight;
	num = stuNum;
}

方式二:指向本类对象的指针,类似于student stu; student *this = &stu;

void student::stuInitFunc(int stuAge, int stuHight, int stuNum) const
{
	this->age = stuAge;
	this->hight = stuHight;
	this->num = stuNum;
}

方式三:表示调用这个成员函数的那个类对象

void student::stuInitFunc(int stuAge, int stuHight, int stuNum) const
{
	(*this).age = stuAge;
	(*this).hight = stuHight;
	(*this).num = stuNum;
}

以上三种方式都是等价的,没有什么区别。

在使用this时,需要注意:

(1)this本身是一个指针常量,总是指向这个对象本身,不可以让this再指向其它地方。

(2)this指针只能在类成员函数中使用,全局函数、静态函数等都不能使用this指针。

(3)在const成员函数中,this指针是指向const对象的const指针。例如,类类型为student,那么this就是const student *const类型。

(4)当形参名与成员变量名相同时,用this.成员变量名来和形参变量区分开,如下所示:

void student::stuInitFunc(int age, int hight, int num)
{
	(*this).age   = age;
	(*this).hight = hight;
	(*this).num   = num;
}
或
void student::stuInitFunc(int age, int hight, int num)
{
	this->age   = age;
	this->hight = hight;
	this->num   = num;
}

(5)当一个成员函数需要返回一个类对象变量时,可以用return (*this);把这个类对象返回给类对象本身。如下所示:

student student::stuInitFunc(int age, int hight, int num)
{
	this->age = age;
	this->hight = hight;
	this->num = num;
	return (*this);//返回调用类对象本身。这里类对象为stu1
}

调用方式如下:

student stu1;
student stu2;
stu2 = stu1.stuInitFunc(20,180,1001);
cout << stu2.age << " " << stu2.hight << " " << stu2.num << endl;

五、static成员

在C中static有两个作用,这里看看static在C++中有什么作用。

1、static修饰成员变量

在.h头文件中,静态成员变量在类中这样声明:

class student
{
public:
	static int age;  //声明为静态成员变量
	static int hight;//声明为静态成员变量
	static int num;  //声明为静态成员变量
    int weight;      //声明为普通成员变量
	void  stuInitFunc(int stuAge,int stuHight,int stuNum,int stuWeight);
};

声明以后,在.cpp文件中,不要把成员变量定义在类的成员函数中,而是定义在.cpp文件的开头,这样能够保证在调用任何函数之前这个静态成员变量已经被初始化,从而保证这个静态成员变量能够被正常使用,如下定义:

int student::age  = 18;
int student::hight= 180;
int student::num  = 10002;

我们在mian.cpp文件中创建两个student类的新对象stu1和stu2,然后stu1和stu2都调用且打印age、hight和num这三个成员变量的值,再用stu1去修改static修饰的这三个成员变量,再用stu1和stu2调用这三个成员变量且打印这个成员变量的值,可以看到两个类对象的这个成员变量的值是一样的:

student stu1,stu2;

//打印stu1和stu2调用成员变量的值
cout << stu1.age << " " << stu1.hight << " " << stu1.num << endl;
cout << stu2.age << " " << stu2.hight << " " << stu2.num << endl;

//类对象stu1修改成员变量的值
stu1.age   = 20;
stu1.hight = 185;
stu1.num   = 1005;

//打印stu1和stu2调用成员变量的值
cout << stu1.age << " " << stu1.hight << " " << stu1.num << endl;
cout << stu2.age << " " << stu2.hight << " " << stu2.num << endl;

2、static修饰成员函数

在声明类对象和声明成员函数时,在成员函数前面加static,如下所示:

class student
{
public:
	static int age;
	static int hight;
	static int num;
	int weight;
	static void  stuInitFunc(int stuAge, int stuHight, int stuNum, int stuWeight);
};

?在.cpp中定义成员函数,在成员函数前面就不需要加static修饰符,static修饰的成员函数和普通成员函数的定义方式是一样的,如下:

//必须先在这里定义静态成员变量,才能在静态成员函数中再次给静态成员变量赋值
int student::age   = 20;
int student::hight = 185;
int student::num   = 1005;
void student::stuInitFunc(int stuAge,int stuHight,int stuNum,int stuWeight)
{
	age    = stuAge;  //static修饰的成员变量可以在static修饰的成员变量定义或者被赋值
	hight  = stuHight;//static修饰的成员变量可以在static修饰的成员变量定义或者被赋值
	num    = stuNum;  //static修饰的成员变量可以在static修饰的成员变量定义或者被赋值
	//weight = stuWeight;//不是static修饰的成员变量不可以在static修饰的成员变量定义或者被赋值
	cout << "student类的成员函数" << endl;
}

用staitic修饰成员函数后,可以用 ”类名::静态成员函数名” 或 “类对象.静态成员函数名” 来调用静态成员函数。如下所示:

#include <iostream>
#include <vector>
#include<time.h>
#include"main.h"

using namespace std;

//必须先在这里定义静态成员变量,才能在静态成员函数中再次给静态成员变量赋值
int student::age   = 20;
int student::hight = 185;
int student::num   = 1005;

void student::stuInitFunc(int stuAge,int stuHight,int stuNum,int stuWeight)
{
	age    = stuAge;
	hight  = stuHight;
	num    = stuNum;
	cout << "student类的成员函数" << endl;
}

int main()
{
	student stu1,stu2;

	//打印student、stu1和stu2调用成员变量的值
	cout << student::age << " " << student::hight << " " << student::num << endl;
	cout << stu1.age << " " << stu1.hight << " " << stu1.num << endl;
	cout << stu2.age << " " << stu2.hight << " " << stu2.num << endl<<endl;

	stu1.stuInitFunc(25, 170, 1008,165);
	cout << student::age << " " << student::hight << " " << student::num << endl;
	cout << stu1.age << " " << stu1.hight << " " << stu1.num << endl;
	cout << stu2.age << " " << stu2.hight << " " << stu2.num << endl;

	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:37:15  更:2022-07-04 22:40:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/12 18:59:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码